{"version":3,"sources":["lib/prelude.js","../node_modules/@protobufjs/aspromise/index.js","../node_modules/@protobufjs/base64/index.js","../node_modules/@protobufjs/codegen/index.js","../node_modules/@protobufjs/eventemitter/index.js","../node_modules/@protobufjs/fetch/index.js","../node_modules/@protobufjs/float/index.js","../node_modules/@protobufjs/inquire/index.js","../node_modules/@protobufjs/path/index.js","../node_modules/@protobufjs/pool/index.js","../node_modules/@protobufjs/utf8/index.js","../src/common.js","../src/converter.js","../src/decoder.js","../src/encoder.js","../src/enum.js","../src/field.js","../src/index-light.js","../src/index-minimal.js","../src/index","../src/mapfield.js","../src/message.js","../src/method.js","../src/namespace.js","../src/object.js","../src/oneof.js","../src/parse.js","../src/reader.js","../src/reader_buffer.js","../src/root.js","../src/roots.js","../src/rpc.js","../src/rpc/service.js","../src/service.js","../src/tokenize.js","../src/type.js","../src/types.js","../src/util.js","../src/util/longbits.js","../src/util/minimal.js","../src/verifier.js","../src/wrappers.js","../src/writer.js","../src/writer_buffer.js"],"names":["undefined","modules","cache","entries","protobuf","$require","name","$module","call","exports","util","global","define","amd","Long","isLong","configure","module","1","require","fn","ctx","params","Array","arguments","length","offset","index","pending","Promise","resolve","reject","err","apply","base64","string","p","n","Math","ceil","b64","s64","i","encode","buffer","start","end","t","parts","chunk","j","b","push","String","fromCharCode","slice","join","invalidEncoding","decode","c","charCodeAt","Error","test","codegen","functionParams","functionName","body","Codegen","formatStringOrScope","source","toString","verbose","console","log","scopeKeys","Object","keys","scopeParams","scopeValues","scopeOffset","Function","formatParams","formatOffset","replace","$0","$1","value","Number","floor","JSON","stringify","functionNameOverride","EventEmitter","this","_listeners","prototype","on","evt","off","listeners","splice","emit","args","fetch","asPromise","fs","filename","options","callback","xhr","readFile","contents","XMLHttpRequest","binary","onreadystatechange","readyState","status","response","responseText","Uint8Array","overrideMimeType","responseType","open","send","factory","writeFloat_ieee754","writeUint","val","buf","pos","sign","isNaN","round","exponent","LN2","pow","readFloat_ieee754","readUint","uint","mantissa","NaN","Infinity","writeFloat_f32_cpy","f32","f8b","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","f64","le","writeDouble_ieee754","off0","off1","readDouble_ieee754","lo","hi","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","Float32Array","writeFloatLE","writeFloatBE","readFloatLE","readFloatBE","bind","writeUintLE","writeUintBE","readUintLE","readUintBE","Float64Array","writeDoubleLE","writeDoubleBE","readDoubleLE","readDoubleBE","inquire","moduleName","self","trustedTypes","createPolicy","escapeScriptPolicy","createScript","safeScript","mod","eval","e","isAbsolute","path","normalize","split","absolute","prefix","shift","originPath","includePath","alreadyNormalized","alloc","size","SIZE","MAX","slab","utf8","len","read","write","c1","c2","common","commonRe","json","nested","google","Any","fields","type_url","type","id","Duration","timeType","seconds","nanos","Timestamp","Empty","Struct","keyType","Value","oneofs","kind","oneof","nullValue","numberValue","stringValue","boolValue","structValue","listValue","NullValue","values","NULL_VALUE","ListValue","rule","DoubleValue","FloatValue","Int64Value","UInt64Value","Int32Value","UInt32Value","BoolValue","StringValue","BytesValue","FieldMask","paths","get","file","Enum","genValuePartial_fromObject","gen","field","fieldIndex","prop","resolvedType","repeated","typeDefault","fullName","isUnsigned","genValuePartial_toObject","converter","fromObject","mtype","fieldsArray","safeProp","map","toObject","sort","compareFieldsById","repeatedFields","mapFields","normalFields","partOf","arrayDefault","valuesById","long","low","high","unsigned","toNumber","bytes","hasKs2","_fieldsArray","indexOf","filter","group","ref","types","defaults","basic","packed","rfield","required","wireType","mapKey","genTypePartial","optional","ReflectionObject","Namespace","create","constructor","className","comment","comments","TypeError","reserved","fromJSON","enm","toJSON","toJSONOptions","keepComments","Boolean","add","isString","isInteger","isReservedId","isReservedName","allow_alias","remove","Field","Type","ruleRe","extend","isObject","toLowerCase","message","defaultValue","extensionField","declaringField","_packed","defineProperty","getOption","setOption","ifNotSet","resolved","parent","lookupTypeOrEnum","fromNumber","freeze","newBuffer","emptyObject","emptyArray","ctor","d","fieldId","fieldType","fieldRule","decorateType","decorateEnum","fieldName","default","_configure","Type_","build","load","root","Root","loadSync","encoder","decoder","verifier","OneOf","MapField","Service","Method","Message","wrappers","Writer","BufferWriter","Reader","BufferReader","rpc","roots","tokenize","parse","resolvedKeyType","fieldKeyType","fieldValueType","properties","$type","writer","encodeDelimited","reader","decodeDelimited","verify","object","requestType","requestStream","responseStream","parsedOptions","resolvedRequestType","resolvedResponseType","lookupType","arrayToJSON","array","obj","_nestedArray","clearCache","namespace","addJSON","toArray","nestedArray","nestedJson","names","methods","getEnum","prev","setOptions","onAdd","onRemove","isArray","ptr","part","resolveAll","lookup","filterTypes","parentAlreadyChecked","found","lookupEnum","lookupService","Service_","Enum_","defineProperties","unshift","_handleAdd","_handleRemove","setParsedOption","propName","opt","newOpt","find","hasOwnProperty","newValue","setProperty","Root_","fieldNames","addFieldsToParent","oneofName","oneOfGetter","set","oneOfSetter","keepCase","base10Re","base10NegRe","base16Re","base16NegRe","base8Re","base8NegRe","numberRe","nameRe","typeRefRe","fqTypeRefRe","pkg","imports","weakImports","syntax","token","whichImports","preferTrailingComment","tn","alternateCommentMode","next","peek","skip","cmnt","head","isProto3","applyCase","camelCase","illegal","insideTryCatch","line","readString","readValue","acceptTypeRef","parseNumber","substring","parseInt","parseFloat","readRanges","target","acceptStrings","parseId","acceptNegative","parseCommon","parseOption","parseType","ifBlock","parseMapField","valueType","parseInlineOptions","parseField","extensions","parseEnum","parseEnumValue","dummy","parseService","service","parseMethod","commentText","method","parseExtension","reference","fnIf","fnElse","trailingLine","parseGroup","lcFirst","ucFirst","isCustom","option","optionValue","substr","parseOptionValue","result","prevValue","concat","simpleValue","package","LongBits","indexOutOfRange","writeLength","RangeError","Buffer","isBuffer","create_array","readLongVarint","bits","readFixed32_end","readFixed64","_slice","subarray","uint32","int32","sint32","bool","fixed32","sfixed32","float","double","skipType","BufferReader_","merge","int64","uint64","sint64","zzDecode","fixed64","sfixed64","utf8Slice","min","deferred","files","SYNC","resolvePath","sync","finish","cb","getBundledFileName","idx","lastIndexOf","altname","process","parsed","queued","weak","setTimeout","readFileSync","isNode","exposeRe","tryHandleExtension","sisterField","extendedType","parse_","common_","rpcImpl","requestDelimited","responseDelimited","rpcCall","requestCtor","responseCtor","request","endedByRPC","_methodsArray","inherited","methodsArray","rpcService","methodName","isReserved","m","q","s","delimRe","stringDoubleRe","stringSingleRe","setCommentRe","setCommentAltRe","setCommentSplitRe","whitespaceRe","unescapeRe","unescapeMap","0","r","unescape","str","commentType","commentLine","commentLineEmpty","commentIsLeading","stack","stringDelim","subject","charAt","setComment","isLeading","commentOffset","lines","trim","isDoubleSlashCommentLine","startOffset","endOffset","findEndOfLine","lineText","cursor","re","match","lastIndex","exec","repeat","curr","isDoc","isLeadingComment","expected","actual","ret","_fieldsById","_oneofsArray","_ctor","fieldsById","oneofsArray","generateConstructor","ctorProperties","setup","originalThis","wrapper","fork","ldelim","typeName","bake","o","safePropBackslashRe","key","safePropQuoteRe","camelCaseRe","toUpperCase","decorateEnumIndex","a","decorateRoot","enumerable","dst","setProp","zero","zzEncode","zeroHash","from","fromString","toLong","fromHash","hash","toHash","mask","part0","part1","part2","src","newError","CustomError","captureStackTrace","pool","versions","node","window","isFinite","isset","isSet","utf8Write","_Buffer_from","_Buffer_allocUnsafe","sizeOrArray","dcodeIO","key2Re","key32Re","key64Re","longToHash","longFromHash","fromBits","ProtocolError","fieldMap","longs","enums","encoding","allocUnsafe","seenFirstField","oneofProp","invalid","genVerifyValue","messageName","Op","noop","State","tail","states","writeByte","VarintOp","writeVarint64","writeFixed32","_push","writeBytes","reset","BufferWriter_","writeStringBuffer","writeBytesBuffer","copy","byteLength"],"mappings":"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CAlI,MAAA,CACAiI,KAAA,QACAC,GAAA,CACA,CACA,CACA,CACA,CAAA,EAIAT,EAAA,WAAA,CAUAU,SAAAC,EAAA,CACAL,OAAA,CACAM,QAAA,CACAJ,KAAA,QACAC,GAAA,CACA,EACAI,MAAA,CACAL,KAAA,QACAC,GAAA,CACA,CACA,CACA,CACA,CAAA,EAEAT,EAAA,YAAA,CAUAc,UAAAH,CACA,CAAA,EAEAX,EAAA,QAAA,CAOAe,MAAA,CACAT,OAAA,EACA,CACA,CAAA,EAEAN,EAAA,SAAA,CASAgB,OAAA,CACAV,OAAA,CACAA,OAAA,CACAW,QAAA,SACAT,KAAA,QACAC,GAAA,CACA,CACA,CACA,EAeAS,MAAA,CACAC,OAAA,CACAC,KAAA,CACAC,MAAA,CACA,YACA,cACA,cACA,YACA,cACA,YAEA,CACA,EACAf,OAAA,CACAgB,UAAA,CACAd,KAAA,YACAC,GAAA,CACA,EACAc,YAAA,CACAf,KAAA,SACAC,GAAA,CACA,EACAe,YAAA,CACAhB,KAAA,SACAC,GAAA,CACA,EACAgB,UAAA,CACAjB,KAAA,OACAC,GAAA,CACA,EACAiB,YAAA,CACAlB,KAAA,SACAC,GAAA,CACA,EACAkB,UAAA,CACAnB,KAAA,YACAC,GAAA,CACA,CACA,CACA,EAEAmB,UAAA,CACAC,OAAA,CACAC,WAAA,CACA,CACA,EASAC,UAAA,CACAzB,OAAA,CACAuB,OAAA,CACAG,KAAA,WACAxB,KAAA,QACAC,GAAA,CACA,CACA,CACA,CACA,CAAA,EAEAT,EAAA,WAAA,CASAiC,YAAA,CACA3B,OAAA,CACA/H,MAAA,CACAiI,KAAA,SACAC,GAAA,CACA,CACA,CACA,EASAyB,WAAA,CACA5B,OAAA,CACA/H,MAAA,CACAiI,KAAA,QACAC,GAAA,CACA,CACA,CACA,EASA0B,WAAA,CACA7B,OAAA,CACA/H,MAAA,CACAiI,KAAA,QACAC,GAAA,CACA,CACA,CACA,EASA2B,YAAA,CACA9B,OAAA,CACA/H,MAAA,CACAiI,KAAA,SACAC,GAAA,CACA,CACA,CACA,EASA4B,WAAA,CACA/B,OAA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","file":"protobuf.min.js","sourcesContent":["(function prelude(modules, cache, entries) {\n\n    // This is the prelude used to bundle protobuf.js for the browser. Wraps up the CommonJS\n    // sources through a conflict-free require shim and is again wrapped within an iife that\n    // provides a minification-friendly `undefined` var plus a global \"use strict\" directive\n    // so that minification can remove the directives of each module.\n\n    function $require(name) {\n        var $module = cache[name];\n        if (!$module)\n            modules[name][0].call($module = cache[name] = { exports: {} }, $require, $module, $module.exports);\n        return $module.exports;\n    }\n\n    var protobuf = $require(entries[0]);\n\n    // Expose globally\n    protobuf.util.global.protobuf = protobuf;\n\n    // Be nice to AMD\n    if (typeof define === \"function\" && define.amd)\n        define([\"long\"], function(Long) {\n            if (Long && Long.isLong) {\n                protobuf.util.Long = Long;\n                protobuf.configure();\n            }\n            return protobuf;\n        });\n\n    // Be nice to CommonJS\n    if (typeof module === \"object\" && module && module.exports)\n        module.exports = protobuf;\n\n})/* end of prelude */","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n    var params  = new Array(arguments.length - 1),\r\n        offset  = 0,\r\n        index   = 2,\r\n        pending = true;\r\n    while (index < arguments.length)\r\n        params[offset++] = arguments[index++];\r\n    return new Promise(function executor(resolve, reject) {\r\n        params[offset] = function callback(err/*, varargs */) {\r\n            if (pending) {\r\n                pending = false;\r\n                if (err)\r\n                    reject(err);\r\n                else {\r\n                    var params = new Array(arguments.length - 1),\r\n                        offset = 0;\r\n                    while (offset < params.length)\r\n                        params[offset++] = arguments[offset];\r\n                    resolve.apply(null, params);\r\n                }\r\n            }\r\n        };\r\n        try {\r\n            fn.apply(ctx || null, params);\r\n        } catch (err) {\r\n            if (pending) {\r\n                pending = false;\r\n                reject(err);\r\n            }\r\n        }\r\n    });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n    var p = string.length;\r\n    if (!p)\r\n        return 0;\r\n    var n = 0;\r\n    while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n        ++n;\r\n    return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n    s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n    var parts = null,\r\n        chunk = [];\r\n    var i = 0, // output index\r\n        j = 0, // goto index\r\n        t;     // temporary\r\n    while (start < end) {\r\n        var b = buffer[start++];\r\n        switch (j) {\r\n            case 0:\r\n                chunk[i++] = b64[b >> 2];\r\n                t = (b & 3) << 4;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                chunk[i++] = b64[t | b >> 4];\r\n                t = (b & 15) << 2;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                chunk[i++] = b64[t | b >> 6];\r\n                chunk[i++] = b64[b & 63];\r\n                j = 0;\r\n                break;\r\n        }\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (j) {\r\n        chunk[i++] = b64[t];\r\n        chunk[i++] = 61;\r\n        if (j === 1)\r\n            chunk[i++] = 61;\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n    var start = offset;\r\n    var j = 0, // goto index\r\n        t;     // temporary\r\n    for (var i = 0; i < string.length;) {\r\n        var c = string.charCodeAt(i++);\r\n        if (c === 61 && j > 1)\r\n            break;\r\n        if ((c = s64[c]) === undefined)\r\n            throw Error(invalidEncoding);\r\n        switch (j) {\r\n            case 0:\r\n                t = c;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n                t = c;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n                t = c;\r\n                j = 3;\r\n                break;\r\n            case 3:\r\n                buffer[offset++] = (t & 3) << 6 | c;\r\n                j = 0;\r\n                break;\r\n        }\r\n    }\r\n    if (j === 1)\r\n        throw Error(invalidEncoding);\r\n    return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n    return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = codegen;\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @param {string[]} functionParams Function parameter names\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n */\r\nfunction codegen(functionParams, functionName) {\r\n\r\n    /* istanbul ignore if */\r\n    if (typeof functionParams === \"string\") {\r\n        functionName = functionParams;\r\n        functionParams = undefined;\r\n    }\r\n\r\n    var body = [];\r\n\r\n    /**\r\n     * Appends code to the function's body or finishes generation.\r\n     * @typedef Codegen\r\n     * @type {function}\r\n     * @param {string|Object.<string,*>} [formatStringOrScope] Format string or, to finish the function, an object of additional scope variables, if any\r\n     * @param {...*} [formatParams] Format parameters\r\n     * @returns {Codegen|Function} Itself or the generated function if finished\r\n     * @throws {Error} If format parameter counts do not match\r\n     */\r\n\r\n    function Codegen(formatStringOrScope) {\r\n        // note that explicit array handling below makes this ~50% faster\r\n\r\n        // finish the function\r\n        if (typeof formatStringOrScope !== \"string\") {\r\n            var source = toString();\r\n            if (codegen.verbose)\r\n                console.log(\"codegen: \" + source); // eslint-disable-line no-console\r\n            source = \"return \" + source;\r\n            if (formatStringOrScope) {\r\n                var scopeKeys   = Object.keys(formatStringOrScope),\r\n                    scopeParams = new Array(scopeKeys.length + 1),\r\n                    scopeValues = new Array(scopeKeys.length),\r\n                    scopeOffset = 0;\r\n                while (scopeOffset < scopeKeys.length) {\r\n                    scopeParams[scopeOffset] = scopeKeys[scopeOffset];\r\n                    scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]];\r\n                }\r\n                scopeParams[scopeOffset] = source;\r\n                return Function.apply(null, scopeParams).apply(null, scopeValues); // eslint-disable-line no-new-func\r\n            }\r\n            return Function(source)(); // eslint-disable-line no-new-func\r\n        }\r\n\r\n        // otherwise append to body\r\n        var formatParams = new Array(arguments.length - 1),\r\n            formatOffset = 0;\r\n        while (formatOffset < formatParams.length)\r\n            formatParams[formatOffset] = arguments[++formatOffset];\r\n        formatOffset = 0;\r\n        formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) {\r\n            var value = formatParams[formatOffset++];\r\n            switch ($1) {\r\n                case \"d\": case \"f\": return String(Number(value));\r\n                case \"i\": return String(Math.floor(value));\r\n                case \"j\": return JSON.stringify(value);\r\n                case \"s\": return String(value);\r\n            }\r\n            return \"%\";\r\n        });\r\n        if (formatOffset !== formatParams.length)\r\n            throw Error(\"parameter count mismatch\");\r\n        body.push(formatStringOrScope);\r\n        return Codegen;\r\n    }\r\n\r\n    function toString(functionNameOverride) {\r\n        return \"function \" + (functionNameOverride || functionName || \"\") + \"(\" + (functionParams && functionParams.join(\",\") || \"\") + \"){\\n  \" + body.join(\"\\n  \") + \"\\n}\";\r\n    }\r\n\r\n    Codegen.toString = toString;\r\n    return Codegen;\r\n}\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @function codegen\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * When set to `true`, codegen will log generated code to console. Useful for debugging.\r\n * @name util.codegen.verbose\r\n * @type {boolean}\r\n */\r\ncodegen.verbose = false;\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n    /**\r\n     * Registered listeners.\r\n     * @type {Object.<string,*>}\r\n     * @private\r\n     */\r\n    this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n    (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n        fn  : fn,\r\n        ctx : ctx || this\r\n    });\r\n    return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n    if (evt === undefined)\r\n        this._listeners = {};\r\n    else {\r\n        if (fn === undefined)\r\n            this._listeners[evt] = [];\r\n        else {\r\n            var listeners = this._listeners[evt];\r\n            for (var i = 0; i < listeners.length;)\r\n                if (listeners[i].fn === fn)\r\n                    listeners.splice(i, 1);\r\n                else\r\n                    ++i;\r\n        }\r\n    }\r\n    return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n    var listeners = this._listeners[evt];\r\n    if (listeners) {\r\n        var args = [],\r\n            i = 1;\r\n        for (; i < arguments.length;)\r\n            args.push(arguments[i++]);\r\n        for (i = 0; i < listeners.length;)\r\n            listeners[i].fn.apply(listeners[i++].ctx, args);\r\n    }\r\n    return this;\r\n};\r\n","\"use strict\";\r\nmodule.exports = fetch;\r\n\r\nvar asPromise = require(1),\r\n    inquire   = require(7);\r\n\r\nvar fs = inquire(\"fs\");\r\n\r\n/**\r\n * Node-style callback as used by {@link util.fetch}.\r\n * @typedef FetchCallback\r\n * @type {function}\r\n * @param {?Error} error Error, if any, otherwise `null`\r\n * @param {string} [contents] File contents, if there hasn't been an error\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Options as used by {@link util.fetch}.\r\n * @typedef FetchOptions\r\n * @type {Object}\r\n * @property {boolean} [binary=false] Whether expecting a binary response\r\n * @property {boolean} [xhr=false] If `true`, forces the use of XMLHttpRequest\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @memberof util\r\n * @param {string} filename File path or url\r\n * @param {FetchOptions} options Fetch options\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n */\r\nfunction fetch(filename, options, callback) {\r\n    if (typeof options === \"function\") {\r\n        callback = options;\r\n        options = {};\r\n    } else if (!options)\r\n        options = {};\r\n\r\n    if (!callback)\r\n        return asPromise(fetch, this, filename, options); // eslint-disable-line no-invalid-this\r\n\r\n    // if a node-like filesystem is present, try it first but fall back to XHR if nothing is found.\r\n    if (!options.xhr && fs && fs.readFile)\r\n        return fs.readFile(filename, function fetchReadFileCallback(err, contents) {\r\n            return err && typeof XMLHttpRequest !== \"undefined\"\r\n                ? fetch.xhr(filename, options, callback)\r\n                : err\r\n                ? callback(err)\r\n                : callback(null, options.binary ? contents : contents.toString(\"utf8\"));\r\n        });\r\n\r\n    // use the XHR version otherwise.\r\n    return fetch.xhr(filename, options, callback);\r\n}\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchOptions} [options] Fetch options\r\n * @returns {Promise<string|Uint8Array>} Promise\r\n * @variation 3\r\n */\r\n\r\n/**/\r\nfetch.xhr = function fetch_xhr(filename, options, callback) {\r\n    var xhr = new XMLHttpRequest();\r\n    xhr.onreadystatechange /* works everywhere */ = function fetchOnReadyStateChange() {\r\n\r\n        if (xhr.readyState !== 4)\r\n            return undefined;\r\n\r\n        // local cors security errors return status 0 / empty string, too. afaik this cannot be\r\n        // reliably distinguished from an actually empty file for security reasons. feel free\r\n        // to send a pull request if you are aware of a solution.\r\n        if (xhr.status !== 0 && xhr.status !== 200)\r\n            return callback(Error(\"status \" + xhr.status));\r\n\r\n        // if binary data is expected, make sure that some sort of array is returned, even if\r\n        // ArrayBuffers are not supported. the binary string fallback, however, is unsafe.\r\n        if (options.binary) {\r\n            var buffer = xhr.response;\r\n            if (!buffer) {\r\n                buffer = [];\r\n                for (var i = 0; i < xhr.responseText.length; ++i)\r\n                    buffer.push(xhr.responseText.charCodeAt(i) & 255);\r\n            }\r\n            return callback(null, typeof Uint8Array !== \"undefined\" ? new Uint8Array(buffer) : buffer);\r\n        }\r\n        return callback(null, xhr.responseText);\r\n    };\r\n\r\n    if (options.binary) {\r\n        // ref: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers\r\n        if (\"overrideMimeType\" in xhr)\r\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\r\n        xhr.responseType = \"arraybuffer\";\r\n    }\r\n\r\n    xhr.open(\"GET\", filename);\r\n    xhr.send();\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n    // float: typed array\r\n    if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n        var f32 = new Float32Array([ -0 ]),\r\n            f8b = new Uint8Array(f32.buffer),\r\n            le  = f8b[3] === 128;\r\n\r\n        function writeFloat_f32_cpy(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n        }\r\n\r\n        function writeFloat_f32_rev(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[3];\r\n            buf[pos + 1] = f8b[2];\r\n            buf[pos + 2] = f8b[1];\r\n            buf[pos + 3] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n        function readFloat_f32_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        function readFloat_f32_rev(buf, pos) {\r\n            f8b[3] = buf[pos    ];\r\n            f8b[2] = buf[pos + 1];\r\n            f8b[1] = buf[pos + 2];\r\n            f8b[0] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n    // float: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0)\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n            else if (isNaN(val))\r\n                writeUint(2143289344, buf, pos);\r\n            else if (val > 3.4028234663852886e+38) // +-Infinity\r\n                writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n            else if (val < 1.1754943508222875e-38) // denormal\r\n                writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n            else {\r\n                var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n                    mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n                writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n            }\r\n        }\r\n\r\n        exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n        exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n        function readFloat_ieee754(readUint, buf, pos) {\r\n            var uint = readUint(buf, pos),\r\n                sign = (uint >> 31) * 2 + 1,\r\n                exponent = uint >>> 23 & 255,\r\n                mantissa = uint & 8388607;\r\n            return exponent === 255\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 1.401298464324817e-45 * mantissa\r\n                : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n        }\r\n\r\n        exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n        exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n    })();\r\n\r\n    // double: typed array\r\n    if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n        var f64 = new Float64Array([-0]),\r\n            f8b = new Uint8Array(f64.buffer),\r\n            le  = f8b[7] === 128;\r\n\r\n        function writeDouble_f64_cpy(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n            buf[pos + 4] = f8b[4];\r\n            buf[pos + 5] = f8b[5];\r\n            buf[pos + 6] = f8b[6];\r\n            buf[pos + 7] = f8b[7];\r\n        }\r\n\r\n        function writeDouble_f64_rev(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[7];\r\n            buf[pos + 1] = f8b[6];\r\n            buf[pos + 2] = f8b[5];\r\n            buf[pos + 3] = f8b[4];\r\n            buf[pos + 4] = f8b[3];\r\n            buf[pos + 5] = f8b[2];\r\n            buf[pos + 6] = f8b[1];\r\n            buf[pos + 7] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n        function readDouble_f64_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            f8b[4] = buf[pos + 4];\r\n            f8b[5] = buf[pos + 5];\r\n            f8b[6] = buf[pos + 6];\r\n            f8b[7] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        function readDouble_f64_rev(buf, pos) {\r\n            f8b[7] = buf[pos    ];\r\n            f8b[6] = buf[pos + 1];\r\n            f8b[5] = buf[pos + 2];\r\n            f8b[4] = buf[pos + 3];\r\n            f8b[3] = buf[pos + 4];\r\n            f8b[2] = buf[pos + 5];\r\n            f8b[1] = buf[pos + 6];\r\n            f8b[0] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n    // double: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n            } else if (isNaN(val)) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(2146959360, buf, pos + off1);\r\n            } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n            } else {\r\n                var mantissa;\r\n                if (val < 2.2250738585072014e-308) { // denormal\r\n                    mantissa = val / 5e-324;\r\n                    writeUint(mantissa >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n                } else {\r\n                    var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n                    if (exponent === 1024)\r\n                        exponent = 1023;\r\n                    mantissa = val * Math.pow(2, -exponent);\r\n                    writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n                }\r\n            }\r\n        }\r\n\r\n        exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n        exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n        function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n            var lo = readUint(buf, pos + off0),\r\n                hi = readUint(buf, pos + off1);\r\n            var sign = (hi >> 31) * 2 + 1,\r\n                exponent = hi >>> 20 & 2047,\r\n                mantissa = 4294967296 * (hi & 1048575) + lo;\r\n            return exponent === 2047\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 5e-324 * mantissa\r\n                : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n        }\r\n\r\n        exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n        exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n    })();\r\n\r\n    return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n    buf[pos    ] =  val        & 255;\r\n    buf[pos + 1] =  val >>> 8  & 255;\r\n    buf[pos + 2] =  val >>> 16 & 255;\r\n    buf[pos + 3] =  val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n    buf[pos    ] =  val >>> 24;\r\n    buf[pos + 1] =  val >>> 16 & 255;\r\n    buf[pos + 2] =  val >>> 8  & 255;\r\n    buf[pos + 3] =  val        & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n    return (buf[pos    ]\r\n          | buf[pos + 1] << 8\r\n          | buf[pos + 2] << 16\r\n          | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n    return (buf[pos    ] << 24\r\n          | buf[pos + 1] << 16\r\n          | buf[pos + 2] << 8\r\n          | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\nmodule.exports = inquire;\n\n/**\n * Requires a module only if available.\n * @memberof util\n * @param {string} moduleName Module to require\n * @returns {?Object} Required module if available and not empty, otherwise `null`\n */\nfunction inquire(moduleName) {\n    try {\n    \tif (self.trustedTypes && self.trustedTypes.createPolicy) {\n    \t\tconst escapeScriptPolicy = trustedTypes.createPolicy(\"myEscapePolicy\", {\n    \t\t\tcreateScript: (string) => \"require \" + string,\n    \t\t});\n    \t\tsafeScript = escapeScriptPolicy.createScript(moduleName);\n    \t\tvar mod = eval(safeScript);\n    \t} else {\n    \t\tvar mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\n    \t}\n\n        if (mod && (mod.length || Object.keys(mod).length))\n            return mod;\n    } catch (e) {} // eslint-disable-line no-empty\n    return null;\n}\n\n/*\n// maybe worth a shot to prevent renaming issues:\n// see: https://github.com/webpack/webpack/blob/master/lib/dependencies/CommonJsRequireDependencyParserPlugin.js\n// triggers on:\n// - expression require.cache\n// - expression require (???)\n// - call require\n// - call require:commonjs:item\n// - call require:commonjs:context\n\nObject.defineProperty(Function.prototype, \"__self\", { get: function() { return this; } });\nvar r = require.__self;\ndelete Function.prototype.__self;\n*/\n","\"use strict\";\r\n\r\n/**\r\n * A minimal path module to resolve Unix, Windows and URL paths alike.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar path = exports;\r\n\r\nvar isAbsolute =\r\n/**\r\n * Tests if the specified path is absolute.\r\n * @param {string} path Path to test\r\n * @returns {boolean} `true` if path is absolute\r\n */\r\npath.isAbsolute = function isAbsolute(path) {\r\n    return /^(?:\\/|\\w+:)/.test(path);\r\n};\r\n\r\nvar normalize =\r\n/**\r\n * Normalizes the specified path.\r\n * @param {string} path Path to normalize\r\n * @returns {string} Normalized path\r\n */\r\npath.normalize = function normalize(path) {\r\n    path = path.replace(/\\\\/g, \"/\")\r\n               .replace(/\\/{2,}/g, \"/\");\r\n    var parts    = path.split(\"/\"),\r\n        absolute = isAbsolute(path),\r\n        prefix   = \"\";\r\n    if (absolute)\r\n        prefix = parts.shift() + \"/\";\r\n    for (var i = 0; i < parts.length;) {\r\n        if (parts[i] === \"..\") {\r\n            if (i > 0 && parts[i - 1] !== \"..\")\r\n                parts.splice(--i, 2);\r\n            else if (absolute)\r\n                parts.splice(i, 1);\r\n            else\r\n                ++i;\r\n        } else if (parts[i] === \".\")\r\n            parts.splice(i, 1);\r\n        else\r\n            ++i;\r\n    }\r\n    return prefix + parts.join(\"/\");\r\n};\r\n\r\n/**\r\n * Resolves the specified include path against the specified origin path.\r\n * @param {string} originPath Path to the origin file\r\n * @param {string} includePath Include path relative to origin path\r\n * @param {boolean} [alreadyNormalized=false] `true` if both paths are already known to be normalized\r\n * @returns {string} Path to the include file\r\n */\r\npath.resolve = function resolve(originPath, includePath, alreadyNormalized) {\r\n    if (!alreadyNormalized)\r\n        includePath = normalize(includePath);\r\n    if (isAbsolute(includePath))\r\n        return includePath;\r\n    if (!alreadyNormalized)\r\n        originPath = normalize(originPath);\r\n    return (originPath = originPath.replace(/(?:\\/|^)[^/]+$/, \"\")).length ? normalize(originPath + \"/\" + includePath) : includePath;\r\n};\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n    var SIZE   = size || 8192;\r\n    var MAX    = SIZE >>> 1;\r\n    var slab   = null;\r\n    var offset = SIZE;\r\n    return function pool_alloc(size) {\r\n        if (size < 1 || size > MAX)\r\n            return alloc(size);\r\n        if (offset + size > SIZE) {\r\n            slab = alloc(SIZE);\r\n            offset = 0;\r\n        }\r\n        var buf = slice.call(slab, offset, offset += size);\r\n        if (offset & 7) // align to 32 bit\r\n            offset = (offset | 7) + 1;\r\n        return buf;\r\n    };\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n    var len = 0,\r\n        c = 0;\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c = string.charCodeAt(i);\r\n        if (c < 128)\r\n            len += 1;\r\n        else if (c < 2048)\r\n            len += 2;\r\n        else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n            ++i;\r\n            len += 4;\r\n        } else\r\n            len += 3;\r\n    }\r\n    return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n    var len = end - start;\r\n    if (len < 1)\r\n        return \"\";\r\n    var parts = null,\r\n        chunk = [],\r\n        i = 0, // char offset\r\n        t;     // temporary\r\n    while (start < end) {\r\n        t = buffer[start++];\r\n        if (t < 128)\r\n            chunk[i++] = t;\r\n        else if (t > 191 && t < 224)\r\n            chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n        else if (t > 239 && t < 365) {\r\n            t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n            chunk[i++] = 0xD800 + (t >> 10);\r\n            chunk[i++] = 0xDC00 + (t & 1023);\r\n        } else\r\n            chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n    var start = offset,\r\n        c1, // character 1\r\n        c2; // character 2\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c1 = string.charCodeAt(i);\r\n        if (c1 < 128) {\r\n            buffer[offset++] = c1;\r\n        } else if (c1 < 2048) {\r\n            buffer[offset++] = c1 >> 6       | 192;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n            c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n            ++i;\r\n            buffer[offset++] = c1 >> 18      | 240;\r\n            buffer[offset++] = c1 >> 12 & 63 | 128;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else {\r\n            buffer[offset++] = c1 >> 12      | 224;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        }\r\n    }\r\n    return offset - start;\r\n};\r\n","\"use strict\";\nmodule.exports = common;\n\nvar commonRe = /\\/|\\./;\n\n/**\n * Provides common type definitions.\n * Can also be used to provide additional google types or your own custom types.\n * @param {string} name Short name as in `google/protobuf/[name].proto` or full file name\n * @param {Object.<string,*>} json JSON definition within `google.protobuf` if a short name, otherwise the file's root definition\n * @returns {undefined}\n * @property {INamespace} google/protobuf/any.proto Any\n * @property {INamespace} google/protobuf/duration.proto Duration\n * @property {INamespace} google/protobuf/empty.proto Empty\n * @property {INamespace} google/protobuf/field_mask.proto FieldMask\n * @property {INamespace} google/protobuf/struct.proto Struct, Value, NullValue and ListValue\n * @property {INamespace} google/protobuf/timestamp.proto Timestamp\n * @property {INamespace} google/protobuf/wrappers.proto Wrappers\n * @example\n * // manually provides descriptor.proto (assumes google/protobuf/ namespace and .proto extension)\n * protobuf.common(\"descriptor\", descriptorJson);\n *\n * // manually provides a custom definition (uses my.foo namespace)\n * protobuf.common(\"my/foo/bar.proto\", myFooBarJson);\n */\nfunction common(name, json) {\n    if (!commonRe.test(name)) {\n        name = \"google/protobuf/\" + name + \".proto\";\n        json = { nested: { google: { nested: { protobuf: { nested: json } } } } };\n    }\n    common[name] = json;\n}\n\n// Not provided because of limited use (feel free to discuss or to provide yourself):\n//\n// google/protobuf/descriptor.proto\n// google/protobuf/source_context.proto\n// google/protobuf/type.proto\n//\n// Stripped and pre-parsed versions of these non-bundled files are instead available as part of\n// the repository or package within the google/protobuf directory.\n\ncommon(\"any\", {\n\n    /**\n     * Properties of a google.protobuf.Any message.\n     * @interface IAny\n     * @type {Object}\n     * @property {string} [typeUrl]\n     * @property {Uint8Array} [bytes]\n     * @memberof common\n     */\n    Any: {\n        fields: {\n            type_url: {\n                type: \"string\",\n                id: 1\n            },\n            value: {\n                type: \"bytes\",\n                id: 2\n            }\n        }\n    }\n});\n\nvar timeType;\n\ncommon(\"duration\", {\n\n    /**\n     * Properties of a google.protobuf.Duration message.\n     * @interface IDuration\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Duration: timeType = {\n        fields: {\n            seconds: {\n                type: \"int64\",\n                id: 1\n            },\n            nanos: {\n                type: \"int32\",\n                id: 2\n            }\n        }\n    }\n});\n\ncommon(\"timestamp\", {\n\n    /**\n     * Properties of a google.protobuf.Timestamp message.\n     * @interface ITimestamp\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Timestamp: timeType\n});\n\ncommon(\"empty\", {\n\n    /**\n     * Properties of a google.protobuf.Empty message.\n     * @interface IEmpty\n     * @memberof common\n     */\n    Empty: {\n        fields: {}\n    }\n});\n\ncommon(\"struct\", {\n\n    /**\n     * Properties of a google.protobuf.Struct message.\n     * @interface IStruct\n     * @type {Object}\n     * @property {Object.<string,IValue>} [fields]\n     * @memberof common\n     */\n    Struct: {\n        fields: {\n            fields: {\n                keyType: \"string\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Value message.\n     * @interface IValue\n     * @type {Object}\n     * @property {string} [kind]\n     * @property {0} [nullValue]\n     * @property {number} [numberValue]\n     * @property {string} [stringValue]\n     * @property {boolean} [boolValue]\n     * @property {IStruct} [structValue]\n     * @property {IListValue} [listValue]\n     * @memberof common\n     */\n    Value: {\n        oneofs: {\n            kind: {\n                oneof: [\n                    \"nullValue\",\n                    \"numberValue\",\n                    \"stringValue\",\n                    \"boolValue\",\n                    \"structValue\",\n                    \"listValue\"\n                ]\n            }\n        },\n        fields: {\n            nullValue: {\n                type: \"NullValue\",\n                id: 1\n            },\n            numberValue: {\n                type: \"double\",\n                id: 2\n            },\n            stringValue: {\n                type: \"string\",\n                id: 3\n            },\n            boolValue: {\n                type: \"bool\",\n                id: 4\n            },\n            structValue: {\n                type: \"Struct\",\n                id: 5\n            },\n            listValue: {\n                type: \"ListValue\",\n                id: 6\n            }\n        }\n    },\n\n    NullValue: {\n        values: {\n            NULL_VALUE: 0\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.ListValue message.\n     * @interface IListValue\n     * @type {Object}\n     * @property {Array.<IValue>} [values]\n     * @memberof common\n     */\n    ListValue: {\n        fields: {\n            values: {\n                rule: \"repeated\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"wrappers\", {\n\n    /**\n     * Properties of a google.protobuf.DoubleValue message.\n     * @interface IDoubleValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    DoubleValue: {\n        fields: {\n            value: {\n                type: \"double\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.FloatValue message.\n     * @interface IFloatValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    FloatValue: {\n        fields: {\n            value: {\n                type: \"float\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int64Value message.\n     * @interface IInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    Int64Value: {\n        fields: {\n            value: {\n                type: \"int64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt64Value message.\n     * @interface IUInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    UInt64Value: {\n        fields: {\n            value: {\n                type: \"uint64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int32Value message.\n     * @interface IInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    Int32Value: {\n        fields: {\n            value: {\n                type: \"int32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt32Value message.\n     * @interface IUInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    UInt32Value: {\n        fields: {\n            value: {\n                type: \"uint32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BoolValue message.\n     * @interface IBoolValue\n     * @type {Object}\n     * @property {boolean} [value]\n     * @memberof common\n     */\n    BoolValue: {\n        fields: {\n            value: {\n                type: \"bool\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.StringValue message.\n     * @interface IStringValue\n     * @type {Object}\n     * @property {string} [value]\n     * @memberof common\n     */\n    StringValue: {\n        fields: {\n            value: {\n                type: \"string\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BytesValue message.\n     * @interface IBytesValue\n     * @type {Object}\n     * @property {Uint8Array} [value]\n     * @memberof common\n     */\n    BytesValue: {\n        fields: {\n            value: {\n                type: \"bytes\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"field_mask\", {\n\n    /**\n     * Properties of a google.protobuf.FieldMask message.\n     * @interface IDoubleValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    FieldMask: {\n        fields: {\n            paths: {\n                rule: \"repeated\",\n                type: \"string\",\n                id: 1\n            }\n        }\n    }\n});\n\n/**\n * Gets the root definition of the specified common proto file.\n *\n * Bundled definitions are:\n * - google/protobuf/any.proto\n * - google/protobuf/duration.proto\n * - google/protobuf/empty.proto\n * - google/protobuf/field_mask.proto\n * - google/protobuf/struct.proto\n * - google/protobuf/timestamp.proto\n * - google/protobuf/wrappers.proto\n *\n * @param {string} file Proto file name\n * @returns {INamespace|null} Root definition or `null` if not defined\n */\ncommon.get = function get(file) {\n    return common[file] || null;\n};\n","\"use strict\";\n/**\n * Runtime message from/to plain object converters.\n * @namespace\n */\nvar converter = exports;\n\nvar Enum = require(15),\n    util = require(37);\n\n/**\n * Generates a partial value fromObject conveter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} prop Property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_fromObject(gen, field, fieldIndex, prop) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) { gen\n            (\"switch(d%s){\", prop);\n            for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) {\n                if (field.repeated && values[keys[i]] === field.typeDefault) gen\n                (\"default:\");\n                gen\n                (\"case%j:\", keys[i])\n                (\"case %i:\", values[keys[i]])\n                    (\"m%s=%j\", prop, values[keys[i]])\n                    (\"break\");\n            } gen\n            (\"}\");\n        } else gen\n            (\"if(typeof d%s!==\\\"object\\\")\", prop)\n                (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n            (\"m%s=types[%i].fromObject(d%s)\", prop, fieldIndex, prop);\n    } else {\n        var isUnsigned = false;\n        switch (field.type) {\n            case \"double\":\n            case \"float\": gen\n                (\"m%s=Number(d%s)\", prop, prop); // also catches \"NaN\", \"Infinity\"\n                break;\n            case \"uint32\":\n            case \"fixed32\": gen\n                (\"m%s=d%s>>>0\", prop, prop);\n                break;\n            case \"int32\":\n            case \"sint32\":\n            case \"sfixed32\": gen\n                (\"m%s=d%s|0\", prop, prop);\n                break;\n            case \"uint64\":\n                isUnsigned = true;\n                // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n                (\"if(util.Long)\")\n                    (\"(m%s=util.Long.fromValue(d%s)).unsigned=%j\", prop, prop, isUnsigned)\n                (\"else if(typeof d%s===\\\"string\\\")\", prop)\n                    (\"m%s=parseInt(d%s,10)\", prop, prop)\n                (\"else if(typeof d%s===\\\"number\\\")\", prop)\n                    (\"m%s=d%s\", prop, prop)\n                (\"else if(typeof d%s===\\\"object\\\")\", prop)\n                    (\"m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)\", prop, prop, prop, isUnsigned ? \"true\" : \"\");\n                break;\n            case \"bytes\": gen\n                (\"if(typeof d%s===\\\"string\\\")\", prop)\n                    (\"util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)\", prop, prop, prop)\n                (\"else if(d%s.length)\", prop)\n                    (\"m%s=d%s\", prop, prop);\n                break;\n            case \"string\": gen\n                (\"m%s=String(d%s)\", prop, prop);\n                break;\n            case \"bool\": gen\n                (\"m%s=Boolean(d%s)\", prop, prop);\n                break;\n            /* default: gen\n                (\"m%s=d%s\", prop, prop);\n                break; */\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a plain object to runtime message converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.fromObject = function fromObject(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var fields = mtype.fieldsArray;\n    var gen = util.codegen([\"d\"], mtype.name + \"$fromObject\")\n    (\"if(d instanceof this.ctor)\")\n        (\"return d\");\n    if (!fields.length) return gen\n    (\"return new this.ctor\");\n    gen\n    (\"var m=new this.ctor\");\n    for (var i = 0; i < fields.length; ++i) {\n        var field  = fields[i].resolve(),\n            prop   = util.safeProp(field.name);\n\n        // Map fields\n        if (field.map) { gen\n    (\"if(d%s){\", prop)\n        (\"if(typeof d%s!==\\\"object\\\")\", prop)\n            (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n        (\"m%s={}\", prop)\n        (\"for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){\", prop);\n            genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[ks[i]]\")\n        (\"}\")\n    (\"}\");\n\n        // Repeated fields\n        } else if (field.repeated) { gen\n    (\"if(d%s){\", prop)\n        (\"if(!Array.isArray(d%s))\", prop)\n            (\"throw TypeError(%j)\", field.fullName + \": array expected\")\n        (\"m%s=[]\", prop)\n        (\"for(var i=0;i<d%s.length;++i){\", prop);\n            genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[i]\")\n        (\"}\")\n    (\"}\");\n\n        // Non-repeated fields\n        } else {\n            if (!(field.resolvedType instanceof Enum)) gen // no need to test for null/undefined if an enum (uses switch)\n    (\"if(d%s!=null){\", prop); // !== undefined && !== null\n        genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);\n            if (!(field.resolvedType instanceof Enum)) gen\n    (\"}\");\n        }\n    } return gen\n    (\"return m\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n\n/**\n * Generates a partial value toObject converter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} prop Property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_toObject(gen, field, fieldIndex, prop) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) gen\n            (\"d%s=o.enums===String?types[%i].values[m%s]:m%s\", prop, fieldIndex, prop, prop);\n        else gen\n            (\"d%s=types[%i].toObject(m%s,o)\", prop, fieldIndex, prop);\n    } else {\n        var isUnsigned = false;\n        switch (field.type) {\n            case \"double\":\n            case \"float\": gen\n            (\"d%s=o.json&&!isFinite(m%s)?String(m%s):m%s\", prop, prop, prop, prop);\n                break;\n            case \"uint64\":\n                isUnsigned = true;\n                // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n            (\"if(typeof m%s===\\\"number\\\")\", prop)\n                (\"d%s=o.longs===String?String(m%s):m%s\", prop, prop, prop)\n            (\"else\") // Long-like\n                (\"d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s\", prop, prop, prop, prop, isUnsigned ? \"true\": \"\", prop);\n                break;\n            case \"bytes\": gen\n            (\"d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s\", prop, prop, prop, prop, prop);\n                break;\n            default: gen\n            (\"d%s=m%s\", prop, prop);\n                break;\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a runtime message to plain object converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.toObject = function toObject(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);\n    if (!fields.length)\n        return util.codegen()(\"return {}\");\n    var gen = util.codegen([\"m\", \"o\"], mtype.name + \"$toObject\")\n    (\"if(!o)\")\n        (\"o={}\")\n    (\"var d={}\");\n\n    var repeatedFields = [],\n        mapFields = [],\n        normalFields = [],\n        i = 0;\n    for (; i < fields.length; ++i)\n        if (!fields[i].partOf)\n            ( fields[i].resolve().repeated ? repeatedFields\n            : fields[i].map ? mapFields\n            : normalFields).push(fields[i]);\n\n    if (repeatedFields.length) { gen\n    (\"if(o.arrays||o.defaults){\");\n        for (i = 0; i < repeatedFields.length; ++i) gen\n        (\"d%s=[]\", util.safeProp(repeatedFields[i].name));\n        gen\n    (\"}\");\n    }\n\n    if (mapFields.length) { gen\n    (\"if(o.objects||o.defaults){\");\n        for (i = 0; i < mapFields.length; ++i) gen\n        (\"d%s={}\", util.safeProp(mapFields[i].name));\n        gen\n    (\"}\");\n    }\n\n    if (normalFields.length) { gen\n    (\"if(o.defaults){\");\n        for (i = 0; i < normalFields.length; ++i) {\n            var field = normalFields[i],\n                prop  = util.safeProp(field.name);\n            if (field.resolvedType instanceof Enum) gen\n        (\"d%s=o.enums===String?%j:%j\", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault);\n            else if (field.long) gen\n        (\"if(util.Long){\")\n            (\"var n=new util.Long(%i,%i,%j)\", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)\n            (\"d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n\", prop)\n        (\"}else\")\n            (\"d%s=o.longs===String?%j:%i\", prop, field.typeDefault.toString(), field.typeDefault.toNumber());\n            else if (field.bytes) {\n                var arrayDefault = \"[\" + Array.prototype.slice.call(field.typeDefault).join(\",\") + \"]\";\n                gen\n        (\"if(o.bytes===String)d%s=%j\", prop, String.fromCharCode.apply(String, field.typeDefault))\n        (\"else{\")\n            (\"d%s=%s\", prop, arrayDefault)\n            (\"if(o.bytes!==Array)d%s=util.newBuffer(d%s)\", prop, prop)\n        (\"}\");\n            } else gen\n        (\"d%s=%j\", prop, field.typeDefault); // also messages (=null)\n        } gen\n    (\"}\");\n    }\n    var hasKs2 = false;\n    for (i = 0; i < fields.length; ++i) {\n        var field = fields[i],\n            index = mtype._fieldsArray.indexOf(field),\n            prop  = util.safeProp(field.name);\n        if (field.map) {\n            if (!hasKs2) { hasKs2 = true; gen\n    (\"var ks2\");\n            } gen\n    (\"if(m%s&&(ks2=Object.keys(m%s)).length){\", prop, prop)\n        (\"d%s={}\", prop)\n        (\"for(var j=0;j<ks2.length;++j){\");\n            genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[ks2[j]]\")\n        (\"}\");\n        } else if (field.repeated) { gen\n    (\"if(m%s&&m%s.length){\", prop, prop)\n        (\"d%s=[]\", prop)\n        (\"for(var j=0;j<m%s.length;++j){\", prop);\n            genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[j]\")\n        (\"}\");\n        } else { gen\n    (\"if(m%s!=null&&m.hasOwnProperty(%j)){\", prop, field.name); // !== undefined && !== null\n        genValuePartial_toObject(gen, field, /* sorted */ index, prop);\n        if (field.partOf) gen\n        (\"if(o.oneofs)\")\n            (\"d%s=%j\", util.safeProp(field.partOf.name), field.name);\n        }\n        gen\n    (\"}\");\n    }\n    return gen\n    (\"return d\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n","\"use strict\";\nmodule.exports = decoder;\n\nvar Enum    = require(15),\n    types   = require(36),\n    util    = require(37);\n\nfunction missing(field) {\n    return \"missing required '\" + field.name + \"'\";\n}\n\n/**\n * Generates a decoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction decoder(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n    var gen = util.codegen([\"r\", \"l\"], mtype.name + \"$decode\")\n    (\"if(!(r instanceof Reader))\")\n        (\"r=Reader.create(r)\")\n    (\"var c=l===undefined?r.len:r.pos+l,m=new this.ctor\" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? \",k,value\" : \"\"))\n    (\"while(r.pos<c){\")\n        (\"var t=r.uint32()\");\n    if (mtype.group) gen\n        (\"if((t&7)===4)\")\n            (\"break\");\n    gen\n        (\"switch(t>>>3){\");\n\n    var i = 0;\n    for (; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n        var field = mtype._fieldsArray[i].resolve(),\n            type  = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n            ref   = \"m\" + util.safeProp(field.name); gen\n            (\"case %i:\", field.id);\n\n        // Map fields\n        if (field.map) { gen\n                (\"if(%s===util.emptyObject)\", ref)\n                    (\"%s={}\", ref)\n                (\"var c2 = r.uint32()+r.pos\");\n\n            if (types.defaults[field.keyType] !== undefined) gen\n                (\"k=%j\", types.defaults[field.keyType]);\n            else gen\n                (\"k=null\");\n\n            if (types.defaults[type] !== undefined) gen\n                (\"value=%j\", types.defaults[type]);\n            else gen\n                (\"value=null\");\n\n            gen\n                (\"while(r.pos<c2){\")\n                    (\"var tag2=r.uint32()\")\n                    (\"switch(tag2>>>3){\")\n                        (\"case 1: k=r.%s(); break\", field.keyType)\n                        (\"case 2:\");\n\n            if (types.basic[type] === undefined) gen\n                            (\"value=types[%i].decode(r,r.uint32())\", i); // can't be groups\n            else gen\n                            (\"value=r.%s()\", type);\n\n            gen\n                            (\"break\")\n                        (\"default:\")\n                            (\"r.skipType(tag2&7)\")\n                            (\"break\")\n                    (\"}\")\n                (\"}\");\n\n            if (types.long[field.keyType] !== undefined) gen\n                (\"%s[typeof k===\\\"object\\\"?util.longToHash(k):k]=value\", ref);\n            else gen\n                (\"%s[k]=value\", ref);\n\n        // Repeated fields\n        } else if (field.repeated) { gen\n\n                (\"if(!(%s&&%s.length))\", ref, ref)\n                    (\"%s=[]\", ref);\n\n            // Packable (always check for forward and backward compatiblity)\n            if (types.packed[type] !== undefined) gen\n                (\"if((t&7)===2){\")\n                    (\"var c2=r.uint32()+r.pos\")\n                    (\"while(r.pos<c2)\")\n                        (\"%s.push(r.%s())\", ref, type)\n                (\"}else\");\n\n            // Non-packed\n            if (types.basic[type] === undefined) gen(field.resolvedType.group\n                    ? \"%s.push(types[%i].decode(r))\"\n                    : \"%s.push(types[%i].decode(r,r.uint32()))\", ref, i);\n            else gen\n                    (\"%s.push(r.%s())\", ref, type);\n\n        // Non-repeated\n        } else if (types.basic[type] === undefined) gen(field.resolvedType.group\n                ? \"%s=types[%i].decode(r)\"\n                : \"%s=types[%i].decode(r,r.uint32())\", ref, i);\n        else gen\n                (\"%s=r.%s()\", ref, type);\n        gen\n                (\"break\");\n    // Unknown fields\n    } gen\n            (\"default:\")\n                (\"r.skipType(t&7)\")\n                (\"break\")\n\n        (\"}\")\n    (\"}\");\n\n    // Field presence\n    for (i = 0; i < mtype._fieldsArray.length; ++i) {\n        var rfield = mtype._fieldsArray[i];\n        if (rfield.required) gen\n    (\"if(!m.hasOwnProperty(%j))\", rfield.name)\n        (\"throw util.ProtocolError(%j,{instance:m})\", missing(rfield));\n    }\n\n    return gen\n    (\"return m\");\n    /* eslint-enable no-unexpected-multiline */\n}\n","\"use strict\";\nmodule.exports = encoder;\n\nvar Enum     = require(15),\n    types    = require(36),\n    util     = require(37);\n\n/**\n * Generates a partial message type encoder.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genTypePartial(gen, field, fieldIndex, ref) {\n    return field.resolvedType.group\n        ? gen(\"types[%i].encode(%s,w.uint32(%i)).uint32(%i)\", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0)\n        : gen(\"types[%i].encode(%s,w.uint32(%i).fork()).ldelim()\", fieldIndex, ref, (field.id << 3 | 2) >>> 0);\n}\n\n/**\n * Generates an encoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction encoder(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var gen = util.codegen([\"m\", \"w\"], mtype.name + \"$encode\")\n    (\"if(!w)\")\n        (\"w=Writer.create()\");\n\n    var i, ref;\n\n    // \"when a message is serialized its known fields should be written sequentially by field number\"\n    var fields = /* initializes */ mtype.fieldsArray.slice().sort(util.compareFieldsById);\n\n    for (var i = 0; i < fields.length; ++i) {\n        var field    = fields[i].resolve(),\n            index    = mtype._fieldsArray.indexOf(field),\n            type     = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n            wireType = types.basic[type];\n            ref      = \"m\" + util.safeProp(field.name);\n\n        // Map fields\n        if (field.map) {\n            gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)){\", ref, field.name) // !== undefined && !== null\n        (\"for(var ks=Object.keys(%s),i=0;i<ks.length;++i){\", ref)\n            (\"w.uint32(%i).fork().uint32(%i).%s(ks[i])\", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);\n            if (wireType === undefined) gen\n            (\"types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()\", index, ref); // can't be groups\n            else gen\n            (\".uint32(%i).%s(%s[ks[i]]).ldelim()\", 16 | wireType, type, ref);\n            gen\n        (\"}\")\n    (\"}\");\n\n            // Repeated fields\n        } else if (field.repeated) { gen\n    (\"if(%s!=null&&%s.length){\", ref, ref); // !== undefined && !== null\n\n            // Packed repeated\n            if (field.packed && types.packed[type] !== undefined) { gen\n\n        (\"w.uint32(%i).fork()\", (field.id << 3 | 2) >>> 0)\n        (\"for(var i=0;i<%s.length;++i)\", ref)\n            (\"w.%s(%s[i])\", type, ref)\n        (\"w.ldelim()\");\n\n            // Non-packed\n            } else { gen\n\n        (\"for(var i=0;i<%s.length;++i)\", ref);\n                if (wireType === undefined)\n            genTypePartial(gen, field, index, ref + \"[i]\");\n                else gen\n            (\"w.uint32(%i).%s(%s[i])\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n            } gen\n    (\"}\");\n\n        // Non-repeated\n        } else {\n            if (field.optional) gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j))\", ref, field.name); // !== undefined && !== null\n\n            if (wireType === undefined)\n        genTypePartial(gen, field, index, ref);\n            else gen\n        (\"w.uint32(%i).%s(%s)\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n        }\n    }\n\n    return gen\n    (\"return w\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n","\"use strict\";\nmodule.exports = Enum;\n\n// extends ReflectionObject\nvar ReflectionObject = require(24);\n((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = \"Enum\";\n\nvar Namespace = require(23),\n    util = require(37);\n\n/**\n * Constructs a new enum instance.\n * @classdesc Reflected enum.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {Object.<string,number>} [values] Enum values as an object, by name\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this enum\n * @param {Object.<string,string>} [comments] The value comments for this enum\n */\nfunction Enum(name, values, options, comment, comments) {\n    ReflectionObject.call(this, name, options);\n\n    if (values && typeof values !== \"object\")\n        throw TypeError(\"values must be an object\");\n\n    /**\n     * Enum values by id.\n     * @type {Object.<number,string>}\n     */\n    this.valuesById = {};\n\n    /**\n     * Enum values by name.\n     * @type {Object.<string,number>}\n     */\n    this.values = Object.create(this.valuesById); // toJSON, marker\n\n    /**\n     * Enum comment text.\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Value comment texts, if any.\n     * @type {Object.<string,string>}\n     */\n    this.comments = comments || {};\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    // Note that values inherit valuesById on their prototype which makes them a TypeScript-\n    // compatible enum. This is used by pbts to write actual enum definitions that work for\n    // static and reflection code alike instead of emitting generic object definitions.\n\n    if (values)\n        for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)\n            if (typeof values[keys[i]] === \"number\") // use forward entries only\n                this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];\n}\n\n/**\n * Enum descriptor.\n * @interface IEnum\n * @property {Object.<string,number>} values Enum values\n * @property {Object.<string,*>} [options] Enum options\n */\n\n/**\n * Constructs an enum from an enum descriptor.\n * @param {string} name Enum name\n * @param {IEnum} json Enum descriptor\n * @returns {Enum} Created enum\n * @throws {TypeError} If arguments are invalid\n */\nEnum.fromJSON = function fromJSON(name, json) {\n    var enm = new Enum(name, json.values, json.options, json.comment, json.comments);\n    enm.reserved = json.reserved;\n    return enm;\n};\n\n/**\n * Converts this enum to an enum descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IEnum} Enum descriptor\n */\nEnum.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\"  , this.options,\n        \"values\"   , this.values,\n        \"reserved\" , this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"comment\"  , keepComments ? this.comment : undefined,\n        \"comments\" , keepComments ? this.comments : undefined\n    ]);\n};\n\n/**\n * Adds a value to this enum.\n * @param {string} name Value name\n * @param {number} id Value id\n * @param {string} [comment] Comment, if any\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a value with this name or id\n */\nEnum.prototype.add = function add(name, id, comment) {\n    // utilized by the parser but not by .fromJSON\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (!util.isInteger(id))\n        throw TypeError(\"id must be an integer\");\n\n    if (this.values[name] !== undefined)\n        throw Error(\"duplicate name '\" + name + \"' in \" + this);\n\n    if (this.isReservedId(id))\n        throw Error(\"id \" + id + \" is reserved in \" + this);\n\n    if (this.isReservedName(name))\n        throw Error(\"name '\" + name + \"' is reserved in \" + this);\n\n    if (this.valuesById[id] !== undefined) {\n        if (!(this.options && this.options.allow_alias))\n            throw Error(\"duplicate id \" + id + \" in \" + this);\n        this.values[name] = id;\n    } else\n        this.valuesById[this.values[name] = id] = name;\n\n    this.comments[name] = comment || null;\n    return this;\n};\n\n/**\n * Removes a value from this enum\n * @param {string} name Value name\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `name` is not a name of this enum\n */\nEnum.prototype.remove = function remove(name) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    var val = this.values[name];\n    if (val == null)\n        throw Error(\"name '\" + name + \"' does not exist in \" + this);\n\n    delete this.valuesById[val];\n    delete this.values[name];\n    delete this.comments[name];\n\n    return this;\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};\n","\"use strict\";\nmodule.exports = Field;\n\n// extends ReflectionObject\nvar ReflectionObject = require(24);\n((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = \"Field\";\n\nvar Enum  = require(15),\n    types = require(36),\n    util  = require(37);\n\nvar Type; // cyclic\n\nvar ruleRe = /^required|optional|repeated$/;\n\n/**\n * Constructs a new message field instance. Note that {@link MapField|map fields} have their own class.\n * @name Field\n * @classdesc Reflected message field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a field from a field descriptor.\n * @param {string} name Field name\n * @param {IField} json Field descriptor\n * @returns {Field} Created field\n * @throws {TypeError} If arguments are invalid\n */\nField.fromJSON = function fromJSON(name, json) {\n    return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment);\n};\n\n/**\n * Not an actual constructor. Use {@link Field} instead.\n * @classdesc Base class of all reflected message fields. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports FieldBase\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction Field(name, id, type, rule, extend, options, comment) {\n\n    if (util.isObject(rule)) {\n        comment = extend;\n        options = rule;\n        rule = extend = undefined;\n    } else if (util.isObject(extend)) {\n        comment = options;\n        options = extend;\n        extend = undefined;\n    }\n\n    ReflectionObject.call(this, name, options);\n\n    if (!util.isInteger(id) || id < 0)\n        throw TypeError(\"id must be a non-negative integer\");\n\n    if (!util.isString(type))\n        throw TypeError(\"type must be a string\");\n\n    if (rule !== undefined && !ruleRe.test(rule = rule.toString().toLowerCase()))\n        throw TypeError(\"rule must be a string rule\");\n\n    if (extend !== undefined && !util.isString(extend))\n        throw TypeError(\"extend must be a string\");\n\n    if (rule === \"proto3_optional\") {\n        rule = \"optional\";\n    }\n    /**\n     * Field rule, if any.\n     * @type {string|undefined}\n     */\n    this.rule = rule && rule !== \"optional\" ? rule : undefined; // toJSON\n\n    /**\n     * Field type.\n     * @type {string}\n     */\n    this.type = type; // toJSON\n\n    /**\n     * Unique field id.\n     * @type {number}\n     */\n    this.id = id; // toJSON, marker\n\n    /**\n     * Extended type if different from parent.\n     * @type {string|undefined}\n     */\n    this.extend = extend || undefined; // toJSON\n\n    /**\n     * Whether this field is required.\n     * @type {boolean}\n     */\n    this.required = rule === \"required\";\n\n    /**\n     * Whether this field is optional.\n     * @type {boolean}\n     */\n    this.optional = !this.required;\n\n    /**\n     * Whether this field is repeated.\n     * @type {boolean}\n     */\n    this.repeated = rule === \"repeated\";\n\n    /**\n     * Whether this field is a map or not.\n     * @type {boolean}\n     */\n    this.map = false;\n\n    /**\n     * Message this field belongs to.\n     * @type {Type|null}\n     */\n    this.message = null;\n\n    /**\n     * OneOf this field belongs to, if any,\n     * @type {OneOf|null}\n     */\n    this.partOf = null;\n\n    /**\n     * The field type's default value.\n     * @type {*}\n     */\n    this.typeDefault = null;\n\n    /**\n     * The field's default value on prototypes.\n     * @type {*}\n     */\n    this.defaultValue = null;\n\n    /**\n     * Whether this field's value should be treated as a long.\n     * @type {boolean}\n     */\n    this.long = util.Long ? types.long[type] !== undefined : /* istanbul ignore next */ false;\n\n    /**\n     * Whether this field's value is a buffer.\n     * @type {boolean}\n     */\n    this.bytes = type === \"bytes\";\n\n    /**\n     * Resolved type if not a basic type.\n     * @type {Type|Enum|null}\n     */\n    this.resolvedType = null;\n\n    /**\n     * Sister-field within the extended type if a declaring extension field.\n     * @type {Field|null}\n     */\n    this.extensionField = null;\n\n    /**\n     * Sister-field within the declaring namespace if an extended field.\n     * @type {Field|null}\n     */\n    this.declaringField = null;\n\n    /**\n     * Internally remembers whether this field is packed.\n     * @type {boolean|null}\n     * @private\n     */\n    this._packed = null;\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Determines whether this field is packed. Only relevant when repeated and working with proto2.\n * @name Field#packed\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"packed\", {\n    get: function() {\n        // defaults to packed=true if not explicity set to false\n        if (this._packed === null)\n            this._packed = this.getOption(\"packed\") !== false;\n        return this._packed;\n    }\n});\n\n/**\n * @override\n */\nField.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (name === \"packed\") // clear cached before setting\n        this._packed = null;\n    return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet);\n};\n\n/**\n * Field descriptor.\n * @interface IField\n * @property {string} [rule=\"optional\"] Field rule\n * @property {string} type Field type\n * @property {number} id Field id\n * @property {Object.<string,*>} [options] Field options\n */\n\n/**\n * Extension field descriptor.\n * @interface IExtensionField\n * @extends IField\n * @property {string} extend Extended type\n */\n\n/**\n * Converts this field to a field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IField} Field descriptor\n */\nField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"rule\"    , this.rule !== \"optional\" && this.rule || undefined,\n        \"type\"    , this.type,\n        \"id\"      , this.id,\n        \"extend\"  , this.extend,\n        \"options\" , this.options,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Resolves this field's type references.\n * @returns {Field} `this`\n * @throws {Error} If any reference cannot be resolved\n */\nField.prototype.resolve = function resolve() {\n\n    if (this.resolved)\n        return this;\n\n    if ((this.typeDefault = types.defaults[this.type]) === undefined) { // if not a basic type, resolve it\n        this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type);\n        if (this.resolvedType instanceof Type)\n            this.typeDefault = null;\n        else // instanceof Enum\n            this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; // first defined\n    }\n\n    // use explicitly set default value if present\n    if (this.options && this.options[\"default\"] != null) {\n        this.typeDefault = this.options[\"default\"];\n        if (this.resolvedType instanceof Enum && typeof this.typeDefault === \"string\")\n            this.typeDefault = this.resolvedType.values[this.typeDefault];\n    }\n\n    // remove unnecessary options\n    if (this.options) {\n        if (this.options.packed === true || this.options.packed !== undefined && this.resolvedType && !(this.resolvedType instanceof Enum))\n            delete this.options.packed;\n        if (!Object.keys(this.options).length)\n            this.options = undefined;\n    }\n\n    // convert to internal data type if necesssary\n    if (this.long) {\n        this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === \"u\");\n\n        /* istanbul ignore else */\n        if (Object.freeze)\n            Object.freeze(this.typeDefault); // long instances are meant to be immutable anyway (i.e. use small int cache that even requires it)\n\n    } else if (this.bytes && typeof this.typeDefault === \"string\") {\n        var buf;\n        if (util.base64.test(this.typeDefault))\n            util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0);\n        else\n            util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0);\n        this.typeDefault = buf;\n    }\n\n    // take special care of maps and repeated fields\n    if (this.map)\n        this.defaultValue = util.emptyObject;\n    else if (this.repeated)\n        this.defaultValue = util.emptyArray;\n    else\n        this.defaultValue = this.typeDefault;\n\n    // ensure proper value on prototype\n    if (this.parent instanceof Type)\n        this.parent.ctor.prototype[this.name] = this.defaultValue;\n\n    return ReflectionObject.prototype.resolve.call(this);\n};\n\n/**\n * Decorator function as returned by {@link Field.d} and {@link MapField.d} (TypeScript).\n * @typedef FieldDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} fieldName Field name\n * @returns {undefined}\n */\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"string\"|\"bool\"|\"bytes\"|Object} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @param {T} [defaultValue] Default value\n * @returns {FieldDecorator} Decorator function\n * @template T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]\n */\nField.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {\n\n    // submessage: decorate the submessage and use its name as the type\n    if (typeof fieldType === \"function\")\n        fieldType = util.decorateType(fieldType).name;\n\n    // enum reference: create a reflected copy of the enum and keep reuseing it\n    else if (fieldType && typeof fieldType === \"object\")\n        fieldType = util.decorateEnum(fieldType).name;\n\n    return function fieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new Field(fieldName, fieldId, fieldType, fieldRule, { \"default\": defaultValue }));\n    };\n};\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {Constructor<T>|string} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @returns {FieldDecorator} Decorator function\n * @template T extends Message<T>\n * @variation 2\n */\n// like Field.d but without a default value\n\n// Sets up cyclic dependencies (called in index-light)\nField._configure = function configure(Type_) {\n    Type = Type_;\n};\n","\"use strict\";\nvar protobuf = module.exports = require(18);\n\nprotobuf.build = \"light\";\n\n/**\n * A node-style callback as used by {@link load} and {@link Root#load}.\n * @typedef LoadCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Root} [root] Root, if there hasn't been an error\n * @returns {undefined}\n */\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} root Root namespace, defaults to create a new one if omitted.\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n */\nfunction load(filename, root, callback) {\n    if (typeof root === \"function\") {\n        callback = root;\n        root = new protobuf.Root();\n    } else if (!root)\n        root = new protobuf.Root();\n    return root.load(filename, callback);\n}\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and returns a promise.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Promise<Root>} Promise\n * @see {@link Root#load}\n * @variation 3\n */\n// function load(filename:string, [root:Root]):Promise<Root>\n\nprotobuf.load = load;\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into a common root namespace (node only).\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n * @see {@link Root#loadSync}\n */\nfunction loadSync(filename, root) {\n    if (!root)\n        root = new protobuf.Root();\n    return root.loadSync(filename);\n}\n\nprotobuf.loadSync = loadSync;\n\n// Serialization\nprotobuf.encoder          = require(14);\nprotobuf.decoder          = require(13);\nprotobuf.verifier         = require(40);\nprotobuf.converter        = require(12);\n\n// Reflection\nprotobuf.ReflectionObject = require(24);\nprotobuf.Namespace        = require(23);\nprotobuf.Root             = require(29);\nprotobuf.Enum             = require(15);\nprotobuf.Type             = require(35);\nprotobuf.Field            = require(16);\nprotobuf.OneOf            = require(25);\nprotobuf.MapField         = require(20);\nprotobuf.Service          = require(33);\nprotobuf.Method           = require(22);\n\n// Runtime\nprotobuf.Message          = require(21);\nprotobuf.wrappers         = require(41);\n\n// Utility\nprotobuf.types            = require(36);\nprotobuf.util             = require(37);\n\n// Set up possibly cyclic reflection dependencies\nprotobuf.ReflectionObject._configure(protobuf.Root);\nprotobuf.Namespace._configure(protobuf.Type, protobuf.Service, protobuf.Enum);\nprotobuf.Root._configure(protobuf.Type);\nprotobuf.Field._configure(protobuf.Type);\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer       = require(42);\nprotobuf.BufferWriter = require(43);\nprotobuf.Reader       = require(27);\nprotobuf.BufferReader = require(28);\n\n// Utility\nprotobuf.util         = require(39);\nprotobuf.rpc          = require(31);\nprotobuf.roots        = require(30);\nprotobuf.configure    = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n    protobuf.util._configure();\n    protobuf.Writer._configure(protobuf.BufferWriter);\n    protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","\"use strict\";\nvar protobuf = module.exports = require(17);\n\nprotobuf.build = \"full\";\n\n// Parser\nprotobuf.tokenize         = require(34);\nprotobuf.parse            = require(26);\nprotobuf.common           = require(11);\n\n// Configure parser\nprotobuf.Root._configure(protobuf.Type, protobuf.parse, protobuf.common);\n","\"use strict\";\nmodule.exports = MapField;\n\n// extends Field\nvar Field = require(16);\n((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = \"MapField\";\n\nvar types   = require(36),\n    util    = require(37);\n\n/**\n * Constructs a new map field instance.\n * @classdesc Reflected map field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} keyType Key type\n * @param {string} type Value type\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction MapField(name, id, keyType, type, options, comment) {\n    Field.call(this, name, id, type, undefined, undefined, options, comment);\n\n    /* istanbul ignore if */\n    if (!util.isString(keyType))\n        throw TypeError(\"keyType must be a string\");\n\n    /**\n     * Key type.\n     * @type {string}\n     */\n    this.keyType = keyType; // toJSON, marker\n\n    /**\n     * Resolved key type if not a basic type.\n     * @type {ReflectionObject|null}\n     */\n    this.resolvedKeyType = null;\n\n    // Overrides Field#map\n    this.map = true;\n}\n\n/**\n * Map field descriptor.\n * @interface IMapField\n * @extends {IField}\n * @property {string} keyType Key type\n */\n\n/**\n * Extension map field descriptor.\n * @interface IExtensionMapField\n * @extends IMapField\n * @property {string} extend Extended type\n */\n\n/**\n * Constructs a map field from a map field descriptor.\n * @param {string} name Field name\n * @param {IMapField} json Map field descriptor\n * @returns {MapField} Created map field\n * @throws {TypeError} If arguments are invalid\n */\nMapField.fromJSON = function fromJSON(name, json) {\n    return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment);\n};\n\n/**\n * Converts this map field to a map field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMapField} Map field descriptor\n */\nMapField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"keyType\" , this.keyType,\n        \"type\"    , this.type,\n        \"id\"      , this.id,\n        \"extend\"  , this.extend,\n        \"options\" , this.options,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nMapField.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n\n    // Besides a value type, map fields have a key type that may be \"any scalar type except for floating point types and bytes\"\n    if (types.mapKey[this.keyType] === undefined)\n        throw Error(\"invalid key type: \" + this.keyType);\n\n    return Field.prototype.resolve.call(this);\n};\n\n/**\n * Map field decorator (TypeScript).\n * @name MapField.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"} fieldKeyType Field key type\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"|\"bytes\"|Object|Constructor<{}>} fieldValueType Field value type\n * @returns {FieldDecorator} Decorator function\n * @template T extends { [key: string]: number | Long | string | boolean | Uint8Array | Buffer | number[] | Message<{}> }\n */\nMapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) {\n\n    // submessage value: decorate the submessage and use its name as the type\n    if (typeof fieldValueType === \"function\")\n        fieldValueType = util.decorateType(fieldValueType).name;\n\n    // enum reference value: create a reflected copy of the enum and keep reuseing it\n    else if (fieldValueType && typeof fieldValueType === \"object\")\n        fieldValueType = util.decorateEnum(fieldValueType).name;\n\n    return function mapFieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType));\n    };\n};\n","\"use strict\";\nmodule.exports = Message;\n\nvar util = require(39);\n\n/**\n * Constructs a new message instance.\n * @classdesc Abstract runtime message.\n * @constructor\n * @param {Properties<T>} [properties] Properties to set\n * @template T extends object = object\n */\nfunction Message(properties) {\n    // not used internally\n    if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            this[keys[i]] = properties[keys[i]];\n}\n\n/**\n * Reference to the reflected type.\n * @name Message.$type\n * @type {Type}\n * @readonly\n */\n\n/**\n * Reference to the reflected type.\n * @name Message#$type\n * @type {Type}\n * @readonly\n */\n\n/*eslint-disable valid-jsdoc*/\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<T>} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.create = function create(properties) {\n    return this.$type.create(properties);\n};\n\n/**\n * Encodes a message of this type.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encode = function encode(message, writer) {\n    return this.$type.encode(message, writer);\n};\n\n/**\n * Encodes a message of this type preceeded by its length as a varint.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.$type.encodeDelimited(message, writer);\n};\n\n/**\n * Decodes a message of this type.\n * @name Message.decode\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decode = function decode(reader) {\n    return this.$type.decode(reader);\n};\n\n/**\n * Decodes a message of this type preceeded by its length as a varint.\n * @name Message.decodeDelimited\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decodeDelimited = function decodeDelimited(reader) {\n    return this.$type.decodeDelimited(reader);\n};\n\n/**\n * Verifies a message of this type.\n * @name Message.verify\n * @function\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\nMessage.verify = function verify(message) {\n    return this.$type.verify(message);\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object\n * @returns {T} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.fromObject = function fromObject(object) {\n    return this.$type.fromObject(object);\n};\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {T} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.toObject = function toObject(message, options) {\n    return this.$type.toObject(message, options);\n};\n\n/**\n * Converts this message to JSON.\n * @returns {Object.<string,*>} JSON object\n */\nMessage.prototype.toJSON = function toJSON() {\n    return this.$type.toObject(this, util.toJSONOptions);\n};\n\n/*eslint-enable valid-jsdoc*/","\"use strict\";\nmodule.exports = Method;\n\n// extends ReflectionObject\nvar ReflectionObject = require(24);\n((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = \"Method\";\n\nvar util = require(37);\n\n/**\n * Constructs a new service method instance.\n * @classdesc Reflected service method.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Method name\n * @param {string|undefined} type Method type, usually `\"rpc\"`\n * @param {string} requestType Request message type\n * @param {string} responseType Response message type\n * @param {boolean|Object.<string,*>} [requestStream] Whether the request is streamed\n * @param {boolean|Object.<string,*>} [responseStream] Whether the response is streamed\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this method\n * @param {Object.<string,*>} [parsedOptions] Declared options, properly parsed into an object\n */\nfunction Method(name, type, requestType, responseType, requestStream, responseStream, options, comment, parsedOptions) {\n\n    /* istanbul ignore next */\n    if (util.isObject(requestStream)) {\n        options = requestStream;\n        requestStream = responseStream = undefined;\n    } else if (util.isObject(responseStream)) {\n        options = responseStream;\n        responseStream = undefined;\n    }\n\n    /* istanbul ignore if */\n    if (!(type === undefined || util.isString(type)))\n        throw TypeError(\"type must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(requestType))\n        throw TypeError(\"requestType must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(responseType))\n        throw TypeError(\"responseType must be a string\");\n\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Method type.\n     * @type {string}\n     */\n    this.type = type || \"rpc\"; // toJSON\n\n    /**\n     * Request type.\n     * @type {string}\n     */\n    this.requestType = requestType; // toJSON, marker\n\n    /**\n     * Whether requests are streamed or not.\n     * @type {boolean|undefined}\n     */\n    this.requestStream = requestStream ? true : undefined; // toJSON\n\n    /**\n     * Response type.\n     * @type {string}\n     */\n    this.responseType = responseType; // toJSON\n\n    /**\n     * Whether responses are streamed or not.\n     * @type {boolean|undefined}\n     */\n    this.responseStream = responseStream ? true : undefined; // toJSON\n\n    /**\n     * Resolved request type.\n     * @type {Type|null}\n     */\n    this.resolvedRequestType = null;\n\n    /**\n     * Resolved response type.\n     * @type {Type|null}\n     */\n    this.resolvedResponseType = null;\n\n    /**\n     * Comment for this method\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Options properly parsed into an object\n     */\n    this.parsedOptions = parsedOptions;\n}\n\n/**\n * Method descriptor.\n * @interface IMethod\n * @property {string} [type=\"rpc\"] Method type\n * @property {string} requestType Request type\n * @property {string} responseType Response type\n * @property {boolean} [requestStream=false] Whether requests are streamed\n * @property {boolean} [responseStream=false] Whether responses are streamed\n * @property {Object.<string,*>} [options] Method options\n * @property {string} comment Method comments\n * @property {Object.<string,*>} [parsedOptions] Method options properly parsed into an object\n */\n\n/**\n * Constructs a method from a method descriptor.\n * @param {string} name Method name\n * @param {IMethod} json Method descriptor\n * @returns {Method} Created method\n * @throws {TypeError} If arguments are invalid\n */\nMethod.fromJSON = function fromJSON(name, json) {\n    return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions);\n};\n\n/**\n * Converts this method to a method descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMethod} Method descriptor\n */\nMethod.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"type\"           , this.type !== \"rpc\" && /* istanbul ignore next */ this.type || undefined,\n        \"requestType\"    , this.requestType,\n        \"requestStream\"  , this.requestStream,\n        \"responseType\"   , this.responseType,\n        \"responseStream\" , this.responseStream,\n        \"options\"        , this.options,\n        \"comment\"        , keepComments ? this.comment : undefined,\n        \"parsedOptions\"  , this.parsedOptions,\n    ]);\n};\n\n/**\n * @override\n */\nMethod.prototype.resolve = function resolve() {\n\n    /* istanbul ignore if */\n    if (this.resolved)\n        return this;\n\n    this.resolvedRequestType = this.parent.lookupType(this.requestType);\n    this.resolvedResponseType = this.parent.lookupType(this.responseType);\n\n    return ReflectionObject.prototype.resolve.call(this);\n};\n","\"use strict\";\nmodule.exports = Namespace;\n\n// extends ReflectionObject\nvar ReflectionObject = require(24);\n((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = \"Namespace\";\n\nvar Field    = require(16),\n    OneOf    = require(25),\n    util     = require(37);\n\nvar Type,    // cyclic\n    Service,\n    Enum;\n\n/**\n * Constructs a new namespace instance.\n * @name Namespace\n * @classdesc Reflected namespace.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a namespace from JSON.\n * @memberof Namespace\n * @function\n * @param {string} name Namespace name\n * @param {Object.<string,*>} json JSON object\n * @returns {Namespace} Created namespace\n * @throws {TypeError} If arguments are invalid\n */\nNamespace.fromJSON = function fromJSON(name, json) {\n    return new Namespace(name, json.options).addJSON(json.nested);\n};\n\n/**\n * Converts an array of reflection objects to JSON.\n * @memberof Namespace\n * @param {ReflectionObject[]} array Object array\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {Object.<string,*>|undefined} JSON object or `undefined` when array is empty\n */\nfunction arrayToJSON(array, toJSONOptions) {\n    if (!(array && array.length))\n        return undefined;\n    var obj = {};\n    for (var i = 0; i < array.length; ++i)\n        obj[array[i].name] = array[i].toJSON(toJSONOptions);\n    return obj;\n}\n\nNamespace.arrayToJSON = arrayToJSON;\n\n/**\n * Tests if the specified id is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedId = function isReservedId(reserved, id) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (typeof reserved[i] !== \"string\" && reserved[i][0] <= id && reserved[i][1] > id)\n                return true;\n    return false;\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedName = function isReservedName(reserved, name) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (reserved[i] === name)\n                return true;\n    return false;\n};\n\n/**\n * Not an actual constructor. Use {@link Namespace} instead.\n * @classdesc Base class of all reflection objects containing nested objects. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports NamespaceBase\n * @extends ReflectionObject\n * @abstract\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n * @see {@link Namespace}\n */\nfunction Namespace(name, options) {\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Nested objects by name.\n     * @type {Object.<string,ReflectionObject>|undefined}\n     */\n    this.nested = undefined; // toJSON\n\n    /**\n     * Cached nested objects as an array.\n     * @type {ReflectionObject[]|null}\n     * @private\n     */\n    this._nestedArray = null;\n}\n\nfunction clearCache(namespace) {\n    namespace._nestedArray = null;\n    return namespace;\n}\n\n/**\n * Nested objects of this namespace as an array for iteration.\n * @name NamespaceBase#nestedArray\n * @type {ReflectionObject[]}\n * @readonly\n */\nObject.defineProperty(Namespace.prototype, \"nestedArray\", {\n    get: function() {\n        return this._nestedArray || (this._nestedArray = util.toArray(this.nested));\n    }\n});\n\n/**\n * Namespace descriptor.\n * @interface INamespace\n * @property {Object.<string,*>} [options] Namespace options\n * @property {Object.<string,AnyNestedObject>} [nested] Nested object descriptors\n */\n\n/**\n * Any extension field descriptor.\n * @typedef AnyExtensionField\n * @type {IExtensionField|IExtensionMapField}\n */\n\n/**\n * Any nested object descriptor.\n * @typedef AnyNestedObject\n * @type {IEnum|IType|IService|AnyExtensionField|INamespace}\n */\n// ^ BEWARE: VSCode hangs forever when using more than 5 types (that's why AnyExtensionField exists in the first place)\n\n/**\n * Converts this namespace to a namespace descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {INamespace} Namespace descriptor\n */\nNamespace.prototype.toJSON = function toJSON(toJSONOptions) {\n    return util.toObject([\n        \"options\" , this.options,\n        \"nested\"  , arrayToJSON(this.nestedArray, toJSONOptions)\n    ]);\n};\n\n/**\n * Adds nested objects to this namespace from nested object descriptors.\n * @param {Object.<string,AnyNestedObject>} nestedJson Any nested object descriptors\n * @returns {Namespace} `this`\n */\nNamespace.prototype.addJSON = function addJSON(nestedJson) {\n    var ns = this;\n    /* istanbul ignore else */\n    if (nestedJson) {\n        for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) {\n            nested = nestedJson[names[i]];\n            ns.add( // most to least likely\n                ( nested.fields !== undefined\n                ? Type.fromJSON\n                : nested.values !== undefined\n                ? Enum.fromJSON\n                : nested.methods !== undefined\n                ? Service.fromJSON\n                : nested.id !== undefined\n                ? Field.fromJSON\n                : Namespace.fromJSON )(names[i], nested)\n            );\n        }\n    }\n    return this;\n};\n\n/**\n * Gets the nested object of the specified name.\n * @param {string} name Nested object name\n * @returns {ReflectionObject|null} The reflection object or `null` if it doesn't exist\n */\nNamespace.prototype.get = function get(name) {\n    return this.nested && this.nested[name]\n        || null;\n};\n\n/**\n * Gets the values of the nested {@link Enum|enum} of the specified name.\n * This methods differs from {@link Namespace#get|get} in that it returns an enum's values directly and throws instead of returning `null`.\n * @param {string} name Nested enum name\n * @returns {Object.<string,number>} Enum values\n * @throws {Error} If there is no such enum\n */\nNamespace.prototype.getEnum = function getEnum(name) {\n    if (this.nested && this.nested[name] instanceof Enum)\n        return this.nested[name].values;\n    throw Error(\"no such enum: \" + name);\n};\n\n/**\n * Adds a nested object to this namespace.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name\n */\nNamespace.prototype.add = function add(object) {\n\n    if (!(object instanceof Field && object.extend !== undefined || object instanceof Type || object instanceof Enum || object instanceof Service || object instanceof Namespace || object instanceof OneOf))\n        throw TypeError(\"object must be a valid nested object\");\n\n    if (!this.nested)\n        this.nested = {};\n    else {\n        var prev = this.get(object.name);\n        if (prev) {\n            if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) {\n                // replace plain namespace but keep existing nested elements and options\n                var nested = prev.nestedArray;\n                for (var i = 0; i < nested.length; ++i)\n                    object.add(nested[i]);\n                this.remove(prev);\n                if (!this.nested)\n                    this.nested = {};\n                object.setOptions(prev.options, true);\n\n            } else\n                throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n        }\n    }\n    this.nested[object.name] = object;\n    object.onAdd(this);\n    return clearCache(this);\n};\n\n/**\n * Removes a nested object from this namespace.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this namespace\n */\nNamespace.prototype.remove = function remove(object) {\n\n    if (!(object instanceof ReflectionObject))\n        throw TypeError(\"object must be a ReflectionObject\");\n    if (object.parent !== this)\n        throw Error(object + \" is not a member of \" + this);\n\n    delete this.nested[object.name];\n    if (!Object.keys(this.nested).length)\n        this.nested = undefined;\n\n    object.onRemove(this);\n    return clearCache(this);\n};\n\n/**\n * Defines additial namespaces within this one if not yet existing.\n * @param {string|string[]} path Path to create\n * @param {*} [json] Nested types to create from JSON\n * @returns {Namespace} Pointer to the last namespace created or `this` if path is empty\n */\nNamespace.prototype.define = function define(path, json) {\n\n    if (util.isString(path))\n        path = path.split(\".\");\n    else if (!Array.isArray(path))\n        throw TypeError(\"illegal path\");\n    if (path && path.length && path[0] === \"\")\n        throw Error(\"path must be relative\");\n\n    var ptr = this;\n    while (path.length > 0) {\n        var part = path.shift();\n        if (ptr.nested && ptr.nested[part]) {\n            ptr = ptr.nested[part];\n            if (!(ptr instanceof Namespace))\n                throw Error(\"path conflicts with non-namespace objects\");\n        } else\n            ptr.add(ptr = new Namespace(part));\n    }\n    if (json)\n        ptr.addJSON(json);\n    return ptr;\n};\n\n/**\n * Resolves this namespace's and all its nested objects' type references. Useful to validate a reflection tree, but comes at a cost.\n * @returns {Namespace} `this`\n */\nNamespace.prototype.resolveAll = function resolveAll() {\n    var nested = this.nestedArray, i = 0;\n    while (i < nested.length)\n        if (nested[i] instanceof Namespace)\n            nested[i++].resolveAll();\n        else\n            nested[i++].resolve();\n    return this.resolve();\n};\n\n/**\n * Recursively looks up the reflection object matching the specified path in the scope of this namespace.\n * @param {string|string[]} path Path to look up\n * @param {*|Array.<*>} filterTypes Filter types, any combination of the constructors of `protobuf.Type`, `protobuf.Enum`, `protobuf.Service` etc.\n * @param {boolean} [parentAlreadyChecked=false] If known, whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n */\nNamespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) {\n\n    /* istanbul ignore next */\n    if (typeof filterTypes === \"boolean\") {\n        parentAlreadyChecked = filterTypes;\n        filterTypes = undefined;\n    } else if (filterTypes && !Array.isArray(filterTypes))\n        filterTypes = [ filterTypes ];\n\n    if (util.isString(path) && path.length) {\n        if (path === \".\")\n            return this.root;\n        path = path.split(\".\");\n    } else if (!path.length)\n        return this;\n\n    // Start at root if path is absolute\n    if (path[0] === \"\")\n        return this.root.lookup(path.slice(1), filterTypes);\n\n    // Test if the first part matches any nested object, and if so, traverse if path contains more\n    var found = this.get(path[0]);\n    if (found) {\n        if (path.length === 1) {\n            if (!filterTypes || filterTypes.indexOf(found.constructor) > -1)\n                return found;\n        } else if (found instanceof Namespace && (found = found.lookup(path.slice(1), filterTypes, true)))\n            return found;\n\n    // Otherwise try each nested namespace\n    } else\n        for (var i = 0; i < this.nestedArray.length; ++i)\n            if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i].lookup(path, filterTypes, true)))\n                return found;\n\n    // If there hasn't been a match, try again at the parent\n    if (this.parent === null || parentAlreadyChecked)\n        return null;\n    return this.parent.lookup(path, filterTypes);\n};\n\n/**\n * Looks up the reflection object at the specified path, relative to this namespace.\n * @name NamespaceBase#lookup\n * @function\n * @param {string|string[]} path Path to look up\n * @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @variation 2\n */\n// lookup(path: string, [parentAlreadyChecked: boolean])\n\n/**\n * Looks up the {@link Type|type} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type\n * @throws {Error} If `path` does not point to a type\n */\nNamespace.prototype.lookupType = function lookupType(path) {\n    var found = this.lookup(path, [ Type ]);\n    if (!found)\n        throw Error(\"no such type: \" + path);\n    return found;\n};\n\n/**\n * Looks up the values of the {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Enum} Looked up enum\n * @throws {Error} If `path` does not point to an enum\n */\nNamespace.prototype.lookupEnum = function lookupEnum(path) {\n    var found = this.lookup(path, [ Enum ]);\n    if (!found)\n        throw Error(\"no such Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Type|type} or {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type or enum\n * @throws {Error} If `path` does not point to a type or enum\n */\nNamespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) {\n    var found = this.lookup(path, [ Type, Enum ]);\n    if (!found)\n        throw Error(\"no such Type or Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Service|service} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Service} Looked up service\n * @throws {Error} If `path` does not point to a service\n */\nNamespace.prototype.lookupService = function lookupService(path) {\n    var found = this.lookup(path, [ Service ]);\n    if (!found)\n        throw Error(\"no such Service '\" + path + \"' in \" + this);\n    return found;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nNamespace._configure = function(Type_, Service_, Enum_) {\n    Type    = Type_;\n    Service = Service_;\n    Enum    = Enum_;\n};\n","\"use strict\";\nmodule.exports = ReflectionObject;\n\nReflectionObject.className = \"ReflectionObject\";\n\nvar util = require(37);\n\nvar Root; // cyclic\n\n/**\n * Constructs a new reflection object instance.\n * @classdesc Base class of all reflection objects.\n * @constructor\n * @param {string} name Object name\n * @param {Object.<string,*>} [options] Declared options\n * @abstract\n */\nfunction ReflectionObject(name, options) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (options && !util.isObject(options))\n        throw TypeError(\"options must be an object\");\n\n    /**\n     * Options.\n     * @type {Object.<string,*>|undefined}\n     */\n    this.options = options; // toJSON\n\n    /**\n     * Parsed Options.\n     * @type {Array.<Object.<string,*>>|undefined}\n     */\n    this.parsedOptions = null;\n\n    /**\n     * Unique name within its namespace.\n     * @type {string}\n     */\n    this.name = name;\n\n    /**\n     * Parent namespace.\n     * @type {Namespace|null}\n     */\n    this.parent = null;\n\n    /**\n     * Whether already resolved or not.\n     * @type {boolean}\n     */\n    this.resolved = false;\n\n    /**\n     * Comment text, if any.\n     * @type {string|null}\n     */\n    this.comment = null;\n\n    /**\n     * Defining file name.\n     * @type {string|null}\n     */\n    this.filename = null;\n}\n\nObject.defineProperties(ReflectionObject.prototype, {\n\n    /**\n     * Reference to the root namespace.\n     * @name ReflectionObject#root\n     * @type {Root}\n     * @readonly\n     */\n    root: {\n        get: function() {\n            var ptr = this;\n            while (ptr.parent !== null)\n                ptr = ptr.parent;\n            return ptr;\n        }\n    },\n\n    /**\n     * Full name including leading dot.\n     * @name ReflectionObject#fullName\n     * @type {string}\n     * @readonly\n     */\n    fullName: {\n        get: function() {\n            var path = [ this.name ],\n                ptr = this.parent;\n            while (ptr) {\n                path.unshift(ptr.name);\n                ptr = ptr.parent;\n            }\n            return path.join(\".\");\n        }\n    }\n});\n\n/**\n * Converts this reflection object to its descriptor representation.\n * @returns {Object.<string,*>} Descriptor\n * @abstract\n */\nReflectionObject.prototype.toJSON = /* istanbul ignore next */ function toJSON() {\n    throw Error(); // not implemented, shouldn't happen\n};\n\n/**\n * Called when this object is added to a parent.\n * @param {ReflectionObject} parent Parent added to\n * @returns {undefined}\n */\nReflectionObject.prototype.onAdd = function onAdd(parent) {\n    if (this.parent && this.parent !== parent)\n        this.parent.remove(this);\n    this.parent = parent;\n    this.resolved = false;\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleAdd(this);\n};\n\n/**\n * Called when this object is removed from a parent.\n * @param {ReflectionObject} parent Parent removed from\n * @returns {undefined}\n */\nReflectionObject.prototype.onRemove = function onRemove(parent) {\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleRemove(this);\n    this.parent = null;\n    this.resolved = false;\n};\n\n/**\n * Resolves this objects type references.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n    if (this.root instanceof Root)\n        this.resolved = true; // only if part of a root\n    return this;\n};\n\n/**\n * Gets an option value.\n * @param {string} name Option name\n * @returns {*} Option value or `undefined` if not set\n */\nReflectionObject.prototype.getOption = function getOption(name) {\n    if (this.options)\n        return this.options[name];\n    return undefined;\n};\n\n/**\n * Sets an option.\n * @param {string} name Option name\n * @param {*} value Option value\n * @param {boolean} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (!ifNotSet || !this.options || this.options[name] === undefined)\n        (this.options || (this.options = {}))[name] = value;\n    return this;\n};\n\n/**\n * Sets a parsed option.\n * @param {string} name parsed Option name\n * @param {*} value Option value\n * @param {string} propName dot '.' delimited full path of property within the option to set. if undefined\\empty, will add a new option with that value\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) {\n    if (!this.parsedOptions) {\n        this.parsedOptions = [];\n    }\n    var parsedOptions = this.parsedOptions;\n    if (propName) {\n        // If setting a sub property of an option then try to merge it\n        // with an existing option\n        var opt = parsedOptions.find(function (opt) {\n            return Object.prototype.hasOwnProperty.call(opt, name);\n        });\n        if (opt) {\n            // If we found an existing option - just merge the property value\n            var newValue = opt[name];\n            util.setProperty(newValue, propName, value);\n        } else {\n            // otherwise, create a new option, set it's property and add it to the list\n            opt = {};\n            opt[name] = util.setProperty({}, propName, value);\n            parsedOptions.push(opt);\n        }\n    } else {\n        // Always create a new option when setting the value of the option itself\n        var newOpt = {};\n        newOpt[name] = value;\n        parsedOptions.push(newOpt);\n    }\n    return this;\n};\n\n/**\n * Sets multiple options.\n * @param {Object.<string,*>} options Options to set\n * @param {boolean} [ifNotSet] Sets an option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOptions = function setOptions(options, ifNotSet) {\n    if (options)\n        for (var keys = Object.keys(options), i = 0; i < keys.length; ++i)\n            this.setOption(keys[i], options[keys[i]], ifNotSet);\n    return this;\n};\n\n/**\n * Converts this instance to its string representation.\n * @returns {string} Class name[, space, full name]\n */\nReflectionObject.prototype.toString = function toString() {\n    var className = this.constructor.className,\n        fullName  = this.fullName;\n    if (fullName.length)\n        return className + \" \" + fullName;\n    return className;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nReflectionObject._configure = function(Root_) {\n    Root = Root_;\n};\n","\"use strict\";\nmodule.exports = OneOf;\n\n// extends ReflectionObject\nvar ReflectionObject = require(24);\n((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = \"OneOf\";\n\nvar Field = require(16),\n    util  = require(37);\n\n/**\n * Constructs a new oneof instance.\n * @classdesc Reflected oneof.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Oneof name\n * @param {string[]|Object.<string,*>} [fieldNames] Field names\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction OneOf(name, fieldNames, options, comment) {\n    if (!Array.isArray(fieldNames)) {\n        options = fieldNames;\n        fieldNames = undefined;\n    }\n    ReflectionObject.call(this, name, options);\n\n    /* istanbul ignore if */\n    if (!(fieldNames === undefined || Array.isArray(fieldNames)))\n        throw TypeError(\"fieldNames must be an Array\");\n\n    /**\n     * Field names that belong to this oneof.\n     * @type {string[]}\n     */\n    this.oneof = fieldNames || []; // toJSON, marker\n\n    /**\n     * Fields that belong to this oneof as an array for iteration.\n     * @type {Field[]}\n     * @readonly\n     */\n    this.fieldsArray = []; // declared readonly for conformance, possibly not yet added to parent\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Oneof descriptor.\n * @interface IOneOf\n * @property {Array.<string>} oneof Oneof field names\n * @property {Object.<string,*>} [options] Oneof options\n */\n\n/**\n * Constructs a oneof from a oneof descriptor.\n * @param {string} name Oneof name\n * @param {IOneOf} json Oneof descriptor\n * @returns {OneOf} Created oneof\n * @throws {TypeError} If arguments are invalid\n */\nOneOf.fromJSON = function fromJSON(name, json) {\n    return new OneOf(name, json.oneof, json.options, json.comment);\n};\n\n/**\n * Converts this oneof to a oneof descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IOneOf} Oneof descriptor\n */\nOneOf.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\" , this.options,\n        \"oneof\"   , this.oneof,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Adds the fields of the specified oneof to the parent if not already done so.\n * @param {OneOf} oneof The oneof\n * @returns {undefined}\n * @inner\n * @ignore\n */\nfunction addFieldsToParent(oneof) {\n    if (oneof.parent)\n        for (var i = 0; i < oneof.fieldsArray.length; ++i)\n            if (!oneof.fieldsArray[i].parent)\n                oneof.parent.add(oneof.fieldsArray[i]);\n}\n\n/**\n * Adds a field to this oneof and removes it from its current parent, if any.\n * @param {Field} field Field to add\n * @returns {OneOf} `this`\n */\nOneOf.prototype.add = function add(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    if (field.parent && field.parent !== this.parent)\n        field.parent.remove(field);\n    this.oneof.push(field.name);\n    this.fieldsArray.push(field);\n    field.partOf = this; // field.parent remains null\n    addFieldsToParent(this);\n    return this;\n};\n\n/**\n * Removes a field from this oneof and puts it back to the oneof's parent.\n * @param {Field} field Field to remove\n * @returns {OneOf} `this`\n */\nOneOf.prototype.remove = function remove(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    var index = this.fieldsArray.indexOf(field);\n\n    /* istanbul ignore if */\n    if (index < 0)\n        throw Error(field + \" is not a member of \" + this);\n\n    this.fieldsArray.splice(index, 1);\n    index = this.oneof.indexOf(field.name);\n\n    /* istanbul ignore else */\n    if (index > -1) // theoretical\n        this.oneof.splice(index, 1);\n\n    field.partOf = null;\n    return this;\n};\n\n/**\n * @override\n */\nOneOf.prototype.onAdd = function onAdd(parent) {\n    ReflectionObject.prototype.onAdd.call(this, parent);\n    var self = this;\n    // Collect present fields\n    for (var i = 0; i < this.oneof.length; ++i) {\n        var field = parent.get(this.oneof[i]);\n        if (field && !field.partOf) {\n            field.partOf = self;\n            self.fieldsArray.push(field);\n        }\n    }\n    // Add not yet present fields\n    addFieldsToParent(this);\n};\n\n/**\n * @override\n */\nOneOf.prototype.onRemove = function onRemove(parent) {\n    for (var i = 0, field; i < this.fieldsArray.length; ++i)\n        if ((field = this.fieldsArray[i]).parent)\n            field.parent.remove(field);\n    ReflectionObject.prototype.onRemove.call(this, parent);\n};\n\n/**\n * Decorator function as returned by {@link OneOf.d} (TypeScript).\n * @typedef OneOfDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} oneofName OneOf name\n * @returns {undefined}\n */\n\n/**\n * OneOf decorator (TypeScript).\n * @function\n * @param {...string} fieldNames Field names\n * @returns {OneOfDecorator} Decorator function\n * @template T extends string\n */\nOneOf.d = function decorateOneOf() {\n    var fieldNames = new Array(arguments.length),\n        index = 0;\n    while (index < arguments.length)\n        fieldNames[index] = arguments[index++];\n    return function oneOfDecorator(prototype, oneofName) {\n        util.decorateType(prototype.constructor)\n            .add(new OneOf(oneofName, fieldNames));\n        Object.defineProperty(prototype, oneofName, {\n            get: util.oneOfGetter(fieldNames),\n            set: util.oneOfSetter(fieldNames)\n        });\n    };\n};\n","\"use strict\";\nmodule.exports = parse;\n\nparse.filename = null;\nparse.defaults = { keepCase: false };\n\nvar tokenize  = require(34),\n    Root      = require(29),\n    Type      = require(35),\n    Field     = require(16),\n    MapField  = require(20),\n    OneOf     = require(25),\n    Enum      = require(15),\n    Service   = require(33),\n    Method    = require(22),\n    types     = require(36),\n    util      = require(37);\n\nvar base10Re    = /^[1-9][0-9]*$/,\n    base10NegRe = /^-?[1-9][0-9]*$/,\n    base16Re    = /^0[x][0-9a-fA-F]+$/,\n    base16NegRe = /^-?0[x][0-9a-fA-F]+$/,\n    base8Re     = /^0[0-7]+$/,\n    base8NegRe  = /^-?0[0-7]+$/,\n    numberRe    = /^(?![eE])[0-9]*(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,\n    nameRe      = /^[a-zA-Z_][a-zA-Z_0-9]*$/,\n    typeRefRe   = /^(?:\\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*$/,\n    fqTypeRefRe = /^(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)+$/;\n\n/**\n * Result object returned from {@link parse}.\n * @interface IParserResult\n * @property {string|undefined} package Package name, if declared\n * @property {string[]|undefined} imports Imports, if any\n * @property {string[]|undefined} weakImports Weak imports, if any\n * @property {string|undefined} syntax Syntax, if specified (either `\"proto2\"` or `\"proto3\"`)\n * @property {Root} root Populated root instance\n */\n\n/**\n * Options modifying the behavior of {@link parse}.\n * @interface IParseOptions\n * @property {boolean} [keepCase=false] Keeps field casing instead of converting to camel case\n * @property {boolean} [alternateCommentMode=false] Recognize double-slash comments in addition to doc-block comments.\n * @property {boolean} [preferTrailingComment=false] Use trailing comment when both leading comment and trailing comment exist.\n */\n\n/**\n * Options modifying the behavior of JSON serialization.\n * @interface IToJSONOptions\n * @property {boolean} [keepComments=false] Serializes comments.\n */\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @param {string} source Source contents\n * @param {Root} root Root to populate\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n */\nfunction parse(source, root, options) {\n    /* eslint-disable callback-return */\n    if (!(root instanceof Root)) {\n        options = root;\n        root = new Root();\n    }\n    if (!options)\n        options = parse.defaults;\n\n    var preferTrailingComment = options.preferTrailingComment || false;\n    var tn = tokenize(source, options.alternateCommentMode || false),\n        next = tn.next,\n        push = tn.push,\n        peek = tn.peek,\n        skip = tn.skip,\n        cmnt = tn.cmnt;\n\n    var head = true,\n        pkg,\n        imports,\n        weakImports,\n        syntax,\n        isProto3 = false;\n\n    var ptr = root;\n\n    var applyCase = options.keepCase ? function(name) { return name; } : util.camelCase;\n\n    /* istanbul ignore next */\n    function illegal(token, name, insideTryCatch) {\n        var filename = parse.filename;\n        if (!insideTryCatch)\n            parse.filename = null;\n        return Error(\"illegal \" + (name || \"token\") + \" '\" + token + \"' (\" + (filename ? filename + \", \" : \"\") + \"line \" + tn.line + \")\");\n    }\n\n    function readString() {\n        var values = [],\n            token;\n        do {\n            /* istanbul ignore if */\n            if ((token = next()) !== \"\\\"\" && token !== \"'\")\n                throw illegal(token);\n\n            values.push(next());\n            skip(token);\n            token = peek();\n        } while (token === \"\\\"\" || token === \"'\");\n        return values.join(\"\");\n    }\n\n    function readValue(acceptTypeRef) {\n        var token = next();\n        switch (token) {\n            case \"'\":\n            case \"\\\"\":\n                push(token);\n                return readString();\n            case \"true\": case \"TRUE\":\n                return true;\n            case \"false\": case \"FALSE\":\n                return false;\n        }\n        try {\n            return parseNumber(token, /* insideTryCatch */ true);\n        } catch (e) {\n\n            /* istanbul ignore else */\n            if (acceptTypeRef && typeRefRe.test(token))\n                return token;\n\n            /* istanbul ignore next */\n            throw illegal(token, \"value\");\n        }\n    }\n\n    function readRanges(target, acceptStrings) {\n        var token, start;\n        do {\n            if (acceptStrings && ((token = peek()) === \"\\\"\" || token === \"'\"))\n                target.push(readString());\n            else\n                target.push([ start = parseId(next()), skip(\"to\", true) ? parseId(next()) : start ]);\n        } while (skip(\",\", true));\n        skip(\";\");\n    }\n\n    function parseNumber(token, insideTryCatch) {\n        var sign = 1;\n        if (token.charAt(0) === \"-\") {\n            sign = -1;\n            token = token.substring(1);\n        }\n        switch (token) {\n            case \"inf\": case \"INF\": case \"Inf\":\n                return sign * Infinity;\n            case \"nan\": case \"NAN\": case \"Nan\": case \"NaN\":\n                return NaN;\n            case \"0\":\n                return 0;\n        }\n        if (base10Re.test(token))\n            return sign * parseInt(token, 10);\n        if (base16Re.test(token))\n            return sign * parseInt(token, 16);\n        if (base8Re.test(token))\n            return sign * parseInt(token, 8);\n\n        /* istanbul ignore else */\n        if (numberRe.test(token))\n            return sign * parseFloat(token);\n\n        /* istanbul ignore next */\n        throw illegal(token, \"number\", insideTryCatch);\n    }\n\n    function parseId(token, acceptNegative) {\n        switch (token) {\n            case \"max\": case \"MAX\": case \"Max\":\n                return 536870911;\n            case \"0\":\n                return 0;\n        }\n\n        /* istanbul ignore if */\n        if (!acceptNegative && token.charAt(0) === \"-\")\n            throw illegal(token, \"id\");\n\n        if (base10NegRe.test(token))\n            return parseInt(token, 10);\n        if (base16NegRe.test(token))\n            return parseInt(token, 16);\n\n        /* istanbul ignore else */\n        if (base8NegRe.test(token))\n            return parseInt(token, 8);\n\n        /* istanbul ignore next */\n        throw illegal(token, \"id\");\n    }\n\n    function parsePackage() {\n\n        /* istanbul ignore if */\n        if (pkg !== undefined)\n            throw illegal(\"package\");\n\n        pkg = next();\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(pkg))\n            throw illegal(pkg, \"name\");\n\n        ptr = ptr.define(pkg);\n        skip(\";\");\n    }\n\n    function parseImport() {\n        var token = peek();\n        var whichImports;\n        switch (token) {\n            case \"weak\":\n                whichImports = weakImports || (weakImports = []);\n                next();\n                break;\n            case \"public\":\n                next();\n                // eslint-disable-line no-fallthrough\n            default:\n                whichImports = imports || (imports = []);\n                break;\n        }\n        token = readString();\n        skip(\";\");\n        whichImports.push(token);\n    }\n\n    function parseSyntax() {\n        skip(\"=\");\n        syntax = readString();\n        isProto3 = syntax === \"proto3\";\n\n        /* istanbul ignore if */\n        if (!isProto3 && syntax !== \"proto2\")\n            throw illegal(syntax, \"syntax\");\n\n        skip(\";\");\n    }\n\n    function parseCommon(parent, token) {\n        switch (token) {\n\n            case \"option\":\n                parseOption(parent, token);\n                skip(\";\");\n                return true;\n\n            case \"message\":\n                parseType(parent, token);\n                return true;\n\n            case \"enum\":\n                parseEnum(parent, token);\n                return true;\n\n            case \"service\":\n                parseService(parent, token);\n                return true;\n\n            case \"extend\":\n                parseExtension(parent, token);\n                return true;\n        }\n        return false;\n    }\n\n    function ifBlock(obj, fnIf, fnElse) {\n        var trailingLine = tn.line;\n        if (obj) {\n            if(typeof obj.comment !== \"string\") {\n              obj.comment = cmnt(); // try block-type comment\n            }\n            obj.filename = parse.filename;\n        }\n        if (skip(\"{\", true)) {\n            var token;\n            while ((token = next()) !== \"}\")\n                fnIf(token);\n            skip(\";\", true);\n        } else {\n            if (fnElse)\n                fnElse();\n            skip(\";\");\n            if (obj && (typeof obj.comment !== \"string\" || preferTrailingComment))\n                obj.comment = cmnt(trailingLine) || obj.comment; // try line-type comment\n        }\n    }\n\n    function parseType(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"type name\");\n\n        var type = new Type(token);\n        ifBlock(type, function parseType_block(token) {\n            if (parseCommon(type, token))\n                return;\n\n            switch (token) {\n\n                case \"map\":\n                    parseMapField(type, token);\n                    break;\n\n                case \"required\":\n                case \"repeated\":\n                    parseField(type, token);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (isProto3) {\n                        parseField(type, \"proto3_optional\");\n                    } else {\n                        parseField(type, \"optional\");\n                    }\n                    break;\n\n                case \"oneof\":\n                    parseOneOf(type, token);\n                    break;\n\n                case \"extensions\":\n                    readRanges(type.extensions || (type.extensions = []));\n                    break;\n\n                case \"reserved\":\n                    readRanges(type.reserved || (type.reserved = []), true);\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (!isProto3 || !typeRefRe.test(token))\n                        throw illegal(token);\n\n                    push(token);\n                    parseField(type, \"optional\");\n                    break;\n            }\n        });\n        parent.add(type);\n    }\n\n    function parseField(parent, rule, extend) {\n        var type = next();\n        if (type === \"group\") {\n            parseGroup(parent, rule);\n            return;\n        }\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(type))\n            throw illegal(type, \"type\");\n\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        name = applyCase(name);\n        skip(\"=\");\n\n        var field = new Field(name, parseId(next()), type, rule, extend);\n        ifBlock(field, function parseField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseField_line() {\n            parseInlineOptions(field);\n        });\n\n        if (rule === \"proto3_optional\") {\n            // for proto3 optional fields, we create a single-member Oneof to mimic \"optional\" behavior\n            var oneof = new OneOf(\"_\" + name);\n            field.setOption(\"proto3_optional\", true);\n            oneof.add(field);\n            parent.add(oneof);\n        } else {\n            parent.add(field);\n        }\n\n        // JSON defaults to packed=true if not set so we have to set packed=false explicity when\n        // parsing proto2 descriptors without the option, where applicable. This must be done for\n        // all known packable types and anything that could be an enum (= is not a basic type).\n        if (!isProto3 && field.repeated && (types.packed[type] !== undefined || types.basic[type] === undefined))\n            field.setOption(\"packed\", false, /* ifNotSet */ true);\n    }\n\n    function parseGroup(parent, rule) {\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        var fieldName = util.lcFirst(name);\n        if (name === fieldName)\n            name = util.ucFirst(name);\n        skip(\"=\");\n        var id = parseId(next());\n        var type = new Type(name);\n        type.group = true;\n        var field = new Field(fieldName, id, name, rule);\n        field.filename = parse.filename;\n        ifBlock(type, function parseGroup_block(token) {\n            switch (token) {\n\n                case \"option\":\n                    parseOption(type, token);\n                    skip(\";\");\n                    break;\n\n                case \"required\":\n                case \"repeated\":\n                    parseField(type, token);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (isProto3) {\n                        parseField(type, \"proto3_optional\");\n                    } else {\n                        parseField(type, \"optional\");\n                    }\n                    break;\n\n                /* istanbul ignore next */\n                default:\n                    throw illegal(token); // there are no groups with proto3 semantics\n            }\n        });\n        parent.add(type)\n              .add(field);\n    }\n\n    function parseMapField(parent) {\n        skip(\"<\");\n        var keyType = next();\n\n        /* istanbul ignore if */\n        if (types.mapKey[keyType] === undefined)\n            throw illegal(keyType, \"type\");\n\n        skip(\",\");\n        var valueType = next();\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(valueType))\n            throw illegal(valueType, \"type\");\n\n        skip(\">\");\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        skip(\"=\");\n        var field = new MapField(applyCase(name), parseId(next()), keyType, valueType);\n        ifBlock(field, function parseMapField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseMapField_line() {\n            parseInlineOptions(field);\n        });\n        parent.add(field);\n    }\n\n    function parseOneOf(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var oneof = new OneOf(applyCase(token));\n        ifBlock(oneof, function parseOneOf_block(token) {\n            if (token === \"option\") {\n                parseOption(oneof, token);\n                skip(\";\");\n            } else {\n                push(token);\n                parseField(oneof, \"optional\");\n            }\n        });\n        parent.add(oneof);\n    }\n\n    function parseEnum(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var enm = new Enum(token);\n        ifBlock(enm, function parseEnum_block(token) {\n          switch(token) {\n            case \"option\":\n              parseOption(enm, token);\n              skip(\";\");\n              break;\n\n            case \"reserved\":\n              readRanges(enm.reserved || (enm.reserved = []), true);\n              break;\n\n            default:\n              parseEnumValue(enm, token);\n          }\n        });\n        parent.add(enm);\n    }\n\n    function parseEnumValue(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token))\n            throw illegal(token, \"name\");\n\n        skip(\"=\");\n        var value = parseId(next(), true),\n            dummy = {};\n        ifBlock(dummy, function parseEnumValue_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(dummy, token); // skip\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseEnumValue_line() {\n            parseInlineOptions(dummy); // skip\n        });\n        parent.add(token, value, dummy.comment);\n    }\n\n    function parseOption(parent, token) {\n        var isCustom = skip(\"(\", true);\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var name = token;\n        var option = name;\n        var propName;\n\n        if (isCustom) {\n            skip(\")\");\n            name = \"(\" + name + \")\";\n            option = name;\n            token = peek();\n            if (fqTypeRefRe.test(token)) {\n                propName = token.substr(1); //remove '.' before property name\n                name += token;\n                next();\n            }\n        }\n        skip(\"=\");\n        var optionValue = parseOptionValue(parent, name);\n        setParsedOption(parent, option, optionValue, propName);\n    }\n\n    function parseOptionValue(parent, name) {\n        if (skip(\"{\", true)) { // { a: \"foo\" b { c: \"bar\" } }\n            var result = {};\n            while (!skip(\"}\", true)) {\n                /* istanbul ignore if */\n                if (!nameRe.test(token = next()))\n                    throw illegal(token, \"name\");\n\n                var value;\n                var propName = token;\n                if (peek() === \"{\")\n                    value = parseOptionValue(parent, name + \".\" + token);\n                else {\n                    skip(\":\");\n                    if (peek() === \"{\")\n                        value = parseOptionValue(parent, name + \".\" + token);\n                    else {\n                        value = readValue(true);\n                        setOption(parent, name + \".\" + token, value);\n                    }\n                }\n                var prevValue = result[propName];\n                if (prevValue)\n                    value = [].concat(prevValue).concat(value);\n                result[propName] = value;\n                skip(\",\", true);\n            }\n            return result;\n        }\n\n        var simpleValue = readValue(true);\n        setOption(parent, name, simpleValue);\n        return simpleValue;\n        // Does not enforce a delimiter to be universal\n    }\n\n    function setOption(parent, name, value) {\n        if (parent.setOption)\n            parent.setOption(name, value);\n    }\n\n    function setParsedOption(parent, name, value, propName) {\n        if (parent.setParsedOption)\n            parent.setParsedOption(name, value, propName);\n    }\n\n    function parseInlineOptions(parent) {\n        if (skip(\"[\", true)) {\n            do {\n                parseOption(parent, \"option\");\n            } while (skip(\",\", true));\n            skip(\"]\");\n        }\n        return parent;\n    }\n\n    function parseService(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"service name\");\n\n        var service = new Service(token);\n        ifBlock(service, function parseService_block(token) {\n            if (parseCommon(service, token))\n                return;\n\n            /* istanbul ignore else */\n            if (token === \"rpc\")\n                parseMethod(service, token);\n            else\n                throw illegal(token);\n        });\n        parent.add(service);\n    }\n\n    function parseMethod(parent, token) {\n        // Get the comment of the preceding line now (if one exists) in case the\n        // method is defined across multiple lines.\n        var commentText = cmnt();\n\n        var type = token;\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var name = token,\n            requestType, requestStream,\n            responseType, responseStream;\n\n        skip(\"(\");\n        if (skip(\"stream\", true))\n            requestStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        requestType = token;\n        skip(\")\"); skip(\"returns\"); skip(\"(\");\n        if (skip(\"stream\", true))\n            responseStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        responseType = token;\n        skip(\")\");\n\n        var method = new Method(name, type, requestType, responseType, requestStream, responseStream);\n        method.comment = commentText;\n        ifBlock(method, function parseMethod_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(method, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        });\n        parent.add(method);\n    }\n\n    function parseExtension(parent, token) {\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token, \"reference\");\n\n        var reference = token;\n        ifBlock(null, function parseExtension_block(token) {\n            switch (token) {\n\n                case \"required\":\n                case \"repeated\":\n                    parseField(parent, token, reference);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (isProto3) {\n                        parseField(parent, \"proto3_optional\", reference);\n                    } else {\n                        parseField(parent, \"optional\", reference);\n                    }\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (!isProto3 || !typeRefRe.test(token))\n                        throw illegal(token);\n                    push(token);\n                    parseField(parent, \"optional\", reference);\n                    break;\n            }\n        });\n    }\n\n    var token;\n    while ((token = next()) !== null) {\n        switch (token) {\n\n            case \"package\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parsePackage();\n                break;\n\n            case \"import\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseImport();\n                break;\n\n            case \"syntax\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseSyntax();\n                break;\n\n            case \"option\":\n\n                parseOption(ptr, token);\n                skip(\";\");\n                break;\n\n            default:\n\n                /* istanbul ignore else */\n                if (parseCommon(ptr, token)) {\n                    head = false;\n                    continue;\n                }\n\n                /* istanbul ignore next */\n                throw illegal(token);\n        }\n    }\n\n    parse.filename = null;\n    return {\n        \"package\"     : pkg,\n        \"imports\"     : imports,\n         weakImports  : weakImports,\n         syntax       : syntax,\n         root         : root\n    };\n}\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @name parse\n * @function\n * @param {string} source Source contents\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n * @variation 2\n */\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util      = require(39);\n\nvar BufferReader; // cyclic\n\nvar LongBits  = util.LongBits,\n    utf8      = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n    return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n    /**\n     * Read buffer.\n     * @type {Uint8Array}\n     */\n    this.buf = buffer;\n\n    /**\n     * Read buffer position.\n     * @type {number}\n     */\n    this.pos = 0;\n\n    /**\n     * Read buffer length.\n     * @type {number}\n     */\n    this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n    ? function create_typed_array(buffer) {\n        if (buffer instanceof Uint8Array || Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    }\n    /* istanbul ignore next */\n    : function create_array(buffer) {\n        if (Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    };\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup(buffer) {\n            return (Reader.create = function create_buffer(buffer) {\n                return util.Buffer.isBuffer(buffer)\n                    ? new BufferReader(buffer)\n                    /* istanbul ignore next */\n                    : create_array(buffer);\n            })(buffer);\n        }\n        /* istanbul ignore next */\n        : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n    var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n    return function read_uint32() {\n        value = (         this.buf[this.pos] & 127       ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) <<  7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] &  15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n        /* istanbul ignore if */\n        if ((this.pos += 5) > this.len) {\n            this.pos = this.len;\n            throw indexOutOfRange(this, 10);\n        }\n        return value;\n    };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n    return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n    var value = this.uint32();\n    return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n    // tends to deopt with local vars for octet etc.\n    var bits = new LongBits(0, 0);\n    var i = 0;\n    if (this.len - this.pos > 4) { // fast route (lo)\n        for (; i < 4; ++i) {\n            // 1st..4th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 5th\n        bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n        bits.hi = (bits.hi | (this.buf[this.pos] & 127) >>  4) >>> 0;\n        if (this.buf[this.pos++] < 128)\n            return bits;\n        i = 0;\n    } else {\n        for (; i < 3; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 1st..3th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 4th\n        bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n        return bits;\n    }\n    if (this.len - this.pos > 4) { // fast route (hi)\n        for (; i < 5; ++i) {\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    } else {\n        for (; i < 5; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    }\n    /* istanbul ignore next */\n    throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n    return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n    return (buf[end - 4]\n          | buf[end - 3] << 8\n          | buf[end - 2] << 16\n          | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 8);\n\n    return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readFloatLE(this.buf, this.pos);\n    this.pos += 4;\n    return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readDoubleLE(this.buf, this.pos);\n    this.pos += 8;\n    return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n    var length = this.uint32(),\n        start  = this.pos,\n        end    = this.pos + length;\n\n    /* istanbul ignore if */\n    if (end > this.len)\n        throw indexOutOfRange(this, length);\n\n    this.pos += length;\n    if (Array.isArray(this.buf)) // plain array\n        return this.buf.slice(start, end);\n    return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n        ? new this.buf.constructor(0)\n        : this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n    var bytes = this.bytes();\n    return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n    if (typeof length === \"number\") {\n        /* istanbul ignore if */\n        if (this.pos + length > this.len)\n            throw indexOutOfRange(this, length);\n        this.pos += length;\n    } else {\n        do {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n        } while (this.buf[this.pos++] & 128);\n    }\n    return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n    switch (wireType) {\n        case 0:\n            this.skip();\n            break;\n        case 1:\n            this.skip(8);\n            break;\n        case 2:\n            this.skip(this.uint32());\n            break;\n        case 3:\n            while ((wireType = this.uint32() & 7) !== 4) {\n                this.skipType(wireType);\n            }\n            break;\n        case 5:\n            this.skip(4);\n            break;\n\n        /* istanbul ignore next */\n        default:\n            throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n    }\n    return this;\n};\n\nReader._configure = function(BufferReader_) {\n    BufferReader = BufferReader_;\n    Reader.create = create();\n    BufferReader._configure();\n\n    var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n    util.merge(Reader.prototype, {\n\n        int64: function read_int64() {\n            return readLongVarint.call(this)[fn](false);\n        },\n\n        uint64: function read_uint64() {\n            return readLongVarint.call(this)[fn](true);\n        },\n\n        sint64: function read_sint64() {\n            return readLongVarint.call(this).zzDecode()[fn](false);\n        },\n\n        fixed64: function read_fixed64() {\n            return readFixed64.call(this)[fn](true);\n        },\n\n        sfixed64: function read_sfixed64() {\n            return readFixed64.call(this)[fn](false);\n        }\n\n    });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(27);\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(39);\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n    Reader.call(this, buffer);\n\n    /**\n     * Read buffer.\n     * @name BufferReader#buf\n     * @type {Buffer}\n     */\n}\n\nBufferReader._configure = function () {\n    /* istanbul ignore else */\n    if (util.Buffer)\n        BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n    var len = this.uint32(); // modifies pos\n    return this.buf.utf8Slice\n        ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n        : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = Root;\n\n// extends Namespace\nvar Namespace = require(23);\n((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = \"Root\";\n\nvar Field   = require(16),\n    Enum    = require(15),\n    OneOf   = require(25),\n    util    = require(37);\n\nvar Type,   // cyclic\n    parse,  // might be excluded\n    common; // \"\n\n/**\n * Constructs a new root namespace instance.\n * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.\n * @extends NamespaceBase\n * @constructor\n * @param {Object.<string,*>} [options] Top level options\n */\nfunction Root(options) {\n    Namespace.call(this, \"\", options);\n\n    /**\n     * Deferred extension fields.\n     * @type {Field[]}\n     */\n    this.deferred = [];\n\n    /**\n     * Resolved file names of loaded files.\n     * @type {string[]}\n     */\n    this.files = [];\n}\n\n/**\n * Loads a namespace descriptor into a root namespace.\n * @param {INamespace} json Nameespace descriptor\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted\n * @returns {Root} Root namespace\n */\nRoot.fromJSON = function fromJSON(json, root) {\n    if (!root)\n        root = new Root();\n    if (json.options)\n        root.setOptions(json.options);\n    return root.addJSON(json.nested);\n};\n\n/**\n * Resolves the path of an imported file, relative to the importing origin.\n * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.\n * @function\n * @param {string} origin The file name of the importing file\n * @param {string} target The file name being imported\n * @returns {string|null} Resolved path to `target` or `null` to skip the file\n */\nRoot.prototype.resolvePath = util.path.resolve;\n\n/**\n * Fetch content from file path or url\n * This method exists so you can override it with your own logic.\n * @function\n * @param {string} path File path or url\n * @param {FetchCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.fetch = util.fetch;\n\n// A symbol-like function to safely signal synchronous loading\n/* istanbul ignore next */\nfunction SYNC() {} // eslint-disable-line no-empty-function\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} options Parse options\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.load = function load(filename, options, callback) {\n    if (typeof options === \"function\") {\n        callback = options;\n        options = undefined;\n    }\n    var self = this;\n    if (!callback)\n        return util.asPromise(load, self, filename, options);\n\n    var sync = callback === SYNC; // undocumented\n\n    // Finishes loading by calling the callback (exactly once)\n    function finish(err, root) {\n        /* istanbul ignore if */\n        if (!callback)\n            return;\n        var cb = callback;\n        callback = null;\n        if (sync)\n            throw err;\n        cb(err, root);\n    }\n\n    // Bundled definition existence checking\n    function getBundledFileName(filename) {\n        var idx = filename.lastIndexOf(\"google/protobuf/\");\n        if (idx > -1) {\n            var altname = filename.substring(idx);\n            if (altname in common) return altname;\n        }\n        return null;\n    }\n\n    // Processes a single file\n    function process(filename, source) {\n        try {\n            if (util.isString(source) && source.charAt(0) === \"{\")\n                source = JSON.parse(source);\n            if (!util.isString(source))\n                self.setOptions(source.options).addJSON(source.nested);\n            else {\n                parse.filename = filename;\n                var parsed = parse(source, self, options),\n                    resolved,\n                    i = 0;\n                if (parsed.imports)\n                    for (; i < parsed.imports.length; ++i)\n                        if (resolved = getBundledFileName(parsed.imports[i]) || self.resolvePath(filename, parsed.imports[i]))\n                            fetch(resolved);\n                if (parsed.weakImports)\n                    for (i = 0; i < parsed.weakImports.length; ++i)\n                        if (resolved = getBundledFileName(parsed.weakImports[i]) || self.resolvePath(filename, parsed.weakImports[i]))\n                            fetch(resolved, true);\n            }\n        } catch (err) {\n            finish(err);\n        }\n        if (!sync && !queued)\n            finish(null, self); // only once anyway\n    }\n\n    // Fetches a single file\n    function fetch(filename, weak) {\n\n        // Skip if already loaded / attempted\n        if (self.files.indexOf(filename) > -1)\n            return;\n        self.files.push(filename);\n\n        // Shortcut bundled definitions\n        if (filename in common) {\n            if (sync)\n                process(filename, common[filename]);\n            else {\n                ++queued;\n                setTimeout(function() {\n                    --queued;\n                    process(filename, common[filename]);\n                });\n            }\n            return;\n        }\n\n        // Otherwise fetch from disk or network\n        if (sync) {\n            var source;\n            try {\n                source = util.fs.readFileSync(filename).toString(\"utf8\");\n            } catch (err) {\n                if (!weak)\n                    finish(err);\n                return;\n            }\n            process(filename, source);\n        } else {\n            ++queued;\n            self.fetch(filename, function(err, source) {\n                --queued;\n                /* istanbul ignore if */\n                if (!callback)\n                    return; // terminated meanwhile\n                if (err) {\n                    /* istanbul ignore else */\n                    if (!weak)\n                        finish(err);\n                    else if (!queued) // can't be covered reliably\n                        finish(null, self);\n                    return;\n                }\n                process(filename, source);\n            });\n        }\n    }\n    var queued = 0;\n\n    // Assembling the root namespace doesn't require working type\n    // references anymore, so we can load everything in parallel\n    if (util.isString(filename))\n        filename = [ filename ];\n    for (var i = 0, resolved; i < filename.length; ++i)\n        if (resolved = self.resolvePath(\"\", filename[i]))\n            fetch(resolved);\n\n    if (sync)\n        return self;\n    if (!queued)\n        finish(null, self);\n    return undefined;\n};\n// function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Promise<Root>} Promise\n * @variation 3\n */\n// function load(filename:string, [options:IParseOptions]):Promise<Root>\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).\n * @function Root#loadSync\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n */\nRoot.prototype.loadSync = function loadSync(filename, options) {\n    if (!util.isNode)\n        throw Error(\"not supported\");\n    return this.load(filename, options, SYNC);\n};\n\n/**\n * @override\n */\nRoot.prototype.resolveAll = function resolveAll() {\n    if (this.deferred.length)\n        throw Error(\"unresolvable extensions: \" + this.deferred.map(function(field) {\n            return \"'extend \" + field.extend + \"' in \" + field.parent.fullName;\n        }).join(\", \"));\n    return Namespace.prototype.resolveAll.call(this);\n};\n\n// only uppercased (and thus conflict-free) children are exposed, see below\nvar exposeRe = /^[A-Z]/;\n\n/**\n * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.\n * @param {Root} root Root instance\n * @param {Field} field Declaring extension field witin the declaring type\n * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise\n * @inner\n * @ignore\n */\nfunction tryHandleExtension(root, field) {\n    var extendedType = field.parent.lookup(field.extend);\n    if (extendedType) {\n        var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);\n        sisterField.declaringField = field;\n        field.extensionField = sisterField;\n        extendedType.add(sisterField);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Called when any object is added to this root or its sub-namespaces.\n * @param {ReflectionObject} object Object added\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleAdd = function _handleAdd(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)\n            if (!tryHandleExtension(this, object))\n                this.deferred.push(object);\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object.values; // expose enum values as property of its parent\n\n    } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {\n\n        if (object instanceof Type) // Try to handle any deferred extensions\n            for (var i = 0; i < this.deferred.length;)\n                if (tryHandleExtension(this, this.deferred[i]))\n                    this.deferred.splice(i, 1);\n                else\n                    ++i;\n        for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace\n            this._handleAdd(object._nestedArray[j]);\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object; // expose namespace as property of its parent\n    }\n\n    // The above also adds uppercased (and thus conflict-free) nested types, services and enums as\n    // properties of namespaces just like static code does. This allows using a .d.ts generated for\n    // a static module with reflection-based solutions where the condition is met.\n};\n\n/**\n * Called when any object is removed from this root or its sub-namespaces.\n * @param {ReflectionObject} object Object removed\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleRemove = function _handleRemove(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field */ object.extend !== undefined) {\n            if (/* already handled */ object.extensionField) { // remove its sister field\n                object.extensionField.parent.remove(object.extensionField);\n                object.extensionField = null;\n            } else { // cancel the extension\n                var index = this.deferred.indexOf(object);\n                /* istanbul ignore else */\n                if (index > -1)\n                    this.deferred.splice(index, 1);\n            }\n        }\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose enum values\n\n    } else if (object instanceof Namespace) {\n\n        for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace\n            this._handleRemove(object._nestedArray[i]);\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose namespaces\n\n    }\n};\n\n// Sets up cyclic dependencies (called in index-light)\nRoot._configure = function(Type_, parse_, common_) {\n    Type   = Type_;\n    parse  = parse_;\n    common = common_;\n};\n","\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available accross modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n *     if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n *         throw Error(\"no such method\");\n *     asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n *         callback(err, responseData);\n *     });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(32);\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(39);\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n    if (typeof rpcImpl !== \"function\")\n        throw TypeError(\"rpcImpl must be a function\");\n\n    util.EventEmitter.call(this);\n\n    /**\n     * RPC implementation. Becomes `null` once the service is ended.\n     * @type {RPCImpl|null}\n     */\n    this.rpcImpl = rpcImpl;\n\n    /**\n     * Whether requests are length-delimited.\n     * @type {boolean}\n     */\n    this.requestDelimited = Boolean(requestDelimited);\n\n    /**\n     * Whether responses are length-delimited.\n     * @type {boolean}\n     */\n    this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n    if (!request)\n        throw TypeError(\"request must be specified\");\n\n    var self = this;\n    if (!callback)\n        return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n    if (!self.rpcImpl) {\n        setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n        return undefined;\n    }\n\n    try {\n        return self.rpcImpl(\n            method,\n            requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n            function rpcCallback(err, response) {\n\n                if (err) {\n                    self.emit(\"error\", err, method);\n                    return callback(err);\n                }\n\n                if (response === null) {\n                    self.end(/* endedByRPC */ true);\n                    return undefined;\n                }\n\n                if (!(response instanceof responseCtor)) {\n                    try {\n                        response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n                    } catch (err) {\n                        self.emit(\"error\", err, method);\n                        return callback(err);\n                    }\n                }\n\n                self.emit(\"data\", response, method);\n                return callback(null, response);\n            }\n        );\n    } catch (err) {\n        self.emit(\"error\", err, method);\n        setTimeout(function() { callback(err); }, 0);\n        return undefined;\n    }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n    if (this.rpcImpl) {\n        if (!endedByRPC) // signal end to rpcImpl\n            this.rpcImpl(null, null, null);\n        this.rpcImpl = null;\n        this.emit(\"end\").off();\n    }\n    return this;\n};\n","\"use strict\";\nmodule.exports = Service;\n\n// extends Namespace\nvar Namespace = require(23);\n((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = \"Service\";\n\nvar Method = require(22),\n    util   = require(37),\n    rpc    = require(31);\n\n/**\n * Constructs a new service instance.\n * @classdesc Reflected service.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Service name\n * @param {Object.<string,*>} [options] Service options\n * @throws {TypeError} If arguments are invalid\n */\nfunction Service(name, options) {\n    Namespace.call(this, name, options);\n\n    /**\n     * Service methods.\n     * @type {Object.<string,Method>}\n     */\n    this.methods = {}; // toJSON, marker\n\n    /**\n     * Cached methods as an array.\n     * @type {Method[]|null}\n     * @private\n     */\n    this._methodsArray = null;\n}\n\n/**\n * Service descriptor.\n * @interface IService\n * @extends INamespace\n * @property {Object.<string,IMethod>} methods Method descriptors\n */\n\n/**\n * Constructs a service from a service descriptor.\n * @param {string} name Service name\n * @param {IService} json Service descriptor\n * @returns {Service} Created service\n * @throws {TypeError} If arguments are invalid\n */\nService.fromJSON = function fromJSON(name, json) {\n    var service = new Service(name, json.options);\n    /* istanbul ignore else */\n    if (json.methods)\n        for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i)\n            service.add(Method.fromJSON(names[i], json.methods[names[i]]));\n    if (json.nested)\n        service.addJSON(json.nested);\n    service.comment = json.comment;\n    return service;\n};\n\n/**\n * Converts this service to a service descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IService} Service descriptor\n */\nService.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\" , inherited && inherited.options || undefined,\n        \"methods\" , Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ {},\n        \"nested\"  , inherited && inherited.nested || undefined,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Methods of this service as an array for iteration.\n * @name Service#methodsArray\n * @type {Method[]}\n * @readonly\n */\nObject.defineProperty(Service.prototype, \"methodsArray\", {\n    get: function() {\n        return this._methodsArray || (this._methodsArray = util.toArray(this.methods));\n    }\n});\n\nfunction clearCache(service) {\n    service._methodsArray = null;\n    return service;\n}\n\n/**\n * @override\n */\nService.prototype.get = function get(name) {\n    return this.methods[name]\n        || Namespace.prototype.get.call(this, name);\n};\n\n/**\n * @override\n */\nService.prototype.resolveAll = function resolveAll() {\n    var methods = this.methodsArray;\n    for (var i = 0; i < methods.length; ++i)\n        methods[i].resolve();\n    return Namespace.prototype.resolve.call(this);\n};\n\n/**\n * @override\n */\nService.prototype.add = function add(object) {\n\n    /* istanbul ignore if */\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Method) {\n        this.methods[object.name] = object;\n        object.parent = this;\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * @override\n */\nService.prototype.remove = function remove(object) {\n    if (object instanceof Method) {\n\n        /* istanbul ignore if */\n        if (this.methods[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.methods[object.name];\n        object.parent = null;\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Creates a runtime service using the specified rpc implementation.\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n * @returns {rpc.Service} RPC service. Useful where requests and/or responses are streamed.\n */\nService.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) {\n    var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited);\n    for (var i = 0, method; i < /* initializes */ this.methodsArray.length; ++i) {\n        var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\\w_]/g, \"\");\n        rpcService[methodName] = util.codegen([\"r\",\"c\"], util.isReserved(methodName) ? methodName + \"_\" : methodName)(\"return this.rpcCall(m,q,s,r,c)\")({\n            m: method,\n            q: method.resolvedRequestType.ctor,\n            s: method.resolvedResponseType.ctor\n        });\n    }\n    return rpcService;\n};\n","\"use strict\";\nmodule.exports = tokenize;\n\nvar delimRe        = /[\\s{}=;:[\\],'\"()<>]/g,\n    stringDoubleRe = /(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")/g,\n    stringSingleRe = /(?:'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')/g;\n\nvar setCommentRe = /^ *[*/]+ */,\n    setCommentAltRe = /^\\s*\\*?\\/*/,\n    setCommentSplitRe = /\\n/g,\n    whitespaceRe = /\\s/,\n    unescapeRe = /\\\\(.?)/g;\n\nvar unescapeMap = {\n    \"0\": \"\\0\",\n    \"r\": \"\\r\",\n    \"n\": \"\\n\",\n    \"t\": \"\\t\"\n};\n\n/**\n * Unescapes a string.\n * @param {string} str String to unescape\n * @returns {string} Unescaped string\n * @property {Object.<string,string>} map Special characters map\n * @memberof tokenize\n */\nfunction unescape(str) {\n    return str.replace(unescapeRe, function($0, $1) {\n        switch ($1) {\n            case \"\\\\\":\n            case \"\":\n                return $1;\n            default:\n                return unescapeMap[$1] || \"\";\n        }\n    });\n}\n\ntokenize.unescape = unescape;\n\n/**\n * Gets the next token and advances.\n * @typedef TokenizerHandleNext\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Peeks for the next token.\n * @typedef TokenizerHandlePeek\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Pushes a token back to the stack.\n * @typedef TokenizerHandlePush\n * @type {function}\n * @param {string} token Token\n * @returns {undefined}\n */\n\n/**\n * Skips the next token.\n * @typedef TokenizerHandleSkip\n * @type {function}\n * @param {string} expected Expected token\n * @param {boolean} [optional=false] If optional\n * @returns {boolean} Whether the token matched\n * @throws {Error} If the token didn't match and is not optional\n */\n\n/**\n * Gets the comment on the previous line or, alternatively, the line comment on the specified line.\n * @typedef TokenizerHandleCmnt\n * @type {function}\n * @param {number} [line] Line number\n * @returns {string|null} Comment text or `null` if none\n */\n\n/**\n * Handle object returned from {@link tokenize}.\n * @interface ITokenizerHandle\n * @property {TokenizerHandleNext} next Gets the next token and advances (`null` on eof)\n * @property {TokenizerHandlePeek} peek Peeks for the next token (`null` on eof)\n * @property {TokenizerHandlePush} push Pushes a token back to the stack\n * @property {TokenizerHandleSkip} skip Skips a token, returns its presence and advances or, if non-optional and not present, throws\n * @property {TokenizerHandleCmnt} cmnt Gets the comment on the previous line or the line comment on the specified line, if any\n * @property {number} line Current line number\n */\n\n/**\n * Tokenizes the given .proto source and returns an object with useful utility functions.\n * @param {string} source Source contents\n * @param {boolean} alternateCommentMode Whether we should activate alternate comment parsing mode.\n * @returns {ITokenizerHandle} Tokenizer handle\n */\nfunction tokenize(source, alternateCommentMode) {\n    /* eslint-disable callback-return */\n    source = source.toString();\n\n    var offset = 0,\n        length = source.length,\n        line = 1,\n        commentType = null,\n        commentText = null,\n        commentLine = 0,\n        commentLineEmpty = false,\n        commentIsLeading = false;\n\n    var stack = [];\n\n    var stringDelim = null;\n\n    /* istanbul ignore next */\n    /**\n     * Creates an error for illegal syntax.\n     * @param {string} subject Subject\n     * @returns {Error} Error created\n     * @inner\n     */\n    function illegal(subject) {\n        return Error(\"illegal \" + subject + \" (line \" + line + \")\");\n    }\n\n    /**\n     * Reads a string till its end.\n     * @returns {string} String read\n     * @inner\n     */\n    function readString() {\n        var re = stringDelim === \"'\" ? stringSingleRe : stringDoubleRe;\n        re.lastIndex = offset - 1;\n        var match = re.exec(source);\n        if (!match)\n            throw illegal(\"string\");\n        offset = re.lastIndex;\n        push(stringDelim);\n        stringDelim = null;\n        return unescape(match[1]);\n    }\n\n    /**\n     * Gets the character at `pos` within the source.\n     * @param {number} pos Position\n     * @returns {string} Character\n     * @inner\n     */\n    function charAt(pos) {\n        return source.charAt(pos);\n    }\n\n    /**\n     * Sets the current comment text.\n     * @param {number} start Start offset\n     * @param {number} end End offset\n     * @param {boolean} isLeading set if a leading comment\n     * @returns {undefined}\n     * @inner\n     */\n    function setComment(start, end, isLeading) {\n        commentType = source.charAt(start++);\n        commentLine = line;\n        commentLineEmpty = false;\n        commentIsLeading = isLeading;\n        var lookback;\n        if (alternateCommentMode) {\n            lookback = 2;  // alternate comment parsing: \"//\" or \"/*\"\n        } else {\n            lookback = 3;  // \"///\" or \"/**\"\n        }\n        var commentOffset = start - lookback,\n            c;\n        do {\n            if (--commentOffset < 0 ||\n                    (c = source.charAt(commentOffset)) === \"\\n\") {\n                commentLineEmpty = true;\n                break;\n            }\n        } while (c === \" \" || c === \"\\t\");\n        var lines = source\n            .substring(start, end)\n            .split(setCommentSplitRe);\n        for (var i = 0; i < lines.length; ++i)\n            lines[i] = lines[i]\n                .replace(alternateCommentMode ? setCommentAltRe : setCommentRe, \"\")\n                .trim();\n        commentText = lines\n            .join(\"\\n\")\n            .trim();\n    }\n\n    function isDoubleSlashCommentLine(startOffset) {\n        var endOffset = findEndOfLine(startOffset);\n\n        // see if remaining line matches comment pattern\n        var lineText = source.substring(startOffset, endOffset);\n        // look for 1 or 2 slashes since startOffset would already point past\n        // the first slash that started the comment.\n        var isComment = /^\\s*\\/{1,2}/.test(lineText);\n        return isComment;\n    }\n\n    function findEndOfLine(cursor) {\n        // find end of cursor's line\n        var endOffset = cursor;\n        while (endOffset < length && charAt(endOffset) !== \"\\n\") {\n            endOffset++;\n        }\n        return endOffset;\n    }\n\n    /**\n     * Obtains the next token.\n     * @returns {string|null} Next token or `null` on eof\n     * @inner\n     */\n    function next() {\n        if (stack.length > 0)\n            return stack.shift();\n        if (stringDelim)\n            return readString();\n        var repeat,\n            prev,\n            curr,\n            start,\n            isDoc,\n            isLeadingComment = offset === 0;\n        do {\n            if (offset === length)\n                return null;\n            repeat = false;\n            while (whitespaceRe.test(curr = charAt(offset))) {\n                if (curr === \"\\n\") {\n                    isLeadingComment = true;\n                    ++line;\n                }\n                if (++offset === length)\n                    return null;\n            }\n\n            if (charAt(offset) === \"/\") {\n                if (++offset === length) {\n                    throw illegal(\"comment\");\n                }\n                if (charAt(offset) === \"/\") { // Line\n                    if (!alternateCommentMode) {\n                        // check for triple-slash comment\n                        isDoc = charAt(start = offset + 1) === \"/\";\n\n                        while (charAt(++offset) !== \"\\n\") {\n                            if (offset === length) {\n                                return null;\n                            }\n                        }\n                        ++offset;\n                        if (isDoc) {\n                            setComment(start, offset - 1, isLeadingComment);\n                        }\n                        ++line;\n                        repeat = true;\n                    } else {\n                        // check for double-slash comments, consolidating consecutive lines\n                        start = offset;\n                        isDoc = false;\n                        if (isDoubleSlashCommentLine(offset)) {\n                            isDoc = true;\n                            do {\n                                offset = findEndOfLine(offset);\n                                if (offset === length) {\n                                    break;\n                                }\n                                offset++;\n                            } while (isDoubleSlashCommentLine(offset));\n                        } else {\n                            offset = Math.min(length, findEndOfLine(offset) + 1);\n                        }\n                        if (isDoc) {\n                            setComment(start, offset, isLeadingComment);\n                        }\n                        line++;\n                        repeat = true;\n                    }\n                } else if ((curr = charAt(offset)) === \"*\") { /* Block */\n                    // check for /** (regular comment mode) or /* (alternate comment mode)\n                    start = offset + 1;\n                    isDoc = alternateCommentMode || charAt(start) === \"*\";\n                    do {\n                        if (curr === \"\\n\") {\n                            ++line;\n                        }\n                        if (++offset === length) {\n                            throw illegal(\"comment\");\n                        }\n                        prev = curr;\n                        curr = charAt(offset);\n                    } while (prev !== \"*\" || curr !== \"/\");\n                    ++offset;\n                    if (isDoc) {\n                        setComment(start, offset - 2, isLeadingComment);\n                    }\n                    repeat = true;\n                } else {\n                    return \"/\";\n                }\n            }\n        } while (repeat);\n\n        // offset !== length if we got here\n\n        var end = offset;\n        delimRe.lastIndex = 0;\n        var delim = delimRe.test(charAt(end++));\n        if (!delim)\n            while (end < length && !delimRe.test(charAt(end)))\n                ++end;\n        var token = source.substring(offset, offset = end);\n        if (token === \"\\\"\" || token === \"'\")\n            stringDelim = token;\n        return token;\n    }\n\n    /**\n     * Pushes a token back to the stack.\n     * @param {string} token Token\n     * @returns {undefined}\n     * @inner\n     */\n    function push(token) {\n        stack.push(token);\n    }\n\n    /**\n     * Peeks for the next token.\n     * @returns {string|null} Token or `null` on eof\n     * @inner\n     */\n    function peek() {\n        if (!stack.length) {\n            var token = next();\n            if (token === null)\n                return null;\n            push(token);\n        }\n        return stack[0];\n    }\n\n    /**\n     * Skips a token.\n     * @param {string} expected Expected token\n     * @param {boolean} [optional=false] Whether the token is optional\n     * @returns {boolean} `true` when skipped, `false` if not\n     * @throws {Error} When a required token is not present\n     * @inner\n     */\n    function skip(expected, optional) {\n        var actual = peek(),\n            equals = actual === expected;\n        if (equals) {\n            next();\n            return true;\n        }\n        if (!optional)\n            throw illegal(\"token '\" + actual + \"', '\" + expected + \"' expected\");\n        return false;\n    }\n\n    /**\n     * Gets a comment.\n     * @param {number} [trailingLine] Line number if looking for a trailing comment\n     * @returns {string|null} Comment text\n     * @inner\n     */\n    function cmnt(trailingLine) {\n        var ret = null;\n        if (trailingLine === undefined) {\n            if (commentLine === line - 1 && (alternateCommentMode || commentType === \"*\" || commentLineEmpty)) {\n                ret = commentIsLeading ? commentText : null;\n            }\n        } else {\n            /* istanbul ignore else */\n            if (commentLine < trailingLine) {\n                peek();\n            }\n            if (commentLine === trailingLine && !commentLineEmpty && (alternateCommentMode || commentType === \"/\")) {\n                ret = commentIsLeading ? null : commentText;\n            }\n        }\n        return ret;\n    }\n\n    return Object.defineProperty({\n        next: next,\n        peek: peek,\n        push: push,\n        skip: skip,\n        cmnt: cmnt\n    }, \"line\", {\n        get: function() { return line; }\n    });\n    /* eslint-enable callback-return */\n}\n","\"use strict\";\nmodule.exports = Type;\n\n// extends Namespace\nvar Namespace = require(23);\n((Type.prototype = Object.create(Namespace.prototype)).constructor = Type).className = \"Type\";\n\nvar Enum      = require(15),\n    OneOf     = require(25),\n    Field     = require(16),\n    MapField  = require(20),\n    Service   = require(33),\n    Message   = require(21),\n    Reader    = require(27),\n    Writer    = require(42),\n    util      = require(37),\n    encoder   = require(14),\n    decoder   = require(13),\n    verifier  = require(40),\n    converter = require(12),\n    wrappers  = require(41);\n\n/**\n * Constructs a new reflected message type instance.\n * @classdesc Reflected message type.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Message name\n * @param {Object.<string,*>} [options] Declared options\n */\nfunction Type(name, options) {\n    Namespace.call(this, name, options);\n\n    /**\n     * Message fields.\n     * @type {Object.<string,Field>}\n     */\n    this.fields = {};  // toJSON, marker\n\n    /**\n     * Oneofs declared within this namespace, if any.\n     * @type {Object.<string,OneOf>}\n     */\n    this.oneofs = undefined; // toJSON\n\n    /**\n     * Extension ranges, if any.\n     * @type {number[][]}\n     */\n    this.extensions = undefined; // toJSON\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    /*?\n     * Whether this type is a legacy group.\n     * @type {boolean|undefined}\n     */\n    this.group = undefined; // toJSON\n\n    /**\n     * Cached fields by id.\n     * @type {Object.<number,Field>|null}\n     * @private\n     */\n    this._fieldsById = null;\n\n    /**\n     * Cached fields as an array.\n     * @type {Field[]|null}\n     * @private\n     */\n    this._fieldsArray = null;\n\n    /**\n     * Cached oneofs as an array.\n     * @type {OneOf[]|null}\n     * @private\n     */\n    this._oneofsArray = null;\n\n    /**\n     * Cached constructor.\n     * @type {Constructor<{}>}\n     * @private\n     */\n    this._ctor = null;\n}\n\nObject.defineProperties(Type.prototype, {\n\n    /**\n     * Message fields by id.\n     * @name Type#fieldsById\n     * @type {Object.<number,Field>}\n     * @readonly\n     */\n    fieldsById: {\n        get: function() {\n\n            /* istanbul ignore if */\n            if (this._fieldsById)\n                return this._fieldsById;\n\n            this._fieldsById = {};\n            for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) {\n                var field = this.fields[names[i]],\n                    id = field.id;\n\n                /* istanbul ignore if */\n                if (this._fieldsById[id])\n                    throw Error(\"duplicate id \" + id + \" in \" + this);\n\n                this._fieldsById[id] = field;\n            }\n            return this._fieldsById;\n        }\n    },\n\n    /**\n     * Fields of this message as an array for iteration.\n     * @name Type#fieldsArray\n     * @type {Field[]}\n     * @readonly\n     */\n    fieldsArray: {\n        get: function() {\n            return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields));\n        }\n    },\n\n    /**\n     * Oneofs of this message as an array for iteration.\n     * @name Type#oneofsArray\n     * @type {OneOf[]}\n     * @readonly\n     */\n    oneofsArray: {\n        get: function() {\n            return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs));\n        }\n    },\n\n    /**\n     * The registered constructor, if any registered, otherwise a generic constructor.\n     * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor.\n     * @name Type#ctor\n     * @type {Constructor<{}>}\n     */\n    ctor: {\n        get: function() {\n            return this._ctor || (this.ctor = Type.generateConstructor(this)());\n        },\n        set: function(ctor) {\n\n            // Ensure proper prototype\n            var prototype = ctor.prototype;\n            if (!(prototype instanceof Message)) {\n                (ctor.prototype = new Message()).constructor = ctor;\n                util.merge(ctor.prototype, prototype);\n            }\n\n            // Classes and messages reference their reflected type\n            ctor.$type = ctor.prototype.$type = this;\n\n            // Mix in static methods\n            util.merge(ctor, Message, true);\n\n            this._ctor = ctor;\n\n            // Messages have non-enumerable default values on their prototype\n            var i = 0;\n            for (; i < /* initializes */ this.fieldsArray.length; ++i)\n                this._fieldsArray[i].resolve(); // ensures a proper value\n\n            // Messages have non-enumerable getters and setters for each virtual oneof field\n            var ctorProperties = {};\n            for (i = 0; i < /* initializes */ this.oneofsArray.length; ++i)\n                ctorProperties[this._oneofsArray[i].resolve().name] = {\n                    get: util.oneOfGetter(this._oneofsArray[i].oneof),\n                    set: util.oneOfSetter(this._oneofsArray[i].oneof)\n                };\n            if (i)\n                Object.defineProperties(ctor.prototype, ctorProperties);\n        }\n    }\n});\n\n/**\n * Generates a constructor function for the specified type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nType.generateConstructor = function generateConstructor(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n    var gen = util.codegen([\"p\"], mtype.name);\n    // explicitly initialize mutable object/array fields so that these aren't just inherited from the prototype\n    for (var i = 0, field; i < mtype.fieldsArray.length; ++i)\n        if ((field = mtype._fieldsArray[i]).map) gen\n            (\"this%s={}\", util.safeProp(field.name));\n        else if (field.repeated) gen\n            (\"this%s=[]\", util.safeProp(field.name));\n    return gen\n    (\"if(p)for(var ks=Object.keys(p),i=0;i<ks.length;++i)if(p[ks[i]]!=null)\") // omit undefined or null\n        (\"this[ks[i]]=p[ks[i]]\");\n    /* eslint-enable no-unexpected-multiline */\n};\n\nfunction clearCache(type) {\n    type._fieldsById = type._fieldsArray = type._oneofsArray = null;\n    delete type.encode;\n    delete type.decode;\n    delete type.verify;\n    return type;\n}\n\n/**\n * Message type descriptor.\n * @interface IType\n * @extends INamespace\n * @property {Object.<string,IOneOf>} [oneofs] Oneof descriptors\n * @property {Object.<string,IField>} fields Field descriptors\n * @property {number[][]} [extensions] Extension ranges\n * @property {number[][]} [reserved] Reserved ranges\n * @property {boolean} [group=false] Whether a legacy group or not\n */\n\n/**\n * Creates a message type from a message type descriptor.\n * @param {string} name Message name\n * @param {IType} json Message type descriptor\n * @returns {Type} Created message type\n */\nType.fromJSON = function fromJSON(name, json) {\n    var type = new Type(name, json.options);\n    type.extensions = json.extensions;\n    type.reserved = json.reserved;\n    var names = Object.keys(json.fields),\n        i = 0;\n    for (; i < names.length; ++i)\n        type.add(\n            ( typeof json.fields[names[i]].keyType !== \"undefined\"\n            ? MapField.fromJSON\n            : Field.fromJSON )(names[i], json.fields[names[i]])\n        );\n    if (json.oneofs)\n        for (names = Object.keys(json.oneofs), i = 0; i < names.length; ++i)\n            type.add(OneOf.fromJSON(names[i], json.oneofs[names[i]]));\n    if (json.nested)\n        for (names = Object.keys(json.nested), i = 0; i < names.length; ++i) {\n            var nested = json.nested[names[i]];\n            type.add( // most to least likely\n                ( nested.id !== undefined\n                ? Field.fromJSON\n                : nested.fields !== undefined\n                ? Type.fromJSON\n                : nested.values !== undefined\n                ? Enum.fromJSON\n                : nested.methods !== undefined\n                ? Service.fromJSON\n                : Namespace.fromJSON )(names[i], nested)\n            );\n        }\n    if (json.extensions && json.extensions.length)\n        type.extensions = json.extensions;\n    if (json.reserved && json.reserved.length)\n        type.reserved = json.reserved;\n    if (json.group)\n        type.group = true;\n    if (json.comment)\n        type.comment = json.comment;\n    return type;\n};\n\n/**\n * Converts this message type to a message type descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IType} Message type descriptor\n */\nType.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\"    , inherited && inherited.options || undefined,\n        \"oneofs\"     , Namespace.arrayToJSON(this.oneofsArray, toJSONOptions),\n        \"fields\"     , Namespace.arrayToJSON(this.fieldsArray.filter(function(obj) { return !obj.declaringField; }), toJSONOptions) || {},\n        \"extensions\" , this.extensions && this.extensions.length ? this.extensions : undefined,\n        \"reserved\"   , this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"group\"      , this.group || undefined,\n        \"nested\"     , inherited && inherited.nested || undefined,\n        \"comment\"    , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nType.prototype.resolveAll = function resolveAll() {\n    var fields = this.fieldsArray, i = 0;\n    while (i < fields.length)\n        fields[i++].resolve();\n    var oneofs = this.oneofsArray; i = 0;\n    while (i < oneofs.length)\n        oneofs[i++].resolve();\n    return Namespace.prototype.resolveAll.call(this);\n};\n\n/**\n * @override\n */\nType.prototype.get = function get(name) {\n    return this.fields[name]\n        || this.oneofs && this.oneofs[name]\n        || this.nested && this.nested[name]\n        || null;\n};\n\n/**\n * Adds a nested object to this type.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name or, if a field, when there is already a field with this id\n */\nType.prototype.add = function add(object) {\n\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Field && object.extend === undefined) {\n        // NOTE: Extension fields aren't actual fields on the declaring type, but nested objects.\n        // The root object takes care of adding distinct sister-fields to the respective extended\n        // type instead.\n\n        // avoids calling the getter if not absolutely necessary because it's called quite frequently\n        if (this._fieldsById ? /* istanbul ignore next */ this._fieldsById[object.id] : this.fieldsById[object.id])\n            throw Error(\"duplicate id \" + object.id + \" in \" + this);\n        if (this.isReservedId(object.id))\n            throw Error(\"id \" + object.id + \" is reserved in \" + this);\n        if (this.isReservedName(object.name))\n            throw Error(\"name '\" + object.name + \"' is reserved in \" + this);\n\n        if (object.parent)\n            object.parent.remove(object);\n        this.fields[object.name] = object;\n        object.message = this;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n        if (!this.oneofs)\n            this.oneofs = {};\n        this.oneofs[object.name] = object;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * Removes a nested object from this type.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this type\n */\nType.prototype.remove = function remove(object) {\n    if (object instanceof Field && object.extend === undefined) {\n        // See Type#add for the reason why extension fields are excluded here.\n\n        /* istanbul ignore if */\n        if (!this.fields || this.fields[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.fields[object.name];\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n\n        /* istanbul ignore if */\n        if (!this.oneofs || this.oneofs[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.oneofs[object.name];\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<{}>} Message instance\n */\nType.prototype.create = function create(properties) {\n    return new this.ctor(properties);\n};\n\n/**\n * Sets up {@link Type#encode|encode}, {@link Type#decode|decode} and {@link Type#verify|verify}.\n * @returns {Type} `this`\n */\nType.prototype.setup = function setup() {\n    // Sets up everything at once so that the prototype chain does not have to be re-evaluated\n    // multiple times (V8, soft-deopt prototype-check).\n\n    var fullName = this.fullName,\n        types    = [];\n    for (var i = 0; i < /* initializes */ this.fieldsArray.length; ++i)\n        types.push(this._fieldsArray[i].resolve().resolvedType);\n\n    // Replace setup methods with type-specific generated functions\n    this.encode = encoder(this)({\n        Writer : Writer,\n        types  : types,\n        util   : util\n    });\n    this.decode = decoder(this)({\n        Reader : Reader,\n        types  : types,\n        util   : util\n    });\n    this.verify = verifier(this)({\n        types : types,\n        util  : util\n    });\n    this.fromObject = converter.fromObject(this)({\n        types : types,\n        util  : util\n    });\n    this.toObject = converter.toObject(this)({\n        types : types,\n        util  : util\n    });\n\n    // Inject custom wrappers for common types\n    var wrapper = wrappers[fullName];\n    if (wrapper) {\n        var originalThis = Object.create(this);\n        // if (wrapper.fromObject) {\n            originalThis.fromObject = this.fromObject;\n            this.fromObject = wrapper.fromObject.bind(originalThis);\n        // }\n        // if (wrapper.toObject) {\n            originalThis.toObject = this.toObject;\n            this.toObject = wrapper.toObject.bind(originalThis);\n        // }\n    }\n\n    return this;\n};\n\n/**\n * Encodes a message of this type. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encode = function encode_setup(message, writer) {\n    return this.setup().encode(message, writer); // overrides this method\n};\n\n/**\n * Encodes a message of this type preceeded by its byte length as a varint. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();\n};\n\n/**\n * Decodes a message of this type.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Length of the message, if known beforehand\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError<{}>} If required fields are missing\n */\nType.prototype.decode = function decode_setup(reader, length) {\n    return this.setup().decode(reader, length); // overrides this method\n};\n\n/**\n * Decodes a message of this type preceeded by its byte length as a varint.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError} If required fields are missing\n */\nType.prototype.decodeDelimited = function decodeDelimited(reader) {\n    if (!(reader instanceof Reader))\n        reader = Reader.create(reader);\n    return this.decode(reader, reader.uint32());\n};\n\n/**\n * Verifies that field values are valid and that required fields are present.\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {null|string} `null` if valid, otherwise the reason why it is not\n */\nType.prototype.verify = function verify_setup(message) {\n    return this.setup().verify(message); // overrides this method\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object to convert\n * @returns {Message<{}>} Message instance\n */\nType.prototype.fromObject = function fromObject(object) {\n    return this.setup().fromObject(object);\n};\n\n/**\n * Conversion options as used by {@link Type#toObject} and {@link Message.toObject}.\n * @interface IConversionOptions\n * @property {Function} [longs] Long conversion type.\n * Valid values are `String` and `Number` (the global types).\n * Defaults to copy the present value, which is a possibly unsafe number without and a {@link Long} with a long library.\n * @property {Function} [enums] Enum value conversion type.\n * Only valid value is `String` (the global type).\n * Defaults to copy the present value, which is the numeric id.\n * @property {Function} [bytes] Bytes value conversion type.\n * Valid values are `Array` and (a base64 encoded) `String` (the global types).\n * Defaults to copy the present value, which usually is a Buffer under node and an Uint8Array in the browser.\n * @property {boolean} [defaults=false] Also sets default values on the resulting object\n * @property {boolean} [arrays=false] Sets empty arrays for missing repeated fields even if `defaults=false`\n * @property {boolean} [objects=false] Sets empty objects for missing map fields even if `defaults=false`\n * @property {boolean} [oneofs=false] Includes virtual oneof properties set to the present field's name, if any\n * @property {boolean} [json=false] Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings\n */\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\nType.prototype.toObject = function toObject(message, options) {\n    return this.setup().toObject(message, options);\n};\n\n/**\n * Decorator function as returned by {@link Type.d} (TypeScript).\n * @typedef TypeDecorator\n * @type {function}\n * @param {Constructor<T>} target Target constructor\n * @returns {undefined}\n * @template T extends Message<T>\n */\n\n/**\n * Type decorator (TypeScript).\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {TypeDecorator<T>} Decorator function\n * @template T extends Message<T>\n */\nType.d = function decorateType(typeName) {\n    return function typeDecorator(target) {\n        util.decorateType(target, typeName);\n    };\n};\n","\"use strict\";\n\n/**\n * Common type constants.\n * @namespace\n */\nvar types = exports;\n\nvar util = require(37);\n\nvar s = [\n    \"double\",   // 0\n    \"float\",    // 1\n    \"int32\",    // 2\n    \"uint32\",   // 3\n    \"sint32\",   // 4\n    \"fixed32\",  // 5\n    \"sfixed32\", // 6\n    \"int64\",    // 7\n    \"uint64\",   // 8\n    \"sint64\",   // 9\n    \"fixed64\",  // 10\n    \"sfixed64\", // 11\n    \"bool\",     // 12\n    \"string\",   // 13\n    \"bytes\"     // 14\n];\n\nfunction bake(values, offset) {\n    var i = 0, o = {};\n    offset |= 0;\n    while (i < values.length) o[s[i + offset]] = values[i++];\n    return o;\n}\n\n/**\n * Basic type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n * @property {number} bytes=2 Ldelim wire type\n */\ntypes.basic = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2,\n    /* bytes    */ 2\n]);\n\n/**\n * Basic type defaults.\n * @type {Object.<string,*>}\n * @const\n * @property {number} double=0 Double default\n * @property {number} float=0 Float default\n * @property {number} int32=0 Int32 default\n * @property {number} uint32=0 Uint32 default\n * @property {number} sint32=0 Sint32 default\n * @property {number} fixed32=0 Fixed32 default\n * @property {number} sfixed32=0 Sfixed32 default\n * @property {number} int64=0 Int64 default\n * @property {number} uint64=0 Uint64 default\n * @property {number} sint64=0 Sint32 default\n * @property {number} fixed64=0 Fixed64 default\n * @property {number} sfixed64=0 Sfixed64 default\n * @property {boolean} bool=false Bool default\n * @property {string} string=\"\" String default\n * @property {Array.<number>} bytes=Array(0) Bytes default\n * @property {null} message=null Message default\n */\ntypes.defaults = bake([\n    /* double   */ 0,\n    /* float    */ 0,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 0,\n    /* sfixed32 */ 0,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 0,\n    /* sfixed64 */ 0,\n    /* bool     */ false,\n    /* string   */ \"\",\n    /* bytes    */ util.emptyArray,\n    /* message  */ null\n]);\n\n/**\n * Basic long type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n */\ntypes.long = bake([\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1\n], 7);\n\n/**\n * Allowed types for map keys with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n */\ntypes.mapKey = bake([\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2\n], 2);\n\n/**\n * Allowed types for packed repeated fields with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n */\ntypes.packed = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0\n]);\n","\"use strict\";\n\n/**\n * Various utility functions.\n * @namespace\n */\nvar util = module.exports = require(39);\n\nvar roots = require(30);\n\nvar Type, // cyclic\n    Enum;\n\nutil.codegen = require(3);\nutil.fetch   = require(5);\nutil.path    = require(8);\n\n/**\n * Node's fs module if available.\n * @type {Object.<string,*>}\n */\nutil.fs = util.inquire(\"fs\");\n\n/**\n * Converts an object's values to an array.\n * @param {Object.<string,*>} object Object to convert\n * @returns {Array.<*>} Converted array\n */\nutil.toArray = function toArray(object) {\n    if (object) {\n        var keys  = Object.keys(object),\n            array = new Array(keys.length),\n            index = 0;\n        while (index < keys.length)\n            array[index] = object[keys[index++]];\n        return array;\n    }\n    return [];\n};\n\n/**\n * Converts an array of keys immediately followed by their respective value to an object, omitting undefined values.\n * @param {Array.<*>} array Array to convert\n * @returns {Object.<string,*>} Converted object\n */\nutil.toObject = function toObject(array) {\n    var object = {},\n        index  = 0;\n    while (index < array.length) {\n        var key = array[index++],\n            val = array[index++];\n        if (val !== undefined)\n            object[key] = val;\n    }\n    return object;\n};\n\nvar safePropBackslashRe = /\\\\/g,\n    safePropQuoteRe     = /\"/g;\n\n/**\n * Tests whether the specified name is a reserved word in JS.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nutil.isReserved = function isReserved(name) {\n    return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(name);\n};\n\n/**\n * Returns a safe property accessor for the specified property name.\n * @param {string} prop Property name\n * @returns {string} Safe accessor\n */\nutil.safeProp = function safeProp(prop) {\n    if (!/^[$\\w_]+$/.test(prop) || util.isReserved(prop))\n        return \"[\\\"\" + prop.replace(safePropBackslashRe, \"\\\\\\\\\").replace(safePropQuoteRe, \"\\\\\\\"\") + \"\\\"]\";\n    return \".\" + prop;\n};\n\n/**\n * Converts the first character of a string to upper case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.ucFirst = function ucFirst(str) {\n    return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\nvar camelCaseRe = /_([a-z])/g;\n\n/**\n * Converts a string to camel case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.camelCase = function camelCase(str) {\n    return str.substring(0, 1)\n         + str.substring(1)\n               .replace(camelCaseRe, function($0, $1) { return $1.toUpperCase(); });\n};\n\n/**\n * Compares reflected fields by id.\n * @param {Field} a First field\n * @param {Field} b Second field\n * @returns {number} Comparison value\n */\nutil.compareFieldsById = function compareFieldsById(a, b) {\n    return a.id - b.id;\n};\n\n/**\n * Decorator helper for types (TypeScript).\n * @param {Constructor<T>} ctor Constructor function\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {Type} Reflected type\n * @template T extends Message<T>\n * @property {Root} root Decorators root\n */\nutil.decorateType = function decorateType(ctor, typeName) {\n\n    /* istanbul ignore if */\n    if (ctor.$type) {\n        if (typeName && ctor.$type.name !== typeName) {\n            util.decorateRoot.remove(ctor.$type);\n            ctor.$type.name = typeName;\n            util.decorateRoot.add(ctor.$type);\n        }\n        return ctor.$type;\n    }\n\n    /* istanbul ignore next */\n    if (!Type)\n        Type = require(35);\n\n    var type = new Type(typeName || ctor.name);\n    util.decorateRoot.add(type);\n    type.ctor = ctor; // sets up .encode, .decode etc.\n    Object.defineProperty(ctor, \"$type\", { value: type, enumerable: false });\n    Object.defineProperty(ctor.prototype, \"$type\", { value: type, enumerable: false });\n    return type;\n};\n\nvar decorateEnumIndex = 0;\n\n/**\n * Decorator helper for enums (TypeScript).\n * @param {Object} object Enum object\n * @returns {Enum} Reflected enum\n */\nutil.decorateEnum = function decorateEnum(object) {\n\n    /* istanbul ignore if */\n    if (object.$type)\n        return object.$type;\n\n    /* istanbul ignore next */\n    if (!Enum)\n        Enum = require(15);\n\n    var enm = new Enum(\"Enum\" + decorateEnumIndex++, object);\n    util.decorateRoot.add(enm);\n    Object.defineProperty(object, \"$type\", { value: enm, enumerable: false });\n    return enm;\n};\n\n\n/**\n * Sets the value of a property by property path. If a value already exists, it is turned to an array\n * @param {Object.<string,*>} dst Destination object\n * @param {string} path dot '.' delimited path of the property to set\n * @param {Object} value the value to set\n * @returns {Object.<string,*>} Destination object\n */\nutil.setProperty = function setProperty(dst, path, value) {\n    function setProp(dst, path, value) {\n        var part = path.shift();\n        if (path.length > 0) {\n            dst[part] = setProp(dst[part] || {}, path, value);\n        } else {\n            var prevValue = dst[part];\n            if (prevValue)\n                value = [].concat(prevValue).concat(value);\n            dst[part] = value;\n        }\n        return dst;\n    }\n\n    if (typeof dst !== \"object\")\n        throw TypeError(\"dst must be an object\");\n    if (!path)\n        throw TypeError(\"path must be specified\");\n\n    path = path.split(\".\");\n    return setProp(dst, path, value);\n};\n\n/**\n * Decorator root (TypeScript).\n * @name util.decorateRoot\n * @type {Root}\n * @readonly\n */\nObject.defineProperty(util, \"decorateRoot\", {\n    get: function() {\n        return roots[\"decorated\"] || (roots[\"decorated\"] = new (require(29))());\n    }\n});\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(39);\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n    // note that the casts below are theoretically unnecessary as of today, but older statically\n    // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n    /**\n     * Low bits.\n     * @type {number}\n     */\n    this.lo = lo >>> 0;\n\n    /**\n     * High bits.\n     * @type {number}\n     */\n    this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n    if (value === 0)\n        return zero;\n    var sign = value < 0;\n    if (sign)\n        value = -value;\n    var lo = value >>> 0,\n        hi = (value - lo) / 4294967296 >>> 0;\n    if (sign) {\n        hi = ~hi >>> 0;\n        lo = ~lo >>> 0;\n        if (++lo > 4294967295) {\n            lo = 0;\n            if (++hi > 4294967295)\n                hi = 0;\n        }\n    }\n    return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n    if (typeof value === \"number\")\n        return LongBits.fromNumber(value);\n    if (util.isString(value)) {\n        /* istanbul ignore else */\n        if (util.Long)\n            value = util.Long.fromString(value);\n        else\n            return LongBits.fromNumber(parseInt(value, 10));\n    }\n    return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n    if (!unsigned && this.hi >>> 31) {\n        var lo = ~this.lo + 1 >>> 0,\n            hi = ~this.hi     >>> 0;\n        if (!lo)\n            hi = hi + 1 >>> 0;\n        return -(lo + hi * 4294967296);\n    }\n    return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n    return util.Long\n        ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n        /* istanbul ignore next */\n        : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n    if (hash === zeroHash)\n        return zero;\n    return new LongBits(\n        ( charCodeAt.call(hash, 0)\n        | charCodeAt.call(hash, 1) << 8\n        | charCodeAt.call(hash, 2) << 16\n        | charCodeAt.call(hash, 3) << 24) >>> 0\n    ,\n        ( charCodeAt.call(hash, 4)\n        | charCodeAt.call(hash, 5) << 8\n        | charCodeAt.call(hash, 6) << 16\n        | charCodeAt.call(hash, 7) << 24) >>> 0\n    );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n    return String.fromCharCode(\n        this.lo        & 255,\n        this.lo >>> 8  & 255,\n        this.lo >>> 16 & 255,\n        this.lo >>> 24      ,\n        this.hi        & 255,\n        this.hi >>> 8  & 255,\n        this.hi >>> 16 & 255,\n        this.hi >>> 24\n    );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n    var mask =   this.hi >> 31;\n    this.hi  = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n    this.lo  = ( this.lo << 1                   ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n    var mask = -(this.lo & 1);\n    this.lo  = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n    this.hi  = ( this.hi >>> 1                  ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n    var part0 =  this.lo,\n        part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n        part2 =  this.hi >>> 24;\n    return part2 === 0\n         ? part1 === 0\n           ? part0 < 16384\n             ? part0 < 128 ? 1 : 2\n             : part0 < 2097152 ? 3 : 4\n           : part1 < 16384\n             ? part1 < 128 ? 5 : 6\n             : part1 < 2097152 ? 7 : 8\n         : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(1);\n\n// converts to / from base64 encoded strings\nutil.base64 = require(2);\n\n// base class of rpc.Service\nutil.EventEmitter = require(4);\n\n// float handling accross browsers\nutil.float = require(6);\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(7);\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(10);\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(9);\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(38);\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n                   && global\n                   && global.process\n                   && global.process.versions\n                   && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n           || typeof window !== \"undefined\" && window\n           || typeof self   !== \"undefined\" && self\n           || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n    return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n    return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n    return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n    var value = obj[prop];\n    if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n        return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n    return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n    try {\n        var Buffer = util.inquire(\"buffer\").Buffer;\n        // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n        return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n    } catch (e) {\n        /* istanbul ignore next */\n        return null;\n    }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n    /* istanbul ignore next */\n    return typeof sizeOrArray === \"number\"\n        ? util.Buffer\n            ? util._Buffer_allocUnsafe(sizeOrArray)\n            : new util.Array(sizeOrArray)\n        : util.Buffer\n            ? util._Buffer_from(sizeOrArray)\n            : typeof Uint8Array === \"undefined\"\n                ? sizeOrArray\n                : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n         || /* istanbul ignore next */ util.global.Long\n         || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n    return value\n        ? util.LongBits.from(value).toHash()\n        : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n    var bits = util.LongBits.fromHash(hash);\n    if (util.Long)\n        return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n    return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n        if (dst[keys[i]] === undefined || !ifNotSet)\n            dst[keys[i]] = src[keys[i]];\n    return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n    return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n    function CustomError(message, properties) {\n\n        if (!(this instanceof CustomError))\n            return new CustomError(message, properties);\n\n        // Error.call(this, message);\n        // ^ just returns a new error instance because the ctor can be called as a function\n\n        Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) // node\n            Error.captureStackTrace(this, CustomError);\n        else\n            Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n        if (properties)\n            merge(this, properties);\n    }\n\n    (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError;\n\n    Object.defineProperty(CustomError.prototype, \"name\", { get: function() { return name; } });\n\n    CustomError.prototype.toString = function toString() {\n        return this.name + \": \" + this.message;\n    };\n\n    return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n *     MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n *     if (e instanceof ProtocolError && e.instance)\n *         console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n    var fieldMap = {};\n    for (var i = 0; i < fieldNames.length; ++i)\n        fieldMap[fieldNames[i]] = 1;\n\n    /**\n     * @returns {string|undefined} Set field name, if any\n     * @this Object\n     * @ignore\n     */\n    return function() { // eslint-disable-line consistent-return\n        for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n            if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n                return keys[i];\n    };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n    /**\n     * @param {string} name Field name\n     * @returns {undefined}\n     * @this Object\n     * @ignore\n     */\n    return function(name) {\n        for (var i = 0; i < fieldNames.length; ++i)\n            if (fieldNames[i] !== name)\n                delete this[fieldNames[i]];\n    };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n    longs: String,\n    enums: String,\n    bytes: String,\n    json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n    var Buffer = util.Buffer;\n    /* istanbul ignore if */\n    if (!Buffer) {\n        util._Buffer_from = util._Buffer_allocUnsafe = null;\n        return;\n    }\n    // because node 4.x buffers are incompatible & immutable\n    // see: https://github.com/dcodeIO/protobuf.js/pull/665\n    util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n        /* istanbul ignore next */\n        function Buffer_from(value, encoding) {\n            return new Buffer(value, encoding);\n        };\n    util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n        /* istanbul ignore next */\n        function Buffer_allocUnsafe(size) {\n            return new Buffer(size);\n        };\n};\n","\"use strict\";\nmodule.exports = verifier;\n\nvar Enum      = require(15),\n    util      = require(37);\n\nfunction invalid(field, expected) {\n    return field.name + \": \" + expected + (field.repeated && expected !== \"array\" ? \"[]\" : field.map && expected !== \"object\" ? \"{k:\"+field.keyType+\"}\" : \"\") + \" expected\";\n}\n\n/**\n * Generates a partial value verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyValue(gen, field, fieldIndex, ref) {\n    /* eslint-disable no-unexpected-multiline */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) { gen\n            (\"switch(%s){\", ref)\n                (\"default:\")\n                    (\"return%j\", invalid(field, \"enum value\"));\n            for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen\n                (\"case %i:\", field.resolvedType.values[keys[j]]);\n            gen\n                    (\"break\")\n            (\"}\");\n        } else {\n            gen\n            (\"{\")\n                (\"var e=types[%i].verify(%s);\", fieldIndex, ref)\n                (\"if(e)\")\n                    (\"return%j+e\", field.name + \".\")\n            (\"}\");\n        }\n    } else {\n        switch (field.type) {\n            case \"int32\":\n            case \"uint32\":\n            case \"sint32\":\n            case \"fixed32\":\n            case \"sfixed32\": gen\n                (\"if(!util.isInteger(%s))\", ref)\n                    (\"return%j\", invalid(field, \"integer\"));\n                break;\n            case \"int64\":\n            case \"uint64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n                (\"if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))\", ref, ref, ref, ref)\n                    (\"return%j\", invalid(field, \"integer|Long\"));\n                break;\n            case \"float\":\n            case \"double\": gen\n                (\"if(typeof %s!==\\\"number\\\")\", ref)\n                    (\"return%j\", invalid(field, \"number\"));\n                break;\n            case \"bool\": gen\n                (\"if(typeof %s!==\\\"boolean\\\")\", ref)\n                    (\"return%j\", invalid(field, \"boolean\"));\n                break;\n            case \"string\": gen\n                (\"if(!util.isString(%s))\", ref)\n                    (\"return%j\", invalid(field, \"string\"));\n                break;\n            case \"bytes\": gen\n                (\"if(!(%s&&typeof %s.length===\\\"number\\\"||util.isString(%s)))\", ref, ref, ref)\n                    (\"return%j\", invalid(field, \"buffer\"));\n                break;\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a partial key verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyKey(gen, field, ref) {\n    /* eslint-disable no-unexpected-multiline */\n    switch (field.keyType) {\n        case \"int32\":\n        case \"uint32\":\n        case \"sint32\":\n        case \"fixed32\":\n        case \"sfixed32\": gen\n            (\"if(!util.key32Re.test(%s))\", ref)\n                (\"return%j\", invalid(field, \"integer key\"));\n            break;\n        case \"int64\":\n        case \"uint64\":\n        case \"sint64\":\n        case \"fixed64\":\n        case \"sfixed64\": gen\n            (\"if(!util.key64Re.test(%s))\", ref) // see comment above: x is ok, d is not\n                (\"return%j\", invalid(field, \"integer|Long key\"));\n            break;\n        case \"bool\": gen\n            (\"if(!util.key2Re.test(%s))\", ref)\n                (\"return%j\", invalid(field, \"boolean key\"));\n            break;\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a verifier specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction verifier(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n\n    var gen = util.codegen([\"m\"], mtype.name + \"$verify\")\n    (\"if(typeof m!==\\\"object\\\"||m===null)\")\n        (\"return%j\", \"object expected\");\n    var oneofs = mtype.oneofsArray,\n        seenFirstField = {};\n    if (oneofs.length) gen\n    (\"var p={}\");\n\n    for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n        var field = mtype._fieldsArray[i].resolve(),\n            ref   = \"m\" + util.safeProp(field.name);\n\n        if (field.optional) gen\n        (\"if(%s!=null&&m.hasOwnProperty(%j)){\", ref, field.name); // !== undefined && !== null\n\n        // map fields\n        if (field.map) { gen\n            (\"if(!util.isObject(%s))\", ref)\n                (\"return%j\", invalid(field, \"object\"))\n            (\"var k=Object.keys(%s)\", ref)\n            (\"for(var i=0;i<k.length;++i){\");\n                genVerifyKey(gen, field, \"k[i]\");\n                genVerifyValue(gen, field, i, ref + \"[k[i]]\")\n            (\"}\");\n\n        // repeated fields\n        } else if (field.repeated) { gen\n            (\"if(!Array.isArray(%s))\", ref)\n                (\"return%j\", invalid(field, \"array\"))\n            (\"for(var i=0;i<%s.length;++i){\", ref);\n                genVerifyValue(gen, field, i, ref + \"[i]\")\n            (\"}\");\n\n        // required or present fields\n        } else {\n            if (field.partOf) {\n                var oneofProp = util.safeProp(field.partOf.name);\n                if (seenFirstField[field.partOf.name] === 1) gen\n            (\"if(p%s===1)\", oneofProp)\n                (\"return%j\", field.partOf.name + \": multiple values\");\n                seenFirstField[field.partOf.name] = 1;\n                gen\n            (\"p%s=1\", oneofProp);\n            }\n            genVerifyValue(gen, field, i, ref);\n        }\n        if (field.optional) gen\n        (\"}\");\n    }\n    return gen\n    (\"return null\");\n    /* eslint-enable no-unexpected-multiline */\n}","\"use strict\";\n\n/**\n * Wrappers for common types.\n * @type {Object.<string,IWrapper>}\n * @const\n */\nvar wrappers = exports;\n\nvar Message = require(21);\n\n/**\n * From object converter part of an {@link IWrapper}.\n * @typedef WrapperFromObjectConverter\n * @type {function}\n * @param {Object.<string,*>} object Plain object\n * @returns {Message<{}>} Message instance\n * @this Type\n */\n\n/**\n * To object converter part of an {@link IWrapper}.\n * @typedef WrapperToObjectConverter\n * @type {function}\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @this Type\n */\n\n/**\n * Common type wrapper part of {@link wrappers}.\n * @interface IWrapper\n * @property {WrapperFromObjectConverter} [fromObject] From object converter\n * @property {WrapperToObjectConverter} [toObject] To object converter\n */\n\n// Custom wrapper for Any\nwrappers[\".google.protobuf.Any\"] = {\n\n    fromObject: function(object) {\n\n        // unwrap value type if mapped\n        if (object && object[\"@type\"]) {\n             // Only use fully qualified type name after the last '/'\n            var name = object[\"@type\"].substring(object[\"@type\"].lastIndexOf(\"/\") + 1);\n            var type = this.lookup(name);\n            /* istanbul ignore else */\n            if (type) {\n                // type_url does not accept leading \".\"\n                var type_url = object[\"@type\"].charAt(0) === \".\" ?\n                    object[\"@type\"].substr(1) : object[\"@type\"];\n                // type_url prefix is optional, but path seperator is required\n                if (type_url.indexOf(\"/\") === -1) {\n                    type_url = \"/\" + type_url;\n                }\n                return this.create({\n                    type_url: type_url,\n                    value: type.encode(type.fromObject(object)).finish()\n                });\n            }\n        }\n\n        return this.fromObject(object);\n    },\n\n    toObject: function(message, options) {\n\n        // Default prefix\n        var googleApi = \"type.googleapis.com/\";\n        var prefix = \"\";\n        var name = \"\";\n\n        // decode value if requested and unmapped\n        if (options && options.json && message.type_url && message.value) {\n            // Only use fully qualified type name after the last '/'\n            name = message.type_url.substring(message.type_url.lastIndexOf(\"/\") + 1);\n            // Separate the prefix used\n            prefix = message.type_url.substring(0, message.type_url.lastIndexOf(\"/\") + 1);\n            var type = this.lookup(name);\n            /* istanbul ignore else */\n            if (type)\n                message = type.decode(message.value);\n        }\n\n        // wrap value if unmapped\n        if (!(message instanceof this.ctor) && message instanceof Message) {\n            var object = message.$type.toObject(message, options);\n            var messageName = message.$type.fullName[0] === \".\" ?\n                message.$type.fullName.substr(1) : message.$type.fullName;\n            // Default to type.googleapis.com prefix if no prefix is used\n            if (prefix === \"\") {\n                prefix = googleApi;\n            }\n            name = prefix + messageName;\n            object[\"@type\"] = name;\n            return object;\n        }\n\n        return this.toObject(message, options);\n    }\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util      = require(39);\n\nvar BufferWriter; // cyclic\n\nvar LongBits  = util.LongBits,\n    base64    = util.base64,\n    utf8      = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n    /**\n     * Function to call.\n     * @type {function(Uint8Array, number, *)}\n     */\n    this.fn = fn;\n\n    /**\n     * Value byte length.\n     * @type {number}\n     */\n    this.len = len;\n\n    /**\n     * Next operation.\n     * @type {Writer.Op|undefined}\n     */\n    this.next = undefined;\n\n    /**\n     * Value to write.\n     * @type {*}\n     */\n    this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n    /**\n     * Current head.\n     * @type {Writer.Op}\n     */\n    this.head = writer.head;\n\n    /**\n     * Current tail.\n     * @type {Writer.Op}\n     */\n    this.tail = writer.tail;\n\n    /**\n     * Current buffer length.\n     * @type {number}\n     */\n    this.len = writer.len;\n\n    /**\n     * Next state.\n     * @type {State|null}\n     */\n    this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n    /**\n     * Current length.\n     * @type {number}\n     */\n    this.len = 0;\n\n    /**\n     * Operations head.\n     * @type {Object}\n     */\n    this.head = new Op(noop, 0, 0);\n\n    /**\n     * Operations tail\n     * @type {Object}\n     */\n    this.tail = this.head;\n\n    /**\n     * Linked forked states.\n     * @type {Object|null}\n     */\n    this.states = null;\n\n    // When a value is written, the writer calculates its byte length and puts it into a linked\n    // list of operations to perform when finish() is called. This both allows us to allocate\n    // buffers of the exact required size and reduces the amount of work we have to do compared\n    // to first calculating over objects and then encoding over objects. In our case, the encoding\n    // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup() {\n            return (Writer.create = function create_buffer() {\n                return new BufferWriter();\n            })();\n        }\n        /* istanbul ignore next */\n        : function create_array() {\n            return new Writer();\n        };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n    return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n    Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n    this.tail = this.tail.next = new Op(fn, len, val);\n    this.len += len;\n    return this;\n};\n\nfunction writeByte(val, buf, pos) {\n    buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n    while (val > 127) {\n        buf[pos++] = val & 127 | 128;\n        val >>>= 7;\n    }\n    buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n    this.len = len;\n    this.next = undefined;\n    this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n    // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n    // uint32 is by far the most frequently used operation and benefits significantly from this.\n    this.len += (this.tail = this.tail.next = new VarintOp(\n        (value = value >>> 0)\n                < 128       ? 1\n        : value < 16384     ? 2\n        : value < 2097152   ? 3\n        : value < 268435456 ? 4\n        :                     5,\n    value)).len;\n    return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n    return value < 0\n        ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n        : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n    return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n    while (val.hi) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n        val.hi >>>= 7;\n    }\n    while (val.lo > 127) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = val.lo >>> 7;\n    }\n    buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n    var bits = LongBits.from(value).zzEncode();\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n    return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n    buf[pos    ] =  val         & 255;\n    buf[pos + 1] =  val >>> 8   & 255;\n    buf[pos + 2] =  val >>> 16  & 255;\n    buf[pos + 3] =  val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n    return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n    return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n    return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n    ? function writeBytes_set(val, buf, pos) {\n        buf.set(val, pos); // also works for plain array values\n    }\n    /* istanbul ignore next */\n    : function writeBytes_for(val, buf, pos) {\n        for (var i = 0; i < val.length; ++i)\n            buf[pos + i] = val[i];\n    };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n    var len = value.length >>> 0;\n    if (!len)\n        return this._push(writeByte, 1, 0);\n    if (util.isString(value)) {\n        var buf = Writer.alloc(len = base64.length(value));\n        base64.decode(value, buf, 0);\n        value = buf;\n    }\n    return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n    var len = utf8.length(value);\n    return len\n        ? this.uint32(len)._push(utf8.write, len, value)\n        : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n    this.states = new State(this);\n    this.head = this.tail = new Op(noop, 0, 0);\n    this.len = 0;\n    return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n    if (this.states) {\n        this.head   = this.states.head;\n        this.tail   = this.states.tail;\n        this.len    = this.states.len;\n        this.states = this.states.next;\n    } else {\n        this.head = this.tail = new Op(noop, 0, 0);\n        this.len  = 0;\n    }\n    return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n    var head = this.head,\n        tail = this.tail,\n        len  = this.len;\n    this.reset().uint32(len);\n    if (len) {\n        this.tail.next = head.next; // skip noop\n        this.tail = tail;\n        this.len += len;\n    }\n    return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n    var head = this.head.next, // skip noop\n        buf  = this.constructor.alloc(this.len),\n        pos  = 0;\n    while (head) {\n        head.fn(head.val, buf, pos);\n        pos += head.len;\n        head = head.next;\n    }\n    // this.head = this.tail = null;\n    return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n    BufferWriter = BufferWriter_;\n    Writer.create = create();\n    BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(42);\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(39);\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n    Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n    /**\n     * Allocates a buffer of the specified size.\n     * @function\n     * @param {number} size Buffer size\n     * @returns {Buffer} Buffer\n     */\n    BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n    BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n        ? function writeBytesBuffer_set(val, buf, pos) {\n          buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n          // also works for plain array values\n        }\n        /* istanbul ignore next */\n        : function writeBytesBuffer_copy(val, buf, pos) {\n          if (val.copy) // Buffer values\n            val.copy(buf, pos, 0, val.length);\n          else for (var i = 0; i < val.length;) // plain array values\n            buf[pos++] = val[i++];\n        };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n    if (util.isString(value))\n        value = util._Buffer_from(value, \"base64\");\n    var len = value.length >>> 0;\n    this.uint32(len);\n    if (len)\n        this._push(BufferWriter.writeBytesBuffer, len, value);\n    return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n    if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n        util.utf8.write(val, buf, pos);\n    else if (buf.utf8Write)\n        buf.utf8Write(val, pos);\n    else\n        buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n    var len = util.Buffer.byteLength(value);\n    this.uint32(len);\n    if (len)\n        this._push(writeStringBuffer, len, value);\n    return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n"],"sourceRoot":"."}