{"version":3,"file":"obs-ws.min.cjs","sources":["../node_modules/debug/node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../node_modules/eventemitter3/index.js","../node_modules/isomorphic-ws/browser.js","../src/types.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/sha256.js","../node_modules/crypto-js/enc-base64.js","../src/base.ts","../src/utils/authenticationHashing.ts","../src/json.ts","../src/unpkg.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","// https://github.com/maxogden/websocket-stream/blob/48dc3ddf943e5ada668c31ccd94e9186f02fafbd/ws-fallback.js\n\nvar ws = null\n\nif (typeof WebSocket !== 'undefined') {\n  ws = WebSocket\n} else if (typeof MozWebSocket !== 'undefined') {\n  ws = MozWebSocket\n} else if (typeof global !== 'undefined') {\n  ws = global.WebSocket || global.MozWebSocket\n} else if (typeof window !== 'undefined') {\n  ws = window.WebSocket || window.MozWebSocket\n} else if (typeof self !== 'undefined') {\n  ws = self.WebSocket || self.MozWebSocket\n}\n\nmodule.exports = ws\n","/**\n * This file is autogenerated by scripts/generate-obs-typings.js\n * To update this with latest changes do npm run generate:obs-types\n */\nimport {JsonArray, JsonObject, JsonValue} from 'type-fest';\n\nexport enum WebSocketOpCode {\n/**\n * The initial message sent by obs-websocket to newly connected clients.\n *\n * Initial OBS Version: 5.0.0\n */\n\tHello = 0,\n\t/**\n\t * The message sent by a newly connected client to obs-websocket in response to a `Hello`.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tIdentify = 1,\n\t/**\n\t * The response sent by obs-websocket to a client after it has successfully identified with obs-websocket.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tIdentified = 2,\n\t/**\n\t * The message sent by an already-identified client to update identification parameters.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tReidentify = 3,\n\t/**\n\t * The message sent by obs-websocket containing an event payload.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tEvent = 5,\n\t/**\n\t * The message sent by a client to obs-websocket to perform a request.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tRequest = 6,\n\t/**\n\t * The message sent by obs-websocket in response to a particular request from a client.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tRequestResponse = 7,\n\t/**\n\t * The message sent by a client to obs-websocket to perform a batch of requests.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tRequestBatch = 8,\n\t/**\n\t * The message sent by obs-websocket in response to a particular batch of requests from a client.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tRequestBatchResponse = 9,\n}\n\n/* eslint-disable no-bitwise, @typescript-eslint/prefer-literal-enum-member */\nexport enum EventSubscription {\n/**\n * Subcription value used to disable all events.\n *\n * Initial OBS Version: 5.0.0\n */\n\tNone = 0,\n\t/**\n\t * Subscription value to receive events in the `General` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tGeneral = (1 << 0),\n\t/**\n\t * Subscription value to receive events in the `Config` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tConfig = (1 << 1),\n\t/**\n\t * Subscription value to receive events in the `Scenes` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tScenes = (1 << 2),\n\t/**\n\t * Subscription value to receive events in the `Inputs` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tInputs = (1 << 3),\n\t/**\n\t * Subscription value to receive events in the `Transitions` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tTransitions = (1 << 4),\n\t/**\n\t * Subscription value to receive events in the `Filters` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tFilters = (1 << 5),\n\t/**\n\t * Subscription value to receive events in the `Outputs` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tOutputs = (1 << 6),\n\t/**\n\t * Subscription value to receive events in the `SceneItems` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tSceneItems = (1 << 7),\n\t/**\n\t * Subscription value to receive events in the `MediaInputs` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tMediaInputs = (1 << 8),\n\t/**\n\t * Subscription value to receive the `VendorEvent` event.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tVendors = (1 << 9),\n\t/**\n\t * Subscription value to receive events in the `Ui` category.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tUi = (1 << 10),\n\t/**\n\t * Helper to receive all non-high-volume events.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tAll = (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors),\n\t/**\n\t * Subscription value to receive the `InputVolumeMeters` high-volume event.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tInputVolumeMeters = (1 << 16),\n\t/**\n\t * Subscription value to receive the `InputActiveStateChanged` high-volume event.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tInputActiveStateChanged = (1 << 17),\n\t/**\n\t * Subscription value to receive the `InputShowStateChanged` high-volume event.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tInputShowStateChanged = (1 << 18),\n\t/**\n\t * Subscription value to receive the `SceneItemTransformChanged` high-volume event.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tSceneItemTransformChanged = (1 << 19),\n}\n/* eslint-enable no-bitwise, @typescript-eslint/prefer-literal-enum-member */\n\nexport enum RequestBatchExecutionType {\n/**\n * Not a request batch.\n *\n * Initial OBS Version: 5.0.0\n */\n\tNone = -1,\n\t/**\n\t * A request batch which processes all requests serially, as fast as possible.\n\t *\n\t * Note: To introduce artificial delay, use the `Sleep` request and the `sleepMillis` request field.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tSerialRealtime = 0,\n\t/**\n\t * A request batch type which processes all requests serially, in sync with the graphics thread. Designed to provide high accuracy for animations.\n\t *\n\t * Note: To introduce artificial delay, use the `Sleep` request and the `sleepFrames` request field.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tSerialFrame = 1,\n\t/**\n\t * A request batch type which processes all requests using all available threads in the thread pool.\n\t *\n\t * Note: This is mainly experimental, and only really shows its colors during requests which require lots of\n\t * active processing, like `GetSourceScreenshot`.\n\t *\n\t * Initial OBS Version: 5.0.0\n\t */\n\tParallel = 2,\n}\n\n// WebSocket Message Types\nexport type IncomingMessage<Type = keyof IncomingMessageTypes> = Type extends keyof IncomingMessageTypes ? {\n\top: Type;\n\td: IncomingMessageTypes[Type];\n} : never;\n\nexport type OutgoingMessage<Type = keyof OutgoingMessageTypes> = Type extends keyof OutgoingMessageTypes ? {\n\top: Type;\n\td: OutgoingMessageTypes[Type];\n} : never;\n\nexport interface IncomingMessageTypes {\n\t/**\n\t * Message sent from the server immediately on client connection. Contains authentication information if auth is required. Also contains RPC version for version negotiation.\n\t */\n\t[WebSocketOpCode.Hello]: {\n\t\t/**\n\t\t * Version number of obs-websocket\n\t\t */\n\t\tobsWebSocketVersion: string;\n\t\t/**\n\t\t * Version number which gets incremented on each breaking change to the obs-websocket protocol.\n\t\t * It's usage in this context is to provide the current rpc version that the server would like to use.\n\t\t */\n\t\trpcVersion: number;\n\t\t/**\n\t\t * Authentication challenge when password is required\n\t\t */\n\t\tauthentication?: {\n\t\t\tchallenge: string;\n\t\t\tsalt: string;\n\t\t};\n\t};\n\t/**\n\t * The identify request was received and validated, and the connection is now ready for normal operation.\n\t */\n\t[WebSocketOpCode.Identified]: {\n\t\t/**\n\t\t * If rpc version negotiation succeeds, the server determines the RPC version to be used and gives it to the client\n\t\t */\n\t\tnegotiatedRpcVersion: number;\n\t};\n\t/**\n\t * An event coming from OBS has occured. Eg scene switched, source muted.\n\t */\n\t[WebSocketOpCode.Event]: EventMessage;\n\t/**\n\t * obs-websocket is responding to a request coming from a client\n\t */\n\t[WebSocketOpCode.RequestResponse]: ResponseMessage;\n}\n\nexport interface OutgoingMessageTypes {\n\t/**\n\t * Response to Hello message, should contain authentication string if authentication is required, along with PubSub subscriptions and other session parameters.\n\t */\n\t[WebSocketOpCode.Identify]: {\n\t\t/**\n\t\t * Version number that the client would like the obs-websocket server to use\n\t\t */\n\t\trpcVersion: number;\n\t\t/**\n\t\t * Authentication challenge response\n\t\t */\n\t\tauthentication?: string;\n\t\t/**\n\t\t * Bitmask of `EventSubscription` items to subscribe to events and event categories at will. By default, all event categories are subscribed, except for events marked as high volume. High volume events must be explicitly subscribed to.\n\t\t */\n\t\teventSubscriptions?: number;\n\t};\n\t/**\n\t * Sent at any time after initial identification to update the provided session parameters.\n\t */\n\t[WebSocketOpCode.Reidentify]: {\n\t\t/**\n\t\t * Bitmask of `EventSubscription` items to subscribe to events and event categories at will. By default, all event categories are subscribed, except for events marked as high volume. High volume events must be explicitly subscribed to.\n\t\t */\n\t\teventSubscriptions?: number;\n\t};\n\t/**\n\t * Client is making a request to obs-websocket. Eg get current scene, create source.\n\t */\n\t[WebSocketOpCode.Request]: RequestMessage;\n}\n\ntype EventMessage<T = keyof OBSEventTypes> = T extends keyof OBSEventTypes ? {\n\teventType: T;\n\t/**\n\t * The original intent required to be subscribed to in order to receive the event.\n\t */\n\teventIntent: number;\n\teventData: OBSEventTypes[T];\n} : never;\n\nexport type RequestMessage<T = keyof OBSRequestTypes> = T extends keyof OBSRequestTypes ? {\n\trequestType: T;\n\trequestId: string;\n\trequestData: OBSRequestTypes[T];\n} : never;\n\nexport type ResponseMessage<T = keyof OBSResponseTypes> = T extends keyof OBSResponseTypes ? {\n\trequestType: T;\n\trequestId: string;\n\trequestStatus: {result: true; code: number} | {result: false; code: number; comment: string};\n\tresponseData: OBSResponseTypes[T];\n} : never;\n\n// Events\nexport interface OBSEventTypes {\n\tCurrentSceneCollectionChanging: {\n\t\t/**\n\t\t * Name of the current scene collection\n\t\t */\n\t\tsceneCollectionName: string;\n\t};\n\tCurrentSceneCollectionChanged: {\n\t\t/**\n\t\t * Name of the new scene collection\n\t\t */\n\t\tsceneCollectionName: string;\n\t};\n\tSceneCollectionListChanged: {\n\t\t/**\n\t\t * Updated list of scene collections\n\t\t */\n\t\tsceneCollections: string[];\n\t};\n\tCurrentProfileChanging: {\n\t\t/**\n\t\t * Name of the current profile\n\t\t */\n\t\tprofileName: string;\n\t};\n\tCurrentProfileChanged: {\n\t\t/**\n\t\t * Name of the new profile\n\t\t */\n\t\tprofileName: string;\n\t};\n\tProfileListChanged: {\n\t\t/**\n\t\t * Updated list of profiles\n\t\t */\n\t\tprofiles: string[];\n\t};\n\tSourceFilterListReindexed: {\n\t\t/**\n\t\t * Name of the source\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Array of filter objects\n\t\t */\n\t\tfilters: JsonArray;\n\t};\n\tSourceFilterCreated: {\n\t\t/**\n\t\t * Name of the source the filter was added to\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * The kind of the filter\n\t\t */\n\t\tfilterKind: string;\n\t\t/**\n\t\t * Index position of the filter\n\t\t */\n\t\tfilterIndex: number;\n\t\t/**\n\t\t * The settings configured to the filter when it was created\n\t\t */\n\t\tfilterSettings: JsonObject;\n\t\t/**\n\t\t * The default settings for the filter\n\t\t */\n\t\tdefaultFilterSettings: JsonObject;\n\t};\n\tSourceFilterRemoved: {\n\t\t/**\n\t\t * Name of the source the filter was on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter\n\t\t */\n\t\tfilterName: string;\n\t};\n\tSourceFilterNameChanged: {\n\t\t/**\n\t\t * The source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Old name of the filter\n\t\t */\n\t\toldFilterName: string;\n\t\t/**\n\t\t * New name of the filter\n\t\t */\n\t\tfilterName: string;\n\t};\n\tSourceFilterEnableStateChanged: {\n\t\t/**\n\t\t * Name of the source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * Whether the filter is enabled\n\t\t */\n\t\tfilterEnabled: boolean;\n\t};\n\tExitStarted: undefined;\n\tInputCreated: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * The kind of the input\n\t\t */\n\t\tinputKind: string;\n\t\t/**\n\t\t * The unversioned kind of input (aka no `_v2` stuff)\n\t\t */\n\t\tunversionedInputKind: string;\n\t\t/**\n\t\t * The settings configured to the input when it was created\n\t\t */\n\t\tinputSettings: JsonObject;\n\t\t/**\n\t\t * The default settings for the input\n\t\t */\n\t\tdefaultInputSettings: JsonObject;\n\t};\n\tInputRemoved: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t};\n\tInputNameChanged: {\n\t\t/**\n\t\t * Old name of the input\n\t\t */\n\t\toldInputName: string;\n\t\t/**\n\t\t * New name of the input\n\t\t */\n\t\tinputName: string;\n\t};\n\tInputActiveStateChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Whether the input is active\n\t\t */\n\t\tvideoActive: boolean;\n\t};\n\tInputShowStateChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Whether the input is showing\n\t\t */\n\t\tvideoShowing: boolean;\n\t};\n\tInputMuteStateChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Whether the input is muted\n\t\t */\n\t\tinputMuted: boolean;\n\t};\n\tInputVolumeChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New volume level in multimap\n\t\t */\n\t\tinputVolumeMul: number;\n\t\t/**\n\t\t * New volume level in dB\n\t\t */\n\t\tinputVolumeDb: number;\n\t};\n\tInputAudioBalanceChanged: {\n\t\t/**\n\t\t * Name of the affected input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New audio balance value of the input\n\t\t */\n\t\tinputAudioBalance: number;\n\t};\n\tInputAudioSyncOffsetChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New sync offset in milliseconds\n\t\t */\n\t\tinputAudioSyncOffset: number;\n\t};\n\tInputAudioTracksChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Object of audio tracks along with their associated enable states\n\t\t */\n\t\tinputAudioTracks: JsonObject;\n\t};\n\tInputAudioMonitorTypeChanged: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New monitor type of the input\n\t\t */\n\t\tmonitorType: string;\n\t};\n\tInputVolumeMeters: {\n\t\t/**\n\t\t * Array of active inputs with their associated volume levels\n\t\t */\n\t\tinputs: JsonArray;\n\t};\n\tMediaInputPlaybackStarted: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t};\n\tMediaInputPlaybackEnded: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t};\n\tMediaInputActionTriggered: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Action performed on the input. See `ObsMediaInputAction` enum\n\t\t */\n\t\tmediaAction: string;\n\t};\n\tStreamStateChanged: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * The specific state of the output\n\t\t */\n\t\toutputState: string;\n\t};\n\tRecordStateChanged: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * The specific state of the output\n\t\t */\n\t\toutputState: string;\n\t};\n\tReplayBufferStateChanged: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * The specific state of the output\n\t\t */\n\t\toutputState: string;\n\t};\n\tVirtualcamStateChanged: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * The specific state of the output\n\t\t */\n\t\toutputState: string;\n\t};\n\tReplayBufferSaved: {\n\t\t/**\n\t\t * Path of the saved replay file\n\t\t */\n\t\tsavedReplayPath: string;\n\t};\n\tSceneItemCreated: {\n\t\t/**\n\t\t * Name of the scene the item was added to\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the underlying source (input/scene)\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * Index position of the item\n\t\t */\n\t\tsceneItemIndex: number;\n\t};\n\tSceneItemRemoved: {\n\t\t/**\n\t\t * Name of the scene the item was removed from\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the underlying source (input/scene)\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSceneItemListReindexed: {\n\t\t/**\n\t\t * Name of the scene\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Array of scene item objects\n\t\t */\n\t\tsceneItems: JsonArray;\n\t};\n\tSceneItemEnableStateChanged: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * Whether the scene item is enabled (visible)\n\t\t */\n\t\tsceneItemEnabled: boolean;\n\t};\n\tSceneItemLockStateChanged: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * Whether the scene item is locked\n\t\t */\n\t\tsceneItemLocked: boolean;\n\t};\n\tSceneItemSelected: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSceneItemTransformChanged: {\n\t\t/**\n\t\t * The name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * New transform/crop info of the scene item\n\t\t */\n\t\tsceneItemTransform: JsonObject;\n\t};\n\tSceneCreated: {\n\t\t/**\n\t\t * Name of the new scene\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Whether the new scene is a group\n\t\t */\n\t\tisGroup: boolean;\n\t};\n\tSceneRemoved: {\n\t\t/**\n\t\t * Name of the removed scene\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Whether the scene was a group\n\t\t */\n\t\tisGroup: boolean;\n\t};\n\tSceneNameChanged: {\n\t\t/**\n\t\t * Old name of the scene\n\t\t */\n\t\toldSceneName: string;\n\t\t/**\n\t\t * New name of the scene\n\t\t */\n\t\tsceneName: string;\n\t};\n\tCurrentProgramSceneChanged: {\n\t\t/**\n\t\t * Name of the scene that was switched to\n\t\t */\n\t\tsceneName: string;\n\t};\n\tCurrentPreviewSceneChanged: {\n\t\t/**\n\t\t * Name of the scene that was switched to\n\t\t */\n\t\tsceneName: string;\n\t};\n\tSceneListChanged: {\n\t\t/**\n\t\t * Updated array of scenes\n\t\t */\n\t\tscenes: JsonArray;\n\t};\n\tCurrentSceneTransitionChanged: {\n\t\t/**\n\t\t * Name of the new transition\n\t\t */\n\t\ttransitionName: string;\n\t};\n\tCurrentSceneTransitionDurationChanged: {\n\t\t/**\n\t\t * Transition duration in milliseconds\n\t\t */\n\t\ttransitionDuration: number;\n\t};\n\tSceneTransitionStarted: {\n\t\t/**\n\t\t * Scene transition name\n\t\t */\n\t\ttransitionName: string;\n\t};\n\tSceneTransitionEnded: {\n\t\t/**\n\t\t * Scene transition name\n\t\t */\n\t\ttransitionName: string;\n\t};\n\tSceneTransitionVideoEnded: {\n\t\t/**\n\t\t * Scene transition name\n\t\t */\n\t\ttransitionName: string;\n\t};\n\tStudioModeStateChanged: {\n\t\t/**\n\t\t * True == Enabled, False == Disabled\n\t\t */\n\t\tstudioModeEnabled: boolean;\n\t};\n\tVendorEvent: {\n\t\t/**\n\t\t * Name of the vendor emitting the event\n\t\t */\n\t\tvendorName: string;\n\t\t/**\n\t\t * Vendor-provided event typedef\n\t\t */\n\t\teventType: string;\n\t\t/**\n\t\t * Vendor-provided event data. {} if event does not provide any data\n\t\t */\n\t\teventData: JsonObject;\n\t};\n}\n\n// Requests and Responses\nexport interface OBSRequestTypes {\n\tGetPersistentData: {\n\t\t/**\n\t\t * The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`\n\t\t */\n\t\trealm: string;\n\t\t/**\n\t\t * The name of the slot to retrieve data from\n\t\t */\n\t\tslotName: string;\n\t};\n\tSetPersistentData: {\n\t\t/**\n\t\t * The data realm to select. `OBS_WEBSOCKET_DATA_REALM_GLOBAL` or `OBS_WEBSOCKET_DATA_REALM_PROFILE`\n\t\t */\n\t\trealm: string;\n\t\t/**\n\t\t * The name of the slot to retrieve data from\n\t\t */\n\t\tslotName: string;\n\t\t/**\n\t\t * The value to apply to the slot\n\t\t */\n\t\tslotValue: JsonValue;\n\t};\n\tGetSceneCollectionList: never;\n\tSetCurrentSceneCollection: {\n\t\t/**\n\t\t * Name of the scene collection to switch to\n\t\t */\n\t\tsceneCollectionName: string;\n\t};\n\tCreateSceneCollection: {\n\t\t/**\n\t\t * Name for the new scene collection\n\t\t */\n\t\tsceneCollectionName: string;\n\t};\n\tGetProfileList: never;\n\tSetCurrentProfile: {\n\t\t/**\n\t\t * Name of the profile to switch to\n\t\t */\n\t\tprofileName: string;\n\t};\n\tCreateProfile: {\n\t\t/**\n\t\t * Name for the new profile\n\t\t */\n\t\tprofileName: string;\n\t};\n\tRemoveProfile: {\n\t\t/**\n\t\t * Name of the profile to remove\n\t\t */\n\t\tprofileName: string;\n\t};\n\tGetProfileParameter: {\n\t\t/**\n\t\t * Category of the parameter to get\n\t\t */\n\t\tparameterCategory: string;\n\t\t/**\n\t\t * Name of the parameter to get\n\t\t */\n\t\tparameterName: string;\n\t};\n\tSetProfileParameter: {\n\t\t/**\n\t\t * Category of the parameter to set\n\t\t */\n\t\tparameterCategory: string;\n\t\t/**\n\t\t * Name of the parameter to set\n\t\t */\n\t\tparameterName: string;\n\t\t/**\n\t\t * Value of the parameter to set. Use `null` to delete\n\t\t */\n\t\tparameterValue: string;\n\t};\n\tGetVideoSettings: never;\n\tSetVideoSettings: {\n\t\t/**\n\t\t * Numerator of the fractional FPS value\n\t\t *\n\t\t * @restrictions >= 1\n\t\t * @defaultValue Not changed\n\t\t */\n\t\tfpsNumerator?: number;\n\t\t/**\n\t\t * Denominator of the fractional FPS value\n\t\t *\n\t\t * @restrictions >= 1\n\t\t * @defaultValue Not changed\n\t\t */\n\t\tfpsDenominator?: number;\n\t\t/**\n\t\t * Width of the base (canvas) resolution in pixels\n\t\t *\n\t\t * @restrictions >= 1, <= 4096\n\t\t * @defaultValue Not changed\n\t\t */\n\t\tbaseWidth?: number;\n\t\t/**\n\t\t * Height of the base (canvas) resolution in pixels\n\t\t *\n\t\t * @restrictions >= 1, <= 4096\n\t\t * @defaultValue Not changed\n\t\t */\n\t\tbaseHeight?: number;\n\t\t/**\n\t\t * Width of the output resolution in pixels\n\t\t *\n\t\t * @restrictions >= 1, <= 4096\n\t\t * @defaultValue Not changed\n\t\t */\n\t\toutputWidth?: number;\n\t\t/**\n\t\t * Height of the output resolution in pixels\n\t\t *\n\t\t * @restrictions >= 1, <= 4096\n\t\t * @defaultValue Not changed\n\t\t */\n\t\toutputHeight?: number;\n\t};\n\tGetStreamServiceSettings: never;\n\tSetStreamServiceSettings: {\n\t\t/**\n\t\t * Type of stream service to apply. Example: `rtmp_common` or `rtmp_custom`\n\t\t */\n\t\tstreamServiceType: string;\n\t\t/**\n\t\t * Settings to apply to the service\n\t\t */\n\t\tstreamServiceSettings: JsonObject;\n\t};\n\tGetRecordDirectory: never;\n\tGetSourceFilterList: {\n\t\t/**\n\t\t * Name of the source\n\t\t */\n\t\tsourceName: string;\n\t};\n\tGetSourceFilterDefaultSettings: {\n\t\t/**\n\t\t * Filter kind to get the default settings for\n\t\t */\n\t\tfilterKind: string;\n\t};\n\tCreateSourceFilter: {\n\t\t/**\n\t\t * Name of the source to add the filter to\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the new filter to be created\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * The kind of filter to be created\n\t\t */\n\t\tfilterKind: string;\n\t\t/**\n\t\t * Settings object to initialize the filter with\n\t\t *\n\t\t * @defaultValue Default settings used\n\t\t */\n\t\tfilterSettings?: JsonObject;\n\t};\n\tRemoveSourceFilter: {\n\t\t/**\n\t\t * Name of the source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter to remove\n\t\t */\n\t\tfilterName: string;\n\t};\n\tSetSourceFilterName: {\n\t\t/**\n\t\t * Name of the source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Current name of the filter\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * New name for the filter\n\t\t */\n\t\tnewFilterName: string;\n\t};\n\tGetSourceFilter: {\n\t\t/**\n\t\t * Name of the source\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter\n\t\t */\n\t\tfilterName: string;\n\t};\n\tSetSourceFilterIndex: {\n\t\t/**\n\t\t * Name of the source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * New index position of the filter\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tfilterIndex: number;\n\t};\n\tSetSourceFilterSettings: {\n\t\t/**\n\t\t * Name of the source the filter is on\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Name of the filter to set the settings of\n\t\t */\n\t\tfilterName: string;\n\t\t/**\n\t\t * Object of settings to apply\n\t\t */\n\t\tfilterSettings: JsonObject;\n\t\t/**\n\t\t * True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.\n\t\t *\n\t\t * @defaultValue true\n\t\t */\n\t\toverlay?: boolean;\n\t};\n\tGetVersion: never;\n\tGetStats: never;\n\tBroadcastCustomEvent: {\n\t\t/**\n\t\t * Data payload to emit to all receivers\n\t\t */\n\t\teventData: JsonObject;\n\t};\n\tCallVendorRequest: {\n\t\t/**\n\t\t * Name of the vendor to use\n\t\t */\n\t\tvendorName: string;\n\t\t/**\n\t\t * The request type to call\n\t\t */\n\t\trequestType: string;\n\t\t/**\n\t\t * Object containing appropriate request data\n\t\t *\n\t\t * @defaultValue {}\n\t\t */\n\t\trequestData?: JsonObject;\n\t};\n\tGetHotkeyList: never;\n\tTriggerHotkeyByName: {\n\t\t/**\n\t\t * Name of the hotkey to trigger\n\t\t */\n\t\thotkeyName: string;\n\t};\n\tTriggerHotkeyByKeySequence: {\n\t\t/**\n\t\t * The OBS key ID to use. See https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h\n\t\t *\n\t\t * @defaultValue Not pressed\n\t\t */\n\t\tkeyId?: string;\n\t\t/**\n\t\t * Object containing key modifiers to apply\n\t\t *\n\t\t * @defaultValue Ignored\n\t\t */\n\t\tkeyModifiers?: {\n\t\t\t/**\n\t\t\t * Press Shift\n\t\t\t *\n\t\t\t * @defaultValue Not pressed\n\t\t\t */\n\t\t\tshift?: boolean;\n\t\t\t/**\n\t\t\t * Press CTRL\n\t\t\t *\n\t\t\t * @defaultValue Not pressed\n\t\t\t */\n\t\t\tcontrol?: boolean;\n\t\t\t/**\n\t\t\t * Press ALT\n\t\t\t *\n\t\t\t * @defaultValue Not pressed\n\t\t\t */\n\t\t\talt?: boolean;\n\t\t\t/**\n\t\t\t * Press CMD (Mac)\n\t\t\t *\n\t\t\t * @defaultValue Not pressed\n\t\t\t */\n\t\t\tcommand?: boolean;\n\t\t};\n\t};\n\tSleep: {\n\t\t/**\n\t\t * Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)\n\t\t *\n\t\t * @restrictions >= 0, <= 50000\n\t\t */\n\t\tsleepMillis: number;\n\t\t/**\n\t\t * Number of frames to sleep for (if `SERIAL_FRAME` mode)\n\t\t *\n\t\t * @restrictions >= 0, <= 10000\n\t\t */\n\t\tsleepFrames: number;\n\t};\n\tGetInputList: {\n\t\t/**\n\t\t * Restrict the array to only inputs of the specified kind\n\t\t *\n\t\t * @defaultValue All kinds included\n\t\t */\n\t\tinputKind?: string;\n\t};\n\tGetInputKindList: {\n\t\t/**\n\t\t * True == Return all kinds as unversioned, False == Return with version suffixes (if available)\n\t\t *\n\t\t * @defaultValue false\n\t\t */\n\t\tunversioned?: boolean;\n\t};\n\tGetSpecialInputs: never;\n\tCreateInput: {\n\t\t/**\n\t\t * Name of the scene to add the input to as a scene item\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the new input to created\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * The kind of input to be created\n\t\t */\n\t\tinputKind: string;\n\t\t/**\n\t\t * Settings object to initialize the input with\n\t\t *\n\t\t * @defaultValue Default settings used\n\t\t */\n\t\tinputSettings?: JsonObject;\n\t\t/**\n\t\t * Whether to set the created scene item to enabled or disabled\n\t\t *\n\t\t * @defaultValue True\n\t\t */\n\t\tsceneItemEnabled?: boolean;\n\t};\n\tRemoveInput: {\n\t\t/**\n\t\t * Name of the input to remove\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputName: {\n\t\t/**\n\t\t * Current input name\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New name for the input\n\t\t */\n\t\tnewInputName: string;\n\t};\n\tGetInputDefaultSettings: {\n\t\t/**\n\t\t * Input kind to get the default settings for\n\t\t */\n\t\tinputKind: string;\n\t};\n\tGetInputSettings: {\n\t\t/**\n\t\t * Name of the input to get the settings of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputSettings: {\n\t\t/**\n\t\t * Name of the input to set the settings of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Object of settings to apply\n\t\t */\n\t\tinputSettings: JsonObject;\n\t\t/**\n\t\t * True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings.\n\t\t *\n\t\t * @defaultValue true\n\t\t */\n\t\toverlay?: boolean;\n\t};\n\tGetInputMute: {\n\t\t/**\n\t\t * Name of input to get the mute state of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputMute: {\n\t\t/**\n\t\t * Name of the input to set the mute state of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Whether to mute the input or not\n\t\t */\n\t\tinputMuted: boolean;\n\t};\n\tToggleInputMute: {\n\t\t/**\n\t\t * Name of the input to toggle the mute state of\n\t\t */\n\t\tinputName: string;\n\t};\n\tGetInputVolume: {\n\t\t/**\n\t\t * Name of the input to get the volume of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputVolume: {\n\t\t/**\n\t\t * Name of the input to set the volume of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Volume setting in mul\n\t\t *\n\t\t * @restrictions >= 0, <= 20\n\t\t * @defaultValue `inputVolumeDb` should be specified\n\t\t */\n\t\tinputVolumeMul?: number;\n\t\t/**\n\t\t * Volume setting in dB\n\t\t *\n\t\t * @restrictions >= -100, <= 26\n\t\t * @defaultValue `inputVolumeMul` should be specified\n\t\t */\n\t\tinputVolumeDb?: number;\n\t};\n\tGetInputAudioBalance: {\n\t\t/**\n\t\t * Name of the input to get the audio balance of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputAudioBalance: {\n\t\t/**\n\t\t * Name of the input to set the audio balance of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New audio balance value\n\t\t *\n\t\t * @restrictions >= 0.0, <= 1.0\n\t\t */\n\t\tinputAudioBalance: number;\n\t};\n\tGetInputAudioSyncOffset: {\n\t\t/**\n\t\t * Name of the input to get the audio sync offset of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputAudioSyncOffset: {\n\t\t/**\n\t\t * Name of the input to set the audio sync offset of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New audio sync offset in milliseconds\n\t\t *\n\t\t * @restrictions >= -950, <= 20000\n\t\t */\n\t\tinputAudioSyncOffset: number;\n\t};\n\tGetInputAudioMonitorType: {\n\t\t/**\n\t\t * Name of the input to get the audio monitor type of\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputAudioMonitorType: {\n\t\t/**\n\t\t * Name of the input to set the audio monitor type of\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Audio monitor type\n\t\t */\n\t\tmonitorType: string;\n\t};\n\tGetInputAudioTracks: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetInputAudioTracks: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Track settings to apply\n\t\t */\n\t\tinputAudioTracks: JsonObject;\n\t};\n\tGetInputPropertiesListPropertyItems: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Name of the list property to get the items of\n\t\t */\n\t\tpropertyName: string;\n\t};\n\tPressInputPropertiesButton: {\n\t\t/**\n\t\t * Name of the input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Name of the button property to press\n\t\t */\n\t\tpropertyName: string;\n\t};\n\tGetMediaInputStatus: {\n\t\t/**\n\t\t * Name of the media input\n\t\t */\n\t\tinputName: string;\n\t};\n\tSetMediaInputCursor: {\n\t\t/**\n\t\t * Name of the media input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * New cursor position to set\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tmediaCursor: number;\n\t};\n\tOffsetMediaInputCursor: {\n\t\t/**\n\t\t * Name of the media input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Value to offset the current cursor position by\n\t\t */\n\t\tmediaCursorOffset: number;\n\t};\n\tTriggerMediaInputAction: {\n\t\t/**\n\t\t * Name of the media input\n\t\t */\n\t\tinputName: string;\n\t\t/**\n\t\t * Identifier of the `ObsMediaInputAction` enum\n\t\t */\n\t\tmediaAction: string;\n\t};\n\tGetVirtualCamStatus: never;\n\tToggleVirtualCam: never;\n\tStartVirtualCam: never;\n\tStopVirtualCam: never;\n\tGetReplayBufferStatus: never;\n\tToggleReplayBuffer: never;\n\tStartReplayBuffer: never;\n\tStopReplayBuffer: never;\n\tSaveReplayBuffer: never;\n\tGetLastReplayBufferReplay: never;\n\tGetRecordStatus: never;\n\tToggleRecord: never;\n\tStartRecord: never;\n\tStopRecord: never;\n\tToggleRecordPause: never;\n\tPauseRecord: never;\n\tResumeRecord: never;\n\tGetSceneItemList: {\n\t\t/**\n\t\t * Name of the scene to get the items of\n\t\t */\n\t\tsceneName: string;\n\t};\n\tGetGroupItemList: {\n\t\t/**\n\t\t * Name of the group to get the items of\n\t\t */\n\t\tsceneName: string;\n\t};\n\tGetSceneItemId: {\n\t\t/**\n\t\t * Name of the scene or group to search in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the source to find\n\t\t */\n\t\tsourceName: string;\n\t};\n\tCreateSceneItem: {\n\t\t/**\n\t\t * Name of the scene to create the new item in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the source to add to the scene\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Enable state to apply to the scene item on creation\n\t\t *\n\t\t * @defaultValue True\n\t\t */\n\t\tsceneItemEnabled?: boolean;\n\t};\n\tRemoveSceneItem: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tDuplicateSceneItem: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * Name of the scene to create the duplicated item in\n\t\t *\n\t\t * @defaultValue `sceneName` is assumed\n\t\t */\n\t\tdestinationSceneName?: string;\n\t};\n\tGetSceneItemTransform: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSetSceneItemTransform: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * Object containing scene item transform info to update\n\t\t */\n\t\tsceneItemTransform: JsonObject;\n\t};\n\tGetSceneItemEnabled: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSetSceneItemEnabled: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * New enable state of the scene item\n\t\t */\n\t\tsceneItemEnabled: boolean;\n\t};\n\tGetSceneItemLocked: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSetSceneItemLocked: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * New lock state of the scene item\n\t\t */\n\t\tsceneItemLocked: boolean;\n\t};\n\tGetSceneItemIndex: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSetSceneItemIndex: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * New index position of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemIndex: number;\n\t};\n\tGetSceneItemBlendMode: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tSetSceneItemBlendMode: {\n\t\t/**\n\t\t * Name of the scene the item is in\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t *\n\t\t * @restrictions >= 0\n\t\t */\n\t\tsceneItemId: number;\n\t\t/**\n\t\t * New blend mode\n\t\t */\n\t\tsceneItemBlendMode: string;\n\t};\n\tGetSceneList: never;\n\tGetGroupList: never;\n\tGetCurrentProgramScene: never;\n\tSetCurrentProgramScene: {\n\t\t/**\n\t\t * Scene to set as the current program scene\n\t\t */\n\t\tsceneName: string;\n\t};\n\tGetCurrentPreviewScene: never;\n\tSetCurrentPreviewScene: {\n\t\t/**\n\t\t * Scene to set as the current preview scene\n\t\t */\n\t\tsceneName: string;\n\t};\n\tCreateScene: {\n\t\t/**\n\t\t * Name for the new scene\n\t\t */\n\t\tsceneName: string;\n\t};\n\tRemoveScene: {\n\t\t/**\n\t\t * Name of the scene to remove\n\t\t */\n\t\tsceneName: string;\n\t};\n\tSetSceneName: {\n\t\t/**\n\t\t * Name of the scene to be renamed\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * New name for the scene\n\t\t */\n\t\tnewSceneName: string;\n\t};\n\tGetSceneSceneTransitionOverride: {\n\t\t/**\n\t\t * Name of the scene\n\t\t */\n\t\tsceneName: string;\n\t};\n\tSetSceneSceneTransitionOverride: {\n\t\t/**\n\t\t * Name of the scene\n\t\t */\n\t\tsceneName: string;\n\t\t/**\n\t\t * Name of the scene transition to use as override. Specify `null` to remove\n\t\t *\n\t\t * @defaultValue Unchanged\n\t\t */\n\t\ttransitionName?: string;\n\t\t/**\n\t\t * Duration to use for any overridden transition. Specify `null` to remove\n\t\t *\n\t\t * @restrictions >= 50, <= 20000\n\t\t * @defaultValue Unchanged\n\t\t */\n\t\ttransitionDuration?: number;\n\t};\n\tGetSourceActive: {\n\t\t/**\n\t\t * Name of the source to get the active state of\n\t\t */\n\t\tsourceName: string;\n\t};\n\tGetSourceScreenshot: {\n\t\t/**\n\t\t * Name of the source to take a screenshot of\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Image compression format to use. Use `GetVersion` to get compatible image formats\n\t\t */\n\t\timageFormat: string;\n\t\t/**\n\t\t * Width to scale the screenshot to\n\t\t *\n\t\t * @restrictions >= 8, <= 4096\n\t\t * @defaultValue Source value is used\n\t\t */\n\t\timageWidth?: number;\n\t\t/**\n\t\t * Height to scale the screenshot to\n\t\t *\n\t\t * @restrictions >= 8, <= 4096\n\t\t * @defaultValue Source value is used\n\t\t */\n\t\timageHeight?: number;\n\t\t/**\n\t\t * Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \"default\" (whatever that means, idk)\n\t\t *\n\t\t * @restrictions >= -1, <= 100\n\t\t * @defaultValue -1\n\t\t */\n\t\timageCompressionQuality?: number;\n\t};\n\tSaveSourceScreenshot: {\n\t\t/**\n\t\t * Name of the source to take a screenshot of\n\t\t */\n\t\tsourceName: string;\n\t\t/**\n\t\t * Image compression format to use. Use `GetVersion` to get compatible image formats\n\t\t */\n\t\timageFormat: string;\n\t\t/**\n\t\t * Path to save the screenshot file to. Eg. `C:\\Users\\user\\Desktop\\screenshot.png`\n\t\t */\n\t\timageFilePath: string;\n\t\t/**\n\t\t * Width to scale the screenshot to\n\t\t *\n\t\t * @restrictions >= 8, <= 4096\n\t\t * @defaultValue Source value is used\n\t\t */\n\t\timageWidth?: number;\n\t\t/**\n\t\t * Height to scale the screenshot to\n\t\t *\n\t\t * @restrictions >= 8, <= 4096\n\t\t * @defaultValue Source value is used\n\t\t */\n\t\timageHeight?: number;\n\t\t/**\n\t\t * Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use \"default\" (whatever that means, idk)\n\t\t *\n\t\t * @restrictions >= -1, <= 100\n\t\t * @defaultValue -1\n\t\t */\n\t\timageCompressionQuality?: number;\n\t};\n\tGetStreamStatus: never;\n\tToggleStream: never;\n\tStartStream: never;\n\tStopStream: never;\n\tSendStreamCaption: {\n\t\t/**\n\t\t * Caption text\n\t\t */\n\t\tcaptionText: string;\n\t};\n\tGetTransitionKindList: never;\n\tGetSceneTransitionList: never;\n\tGetCurrentSceneTransition: never;\n\tSetCurrentSceneTransition: {\n\t\t/**\n\t\t * Name of the transition to make active\n\t\t */\n\t\ttransitionName: string;\n\t};\n\tSetCurrentSceneTransitionDuration: {\n\t\t/**\n\t\t * Duration in milliseconds\n\t\t *\n\t\t * @restrictions >= 50, <= 20000\n\t\t */\n\t\ttransitionDuration: number;\n\t};\n\tSetCurrentSceneTransitionSettings: {\n\t\t/**\n\t\t * Settings object to apply to the transition. Can be `{}`\n\t\t */\n\t\ttransitionSettings: JsonObject;\n\t\t/**\n\t\t * Whether to overlay over the current settings or replace them\n\t\t *\n\t\t * @defaultValue true\n\t\t */\n\t\toverlay?: boolean;\n\t};\n\tGetCurrentSceneTransitionCursor: never;\n\tTriggerStudioModeTransition: never;\n\tSetTBarPosition: {\n\t\t/**\n\t\t * New position\n\t\t *\n\t\t * @restrictions >= 0.0, <= 1.0\n\t\t */\n\t\tposition: number;\n\t\t/**\n\t\t * Whether to release the TBar. Only set `false` if you know that you will be sending another position update\n\t\t *\n\t\t * @defaultValue `true`\n\t\t */\n\t\trelease?: boolean;\n\t};\n\tGetStudioModeEnabled: never;\n\tSetStudioModeEnabled: {\n\t\t/**\n\t\t * True == Enabled, False == Disabled\n\t\t */\n\t\tstudioModeEnabled: boolean;\n\t};\n\tOpenInputPropertiesDialog: {\n\t\t/**\n\t\t * Name of the input to open the dialog of\n\t\t */\n\t\tinputName: string;\n\t};\n\tOpenInputFiltersDialog: {\n\t\t/**\n\t\t * Name of the input to open the dialog of\n\t\t */\n\t\tinputName: string;\n\t};\n\tOpenInputInteractDialog: {\n\t\t/**\n\t\t * Name of the input to open the dialog of\n\t\t */\n\t\tinputName: string;\n\t};\n}\n\nexport interface OBSResponseTypes {\n\tGetPersistentData: {\n\t\t/**\n\t\t * Value associated with the slot. `null` if not set\n\t\t */\n\t\tslotValue: JsonValue;\n\t};\n\tSetPersistentData: undefined;\n\tGetSceneCollectionList: {\n\t\t/**\n\t\t * The name of the current scene collection\n\t\t */\n\t\tcurrentSceneCollectionName: string;\n\t\t/**\n\t\t * Array of all available scene collections\n\t\t */\n\t\tsceneCollections: string[];\n\t};\n\tSetCurrentSceneCollection: undefined;\n\tCreateSceneCollection: undefined;\n\tGetProfileList: {\n\t\t/**\n\t\t * The name of the current profile\n\t\t */\n\t\tcurrentProfileName: string;\n\t\t/**\n\t\t * Array of all available profiles\n\t\t */\n\t\tprofiles: string[];\n\t};\n\tSetCurrentProfile: undefined;\n\tCreateProfile: undefined;\n\tRemoveProfile: undefined;\n\tGetProfileParameter: {\n\t\t/**\n\t\t * Value associated with the parameter. `null` if not set and no default\n\t\t */\n\t\tparameterValue: string;\n\t\t/**\n\t\t * Default value associated with the parameter. `null` if no default\n\t\t */\n\t\tdefaultParameterValue: string;\n\t};\n\tSetProfileParameter: undefined;\n\tGetVideoSettings: {\n\t\t/**\n\t\t * Numerator of the fractional FPS value\n\t\t */\n\t\tfpsNumerator: number;\n\t\t/**\n\t\t * Denominator of the fractional FPS value\n\t\t */\n\t\tfpsDenominator: number;\n\t\t/**\n\t\t * Width of the base (canvas) resolution in pixels\n\t\t */\n\t\tbaseWidth: number;\n\t\t/**\n\t\t * Height of the base (canvas) resolution in pixels\n\t\t */\n\t\tbaseHeight: number;\n\t\t/**\n\t\t * Width of the output resolution in pixels\n\t\t */\n\t\toutputWidth: number;\n\t\t/**\n\t\t * Height of the output resolution in pixels\n\t\t */\n\t\toutputHeight: number;\n\t};\n\tSetVideoSettings: undefined;\n\tGetStreamServiceSettings: {\n\t\t/**\n\t\t * Stream service type, like `rtmp_custom` or `rtmp_common`\n\t\t */\n\t\tstreamServiceType: string;\n\t\t/**\n\t\t * Stream service settings\n\t\t */\n\t\tstreamServiceSettings: JsonObject;\n\t};\n\tSetStreamServiceSettings: undefined;\n\tGetRecordDirectory: {\n\t\t/**\n\t\t * Output directory\n\t\t */\n\t\trecordDirectory: string;\n\t};\n\tGetSourceFilterList: {\n\t\t/**\n\t\t * Array of filters\n\t\t */\n\t\tfilters: JsonArray;\n\t};\n\tGetSourceFilterDefaultSettings: {\n\t\t/**\n\t\t * Object of default settings for the filter kind\n\t\t */\n\t\tdefaultFilterSettings: JsonObject;\n\t};\n\tCreateSourceFilter: undefined;\n\tRemoveSourceFilter: undefined;\n\tSetSourceFilterName: undefined;\n\tGetSourceFilter: {\n\t\t/**\n\t\t * Whether the filter is enabled\n\t\t */\n\t\tfilterEnabled: boolean;\n\t\t/**\n\t\t * Index of the filter in the list, beginning at 0\n\t\t */\n\t\tfilterIndex: number;\n\t\t/**\n\t\t * The kind of filter\n\t\t */\n\t\tfilterKind: string;\n\t\t/**\n\t\t * Settings object associated with the filter\n\t\t */\n\t\tfilterSettings: JsonObject;\n\t};\n\tSetSourceFilterIndex: undefined;\n\tSetSourceFilterSettings: undefined;\n\tGetVersion: {\n\t\t/**\n\t\t * Current OBS Studio version\n\t\t */\n\t\tobsVersion: string;\n\t\t/**\n\t\t * Current obs-websocket version\n\t\t */\n\t\tobsWebSocketVersion: string;\n\t\t/**\n\t\t * Current latest obs-websocket RPC version\n\t\t */\n\t\trpcVersion: number;\n\t\t/**\n\t\t * Array of available RPC requests for the currently negotiated RPC version\n\t\t */\n\t\tavailableRequests: string[];\n\t\t/**\n\t\t * Image formats available in `GetSourceScreenshot` and `SaveSourceScreenshot` requests.\n\t\t */\n\t\tsupportedImageFormats: string[];\n\t};\n\tGetStats: {\n\t\t/**\n\t\t * Current CPU usage in percent\n\t\t */\n\t\tcpuUsage: number;\n\t\t/**\n\t\t * Amount of memory in MB currently being used by OBS\n\t\t */\n\t\tmemoryUsage: number;\n\t\t/**\n\t\t * Available disk space on the device being used for recording storage\n\t\t */\n\t\tavailableDiskSpace: number;\n\t\t/**\n\t\t * Current FPS being rendered\n\t\t */\n\t\tactiveFps: number;\n\t\t/**\n\t\t * Average time in milliseconds that OBS is taking to render a frame\n\t\t */\n\t\taverageFrameRenderTime: number;\n\t\t/**\n\t\t * Number of frames skipped by OBS in the render thread\n\t\t */\n\t\trenderSkippedFrames: number;\n\t\t/**\n\t\t * Total number of frames outputted by the render thread\n\t\t */\n\t\trenderTotalFrames: number;\n\t\t/**\n\t\t * Number of frames skipped by OBS in the output thread\n\t\t */\n\t\toutputSkippedFrames: number;\n\t\t/**\n\t\t * Total number of frames outputted by the output thread\n\t\t */\n\t\toutputTotalFrames: number;\n\t\t/**\n\t\t * Total number of messages received by obs-websocket from the client\n\t\t */\n\t\twebSocketSessionIncomingMessages: number;\n\t\t/**\n\t\t * Total number of messages sent by obs-websocket to the client\n\t\t */\n\t\twebSocketSessionOutgoingMessages: number;\n\t};\n\tBroadcastCustomEvent: undefined;\n\tCallVendorRequest: {\n\t\t/**\n\t\t * Object containing appropriate response data. {} if request does not provide any response data\n\t\t */\n\t\tresponseData: JsonObject;\n\t};\n\tGetHotkeyList: {\n\t\t/**\n\t\t * Array of hotkey names\n\t\t */\n\t\thotkeys: string[];\n\t};\n\tTriggerHotkeyByName: undefined;\n\tTriggerHotkeyByKeySequence: undefined;\n\tSleep: undefined;\n\tGetInputList: {\n\t\t/**\n\t\t * Array of inputs\n\t\t */\n\t\tinputs: JsonArray;\n\t};\n\tGetInputKindList: {\n\t\t/**\n\t\t * Array of input kinds\n\t\t */\n\t\tinputKinds: string[];\n\t};\n\tGetSpecialInputs: {\n\t\t/**\n\t\t * Name of the Desktop Audio input\n\t\t */\n\t\tdesktop1: string;\n\t\t/**\n\t\t * Name of the Desktop Audio 2 input\n\t\t */\n\t\tdesktop2: string;\n\t\t/**\n\t\t * Name of the Mic/Auxiliary Audio input\n\t\t */\n\t\tmic1: string;\n\t\t/**\n\t\t * Name of the Mic/Auxiliary Audio 2 input\n\t\t */\n\t\tmic2: string;\n\t\t/**\n\t\t * Name of the Mic/Auxiliary Audio 3 input\n\t\t */\n\t\tmic3: string;\n\t\t/**\n\t\t * Name of the Mic/Auxiliary Audio 4 input\n\t\t */\n\t\tmic4: string;\n\t};\n\tCreateInput: {\n\t\t/**\n\t\t * ID of the newly created scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tRemoveInput: undefined;\n\tSetInputName: undefined;\n\tGetInputDefaultSettings: {\n\t\t/**\n\t\t * Object of default settings for the input kind\n\t\t */\n\t\tdefaultInputSettings: JsonObject;\n\t};\n\tGetInputSettings: {\n\t\t/**\n\t\t * Object of settings for the input\n\t\t */\n\t\tinputSettings: JsonObject;\n\t\t/**\n\t\t * The kind of the input\n\t\t */\n\t\tinputKind: string;\n\t};\n\tSetInputSettings: undefined;\n\tGetInputMute: {\n\t\t/**\n\t\t * Whether the input is muted\n\t\t */\n\t\tinputMuted: boolean;\n\t};\n\tSetInputMute: undefined;\n\tToggleInputMute: {\n\t\t/**\n\t\t * Whether the input has been muted or unmuted\n\t\t */\n\t\tinputMuted: boolean;\n\t};\n\tGetInputVolume: {\n\t\t/**\n\t\t * Volume setting in mul\n\t\t */\n\t\tinputVolumeMul: number;\n\t\t/**\n\t\t * Volume setting in dB\n\t\t */\n\t\tinputVolumeDb: number;\n\t};\n\tSetInputVolume: undefined;\n\tGetInputAudioBalance: {\n\t\t/**\n\t\t * Audio balance value from 0.0-1.0\n\t\t */\n\t\tinputAudioBalance: number;\n\t};\n\tSetInputAudioBalance: undefined;\n\tGetInputAudioSyncOffset: {\n\t\t/**\n\t\t * Audio sync offset in milliseconds\n\t\t */\n\t\tinputAudioSyncOffset: number;\n\t};\n\tSetInputAudioSyncOffset: undefined;\n\tGetInputAudioMonitorType: {\n\t\t/**\n\t\t * Audio monitor type\n\t\t */\n\t\tmonitorType: string;\n\t};\n\tSetInputAudioMonitorType: undefined;\n\tGetInputAudioTracks: {\n\t\t/**\n\t\t * Object of audio tracks and associated enable states\n\t\t */\n\t\tinputAudioTracks: JsonObject;\n\t};\n\tSetInputAudioTracks: undefined;\n\tGetInputPropertiesListPropertyItems: {\n\t\t/**\n\t\t * Array of items in the list property\n\t\t */\n\t\tpropertyItems: JsonArray;\n\t};\n\tPressInputPropertiesButton: undefined;\n\tGetMediaInputStatus: {\n\t\t/**\n\t\t * State of the media input\n\t\t */\n\t\tmediaState: string;\n\t\t/**\n\t\t * Total duration of the playing media in milliseconds. `null` if not playing\n\t\t */\n\t\tmediaDuration: number;\n\t\t/**\n\t\t * Position of the cursor in milliseconds. `null` if not playing\n\t\t */\n\t\tmediaCursor: number;\n\t};\n\tSetMediaInputCursor: undefined;\n\tOffsetMediaInputCursor: undefined;\n\tTriggerMediaInputAction: undefined;\n\tGetVirtualCamStatus: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t};\n\tToggleVirtualCam: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t};\n\tStartVirtualCam: undefined;\n\tStopVirtualCam: undefined;\n\tGetReplayBufferStatus: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t};\n\tToggleReplayBuffer: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t};\n\tStartReplayBuffer: undefined;\n\tStopReplayBuffer: undefined;\n\tSaveReplayBuffer: undefined;\n\tGetLastReplayBufferReplay: {\n\t\t/**\n\t\t * File path\n\t\t */\n\t\tsavedReplayPath: string;\n\t};\n\tGetRecordStatus: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * Whether the output is paused\n\t\t */\n\t\touputPaused: boolean;\n\t\t/**\n\t\t * Current formatted timecode string for the output\n\t\t */\n\t\toutputTimecode: string;\n\t\t/**\n\t\t * Current duration in milliseconds for the output\n\t\t */\n\t\toutputDuration: number;\n\t\t/**\n\t\t * Number of bytes sent by the output\n\t\t */\n\t\toutputBytes: number;\n\t};\n\tToggleRecord: undefined;\n\tStartRecord: undefined;\n\tStopRecord: undefined;\n\tToggleRecordPause: undefined;\n\tPauseRecord: undefined;\n\tResumeRecord: undefined;\n\tGetSceneItemList: {\n\t\t/**\n\t\t * Array of scene items in the scene\n\t\t */\n\t\tsceneItems: JsonArray;\n\t};\n\tGetGroupItemList: {\n\t\t/**\n\t\t * Array of scene items in the group\n\t\t */\n\t\tsceneItems: JsonArray;\n\t};\n\tGetSceneItemId: {\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tCreateSceneItem: {\n\t\t/**\n\t\t * Numeric ID of the scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tRemoveSceneItem: undefined;\n\tDuplicateSceneItem: {\n\t\t/**\n\t\t * Numeric ID of the duplicated scene item\n\t\t */\n\t\tsceneItemId: number;\n\t};\n\tGetSceneItemTransform: {\n\t\t/**\n\t\t * Object containing scene item transform info\n\t\t */\n\t\tsceneItemTransform: JsonObject;\n\t};\n\tSetSceneItemTransform: undefined;\n\tGetSceneItemEnabled: {\n\t\t/**\n\t\t * Whether the scene item is enabled. `true` for enabled, `false` for disabled\n\t\t */\n\t\tsceneItemEnabled: boolean;\n\t};\n\tSetSceneItemEnabled: undefined;\n\tGetSceneItemLocked: {\n\t\t/**\n\t\t * Whether the scene item is locked. `true` for locked, `false` for unlocked\n\t\t */\n\t\tsceneItemLocked: boolean;\n\t};\n\tSetSceneItemLocked: undefined;\n\tGetSceneItemIndex: {\n\t\t/**\n\t\t * Index position of the scene item\n\t\t */\n\t\tsceneItemIndex: number;\n\t};\n\tSetSceneItemIndex: undefined;\n\tGetSceneItemBlendMode: {\n\t\t/**\n\t\t * Current blend mode\n\t\t */\n\t\tsceneItemBlendMode: string;\n\t};\n\tSetSceneItemBlendMode: undefined;\n\tGetSceneList: {\n\t\t/**\n\t\t * Current program scene\n\t\t */\n\t\tcurrentProgramSceneName: string;\n\t\t/**\n\t\t * Current preview scene. `null` if not in studio mode\n\t\t */\n\t\tcurrentPreviewSceneName: string;\n\t\t/**\n\t\t * Array of scenes\n\t\t */\n\t\tscenes: JsonArray;\n\t};\n\tGetGroupList: {\n\t\t/**\n\t\t * Array of group names\n\t\t */\n\t\tgroups: string[];\n\t};\n\tGetCurrentProgramScene: {\n\t\t/**\n\t\t * Current program scene\n\t\t */\n\t\tcurrentProgramSceneName: string;\n\t};\n\tSetCurrentProgramScene: undefined;\n\tGetCurrentPreviewScene: {\n\t\t/**\n\t\t * Current preview scene\n\t\t */\n\t\tcurrentPreviewSceneName: string;\n\t};\n\tSetCurrentPreviewScene: undefined;\n\tCreateScene: undefined;\n\tRemoveScene: undefined;\n\tSetSceneName: undefined;\n\tGetSceneSceneTransitionOverride: {\n\t\t/**\n\t\t * Name of the overridden scene transition, else `null`\n\t\t */\n\t\ttransitionName: string;\n\t\t/**\n\t\t * Duration of the overridden scene transition, else `null`\n\t\t */\n\t\ttransitionDuration: number;\n\t};\n\tSetSceneSceneTransitionOverride: undefined;\n\tGetSourceActive: {\n\t\t/**\n\t\t * Whether the source is showing in Program\n\t\t */\n\t\tvideoActive: boolean;\n\t\t/**\n\t\t * Whether the source is showing in the UI (Preview, Projector, Properties)\n\t\t */\n\t\tvideoShowing: boolean;\n\t};\n\tGetSourceScreenshot: {\n\t\t/**\n\t\t * Base64-encoded screenshot\n\t\t */\n\t\timageData: string;\n\t};\n\tSaveSourceScreenshot: {\n\t\t/**\n\t\t * Base64-encoded screenshot\n\t\t */\n\t\timageData: string;\n\t};\n\tGetStreamStatus: {\n\t\t/**\n\t\t * Whether the output is active\n\t\t */\n\t\toutputActive: boolean;\n\t\t/**\n\t\t * Whether the output is currently reconnecting\n\t\t */\n\t\toutputReconnecting: boolean;\n\t\t/**\n\t\t * Current formatted timecode string for the output\n\t\t */\n\t\toutputTimecode: string;\n\t\t/**\n\t\t * Current duration in milliseconds for the output\n\t\t */\n\t\toutputDuration: number;\n\t\t/**\n\t\t * Number of bytes sent by the output\n\t\t */\n\t\toutputBytes: number;\n\t\t/**\n\t\t * Number of frames skipped by the output's process\n\t\t */\n\t\toutputSkippedFrames: number;\n\t\t/**\n\t\t * Total number of frames delivered by the output's process\n\t\t */\n\t\toutputTotalFrames: number;\n\t};\n\tToggleStream: {\n\t\t/**\n\t\t * New state of the stream output\n\t\t */\n\t\toutputActive: boolean;\n\t};\n\tStartStream: undefined;\n\tStopStream: undefined;\n\tSendStreamCaption: undefined;\n\tGetTransitionKindList: {\n\t\t/**\n\t\t * Array of transition kinds\n\t\t */\n\t\ttransitionKinds: string[];\n\t};\n\tGetSceneTransitionList: {\n\t\t/**\n\t\t * Name of the current scene transition. Can be null\n\t\t */\n\t\tcurrentSceneTransitionName: string;\n\t\t/**\n\t\t * Kind of the current scene transition. Can be null\n\t\t */\n\t\tcurrentSceneTransitionKind: string;\n\t\t/**\n\t\t * Array of transitions\n\t\t */\n\t\ttransitions: JsonArray;\n\t};\n\tGetCurrentSceneTransition: {\n\t\t/**\n\t\t * Name of the transition\n\t\t */\n\t\ttransitionName: string;\n\t\t/**\n\t\t * Kind of the transition\n\t\t */\n\t\ttransitionKind: string;\n\t\t/**\n\t\t * Whether the transition uses a fixed (unconfigurable) duration\n\t\t */\n\t\ttransitionFixed: boolean;\n\t\t/**\n\t\t * Configured transition duration in milliseconds. `null` if transition is fixed\n\t\t */\n\t\ttransitionDuration: number;\n\t\t/**\n\t\t * Whether the transition supports being configured\n\t\t */\n\t\ttransitionConfigurable: boolean;\n\t\t/**\n\t\t * Object of settings for the transition. `null` if transition is not configurable\n\t\t */\n\t\ttransitionSettings: JsonObject;\n\t};\n\tSetCurrentSceneTransition: undefined;\n\tSetCurrentSceneTransitionDuration: undefined;\n\tSetCurrentSceneTransitionSettings: undefined;\n\tGetCurrentSceneTransitionCursor: {\n\t\t/**\n\t\t * Cursor position, between 0.0 and 1.0\n\t\t */\n\t\ttransitionCursor: number;\n\t};\n\tTriggerStudioModeTransition: undefined;\n\tSetTBarPosition: undefined;\n\tGetStudioModeEnabled: {\n\t\t/**\n\t\t * Whether studio mode is enabled\n\t\t */\n\t\tstudioModeEnabled: boolean;\n\t};\n\tSetStudioModeEnabled: undefined;\n\tOpenInputPropertiesDialog: undefined;\n\tOpenInputFiltersDialog: undefined;\n\tOpenInputInteractDialog: undefined;\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t    var crypto;\n\n\t    // Native crypto from window (Browser)\n\t    if (typeof window !== 'undefined' && window.crypto) {\n\t        crypto = window.crypto;\n\t    }\n\n\t    // Native crypto in web worker (Browser)\n\t    if (typeof self !== 'undefined' && self.crypto) {\n\t        crypto = self.crypto;\n\t    }\n\n\t    // Native crypto from worker\n\t    if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t        crypto = globalThis.crypto;\n\t    }\n\n\t    // Native (experimental IE 11) crypto from window (Browser)\n\t    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t        crypto = window.msCrypto;\n\t    }\n\n\t    // Native crypto from global (NodeJS)\n\t    if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t        crypto = global.crypto;\n\t    }\n\n\t    // Native crypto import via require (NodeJS)\n\t    if (!crypto && typeof require === 'function') {\n\t        try {\n\t            crypto = require('crypto');\n\t        } catch (err) {}\n\t    }\n\n\t    /*\n\t     * Cryptographically secure pseudorandom number generator\n\t     *\n\t     * As Math.random() is cryptographically not safe to use\n\t     */\n\t    var cryptoSecureRandomInt = function () {\n\t        if (crypto) {\n\t            // Use getRandomValues method (Browser)\n\t            if (typeof crypto.getRandomValues === 'function') {\n\t                try {\n\t                    return crypto.getRandomValues(new Uint32Array(1))[0];\n\t                } catch (err) {}\n\t            }\n\n\t            // Use randomBytes method (NodeJS)\n\t            if (typeof crypto.randomBytes === 'function') {\n\t                try {\n\t                    return crypto.randomBytes(4).readInt32LE();\n\t                } catch (err) {}\n\t            }\n\t        }\n\n\t        throw new Error('Native crypto module could not be used to get secure random number.');\n\t    };\n\n\t    /*\n\t     * Local polyfill of Object.create\n\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {}\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }());\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var j = 0; j < thatSigBytes; j += 4) {\n\t                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            for (var i = 0; i < nBytes; i += 4) {\n\t                words.push(cryptoSecureRandomInt());\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            var processedWords;\n\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64 encoding strategy.\n\t     */\n\t    var Base64 = C_enc.Base64 = {\n\t        /**\n\t         * Converts a word array to a Base64 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Base64 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64 string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t         */\n\t        parse: function (base64Str) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                    reverseMap = this._reverseMap = [];\n\t                    for (var j = 0; j < map.length; j++) {\n\t                        reverseMap[map.charCodeAt(j)] = j;\n\t                    }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t      var words = [];\n\t      var nBytes = 0;\n\t      for (var i = 0; i < base64StrLength; i++) {\n\t          if (i % 4) {\n\t              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t              var bitsCombined = bits1 | bits2;\n\t              words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t              nBytes++;\n\t          }\n\t      }\n\t      return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));","import createDebug from 'debug';\nimport EventEmitter from 'eventemitter3';\n// Import under alias so DOM's WebSocket type can be used\nimport WebSocketIpml from 'isomorphic-ws';\nimport {Except, Merge, SetOptional} from 'type-fest';\n\nimport {OutgoingMessageTypes, WebSocketOpCode, OutgoingMessage, OBSEventTypes, IncomingMessage, IncomingMessageTypes, OBSRequestTypes, OBSResponseTypes, RequestMessage, ResponseMessage} from './types.js';\nimport authenticationHashing from './utils/authenticationHashing.js';\n\nexport const debug = createDebug('obs-websocket-js');\n\nexport class OBSWebSocketError extends Error {\n\tconstructor(public code: number, message: string) {\n\t\tsuper(message);\n\t}\n}\n\nexport type EventTypes = Merge<{\n\tConnectionOpened: void;\n\tConnectionClosed: OBSWebSocketError;\n\tConnectionError: OBSWebSocketError;\n\tHello: IncomingMessageTypes[WebSocketOpCode.Hello];\n\tIdentified: IncomingMessageTypes[WebSocketOpCode.Identified];\n}, OBSEventTypes>;\n\n// EventEmitter expects {type: [value]} syntax while for us {type: value} is neater\ntype MapValueToArgsArray<T extends Record<string, unknown>> = {\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\t[K in keyof T]: T[K] extends void ? [] : [T[K]];\n};\n\ntype IdentificationInput = SetOptional<Except<OutgoingMessageTypes[WebSocketOpCode.Identify], 'authentication'>, 'rpcVersion'>;\ntype HelloIdentifiedMerged = Merge<\nExclude<IncomingMessageTypes[WebSocketOpCode.Hello], 'authenticate'>,\nIncomingMessageTypes[WebSocketOpCode.Identified]\n>;\n\nexport abstract class BaseOBSWebSocket extends EventEmitter<MapValueToArgsArray<EventTypes>> {\n\tprotected static requestCounter = 1;\n\n\tprotected static generateMessageId(): string {\n\t\treturn String(BaseOBSWebSocket.requestCounter++);\n\t}\n\n\tprotected _identified = false;\n\tprotected internalListeners = new EventEmitter();\n\tprotected socket?: WebSocket;\n\tprotected abstract protocol: string;\n\n\tpublic get identified() {\n\t\treturn this._identified;\n\t}\n\n\t/**\n\t * Connect to an obs-websocket server\n\t *\n\t * @param url Websocket server to connect to (including ws:// or wss:// protocol)\n\t * @param password Password\n\t * @param identificationParams Data for Identify event\n\t * @returns Hello & Identified messages data (combined)\n\t */\n\tasync connect(\n\t\turl = 'ws://127.0.0.1:4444',\n\t\tpassword?: string,\n\t\tidentificationParams: IdentificationInput = {},\n\t): Promise<HelloIdentifiedMerged> {\n\t\tif (this.socket) {\n\t\t\tawait this.disconnect();\n\t\t}\n\n\t\ttry {\n\t\t\tconst connectionClosedPromise = this.internalEventPromise<EventTypes['ConnectionClosed']>('ConnectionClosed');\n\t\t\tconst connectionErrorPromise = this.internalEventPromise<EventTypes['ConnectionError']>('ConnectionError');\n\n\t\t\treturn await Promise.race([\n\t\t\t\t(async () => {\n\t\t\t\t\tconst hello = await this.createConnection(url);\n\t\t\t\t\tthis.emit('Hello', hello);\n\t\t\t\t\treturn this.identify(hello, password, identificationParams);\n\t\t\t\t})(),\n\t\t\t\t// Choose the best promise for connection error/close\n\t\t\t\t// In browser connection close has close code + reason,\n\t\t\t\t// while in node error event has these\n\t\t\t\tnew Promise<never>((resolve, reject) => {\n\t\t\t\t\tvoid connectionErrorPromise.then(e => {\n\t\t\t\t\t\tif (e.message) {\n\t\t\t\t\t\t\treject(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tvoid connectionClosedPromise.then(e => {\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t]);\n\t\t} catch (error: unknown) {\n\t\t\tawait this.disconnect();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from obs-websocket server\n\t */\n\tasync disconnect() {\n\t\tif (!this.socket || this.socket.readyState === WebSocketIpml.CLOSED) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst connectionClosedPromise = this.internalEventPromise('ConnectionClosed');\n\t\tthis.socket.close();\n\t\tawait connectionClosedPromise;\n\t}\n\n\t/**\n\t * Update session parameters\n\t *\n\t * @param data Reidentify data\n\t * @returns Identified message data\n\t */\n\tasync reidentify(data: OutgoingMessageTypes[WebSocketOpCode.Reidentify]) {\n\t\tconst identifiedPromise = this.internalEventPromise<IncomingMessageTypes[WebSocketOpCode.Identified]>(`op:${WebSocketOpCode.Identified}`);\n\t\tawait this.message(WebSocketOpCode.Reidentify, data);\n\t\treturn identifiedPromise;\n\t}\n\n\t/**\n\t * Send a request to obs-websocket\n\t *\n\t * @param requestType Request name\n\t * @param requestData Request data\n\t * @returns Request response\n\t */\n\tasync call<Type extends keyof OBSRequestTypes>(requestType: Type, requestData?: OBSRequestTypes[Type]): Promise<OBSResponseTypes[Type]> {\n\t\tconst requestId = BaseOBSWebSocket.generateMessageId();\n\t\tconst responsePromise = this.internalEventPromise<ResponseMessage<Type>>(`res:${requestId}`);\n\t\tawait this.message(WebSocketOpCode.Request, {\n\t\t\trequestId,\n\t\t\trequestType,\n\t\t\trequestData,\n\t\t} as RequestMessage<Type>);\n\t\tconst {requestStatus, responseData} = await responsePromise;\n\n\t\tif (!requestStatus.result) {\n\t\t\tthrow new OBSWebSocketError(requestStatus.code, requestStatus.comment);\n\t\t}\n\n\t\treturn responseData as OBSResponseTypes[Type];\n\t}\n\n\t/**\n\t * Cleanup from socket disconnection\n\t */\n\tprotected cleanup() {\n\t\tif (!this.socket) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.socket.onopen = null;\n\t\tthis.socket.onmessage = null;\n\t\tthis.socket.onerror = null;\n\t\tthis.socket.onclose = null;\n\t\tthis.socket = undefined;\n\t\tthis._identified = false;\n\n\t\t// Cleanup leftovers\n\t\tthis.internalListeners.removeAllListeners();\n\t}\n\n\t/**\n\t * Create connection to specified obs-websocket server\n\t *\n\t * @private\n\t * @param url Websocket address\n\t * @returns Promise for hello data\n\t */\n\tprotected async createConnection(url: string) {\n\t\tconst connectionOpenedPromise = this.internalEventPromise('ConnectionOpened');\n\t\tconst helloPromise = this.internalEventPromise<IncomingMessageTypes[WebSocketOpCode.Hello]>(`op:${WebSocketOpCode.Hello}`);\n\n\t\tthis.socket = new WebSocketIpml(url, this.protocol) as unknown as WebSocket;\n\t\tthis.socket.onopen = this.onOpen.bind(this);\n\t\tthis.socket.onmessage = this.onMessage.bind(this);\n\t\tthis.socket.onerror = this.onError.bind(this) as (e: Event) => void;\n\t\tthis.socket.onclose = this.onClose.bind(this);\n\n\t\tawait connectionOpenedPromise;\n\t\tconst protocol = this.socket?.protocol;\n\t\t// Browsers don't autoclose on missing/wrong protocol\n\t\tif (!protocol) {\n\t\t\tthrow new OBSWebSocketError(-1, 'Server sent no subprotocol');\n\t\t}\n\n\t\tif (protocol !== this.protocol) {\n\t\t\tthrow new OBSWebSocketError(-1, 'Server sent an invalid subprotocol');\n\t\t}\n\n\t\treturn helloPromise;\n\t}\n\n\t/**\n\t * Send identify message\n\t *\n\t * @private\n\t * @param hello Hello message data\n\t * @param password Password\n\t * @param identificationParams Identification params\n\t * @returns Hello & Identified messages data (combined)\n\t */\n\tprotected async identify(\n\t\t{\n\t\t\tauthentication,\n\t\t\trpcVersion,\n\t\t\t...helloRest\n\t\t}: IncomingMessageTypes[WebSocketOpCode.Hello],\n\t\tpassword?: string,\n\t\tidentificationParams: IdentificationInput = {},\n\t): Promise<HelloIdentifiedMerged> {\n\t\t// Set rpcVersion if unset\n\t\tconst data: OutgoingMessageTypes[WebSocketOpCode.Identify] = {\n\t\t\trpcVersion,\n\t\t\t...identificationParams,\n\t\t};\n\n\t\tif (authentication && password) {\n\t\t\tdata.authentication = authenticationHashing(authentication.salt, authentication.challenge, password);\n\t\t}\n\n\t\tconst identifiedPromise = this.internalEventPromise<IncomingMessageTypes[WebSocketOpCode.Identified]>(`op:${WebSocketOpCode.Identified}`);\n\t\tawait this.message(WebSocketOpCode.Identify, data);\n\t\tconst identified = await identifiedPromise;\n\t\tthis._identified = true;\n\t\tthis.emit('Identified', identified);\n\n\t\treturn {\n\t\t\trpcVersion,\n\t\t\t...helloRest,\n\t\t\t...identified,\n\t\t};\n\t}\n\n\t/**\n\t * Send message to obs-websocket\n\t *\n\t * @private\n\t * @param op WebSocketOpCode\n\t * @param d Message data\n\t */\n\tprotected async message<Type extends keyof OutgoingMessageTypes>(op: Type, d: OutgoingMessageTypes[Type]) {\n\t\tif (!this.socket) {\n\t\t\tthrow new Error('Not connected');\n\t\t}\n\n\t\tif (!this.identified && op !== 1) {\n\t\t\tthrow new Error('Socket not identified');\n\t\t}\n\n\t\tconst encoded = await this.encodeMessage({\n\t\t\top,\n\t\t\td,\n\t\t} as OutgoingMessage);\n\t\tthis.socket.send(encoded);\n\t}\n\n\t/**\n\t * Create a promise to listen for an event on internal listener\n\t * (will be cleaned up on disconnect)\n\t *\n\t * @private\n\t * @param event Event to listen to\n\t * @returns Event data\n\t */\n\tprotected async internalEventPromise<ReturnVal = unknown>(event: string): Promise<ReturnVal> {\n\t\treturn new Promise(resolve => {\n\t\t\tthis.internalListeners.once(event, resolve);\n\t\t});\n\t}\n\n\t/**\n\t * Websocket open event listener\n\t *\n\t * @private\n\t * @param e Event\n\t */\n\tprotected onOpen(e: Event) {\n\t\tdebug('socket.open');\n\t\tthis.emit('ConnectionOpened');\n\t\tthis.internalListeners.emit('ConnectionOpened', e);\n\t}\n\n\t/**\n\t * Websocket message event listener\n\t *\n\t * @private\n\t * @param e Event\n\t */\n\tprotected async onMessage(e: MessageEvent) {\n\t\ttry {\n\t\t\tconst {op, d} = await this.decodeMessage(e.data);\n\t\t\tdebug('socket.message: %d %j', op, d);\n\n\t\t\tif (op === undefined || d === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (op) {\n\t\t\t\tcase WebSocketOpCode.Event: {\n\t\t\t\t\tconst {eventType, eventData} = d as IncomingMessageTypes[WebSocketOpCode.Event];\n\t\t\t\t\t// @ts-expect-error Typescript just doesn't understand it\n\t\t\t\t\tthis.emit(eventType, eventData);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase WebSocketOpCode.RequestResponse: {\n\t\t\t\t\tconst {requestId} = d as IncomingMessageTypes[WebSocketOpCode.RequestResponse];\n\t\t\t\t\tthis.internalListeners.emit(`res:${requestId}`, d);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tthis.internalListeners.emit(`op:${op}`, d);\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tdebug('error handling message: %o', error);\n\t\t}\n\t}\n\n\t/**\n\t * Websocket error event listener\n\t *\n\t * @private\n\t * @param e ErrorEvent\n\t */\n\tprotected onError(e: ErrorEvent) {\n\t\tdebug('socket.error: %o', e);\n\t\tconst error = new OBSWebSocketError(-1, e.message);\n\n\t\tthis.emit('ConnectionError', error);\n\t\tthis.internalListeners.emit('ConnectionError', error);\n\t}\n\n\t/**\n\t * Websocket close event listener\n\t *\n\t * @private\n\t * @param e Event\n\t */\n\tprotected onClose(e: CloseEvent) {\n\t\tdebug('socket.close: %s (%d)', e.reason, e.code);\n\t\tconst error = new OBSWebSocketError(e.code, e.reason);\n\n\t\tthis.emit('ConnectionClosed', error);\n\t\tthis.internalListeners.emit('ConnectionClosed', error);\n\t\tthis.cleanup();\n\t}\n\n\t/**\n\t * Encode a message for specified protocol\n\t *\n\t * @param data Outgoing message\n\t * @returns Outgoing message to send via websocket\n\t */\n\tprotected abstract encodeMessage(data: OutgoingMessage): Promise<string | Blob | ArrayBufferView>;\n\n\t/**\n\t * Decode a message for specified protocol\n\t *\n\t * @param data Incoming message from websocket\n\t * @returns Parsed incoming message\n\t */\n\tprotected abstract decodeMessage(data: string | ArrayBuffer | Blob): Promise<IncomingMessage>;\n}\n\n// https://github.com/developit/microbundle/issues/531#issuecomment-575473024\n// Not using ESM export due to it also being detected and breaking rollup based bundlers (vite)\nif (typeof exports !== 'undefined') {\n\tObject.defineProperty(exports, '__esModule', {value: true});\n}\n","import sha256 from 'crypto-js/sha256.js';\nimport Base64 from 'crypto-js/enc-base64.js';\n\n/**\n * SHA256 Hashing.\n *\n * @param  {string} [salt=''] salt.\n * @param  {string} [challenge=''] challenge.\n * @param  {string} msg Message to encode.\n * @returns {string} sha256 encoded string.\n */\nexport default function (salt: string, challenge: string, msg: string): string {\n\tconst hash = Base64.stringify(sha256(msg + salt))!;\n\n\treturn Base64.stringify(sha256(hash + challenge))!;\n}\n","import {BaseOBSWebSocket} from './base.js';\nexport {OBSWebSocketError} from './base.js';\nexport type {EventTypes} from './base.js';\nimport {IncomingMessage, OutgoingMessage} from './types.js';\nexport * from './types.js';\n\nexport default class OBSWebSocket extends BaseOBSWebSocket {\n\tprotocol = 'obswebsocket.json';\n\n\tprotected async encodeMessage(data: OutgoingMessage): Promise<string> {\n\t\treturn JSON.stringify(data);\n\t}\n\n\tprotected async decodeMessage(data: string): Promise<IncomingMessage> {\n\t\treturn JSON.parse(data) as IncomingMessage;\n\t}\n}\n","// For CDN use generate file with all the exported values on OBSWebSocket object\n/* eslint-disable @typescript-eslint/naming-convention */\nimport JSONOBSWebSocket, {EventSubscription, OBSWebSocketError, RequestBatchExecutionType, WebSocketOpCode} from './json.js';\n\nexport default class OBSWebSocket extends JSONOBSWebSocket {\n\tstatic OBSWebSocketError = OBSWebSocketError;\n\tstatic WebSocketOpCode = WebSocketOpCode;\n\tstatic EventSubscription = EventSubscription;\n\tstatic RequestBatchExecutionType = RequestBatchExecutionType;\n}\n"],"names":["s","m","h","d","val","options","type","length","str","String","match","exec","n","parseFloat","toLowerCase","parse","isFinite","long","ms","msAbs","Math","abs","plural","fmtLong","round","fmtShort","Error","JSON","stringify","name","isPlural","exports","args","this","useColors","namespace","module","humanize","diff","c","color","splice","index","lastC","replace","namespaces","storage","setItem","removeItem","error","r","getItem","process","env","DEBUG","window","__nwjs","navigator","userAgent","document","documentElement","style","WebkitAppearance","console","firebug","exception","table","parseInt","RegExp","$1","localStorage","localstorage","warned","warn","debug","log","createDebug","prevTime","namespacesCache","enabledCache","enableOverride","enabled","self","curr","Number","Date","prev","coerce","unshift","format","formatter","formatters","call","formatArgs","apply","selectColor","extend","destroy","Object","defineProperty","enumerable","configurable","get","set","v","init","delimiter","newDebug","toNamespace","regexp","toString","substring","default","stack","message","disable","names","map","skips","join","enable","i","save","split","len","push","substr","test","require$$0","keys","forEach","key","hash","charCodeAt","colors","load","j","has","prototype","hasOwnProperty","prefix","Events","EE","fn","context","once","addListener","emitter","event","TypeError","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","slice","getOwnPropertySymbols","concat","listeners","handlers","l","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","arguments","removeListener","undefined","on","removeAllListeners","off","prefixed","ws","WebSocket","MozWebSocket","global","WebSocketOpCode","EventSubscription","RequestBatchExecutionType","CryptoJS","crypto","globalThis","msCrypto","err","cryptoSecureRandomInt","getRandomValues","Uint32Array","randomBytes","readInt32LE","F","obj","subtype","C","C_lib","lib","Base","overrides","mixIn","$super","instance","properties","propertyName","clone","WordArray","words","sigBytes","encoder","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","ceil","random","nBytes","C_enc","enc","hexChars","bite","hexStr","hexStrLength","Latin1","latin1Chars","fromCharCode","latin1Str","latin1StrLength","Utf8","decodeURIComponent","escape","e","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","data","_process","doFlush","processedWords","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","max","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","Hasher","cfg","_doReset","update","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","C_algo","HMAC","algo","H","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","pow","W","SHA256","_hash","M","a","b","f","g","gamma0x","gamma1x","maj","t1","nBitsTotal","nBitsLeft","floor","HmacSHA256","Base64","_map","base64Chars","triplet","charAt","paddingChar","base64Str","base64StrLength","reverseMap","_reverseMap","paddingIndex","indexOf","bits1","bits2","parseLoop","OBSWebSocketError","code","_this","BaseOBSWebSocket","_identified","internalListeners","socket","generateMessageId","requestCounter","connect","url","password","identificationParams","connectionClosedPromise","_this4","internalEventPromise","connectionErrorPromise","Promise","race","createConnection","hello","identify","resolve","reject","then","disconnect","_this6","readyState","WebSocketIpml","CLOSED","close","reidentify","identifiedPromise","Identified","Reidentify","requestType","requestData","requestId","responsePromise","Request","requestStatus","responseData","result","comment","cleanup","onopen","onmessage","onerror","onclose","connectionOpenedPromise","_this12","helloPromise","Hello","protocol","onOpen","bind","onMessage","onError","onClose","_this12$socket","challenge","authentication","rpcVersion","helloRest","sha256","salt","_this14","Identify","identified","op","_this16","encodeMessage","encoded","send","_this18","_this20","decodeMessage","Event","eventType","eventData","RequestResponse","reason","value","OBSWebSocket","JSONOBSWebSocket"],"mappings":"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"}