{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/aYGJCvSFoantRUzfEvdJ/R3HzaXN99zpIst2zJwMZ/codesandbox_nodebox.js", "ssg:https://framerusercontent.com/modules/fn2r53K2SixLM3ktuGOw/eTuqjtAw0LFZDyNdTgHv/codesandbox_sandpack_client.js", "ssg:https://framerusercontent.com/modules/peSgSa05KnLqaA8FHu9n/D7eZPbfsEH95yDKH1UTM/codemirror_commands.js", "ssg:https://framerusercontent.com/modules/SWAtenub3goqbKHfvwGg/SGdoMClxnsCb2h0GRQ48/codesandbox_sandpack_react.js", "ssg:https://framerusercontent.com/modules/wOI0XDWuPNeaYuatKp4b/ezOdeUpHBrE7fwL9evTL/browser.js", "ssg:https://framerusercontent.com/modules/19BkzxjVBT3VP0Ykl3DY/Ca7pJ6oGfAIcZSScMdTx/types.js", "ssg:https://framerusercontent.com/modules/HpmklHRFex5a5HMDftQo/5VVfjnRHGJM1T33zb1N5/SuspenseValue.js", "ssg:https://framerusercontent.com/modules/IdMJ4CymCWCh4cOBkZlb/RXSqswLIbuViBOVW1keE/utils.js", "ssg:https://framerusercontent.com/modules/DyzTKdNCsRH8nvz08sNT/dJhQ3yTSKg9tQmEoIrL8/useLanguageAsync.js", "ssg:https://framerusercontent.com/modules/c4BjG1nmVImY1EzTuV13/OqRStXQUJv4l4u3XtQrx/codesandbox_sandpack_themes.js", "ssg:https://framerusercontent.com/modules/HdJmYu90NFzknVhsFw9C/MDI6YFyMfuxuxcY2EeV6/theming.js", "ssg:https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js", "ssg:https://framerusercontent.com/modules/kpCcTLsnJd6KaZUPAO5I/vhMV7xdybphh8rtfkNSv/qfddknsE_.js"],
  "sourcesContent": ["// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */ // ../../node_modules/@codesandbox/nodebox/build/index.mjs\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n  if (privateCollection.has(obj)) {\n    throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n  }\n}\nfunction _classApplyDescriptorGet(receiver, descriptor) {\n  if (descriptor.get) {\n    return descriptor.get.call(receiver);\n  }\n  return descriptor.value;\n}\nfunction _classApplyDescriptorSet(receiver, descriptor, value) {\n  if (descriptor.set) {\n    descriptor.set.call(receiver, value);\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError(\"attempted to set read only private field\");\n    }\n    descriptor.value = value;\n  }\n}\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) {\n  if (!privateMap.has(receiver)) {\n    throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n  }\n  return privateMap.get(receiver);\n}\nfunction _classPrivateFieldGet(receiver, privateMap) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\");\n  return _classApplyDescriptorGet(receiver, descriptor);\n}\nfunction _classPrivateFieldInit(obj, privateMap, value) {\n  _checkPrivateRedeclaration(obj, privateMap);\n  privateMap.set(obj, value);\n}\nfunction _classPrivateFieldSet(receiver, privateMap, value) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\");\n  _classApplyDescriptorSet(receiver, descriptor, value);\n  return value;\n}\nfunction _classPrivateMethodGet(receiver, privateSet, fn) {\n  if (!privateSet.has(receiver)) {\n    throw new TypeError(\"attempted to get private field on non-instance\");\n  }\n  return fn;\n}\nfunction _classPrivateMethodInit(obj, privateSet) {\n  _checkPrivateRedeclaration(obj, privateSet);\n  privateSet.add(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {\n  enumerable: true,\n  configurable: true,\n  writable: true,\n  value\n}) : obj[key] = value;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n    exports: {}\n  }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n      get: () => from[key],\n      enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n    });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n  value: mod,\n  enumerable: true\n}) : target, mod));\nvar __publicField = (obj, key, value) => {\n  __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n  return value;\n};\nvar __accessCheck = (obj, member, msg) => {\n  if (!member.has(obj)) throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n  __accessCheck(obj, member, \"read from private field\");\n  return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n  if (member.has(obj)) throw TypeError(\"Cannot add the same private member more than once\");\n  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n  __accessCheck(obj, member, \"write to private field\");\n  setter ? setter.call(obj, value) : member.set(obj, value);\n  return value;\n};\nvar __privateMethod = (obj, member, method) => {\n  __accessCheck(obj, member, \"access private method\");\n  return method;\n};\nvar require_pad = __commonJS({\n  \"../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/pad.js\"(exports, module) {\n    module.exports = function pad(num, size) {\n      var s = \"000000000\" + num;\n      return s.substr(s.length - size);\n    };\n  }\n});\nvar require_fingerprint_browser = __commonJS({\n  \"../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/fingerprint.browser.js\"(exports, module) {\n    module.exports = function fingerprint() {\n      return Math.random().toString(16).slice(2);\n    };\n  }\n});\nvar require_getRandomValue_browser = __commonJS({\n  \"../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/getRandomValue.browser.js\"(exports, module) {\n    var getRandomValue;\n    var crypto = typeof window !== \"undefined\" && (window.crypto || window.msCrypto) || typeof self !== \"undefined\" && self.crypto;\n    if (crypto) {\n      lim = Math.pow(2, 32) - 1;\n      getRandomValue = function () {\n        return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim);\n      };\n    } else {\n      getRandomValue = Math.random;\n    }\n    var lim;\n    module.exports = getRandomValue;\n  }\n});\nvar require_cuid = __commonJS({\n  \"../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/index.js\"(exports, module) {\n    var fingerprint = require_fingerprint_browser();\n    var pad = require_pad();\n    var getRandomValue = require_getRandomValue_browser();\n    var c = 0;\n    var blockSize = 4;\n    var base = 36;\n    var discreteValues = Math.pow(base, blockSize);\n    function randomBlock() {\n      return pad((getRandomValue() * discreteValues << 0).toString(base), blockSize);\n    }\n    function safeCounter() {\n      c = c < discreteValues ? c : 0;\n      c++;\n      return c - 1;\n    }\n    function cuid3() {\n      var letter = \"c\",\n        timestamp = /* @__PURE__ */new Date().getTime().toString(base),\n        counter = pad(safeCounter().toString(base), blockSize),\n        print = fingerprint(),\n        random = randomBlock() + randomBlock();\n      return letter + timestamp + counter + print + random;\n    }\n    cuid3.slug = function slug() {\n      var date = /* @__PURE__ */new Date().getTime().toString(36),\n        counter = safeCounter().toString(36).slice(-4),\n        print = fingerprint().slice(0, 1) + fingerprint().slice(-1),\n        random = randomBlock().slice(-2);\n      return date.slice(-2) + counter + print + random;\n    };\n    cuid3.isCuid = function isCuid(stringToCheck) {\n      if (typeof stringToCheck !== \"string\") return false;\n      if (stringToCheck.startsWith(\"c\")) return true;\n      return false;\n    };\n    cuid3.isSlug = function isSlug(stringToCheck) {\n      if (typeof stringToCheck !== \"string\") return false;\n      var stringLength = stringToCheck.length;\n      if (stringLength >= 7 && stringLength <= 10) return true;\n      return false;\n    };\n    cuid3.fingerprint = fingerprint;\n    module.exports = cuid3;\n  }\n});\nvar require_createDeferredExecutor = __commonJS({\n  \"../../node_modules/.pnpm/@open-draft+deferred-promise@2.1.0/node_modules/@open-draft/deferred-promise/build/createDeferredExecutor.js\"(exports) {\n    \"use strict\";\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    exports.createDeferredExecutor = void 0;\n    function createDeferredExecutor() {\n      const executor = (resolve, reject) => {\n        executor.state = \"pending\";\n        executor.resolve = data => {\n          if (executor.state !== \"pending\") {\n            return;\n          }\n          executor.result = data;\n          const onFulfilled = value => {\n            executor.state = \"fulfilled\";\n            return value;\n          };\n          return resolve(data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled));\n        };\n        executor.reject = reason => {\n          if (executor.state !== \"pending\") {\n            return;\n          }\n          queueMicrotask(() => {\n            executor.state = \"rejected\";\n          });\n          return reject(executor.rejectionReason = reason);\n        };\n      };\n      return executor;\n    }\n    exports.createDeferredExecutor = createDeferredExecutor;\n  }\n});\nvar require_DeferredPromise = __commonJS({\n  \"../../node_modules/.pnpm/@open-draft+deferred-promise@2.1.0/node_modules/@open-draft/deferred-promise/build/DeferredPromise.js\"(exports) {\n    \"use strict\";\n\n    var _executor, _decorate, _class;\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    exports.DeferredPromise = void 0;\n    var createDeferredExecutor_1 = require_createDeferredExecutor();\n    var DeferredPromise4 = (_executor = /*#__PURE__*/new WeakMap(), _decorate = /*#__PURE__*/new WeakSet(), _class = class extends Promise {\n      get state() {\n        return _classPrivateFieldGet(this, _executor).state;\n      }\n      get rejectionReason() {\n        return _classPrivateFieldGet(this, _executor).rejectionReason;\n      }\n      then(onFulfilled, onRejected) {\n        return _classPrivateMethodGet(this, _decorate, decorate).call(this, super.then(onFulfilled, onRejected));\n      }\n      catch(onRejected) {\n        return _classPrivateMethodGet(this, _decorate, decorate).call(this, super.catch(onRejected));\n      }\n      finally(onfinally) {\n        return _classPrivateMethodGet(this, _decorate, decorate).call(this, super.finally(onfinally));\n      }\n      constructor(executor = null) {\n        const deferredExecutor = (0, createDeferredExecutor_1.createDeferredExecutor)();\n        super((originalResolve, originalReject) => {\n          deferredExecutor(originalResolve, originalReject);\n          executor === null || executor === void 0 ? void 0 : executor(deferredExecutor.resolve, deferredExecutor.reject);\n        });\n        _classPrivateMethodInit(this, _decorate);\n        _classPrivateFieldInit(this, _executor, {\n          writable: true,\n          value: void 0\n        });\n        _classPrivateFieldSet(this, _executor, deferredExecutor);\n        this.resolve = _classPrivateFieldGet(this, _executor).resolve;\n        this.reject = _classPrivateFieldGet(this, _executor).reject;\n      }\n    }, _class);\n    exports.DeferredPromise = DeferredPromise4;\n    function decorate(promise) {\n      return Object.defineProperties(promise, {\n        resolve: {\n          configurable: true,\n          value: this.resolve\n        },\n        reject: {\n          configurable: true,\n          value: this.reject\n        }\n      });\n    }\n  }\n});\nvar require_build = __commonJS({\n  \"../../node_modules/.pnpm/@open-draft+deferred-promise@2.1.0/node_modules/@open-draft/deferred-promise/build/index.js\"(exports) {\n    \"use strict\";\n\n    var __createBinding = exports && exports.__createBinding || (Object.create ? function (o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      var desc = Object.getOwnPropertyDescriptor(m, k);\n      if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n        desc = {\n          enumerable: true,\n          get: function () {\n            return m[k];\n          }\n        };\n      }\n      Object.defineProperty(o, k2, desc);\n    } : function (o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __exportStar = exports && exports.__exportStar || function (m, exports2) {\n      for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p);\n    };\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    __exportStar(require_createDeferredExecutor(), exports);\n    __exportStar(require_DeferredPromise(), exports);\n  }\n});\nvar require_MemoryLeakError = __commonJS({\n  \"../../node_modules/.pnpm/strict-event-emitter@0.4.3/node_modules/strict-event-emitter/lib/MemoryLeakError.js\"(exports) {\n    \"use strict\";\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    exports.MemoryLeakError = void 0;\n    var MemoryLeakError = class extends Error {\n      constructor(emitter, type, count) {\n        super(`Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit`);\n        this.emitter = emitter;\n        this.type = type;\n        this.count = count;\n        this.name = \"MaxListenersExceededWarning\";\n      }\n    };\n    exports.MemoryLeakError = MemoryLeakError;\n  }\n});\nvar require_Emitter = __commonJS({\n  \"../../node_modules/.pnpm/strict-event-emitter@0.4.3/node_modules/strict-event-emitter/lib/Emitter.js\"(exports) {\n    \"use strict\";\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    exports.Emitter = void 0;\n    var MemoryLeakError_1 = require_MemoryLeakError();\n    var _events, _maxListeners, _hasWarnedAboutPotentialMemortyLeak, _getListeners, getListeners_fn, _removeListener, removeListener_fn, _wrapOnceListener, wrapOnceListener_fn, _internalEmit, internalEmit_fn;\n    var _Emitter = class {\n      static listenerCount(emitter, eventName) {\n        return emitter.listenerCount(eventName);\n      }\n      setMaxListeners(maxListeners) {\n        __privateSet(this, _maxListeners, maxListeners);\n        return this;\n      }\n      getMaxListeners() {\n        return __privateGet(this, _maxListeners);\n      }\n      eventNames() {\n        return Array.from(__privateGet(this, _events).keys());\n      }\n      emit(eventName, ...data) {\n        const listeners = __privateMethod(this, _getListeners, getListeners_fn).call(this, eventName);\n        listeners.forEach(listener => {\n          listener.apply(this, data);\n        });\n        return listeners.length > 0;\n      }\n      addListener(eventName, listener) {\n        __privateMethod(this, _internalEmit, internalEmit_fn).call(this, \"newListener\", eventName, listener);\n        const nextListeners = __privateMethod(this, _getListeners, getListeners_fn).call(this, eventName).concat(listener);\n        __privateGet(this, _events).set(eventName, nextListeners);\n        if (__privateGet(this, _maxListeners) > 0 && this.listenerCount(eventName) > __privateGet(this, _maxListeners) && !__privateGet(this, _hasWarnedAboutPotentialMemortyLeak)) {\n          __privateSet(this, _hasWarnedAboutPotentialMemortyLeak, true);\n          const memoryLeakWarning = new MemoryLeakError_1.MemoryLeakError(this, eventName, this.listenerCount(eventName));\n          console.warn(memoryLeakWarning);\n        }\n        return this;\n      }\n      on(eventName, listener) {\n        return this.addListener(eventName, listener);\n      }\n      once(eventName, listener) {\n        return this.addListener(eventName, __privateMethod(this, _wrapOnceListener, wrapOnceListener_fn).call(this, eventName, listener));\n      }\n      prependListener(eventName, listener) {\n        const listeners = __privateMethod(this, _getListeners, getListeners_fn).call(this, eventName);\n        if (listeners.length > 0) {\n          const nextListeners = [listener].concat(listeners);\n          __privateGet(this, _events).set(eventName, nextListeners);\n        } else {\n          __privateGet(this, _events).set(eventName, listeners.concat(listener));\n        }\n        return this;\n      }\n      prependOnceListener(eventName, listener) {\n        return this.prependListener(eventName, __privateMethod(this, _wrapOnceListener, wrapOnceListener_fn).call(this, eventName, listener));\n      }\n      removeListener(eventName, listener) {\n        const listeners = __privateMethod(this, _getListeners, getListeners_fn).call(this, eventName);\n        if (listeners.length > 0) {\n          __privateMethod(this, _removeListener, removeListener_fn).call(this, listeners, listener);\n          __privateGet(this, _events).set(eventName, listeners);\n          __privateMethod(this, _internalEmit, internalEmit_fn).call(this, \"removeListener\", eventName, listener);\n        }\n        return this;\n      }\n      off(eventName, listener) {\n        return this.removeListener(eventName, listener);\n      }\n      removeAllListeners(eventName) {\n        if (eventName) {\n          __privateGet(this, _events).delete(eventName);\n        } else {\n          __privateGet(this, _events).clear();\n        }\n        return this;\n      }\n      listeners(eventName) {\n        return Array.from(__privateMethod(this, _getListeners, getListeners_fn).call(this, eventName));\n      }\n      listenerCount(eventName) {\n        return __privateMethod(this, _getListeners, getListeners_fn).call(this, eventName).length;\n      }\n      rawListeners(eventName) {\n        return this.listeners(eventName);\n      }\n      constructor() {\n        __privateAdd(this, _getListeners);\n        __privateAdd(this, _removeListener);\n        __privateAdd(this, _wrapOnceListener);\n        __privateAdd(this, _internalEmit);\n        __privateAdd(this, _events, void 0);\n        __privateAdd(this, _maxListeners, void 0);\n        __privateAdd(this, _hasWarnedAboutPotentialMemortyLeak, void 0);\n        __privateSet(this, _events, /* @__PURE__ */new Map());\n        __privateSet(this, _maxListeners, _Emitter.defaultMaxListeners);\n        __privateSet(this, _hasWarnedAboutPotentialMemortyLeak, false);\n      }\n    };\n    var Emitter2 = _Emitter;\n    _events = /* @__PURE__ */new WeakMap();\n    _maxListeners = /* @__PURE__ */new WeakMap();\n    _hasWarnedAboutPotentialMemortyLeak = /* @__PURE__ */new WeakMap();\n    _getListeners = /* @__PURE__ */new WeakSet();\n    getListeners_fn = function (eventName) {\n      return __privateGet(this, _events).get(eventName) || [];\n    };\n    _removeListener = /* @__PURE__ */new WeakSet();\n    removeListener_fn = function (listeners, listener) {\n      const index = listeners.indexOf(listener);\n      if (index > -1) {\n        listeners.splice(index, 1);\n      }\n      return [];\n    };\n    _wrapOnceListener = /* @__PURE__ */new WeakSet();\n    wrapOnceListener_fn = function (eventName, listener) {\n      const onceListener = (...data) => {\n        this.removeListener(eventName, onceListener);\n        listener.apply(this, data);\n      };\n      return onceListener;\n    };\n    _internalEmit = /* @__PURE__ */new WeakSet();\n    internalEmit_fn = function (internalEventName, eventName, listener) {\n      this.emit(internalEventName, ...[eventName, listener]);\n    };\n    __publicField(Emitter2, \"defaultMaxListeners\", 10);\n    exports.Emitter = Emitter2;\n  }\n});\nvar require_lib = __commonJS({\n  \"../../node_modules/.pnpm/strict-event-emitter@0.4.3/node_modules/strict-event-emitter/lib/index.js\"(exports) {\n    \"use strict\";\n\n    var __createBinding = exports && exports.__createBinding || (Object.create ? function (o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      var desc = Object.getOwnPropertyDescriptor(m, k);\n      if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n        desc = {\n          enumerable: true,\n          get: function () {\n            return m[k];\n          }\n        };\n      }\n      Object.defineProperty(o, k2, desc);\n    } : function (o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __exportStar = exports && exports.__exportStar || function (m, exports2) {\n      for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p);\n    };\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n    __exportStar(require_Emitter(), exports);\n    __exportStar(require_MemoryLeakError(), exports);\n  }\n});\nvar import_cuid = __toESM(require_cuid());\nvar POSITIONALS_EXP = /(%?)(%([sdjo]))/g;\nfunction serializePositional(positional, flag) {\n  switch (flag) {\n    case \"s\":\n      return positional;\n    case \"d\":\n    case \"i\":\n      return Number(positional);\n    case \"j\":\n      return JSON.stringify(positional);\n    case \"o\":\n      {\n        if (typeof positional === \"string\") {\n          return positional;\n        }\n        const json = JSON.stringify(positional);\n        if (json === \"{}\" || json === \"[]\" || /^\\[object .+?\\]$/.test(json)) {\n          return positional;\n        }\n        return json;\n      }\n  }\n}\nfunction format(message, ...positionals) {\n  if (positionals.length === 0) {\n    return message;\n  }\n  let positionalIndex = 0;\n  let formattedMessage = message.replace(POSITIONALS_EXP, (match, isEscaped, _, flag) => {\n    const positional = positionals[positionalIndex];\n    const value = serializePositional(positional, flag);\n    if (!isEscaped) {\n      positionalIndex++;\n      return value;\n    }\n    return match;\n  });\n  if (positionalIndex < positionals.length) {\n    formattedMessage += ` ${positionals.slice(positionalIndex).join(\" \")}`;\n  }\n  formattedMessage = formattedMessage.replace(/%{2,2}/g, \"%\");\n  return formattedMessage;\n}\nvar STACK_FRAMES_TO_IGNORE = 2;\nfunction cleanErrorStack(error) {\n  if (!error.stack) {\n    return;\n  }\n  const nextStack = error.stack.split(\"\\n\");\n  nextStack.splice(1, STACK_FRAMES_TO_IGNORE);\n  error.stack = nextStack.join(\"\\n\");\n}\nvar InvariantError = class extends Error {\n  constructor(message, ...positionals) {\n    super(message);\n    this.message = message;\n    this.name = \"Invariant Violation\";\n    this.message = format(message, ...positionals);\n    cleanErrorStack(this);\n  }\n};\nvar invariant = (predicate, message, ...positionals) => {\n  if (!predicate) {\n    throw new InvariantError(message, ...positionals);\n  }\n};\ninvariant.as = (ErrorConstructor, predicate, message, ...positionals) => {\n  if (!predicate) {\n    const isConstructor = ErrorConstructor.prototype.name != null;\n    const error = isConstructor ? new ErrorConstructor(format(message, positionals)) : ErrorConstructor(format(message, positionals));\n    throw error;\n  }\n};\nvar import_deferred_promise = __toESM(require_build());\nvar FLAG = undefined;\nvar DEFAULT = \"\\x1b[0m\";\nvar GREEN = \"\\x1b[32;1m\";\nvar RED = \"\\x1b[31m\";\nvar BLUE = \"\\x1b[34m\";\nvar YELLOW = \"\\x1b[33;1m\";\nvar MAGENTA = \"\\x1b[35;1m\";\nvar CYAN = \"\\x1b[36;1m\";\nvar COLOR_SCOPE = {\n  preview: YELLOW,\n  emulator: MAGENTA,\n  runtime: CYAN,\n  bridge: BLUE,\n  \"runtime:worker\": CYAN\n};\nfunction createDebug(scope) {\n  return function debug3(message, ...data) {\n    if (FLAG === \"true\") {\n      const direction = () => {\n        if (message.includes(\"sender\")) return `${GREEN}sender`;\n        if (message.includes(\"receiver\")) return `${RED}receiver`;\n        return \"\";\n      };\n      const cleanMessage = message.replace(/\\[.+\\]:/, \"\");\n      console.debug(`${COLOR_SCOPE[scope]}${scope}:${direction()}${DEFAULT}:${cleanMessage}`, ...data);\n    }\n  };\n}\nvar debug = createDebug(\"emulator\");\nvar MessageReceiver = class {\n  waitForHandshake() {\n    const handshakePromise = new import_deferred_promise.DeferredPromise();\n    const handshakeListener = message => {\n      const {\n        data\n      } = message;\n      debug(\"[message-receiver]: incoming\", message);\n      if (data.type === \"internal/handshake\") {\n        invariant(message.ports.length > 0, \"Failed to confirm a MessageReceiver handshake: received event has no ports\");\n        this.senderPort = message.ports[0];\n        this.addMessageListener();\n        debug(\"[message-receiver]: handshake received!\", this.senderPort);\n        this.send(\"internal/handshake/done\");\n        debug(\"[message-receiver]: finish handshake\");\n      }\n    };\n    window.addEventListener(\"message\", handshakeListener);\n    handshakePromise.then(() => {\n      window.removeEventListener(\"message\", handshakeListener);\n    });\n    window.parent.postMessage({\n      type: \"internal/ready\"\n    }, \"*\");\n    return handshakePromise;\n  }\n  addMessageListener() {\n    invariant(this.senderPort, \"[MessageReceiver] Failed to add a message listener: sender port is not defined. Did you forget to await a handshake?\");\n    this.senderPort.onmessage = evt => {\n      const data = evt.data;\n      if (data.type == null) {\n        return;\n      }\n      this.emitter.dispatchEvent(new MessageEvent(data.type, {\n        data: data.payload\n      }));\n    };\n  }\n  on(event, listener, options) {\n    this.emitter.addEventListener(event, async message => {\n      if (!(message instanceof MessageEvent)) {\n        return;\n      }\n      const {\n        operationId,\n        payload\n      } = message.data;\n      try {\n        const listenerPayload = await listener(payload);\n        this.send(\"internal/operation/done\", {\n          operationId,\n          listenerPayload\n        });\n      } catch (error) {\n        if (error instanceof Error) {\n          this.send(\"internal/operation/failed\", {\n            operationId,\n            error\n          });\n        }\n      }\n    }, options);\n  }\n  send(event, ...data) {\n    invariant(this.senderPort, '[MessageReceiver] Failed to send a message \"%j\": sender port is not defined. Did you forget to await a handshake?', event);\n    const payload = data[0] || {};\n    debug('[message-receiver]: send \"%s\"', event, payload);\n    this.senderPort.postMessage({\n      type: event,\n      payload\n    });\n  }\n  constructor() {\n    _defineProperty(this, \"senderPort\", null);\n    this.emitter = new EventTarget();\n    this.waitForHandshake();\n  }\n};\nvar MessageSender = class {\n  async handshake() {\n    const handshakePromise = new import_deferred_promise.DeferredPromise();\n    await this.receiverReadyPromise;\n    debug(\"[message-sender]: sending handshake\");\n    this.target.postMessage({\n      type: \"internal/handshake\"\n    }, \"*\", [this.channel.port2]);\n    this.on(\"internal/handshake/done\", () => {\n      handshakePromise.resolve();\n      clearTimeout(rejectionTimeout);\n    });\n    const rejectionTimeout = setTimeout(() => {\n      handshakePromise.reject(new Error(\"MessageSender: Handshake timeout\"));\n    }, 5e3);\n    return handshakePromise;\n  }\n  on(event, listener, options) {\n    debug('[message-sender]: add listener \"%s\"', event);\n    this.emitter.addEventListener(event, message => {\n      if (message instanceof MessageEvent) {\n        listener(message);\n      }\n    }, options);\n  }\n  off(event, listener, options) {\n    this.emitter.removeEventListener(event, listener, options);\n  }\n  async send(event, ...data) {\n    const operationPromise = new import_deferred_promise.DeferredPromise();\n    const operationId = (0, import_cuid.default)();\n    const payload = data[0] || {};\n    debug('[message-sender]: send \"%s\" (%s)', event, operationId, payload);\n    this.receiverPort.postMessage({\n      type: event,\n      payload: {\n        operationId,\n        payload\n      }\n    });\n    debug('[message-sender]: adding done listener for \"%s\" (%s)', event, operationId);\n    const handleOperationDone = doneEvent => {\n      const {\n        data: data2\n      } = doneEvent;\n      if (data2.operationId === operationId) {\n        const listenerPayload = data2.listenerPayload || {};\n        debug('[message-sender]: resolving \"%s (%s) promise!', event, operationId);\n        operationPromise.resolve({\n          ...listenerPayload,\n          operationId: data2.operationId\n        });\n      }\n    };\n    const handleOperationFailed = failEvent => {\n      const {\n        data: data2\n      } = failEvent;\n      if (data2.operationId === operationId) {\n        debug('[message-sender]: rejecting \"%s (%s) promise!', event, operationId);\n        operationPromise.reject(data2.error);\n      }\n    };\n    this.on(\"internal/operation/done\", handleOperationDone);\n    this.on(\"internal/operation/failed\", handleOperationFailed);\n    return operationPromise.finally(() => {\n      this.emitter.removeEventListener(\"internal/operation/done\", handleOperationDone);\n      this.emitter.removeEventListener(\"internal/operation/failed\", handleOperationFailed);\n    });\n  }\n  constructor(target) {\n    this.target = target;\n    this.emitter = new EventTarget();\n    this.channel = new MessageChannel();\n    this.receiverPort = this.channel.port1;\n    const receiverReadyPromise = new import_deferred_promise.DeferredPromise();\n    const handshakeListener = message => {\n      if (message.data.type === \"internal/ready\") {\n        debug(\"[message-sender]: runtime is ready\");\n        receiverReadyPromise.resolve();\n      }\n    };\n    window.addEventListener(\"message\", handshakeListener);\n    receiverReadyPromise.then(() => {\n      window.removeEventListener(\"message\", handshakeListener);\n    });\n    this.receiverReadyPromise = receiverReadyPromise;\n    this.receiverPort.onmessage = evt => {\n      const data = evt.data;\n      if (data.type != null) {\n        debug('[message-sender]: emitting \"%s\" event...', data.type, data.payload);\n        this.emitter.dispatchEvent(new MessageEvent(data.type, {\n          data: data.payload\n        }));\n      }\n    };\n  }\n};\nvar import_deferred_promise3 = __toESM(require_build());\nvar import_cuid2 = __toESM(require_cuid());\nvar FileSystemApi = class {\n  async init(files) {\n    await this.channel.send(\"fs/init\", {\n      files\n    });\n  }\n  async readFile(path, encoding) {\n    const response = await this.channel.send(\"fs/readFile\", {\n      path,\n      encoding\n    }).catch(error => {\n      throw new Error(format('Failed to read file at path \"%s\"', path), {\n        cause: error\n      });\n    });\n    if (!response) {\n      throw new Error(\"File not found\");\n    }\n    return response.data;\n  }\n  async writeFile(path, content, options) {\n    let encoding = void 0;\n    let recursive = false;\n    if (typeof options === \"object\") {\n      encoding = options.encoding;\n      recursive = !!options.recursive;\n    } else if (typeof options === \"string\") {\n      encoding = options;\n    }\n    await this.channel.send(\"fs/writeFile\", {\n      path,\n      content,\n      encoding,\n      recursive\n    }).catch(error => {\n      throw new Error(format('Failed to write file at path \"%s\"', path), {\n        cause: error\n      });\n    });\n  }\n  async readdir(path) {\n    const response = await this.channel.send(\"fs/readdir\", {\n      path\n    }).catch(error => {\n      throw new Error(format('Failed to read directory at path \"%s\"', path), {\n        cause: error\n      });\n    });\n    if (!response) {\n      throw new Error(\"Directory not found\");\n    }\n    return response.data;\n  }\n  async mkdir(path, options) {\n    const recursive = !!(options === null || options === void 0 ? void 0 : options.recursive);\n    await this.channel.send(\"fs/mkdir\", {\n      path,\n      recursive\n    }).catch(error => {\n      throw new Error(format('Failed to make directory at path \"%s\"', path), {\n        cause: error\n      });\n    });\n  }\n  async stat(path) {\n    const response = await this.channel.send(\"fs/stat\", {\n      path\n    }).catch(error => {\n      throw new Error(format('Failed to stat file at path \"%s\"', path), {\n        cause: error\n      });\n    });\n    if (!response) {\n      throw new Error(\"File not found\");\n    }\n    return response.data;\n  }\n  async rm(path, options) {\n    const {\n      force,\n      recursive\n    } = options || {};\n    await this.channel.send(\"fs/rm\", {\n      path,\n      force,\n      recursive\n    }).catch(error => {\n      throw new Error(format('Failed to remove file at path \"%s\"', path), {\n        cause: error\n      });\n    });\n  }\n  async watch(includes, excludes, listener) {\n    const watcherId = (0, import_cuid2.default)();\n    await this.channel.send(\"fs/watch\", {\n      watcherId,\n      includes,\n      excludes\n    });\n    this.channel.on(\"fs/watch-event\", ({\n      data\n    }) => {\n      if (data.watcherId === watcherId && listener) {\n        const evt = {\n          ...data\n        };\n        delete evt.watcherId;\n        listener(evt);\n      }\n    });\n    return {\n      dispose: () => this.channel.send(\"fs/unwatch\", {\n        watcherId\n      })\n    };\n  }\n  constructor(channel) {\n    this.channel = channel;\n  }\n};\nvar import_strict_event_emitter = __toESM(require_lib());\nvar ShellApi = class {\n  create() {\n    return new ShellProcess(this.channel);\n  }\n  constructor(channel) {\n    this.channel = channel;\n  }\n};\nvar ShellProcess = class {\n  forwardStdEvents() {\n    this.channel.on(\"worker/tty\", message => {\n      const {\n        data\n      } = message;\n      if (data.workerId !== this.id) {\n        return;\n      }\n      switch (data.payload.type) {\n        case \"out\":\n          {\n            this.stdout.emit(\"data\", data.payload.data);\n            break;\n          }\n        case \"err\":\n          {\n            this.stderr.emit(\"data\", data.payload.data);\n            break;\n          }\n      }\n    });\n  }\n  async runCommand(command, args, options = {}) {\n    invariant(!this.id, 'Failed to run \"runCommand\" on a ShellProcess: there is already a process running.');\n    const shellInfo = await this.channel.send(\"shell/runCommand\", {\n      command,\n      args,\n      options\n    });\n    invariant(shellInfo, 'Failed to run \"runCommand\" on a ShellProcess: was not able to retrieve a running process.');\n    this.id = shellInfo.id;\n    this.state = \"running\";\n    return shellInfo;\n  }\n  async on(message, listener) {\n    switch (message) {\n      case \"progress\":\n        {\n          this.channel.on(\"worker/progress\", ({\n            data\n          }) => {\n            listener(data.status);\n          });\n          return;\n        }\n      case \"exit\":\n        {\n          this.channel.on(\"worker/exit\", ({\n            data\n          }) => {\n            if (data.workerId === this.id) {\n              listener(data.exitCode, data.error);\n            }\n          });\n          return;\n        }\n    }\n  }\n  async kill() {\n    invariant(this.id, 'Failed to run \"kill\" on a ShellProcess: there is no process running. Did you forget to run it?');\n    this.state = \"idle\";\n    await this.channel.send(\"shell/exit\", {\n      id: this.id\n    }).catch(error => {\n      throw new Error(format('Failed to kill shell with ID \"%s\"', this.id), {\n        cause: error\n      });\n    });\n    this.id = void 0;\n  }\n  constructor(channel) {\n    this.channel = channel;\n    this.state = \"running\";\n    this.stdout = new import_strict_event_emitter.Emitter();\n    this.stderr = new import_strict_event_emitter.Emitter();\n    this.stdin = {\n      write: data => {\n        if (!this.id) {\n          throw new Error(\"Failed to write to stdin, no process is currently running\");\n        }\n        return this.channel.send(\"shell/stdin\", {\n          data,\n          workerId: this.id\n        });\n      }\n    };\n    this.forwardStdEvents();\n  }\n};\nvar import_deferred_promise2 = __toESM(require_build());\nvar TIMEOUT = 2e4;\nvar PreviewApi = class {\n  async waitFor(payload, predicate, timeout = TIMEOUT) {\n    const readyPromise = new import_deferred_promise2.DeferredPromise();\n    const rejectTimeout = setTimeout(() => {\n      readyPromise.reject();\n    }, timeout);\n    const previewInformation = await this.channel.send(\"preview/get/info\", payload).catch(error => {\n      readyPromise.reject(new Error(format('Failed to look up preview information for shell ID \"%s\" (port: %d)', payload.sourceShellId, payload.port)));\n    });\n    const foundPreview = previewInformation && predicate(previewInformation);\n    if (foundPreview) {\n      readyPromise.resolve({\n        url: previewInformation.url,\n        port: previewInformation.port,\n        sourceShellId: previewInformation.sourceShellId\n      });\n    }\n    this.channel.on(\"preview/port/ready\", ({\n      data\n    }) => {\n      if (!foundPreview && predicate(data)) {\n        readyPromise.resolve({\n          url: data.url,\n          port: data.port,\n          sourceShellId: data.sourceShellId\n        });\n      }\n    });\n    return readyPromise.finally(() => {\n      clearTimeout(rejectTimeout);\n    });\n  }\n  async getByShellId(sourceShellId, timeout) {\n    return this.waitFor({\n      sourceShellId\n    }, data => data.sourceShellId === sourceShellId, timeout).catch(error => {\n      throw new Error(format('Failed to get shell by ID \"%s\"', sourceShellId), {\n        cause: error\n      });\n    });\n  }\n  async waitForPort(port, timeout) {\n    return this.waitFor({\n      port\n    }, data => data.port === port, timeout).catch(error => {\n      throw new Error(format(\"Failed to await port %d\", port), {\n        cause: error\n      });\n    });\n  }\n  constructor(channel) {\n    this.channel = channel;\n  }\n};\nvar DEFAULT_RUNTIME_URL = \"https://nodebox-runtime.codesandbox.io\";\nvar debug2 = createDebug(\"emulator\");\nvar Nodebox = class {\n  async connect() {\n    const {\n      iframe,\n      cdnUrl\n    } = this.options;\n    debug2(\"[message-sender]: Connecting to node emulator...\");\n    const connectionPromise = new import_deferred_promise3.DeferredPromise();\n    if (!this.url) {\n      connectionPromise.reject(new Error(\"Nodebox URL is missing. Did you forget to provide it when creating this Nodebox instance?\"));\n    }\n    invariant(iframe.contentWindow, \"Failed to create a MessageChannel with the Nodebox iframe: no content window found\");\n    this.channel = new MessageSender(iframe.contentWindow);\n    const frameLoadPromise = new import_deferred_promise3.DeferredPromise();\n    iframe.setAttribute(\"src\", this.url);\n    iframe.addEventListener(\"load\", () => {\n      frameLoadPromise.resolve();\n    }, {\n      once: true\n    });\n    iframe.addEventListener(\"error\", event => {\n      frameLoadPromise.reject(event.error);\n    }, {\n      once: true\n    });\n    await frameLoadPromise;\n    debug2(\"[message-sender]: IFrame loaded...\");\n    await this.channel.handshake();\n    debug2(\"[message-sender]: Handshake completed...\");\n    this.channel.send(\"connect\", {\n      cdnUrl\n    });\n    this.channel.on(\"runtime/ready\", () => {\n      connectionPromise.resolve();\n    });\n    return connectionPromise.then(() => {\n      debug2(\"[message-sender]: Connected to runtime...\");\n      this.isConnected = true;\n    });\n  }\n  get fs() {\n    invariant(this.isConnected, 'Failed to access the File System API: consumer is not connected. Did you forget to run \"connect()\"?');\n    if (this.fileSystemApi) {\n      return this.fileSystemApi;\n    }\n    this.fileSystemApi = new FileSystemApi(this.channel);\n    return this.fileSystemApi;\n  }\n  get shell() {\n    invariant(this.isConnected, 'Failed to access the Shell API: consumer is not connected. Did you forget to run \"connect()\"?');\n    if (this.shellApi) {\n      return this.shellApi;\n    }\n    this.shellApi = new ShellApi(this.channel);\n    return this.shellApi;\n  }\n  get preview() {\n    invariant(this.isConnected, 'Failed to access the Preview API: consumer is not connected. Did you forget to run \"connect()\"?');\n    if (this.previewApi) {\n      return this.previewApi;\n    }\n    this.previewApi = new PreviewApi(this.channel);\n    return this.previewApi;\n  }\n  constructor(options) {\n    _defineProperty(this, \"channel\", null);\n    _defineProperty(this, \"fileSystemApi\", null);\n    _defineProperty(this, \"shellApi\", null);\n    _defineProperty(this, \"previewApi\", null);\n    this.options = options;\n    invariant(this.options.iframe, 'Failed to create a Nodebox: expected \"iframe\" argument to be a reference to an <iframe> element but got %j', this.options.iframe);\n    this.url = this.options.runtimeUrl || DEFAULT_RUNTIME_URL;\n    this.isConnected = false;\n  }\n};\nvar INJECT_MESSAGE_TYPE = \"INJECT_AND_INVOKE\";\nvar PREVIEW_LOADED_MESSAGE_TYPE = \"PREVIEW_LOADED\";\nexport { INJECT_MESSAGE_TYPE, MessageReceiver, MessageSender, Nodebox, PREVIEW_LOADED_MESSAGE_TYPE };\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"Nodebox\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"PREVIEW_LOADED_MESSAGE_TYPE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"MessageReceiver\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"MessageSender\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"INJECT_MESSAGE_TYPE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./codesandbox_nodebox.map", "// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __esm = (fn, res) => function __init() {\n  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;\n};\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n    exports: {}\n  }).exports, mod), mod.exports;\n};\nvar __export = (target, all) => {\n  for (var name in all) __defProp(target, name, {\n    get: all[name],\n    enumerable: true\n  });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n      get: () => from[key],\n      enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n    });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n// If the importer is in node compatibility mode or this is not an ESM\n// file that has been converted to a CommonJS file using a Babel-\n// compatible transform (i.e. \"__esModule\" has not been set), then set\n// \"default\" to the CommonJS \"module.exports\" for node compatibility.\nisNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n  value: mod,\n  enumerable: true\n}) : target, mod)); // ../../node_modules/outvariant/lib/index.mjs\nfunction serializePositional(positional, flag) {\n  switch (flag) {\n    case \"s\":\n      return positional;\n    case \"d\":\n    case \"i\":\n      return Number(positional);\n    case \"j\":\n      return JSON.stringify(positional);\n    case \"o\":\n      {\n        if (typeof positional === \"string\") {\n          return positional;\n        }\n        const json = JSON.stringify(positional);\n        if (json === \"{}\" || json === \"[]\" || /^\\[object .+?\\]$/.test(json)) {\n          return positional;\n        }\n        return json;\n      }\n  }\n}\nfunction format(message, ...positionals) {\n  if (positionals.length === 0) {\n    return message;\n  }\n  let positionalIndex = 0;\n  let formattedMessage = message.replace(POSITIONALS_EXP, (match, isEscaped, _, flag) => {\n    const positional = positionals[positionalIndex];\n    const value = serializePositional(positional, flag);\n    if (!isEscaped) {\n      positionalIndex++;\n      return value;\n    }\n    return match;\n  });\n  if (positionalIndex < positionals.length) {\n    formattedMessage += ` ${positionals.slice(positionalIndex).join(\" \")}`;\n  }\n  formattedMessage = formattedMessage.replace(/%{2,2}/g, \"%\");\n  return formattedMessage;\n}\nfunction cleanErrorStack(error) {\n  if (!error.stack) {\n    return;\n  }\n  const nextStack = error.stack.split(\"\\n\");\n  nextStack.splice(1, STACK_FRAMES_TO_IGNORE);\n  error.stack = nextStack.join(\"\\n\");\n}\nvar POSITIONALS_EXP, STACK_FRAMES_TO_IGNORE, InvariantError, invariant;\nvar init_lib = __esm({\n  \"../../node_modules/outvariant/lib/index.mjs\"() {\n    POSITIONALS_EXP = /(%?)(%([sdjo]))/g;\n    STACK_FRAMES_TO_IGNORE = 2;\n    InvariantError = class extends Error {\n      constructor(message, ...positionals) {\n        super(message);\n        this.message = message;\n        this.name = \"Invariant Violation\";\n        this.message = format(message, ...positionals);\n        cleanErrorStack(this);\n      }\n    };\n    invariant = (predicate, message, ...positionals) => {\n      if (!predicate) {\n        throw new InvariantError(message, ...positionals);\n      }\n    };\n    invariant.as = (ErrorConstructor, predicate, message, ...positionals) => {\n      if (!predicate) {\n        const isConstructor = ErrorConstructor.prototype.name != null;\n        const error = isConstructor ? new ErrorConstructor(format(message, positionals)) : ErrorConstructor(format(message, positionals));\n        throw error;\n      }\n    };\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/types-36e5ec0d.mjs\nfunction __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() {\n    this.constructor = d;\n  }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) {\n    return value instanceof P ? value : new P(function (resolve) {\n      resolve(value);\n    });\n  }\n  return new (P || (P = Promise))(function (resolve, reject) {\n    function fulfilled(value) {\n      try {\n        step(generator.next(value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n    function rejected(value) {\n      try {\n        step(generator[\"throw\"](value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n    function step(result) {\n      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n    }\n    step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\nfunction __generator(thisArg, body) {\n  var _ = {\n      label: 0,\n      sent: function () {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      },\n      trys: [],\n      ops: []\n    },\n    f,\n    y,\n    t,\n    g;\n  return g = {\n    next: verb(0),\n    throw: verb(1),\n    return: verb(2)\n  }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () {\n    return this;\n  }), g;\n  function verb(n) {\n    return function (v) {\n      return step([n, v]);\n    };\n  }\n  function step(op) {\n    if (f) throw new TypeError(\"Generator is already executing.\");\n    while (_) try {\n      if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n      if (y = 0, t) op = [op[0] & 2, t.value];\n      switch (op[0]) {\n        case 0:\n        case 1:\n          t = op;\n          break;\n        case 4:\n          _.label++;\n          return {\n            value: op[1],\n            done: false\n          };\n        case 5:\n          _.label++;\n          y = op[1];\n          op = [0];\n          continue;\n        case 7:\n          op = _.ops.pop();\n          _.trys.pop();\n          continue;\n        default:\n          if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n            _ = 0;\n            continue;\n          }\n          if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n            _.label = op[1];\n            break;\n          }\n          if (op[0] === 6 && _.label < t[1]) {\n            _.label = t[1];\n            t = op;\n            break;\n          }\n          if (t && _.label < t[2]) {\n            _.label = t[2];\n            _.ops.push(op);\n            break;\n          }\n          if (t[2]) _.ops.pop();\n          _.trys.pop();\n          continue;\n      }\n      op = body.call(thisArg, _);\n    } catch (e) {\n      op = [6, e];\n      y = 0;\n    } finally {\n      f = t = 0;\n    }\n    if (op[0] & 5) throw op[1];\n    return {\n      value: op[0] ? op[1] : void 0,\n      done: true\n    };\n  }\n}\nfunction __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n    if (ar || !(i in from)) {\n      if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n      ar[i] = from[i];\n    }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\nfunction nullthrows(value, err) {\n  if (err === void 0) {\n    err = \"Value is nullish\";\n  }\n  invariant(value != null, createError(err));\n  return value;\n}\nfunction createPackageJSON(dependencies, devDependencies, entry) {\n  if (dependencies === void 0) {\n    dependencies = {};\n  }\n  if (devDependencies === void 0) {\n    devDependencies = {};\n  }\n  if (entry === void 0) {\n    entry = \"/index.js\";\n  }\n  return JSON.stringify({\n    name: \"sandpack-project\",\n    main: entry,\n    dependencies,\n    devDependencies\n  }, null, 2);\n}\nfunction addPackageJSONIfNeeded(files, dependencies, devDependencies, entry) {\n  var _a2, _b;\n  var normalizedFilesPath = normalizePath(files);\n  var packageJsonFile = normalizedFilesPath[\"/package.json\"];\n  if (!packageJsonFile) {\n    nullthrows(dependencies, DEPENDENCY_ERROR_MESSAGE);\n    nullthrows(entry, ENTRY_ERROR_MESSAGE);\n    normalizedFilesPath[\"/package.json\"] = {\n      code: createPackageJSON(dependencies, devDependencies, entry)\n    };\n    return normalizedFilesPath;\n  }\n  if (packageJsonFile) {\n    var packageJsonContent = JSON.parse(packageJsonFile.code);\n    nullthrows(!(!dependencies && !packageJsonContent.dependencies), ENTRY_ERROR_MESSAGE);\n    if (dependencies) {\n      packageJsonContent.dependencies = __assign(__assign({}, (_a2 = packageJsonContent.dependencies) !== null && _a2 !== void 0 ? _a2 : {}), dependencies !== null && dependencies !== void 0 ? dependencies : {});\n    }\n    if (devDependencies) {\n      packageJsonContent.devDependencies = __assign(__assign({}, (_b = packageJsonContent.devDependencies) !== null && _b !== void 0 ? _b : {}), devDependencies !== null && devDependencies !== void 0 ? devDependencies : {});\n    }\n    if (entry) {\n      packageJsonContent.main = entry;\n    }\n    normalizedFilesPath[\"/package.json\"] = {\n      code: JSON.stringify(packageJsonContent, null, 2)\n    };\n  }\n  return normalizedFilesPath;\n}\nfunction extractErrorDetails(msg) {\n  var _a2;\n  if (msg.title === \"SyntaxError\") {\n    var title = msg.title,\n      path = msg.path,\n      message = msg.message,\n      line = msg.line,\n      column = msg.column;\n    return {\n      title,\n      path,\n      message,\n      line,\n      column\n    };\n  }\n  var relevantStackFrame = getRelevantStackFrame((_a2 = msg.payload) === null || _a2 === void 0 ? void 0 : _a2.frames);\n  if (!relevantStackFrame) {\n    return {\n      message: msg.message\n    };\n  }\n  var errorInCode = getErrorInOriginalCode(relevantStackFrame);\n  var errorLocation = getErrorLocation(relevantStackFrame);\n  var errorMessage = formatErrorMessage(relevantStackFrame._originalFileName, msg.message, errorLocation, errorInCode);\n  return {\n    message: errorMessage,\n    title: msg.title,\n    path: relevantStackFrame._originalFileName,\n    line: relevantStackFrame._originalLineNumber,\n    column: relevantStackFrame._originalColumnNumber\n  };\n}\nfunction getRelevantStackFrame(frames) {\n  if (!frames) {\n    return;\n  }\n  return frames.find(function (frame) {\n    return !!frame._originalFileName;\n  });\n}\nfunction getErrorLocation(errorFrame) {\n  return errorFrame ? \" (\" + errorFrame._originalLineNumber + \":\" + errorFrame._originalColumnNumber + \")\" : \"\";\n}\nfunction getErrorInOriginalCode(errorFrame) {\n  var lastScriptLine = errorFrame._originalScriptCode[errorFrame._originalScriptCode.length - 1];\n  var numberOfLineNumberCharacters = lastScriptLine.lineNumber.toString().length;\n  var leadingCharacterOffset = 2;\n  var barSeparatorCharacterOffset = 3;\n  var extraLineLeadingSpaces = leadingCharacterOffset + numberOfLineNumberCharacters + barSeparatorCharacterOffset + errorFrame._originalColumnNumber;\n  return errorFrame._originalScriptCode.reduce(function (result, scriptLine) {\n    var leadingChar = scriptLine.highlight ? \">\" : \" \";\n    var lineNumber = scriptLine.lineNumber.toString().length === numberOfLineNumberCharacters ? \"\" + scriptLine.lineNumber : \" \" + scriptLine.lineNumber;\n    var extraLine = scriptLine.highlight ? \"\\n\" + \" \".repeat(extraLineLeadingSpaces) + \"^\" : \"\";\n    return result + \"\\n\" + leadingChar + \" \" + lineNumber + \" | \" + scriptLine.content + extraLine;\n  }, \"\");\n}\nfunction formatErrorMessage(filePath, message, location, errorInCode) {\n  return filePath + \": \" + message + location + \"\\n\" + errorInCode;\n}\nvar extendStatics, __assign, createError, DEPENDENCY_ERROR_MESSAGE, ENTRY_ERROR_MESSAGE, normalizePath, SandpackLogLevel;\nvar init_types_36e5ec0d = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/types-36e5ec0d.mjs\"() {\n    init_lib();\n    extendStatics = function (d, b) {\n      extendStatics = Object.setPrototypeOf || {\n        __proto__: []\n      } instanceof Array && function (d2, b2) {\n        d2.__proto__ = b2;\n      } || function (d2, b2) {\n        for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n      };\n      return extendStatics(d, b);\n    };\n    __assign = function () {\n      __assign = Object.assign || function __assign2(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n        }\n        return t;\n      };\n      return __assign.apply(this, arguments);\n    };\n    createError = function (message) {\n      return \"[sandpack-client]: \" + message;\n    };\n    DEPENDENCY_ERROR_MESSAGE = '\"dependencies\" was not specified - provide either a package.json or a \"dependencies\" value';\n    ENTRY_ERROR_MESSAGE = '\"entry\" was not specified - provide either a package.json with the \"main\" field or an \"entry\" value';\n    normalizePath = function (path) {\n      if (typeof path === \"string\") {\n        return path.startsWith(\"/\") ? path : \"/\" + path;\n      }\n      if (Array.isArray(path)) {\n        return path.map(function (p) {\n          return p.startsWith(\"/\") ? p : \"/\" + p;\n        });\n      }\n      if (typeof path === \"object\" && path !== null) {\n        return Object.entries(path).reduce(function (acc, _a2) {\n          var key = _a2[0],\n            content = _a2[1];\n          var fileName = key.startsWith(\"/\") ? key : \"/\" + key;\n          acc[fileName] = content;\n          return acc;\n        }, {});\n      }\n      return null;\n    };\n    (function (SandpackLogLevel2) {\n      SandpackLogLevel2[SandpackLogLevel2[\"None\"] = 0] = \"None\";\n      SandpackLogLevel2[SandpackLogLevel2[\"Error\"] = 10] = \"Error\";\n      SandpackLogLevel2[SandpackLogLevel2[\"Warning\"] = 20] = \"Warning\";\n      SandpackLogLevel2[SandpackLogLevel2[\"Info\"] = 30] = \"Info\";\n      SandpackLogLevel2[SandpackLogLevel2[\"Debug\"] = 40] = \"Debug\";\n    })(SandpackLogLevel || (SandpackLogLevel = {}));\n  }\n}); // ../../node_modules/dequal/dist/index.mjs\nfunction find(iter, tar, key) {\n  for (key of iter.keys()) {\n    if (dequal(key, tar)) return key;\n  }\n}\nfunction dequal(foo, bar) {\n  var ctor, len, tmp;\n  if (foo === bar) return true;\n  if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n    if (ctor === Date) return foo.getTime() === bar.getTime();\n    if (ctor === RegExp) return foo.toString() === bar.toString();\n    if (ctor === Array) {\n      if ((len = foo.length) === bar.length) {\n        while (len-- && dequal(foo[len], bar[len]));\n      }\n      return len === -1;\n    }\n    if (ctor === Set) {\n      if (foo.size !== bar.size) {\n        return false;\n      }\n      for (len of foo) {\n        tmp = len;\n        if (tmp && typeof tmp === \"object\") {\n          tmp = find(bar, tmp);\n          if (!tmp) return false;\n        }\n        if (!bar.has(tmp)) return false;\n      }\n      return true;\n    }\n    if (ctor === Map) {\n      if (foo.size !== bar.size) {\n        return false;\n      }\n      for (len of foo) {\n        tmp = len[0];\n        if (tmp && typeof tmp === \"object\") {\n          tmp = find(bar, tmp);\n          if (!tmp) return false;\n        }\n        if (!dequal(len[1], bar.get(tmp))) {\n          return false;\n        }\n      }\n      return true;\n    }\n    if (ctor === ArrayBuffer) {\n      foo = new Uint8Array(foo);\n      bar = new Uint8Array(bar);\n    } else if (ctor === DataView) {\n      if ((len = foo.byteLength) === bar.byteLength) {\n        while (len-- && foo.getInt8(len) === bar.getInt8(len));\n      }\n      return len === -1;\n    }\n    if (ArrayBuffer.isView(foo)) {\n      if ((len = foo.byteLength) === bar.byteLength) {\n        while (len-- && foo[len] === bar[len]);\n      }\n      return len === -1;\n    }\n    if (!ctor || typeof foo === \"object\") {\n      len = 0;\n      for (ctor in foo) {\n        if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n        if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n      }\n      return Object.keys(bar).length === len;\n    }\n  }\n  return foo !== foo && bar !== bar;\n}\nvar has;\nvar init_dist = __esm({\n  \"../../node_modules/dequal/dist/index.mjs\"() {\n    has = Object.prototype.hasOwnProperty;\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/base-80a1f760.mjs\nvar SandpackClient;\nvar init_base_80a1f760 = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/base-80a1f760.mjs\"() {\n    init_dist();\n    SandpackClient = /** @class */function () {\n      function SandpackClient2(iframeSelector, sandboxSetup, options) {\n        if (options === void 0) {\n          options = {};\n        }\n        this.status = \"idle\";\n        this.options = options;\n        this.sandboxSetup = sandboxSetup;\n        this.iframeSelector = iframeSelector;\n      }\n      SandpackClient2.prototype.updateOptions = function (options) {\n        if (!dequal(this.options, options)) {\n          this.options = options;\n          this.updateSandbox();\n        }\n      };\n      SandpackClient2.prototype.updateSandbox = function (_sandboxSetup, _isInitializationCompile) {\n        if (_sandboxSetup === void 0) {\n          _sandboxSetup = this.sandboxSetup;\n        }\n        throw Error(\"Method not implemented\");\n      };\n      SandpackClient2.prototype.destroy = function () {\n        throw Error(\"Method not implemented\");\n      };\n      SandpackClient2.prototype.dispatch = function (_message) {\n        throw Error(\"Method not implemented\");\n      };\n      SandpackClient2.prototype.listen = function (_listener) {\n        throw Error(\"Method not implemented\");\n      };\n      return SandpackClient2;\n    }();\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/client.utils-7a723432.mjs\nfunction isCommand(char) {\n  return /[a-zA-Z.]/.test(char);\n}\nfunction isAlpha(char) {\n  return /[a-zA-Z]/.test(char);\n}\nfunction isWhitespace(char) {\n  return /\\s/.test(char);\n}\nfunction isOperator(char) {\n  return /[&|]/.test(char);\n}\nfunction isArgument(char) {\n  return /-/.test(char);\n}\nfunction isString(char) {\n  return /[\"']/.test(char);\n}\nfunction isEnvVar(char) {\n  return isAlpha(char) && char === char.toUpperCase();\n}\nfunction tokenize(input) {\n  var current = 0;\n  var tokens = [];\n  function parseCommand() {\n    var value = \"\";\n    while (isCommand(input[current]) && current < input.length) {\n      value += input[current];\n      current++;\n    }\n    return {\n      type: TokenType.Command,\n      value\n    };\n  }\n  function parseOperator() {\n    var value = \"\";\n    while (isOperator(input[current]) && current < input.length) {\n      value += input[current];\n      current++;\n    }\n    return operators.get(value);\n  }\n  function parseArgument() {\n    var value = \"\";\n    while ((isArgument(input[current]) || isAlpha(input[current])) && current < input.length) {\n      value += input[current];\n      current++;\n    }\n    return {\n      type: TokenType.Argument,\n      value\n    };\n  }\n  function parseString() {\n    var openCloseQuote = input[current];\n    var value = input[current];\n    current++;\n    while (input[current] !== openCloseQuote && current < input.length) {\n      value += input[current];\n      current++;\n    }\n    value += input[current];\n    current++;\n    return {\n      type: TokenType.String,\n      value\n    };\n  }\n  function parseEnvVars() {\n    var value = {};\n    var parseSingleEnv = function () {\n      var key = \"\";\n      var pair = \"\";\n      while (input[current] !== \"=\" && current < input.length) {\n        key += input[current];\n        current++;\n      }\n      if (input[current] === \"=\") {\n        current++;\n      }\n      while (input[current] !== \" \" && current < input.length) {\n        pair += input[current];\n        current++;\n      }\n      value[key] = pair;\n    };\n    while (isEnvVar(input[current]) && current < input.length) {\n      parseSingleEnv();\n      current++;\n    }\n    return {\n      type: TokenType.EnvVar,\n      value\n    };\n  }\n  while (current < input.length) {\n    var currentChar = input[current];\n    if (isWhitespace(currentChar)) {\n      current++;\n      continue;\n    }\n    switch (true) {\n      case isEnvVar(currentChar):\n        tokens.push(parseEnvVars());\n        break;\n      case isCommand(currentChar):\n        tokens.push(parseCommand());\n        break;\n      case isOperator(currentChar):\n        tokens.push(parseOperator());\n        break;\n      case isArgument(currentChar):\n        tokens.push(parseArgument());\n        break;\n      case isString(currentChar):\n        tokens.push(parseString());\n        break;\n      default:\n        throw new Error(\"Unknown character: \" + currentChar);\n    }\n  }\n  return tokens;\n}\nfunction generateRandomId() {\n  var now = Date.now();\n  var randomNumber = Math.round(Math.random() * 1e4);\n  var count = counter += 1;\n  return (+(\"\" + now + randomNumber + count)).toString(16);\n}\nvar EventEmitter, TokenType, operators, counter, writeBuffer, readBuffer, fromBundlerFilesToFS, findStartScriptPackageJson, getMessageFromError;\nvar init_client_utils_7a723432 = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/client.utils-7a723432.mjs\"() {\n    init_lib();\n    init_types_36e5ec0d();\n    EventEmitter = /** @class */function () {\n      function EventEmitter2() {\n        this.listeners = {};\n        this.listenersCount = 0;\n        this.channelId = Math.floor(Math.random() * 1e6);\n        this.listeners = [];\n      }\n      EventEmitter2.prototype.cleanup = function () {\n        this.listeners = {};\n        this.listenersCount = 0;\n      };\n      EventEmitter2.prototype.dispatch = function (message) {\n        Object.values(this.listeners).forEach(function (listener) {\n          return listener(message);\n        });\n      };\n      EventEmitter2.prototype.listener = function (listener) {\n        var _this = this;\n        if (typeof listener !== \"function\") {\n          return function () {\n            return;\n          };\n        }\n        var listenerId = this.listenersCount;\n        this.listeners[listenerId] = listener;\n        this.listenersCount++;\n        return function () {\n          delete _this.listeners[listenerId];\n        };\n      };\n      return EventEmitter2;\n    }();\n    (function (TokenType2) {\n      TokenType2[\"OR\"] = \"OR\";\n      TokenType2[\"AND\"] = \"AND\";\n      TokenType2[\"PIPE\"] = \"PIPE\";\n      TokenType2[\"Command\"] = \"Command\";\n      TokenType2[\"Argument\"] = \"Argument\";\n      TokenType2[\"String\"] = \"String\";\n      TokenType2[\"EnvVar\"] = \"EnvVar\";\n    })(TokenType || (TokenType = {}));\n    operators = /* @__PURE__ */new Map([[\"&&\", {\n      type: TokenType.AND\n    }], [\"||\", {\n      type: TokenType.OR\n    }], [\"|\", {\n      type: TokenType.PIPE\n    }], [\"-\", {\n      type: TokenType.Argument\n    }]]);\n    counter = 0;\n    writeBuffer = function (content) {\n      if (typeof content === \"string\") {\n        return new TextEncoder().encode(content);\n      } else {\n        return content;\n      }\n    };\n    readBuffer = function (content) {\n      if (typeof content === \"string\") {\n        return content;\n      } else {\n        return new TextDecoder().decode(content);\n      }\n    };\n    fromBundlerFilesToFS = function (files) {\n      return Object.entries(files).reduce(function (acc, _a2) {\n        var key = _a2[0],\n          value = _a2[1];\n        acc[key] = writeBuffer(value.code);\n        return acc;\n      }, {});\n    };\n    findStartScriptPackageJson = function (packageJson) {\n      var scripts2 = {};\n      var possibleKeys = [\"dev\", \"start\"];\n      try {\n        scripts2 = JSON.parse(packageJson).scripts;\n      } catch (e) {\n        throw createError(\"Could not parse package.json file: \" + e.message);\n      }\n      invariant(scripts2, \"Failed to start. Please provide a `start` or `dev` script on the package.json\");\n      var _loop_1 = function (index2) {\n        if (possibleKeys[index2] in scripts2) {\n          var script = possibleKeys[index2];\n          var candidate = scripts2[script];\n          var env_1 = {};\n          var command_1 = \"\";\n          var args_1 = [];\n          tokenize(candidate).forEach(function (item) {\n            var commandNotFoundYet = command_1 === \"\";\n            if (item.type === TokenType.EnvVar) {\n              env_1 = item.value;\n            }\n            if (item.type === TokenType.Command && commandNotFoundYet) {\n              command_1 = item.value;\n            }\n            if (item.type === TokenType.Argument || !commandNotFoundYet && item.type === TokenType.Command) {\n              args_1.push(item.value);\n            }\n          });\n          return {\n            value: [command_1, args_1, {\n              env: env_1\n            }]\n          };\n        }\n      };\n      for (var index = 0; index < possibleKeys.length; index++) {\n        var state_1 = _loop_1(index);\n        if (typeof state_1 === \"object\") return state_1.value;\n      }\n      throw createError(\"Failed to start. Please provide a `start` or `dev` script on the package.json\");\n    };\n    getMessageFromError = function (error) {\n      if (typeof error === \"string\") return error;\n      if (typeof error === \"object\" && \"message\" in error) {\n        return error.message;\n      }\n      return createError(\"The server could not be reached. Make sure that the node script is running and that a port has been started.\");\n    };\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/clients/node/index.mjs\nvar node_exports = {};\n__export(node_exports, {\n  SandpackNode: () => SandpackNode\n});\nimport { INJECT_MESSAGE_TYPE, Nodebox, PREVIEW_LOADED_MESSAGE_TYPE } from \"https://framerusercontent.com/modules/aYGJCvSFoantRUzfEvdJ/R3HzaXN99zpIst2zJwMZ/codesandbox_nodebox.js\";\nfunction loadPreviewIframe(iframe, url) {\n  return __awaiter(this, void 0, void 0, function () {\n    var contentWindow, TIME_OUT, MAX_MANY_TIRES, tries, timeout;\n    return __generator(this, function (_a2) {\n      contentWindow = iframe.contentWindow;\n      nullthrows(contentWindow, \"Failed to await preview iframe: no content window found\");\n      TIME_OUT = 9e4;\n      MAX_MANY_TIRES = 20;\n      tries = 0;\n      return [2, new Promise(function (resolve, reject) {\n        var triesToSetUrl = function () {\n          var onLoadPage = function () {\n            clearTimeout(timeout);\n            tries = MAX_MANY_TIRES;\n            resolve();\n            iframe.removeEventListener(\"load\", onLoadPage);\n          };\n          if (tries >= MAX_MANY_TIRES) {\n            reject(createError(\"Could not able to connect to preview.\"));\n            return;\n          }\n          iframe.setAttribute(\"src\", url);\n          timeout = setTimeout(function () {\n            triesToSetUrl();\n            iframe.removeEventListener(\"load\", onLoadPage);\n          }, TIME_OUT);\n          tries = tries + 1;\n          iframe.addEventListener(\"load\", onLoadPage);\n        };\n        iframe.addEventListener(\"error\", function () {\n          return reject(new Error(\"Iframe error\"));\n        });\n        iframe.addEventListener(\"abort\", function () {\n          return reject(new Error(\"Aborted\"));\n        });\n        triesToSetUrl();\n      })];\n    });\n  });\n}\nfunction setupHistoryListeners(_a2) {\n  var scope = _a2.scope;\n  var origHistoryProto = window.history.__proto__;\n  var historyList = [];\n  var historyPosition = 0;\n  var dispatchMessage = function (url) {\n    parent.postMessage({\n      type: \"urlchange\",\n      url,\n      back: historyPosition > 0,\n      forward: historyPosition < historyList.length - 1,\n      channelId: scope.channelId\n    }, \"*\");\n  };\n  function pushHistory(url, state) {\n    historyList.splice(historyPosition + 1);\n    historyList.push({\n      url,\n      state\n    });\n    historyPosition = historyList.length - 1;\n  }\n  Object.assign(window.history, {\n    go: function (delta) {\n      var newPos = historyPosition + delta;\n      if (newPos >= 0 && newPos <= historyList.length - 1) {\n        historyPosition = newPos;\n        var _a3 = historyList[historyPosition],\n          url = _a3.url,\n          state = _a3.state;\n        origHistoryProto.replaceState.call(window.history, state, \"\", url);\n        var newURL = document.location.href;\n        dispatchMessage(newURL);\n        window.dispatchEvent(new PopStateEvent(\"popstate\", {\n          state\n        }));\n      }\n    },\n    back: function () {\n      window.history.go(-1);\n    },\n    forward: function () {\n      window.history.go(1);\n    },\n    pushState: function (state, title, url) {\n      origHistoryProto.replaceState.call(window.history, state, title, url);\n      pushHistory(url, state);\n      dispatchMessage(document.location.href);\n    },\n    replaceState: function (state, title, url) {\n      origHistoryProto.replaceState.call(window.history, state, title, url);\n      historyList[historyPosition] = {\n        state,\n        url\n      };\n      dispatchMessage(document.location.href);\n    }\n  });\n  function handleMessage(_a3) {\n    var data = _a3.data;\n    if (data.type === \"urlback\") {\n      history.back();\n    } else if (data.type === \"urlforward\") {\n      history.forward();\n    } else if (data.type === \"refresh\") {\n      document.location.reload();\n    }\n  }\n  window.addEventListener(\"message\", handleMessage);\n}\nvar setPreviewIframeProperties, consoleHook, scripts, injectScriptToIframe, SandpackNode;\nvar init_node = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/clients/node/index.mjs\"() {\n    init_types_36e5ec0d();\n    init_base_80a1f760();\n    init_client_utils_7a723432();\n    init_lib();\n    init_dist();\n    setPreviewIframeProperties = function (iframe, options) {\n      iframe.style.border = \"0\";\n      iframe.style.width = options.width || \"100%\";\n      iframe.style.height = options.height || \"100%\";\n      iframe.style.overflow = \"hidden\";\n      iframe.allow = \"cross-origin-isolated\";\n    };\n    consoleHook = `var t=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:{};function r(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,\"default\")?t.default:t}var e={},n={};!function(t){t.__esModule=!0,t.default=[\"log\",\"debug\",\"info\",\"warn\",\"error\",\"table\",\"clear\",\"time\",\"timeEnd\",\"count\",\"assert\",\"command\",\"result\"]}(n);var a,o={},i={};(a=i).__esModule=!0,a.default=function(){var t=function(){return(65536*(1+Math.random())|0).toString(16).substring(1)};return t()+t()+\"-\"+t()+\"-\"+t()+\"-\"+t()+\"-\"+t()+\"-\"+Date.now()};var u={},s={__esModule:!0};s.update=s.state=void 0,s.update=function(t){s.state=t};var f={},c={};!function(r){var e=t&&t.__assign||function(){return e=Object.assign||function(t){for(var r,e=1,n=arguments.length;e<n;e++)for(var a in r=arguments[e])Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a]);return t},e.apply(this,arguments)};r.__esModule=!0,r.initialState=void 0,r.initialState={timings:{},count:{}};var n=function(){return\"undefined\"!=typeof performance&&performance.now?performance.now():Date.now()};r.default=function(t,a){var o,i,u;switch(void 0===t&&(t=r.initialState),a.type){case\"COUNT\":var s=t.count[a.name]||0;return e(e({},t),{count:e(e({},t.count),(o={},o[a.name]=s+1,o))});case\"TIME_START\":return e(e({},t),{timings:e(e({},t.timings),(i={},i[a.name]={start:n()},i))});case\"TIME_END\":var f=t.timings[a.name],c=n(),l=c-f.start;return e(e({},t),{timings:e(e({},t.timings),(u={},u[a.name]=e(e({},f),{end:c,time:l}),u))});default:return t}}}(c),function(r){var e=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};r.__esModule=!0;var n=e(c),a=s;r.default=function(t){a.update(n.default(a.state,t))}}(f);var l={__esModule:!0};l.timeEnd=l.timeStart=l.count=void 0,l.count=function(t){return{type:\"COUNT\",name:t}},l.timeStart=function(t){return{type:\"TIME_START\",name:t}},l.timeEnd=function(t){return{type:\"TIME_END\",name:t}};var d=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};u.__esModule=!0,u.stop=u.start=void 0;var p=s,h=d(f),m=l;u.start=function(t){h.default(m.timeStart(t))},u.stop=function(t){var r=null===p.state||void 0===p.state?void 0:p.state.timings[t];return r&&!r.end?(h.default(m.timeEnd(t)),{method:\"log\",data:[t+\": \"+p.state.timings[t].time+\"ms\"]}):{method:\"warn\",data:[\"Timer '\"+t+\"' does not exist\"]}};var y={},v=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};y.__esModule=!0,y.increment=void 0;var _=s,b=v(f),g=l;y.increment=function(t){return b.default(g.count(t)),{method:\"log\",data:[t+\": \"+_.state.count[t]]}};var M={},T=t&&t.__spreadArrays||function(){for(var t=0,r=0,e=arguments.length;r<e;r++)t+=arguments[r].length;var n=Array(t),a=0;for(r=0;r<e;r++)for(var o=arguments[r],i=0,u=o.length;i<u;i++,a++)n[a]=o[i];return n};M.__esModule=!0,M.test=void 0,M.test=function(t){for(var r=[],e=1;e<arguments.length;e++)r[e-1]=arguments[e];return!t&&(0===r.length&&r.push(\"console.assert\"),{method:\"error\",data:T([\"Assertion failed:\"],r)})},function(r){var e=t&&t.__assign||function(){return e=Object.assign||function(t){for(var r,e=1,n=arguments.length;e<n;e++)for(var a in r=arguments[e])Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a]);return t},e.apply(this,arguments)},n=t&&t.__createBinding||(Object.create?function(t,r,e,n){void 0===n&&(n=e),Object.defineProperty(t,n,{enumerable:!0,get:function(){return r[e]}})}:function(t,r,e,n){void 0===n&&(n=e),t[n]=r[e]}),a=t&&t.__setModuleDefault||(Object.create?function(t,r){Object.defineProperty(t,\"default\",{enumerable:!0,value:r})}:function(t,r){t.default=r}),o=t&&t.__importStar||function(t){if(t&&t.__esModule)return t;var r={};if(null!=t)for(var e in t)\"default\"!==e&&Object.prototype.hasOwnProperty.call(t,e)&&n(r,t,e);return a(r,t),r},s=t&&t.__spreadArrays||function(){for(var t=0,r=0,e=arguments.length;r<e;r++)t+=arguments[r].length;var n=Array(t),a=0;for(r=0;r<e;r++)for(var o=arguments[r],i=0,u=o.length;i<u;i++,a++)n[a]=o[i];return n},f=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};r.__esModule=!0;var c=f(i),l=o(u),d=o(y),p=o(M);r.default=function(t,r,n){var a=n||c.default();switch(t){case\"clear\":return{method:t,id:a};case\"count\":return!!(o=\"string\"==typeof r[0]?r[0]:\"default\")&&e(e({},d.increment(o)),{id:a});case\"time\":case\"timeEnd\":var o;return!!(o=\"string\"==typeof r[0]?r[0]:\"default\")&&(\"time\"===t?(l.start(o),!1):e(e({},l.stop(o)),{id:a}));case\"assert\":if(0!==r.length){var i=p.test.apply(p,s([r[0]],r.slice(1)));if(i)return e(e({},i),{id:a})}return!1;case\"error\":return{method:t,id:a,data:r.map((function(t){try{return t.stack||t}catch(r){return t}}))};default:return{method:t,id:a,data:r}}}}(o);var S={},O={};!function(t){var r;t.__esModule=!0,function(t){t[t.infinity=0]=\"infinity\",t[t.minusInfinity=1]=\"minusInfinity\",t[t.minusZero=2]=\"minusZero\"}(r||(r={})),t.default={type:\"Arithmetic\",lookup:Number,shouldTransform:function(t,r){return\"number\"===t&&(r===1/0||r===-1/0||function(t){return 1/t==-1/0}(r))},toSerializable:function(t){return t===1/0?r.infinity:t===-1/0?r.minusInfinity:r.minusZero},fromSerializable:function(t){return t===r.infinity?1/0:t===r.minusInfinity?-1/0:t===r.minusZero?-0:t}}}(O);var w={};!function(t){t.__esModule=!0,t.default={type:\"Function\",lookup:Function,shouldTransform:function(t,r){return\"function\"==typeof r},toSerializable:function(t){var r=\"\";try{r=t.toString().substring(r.indexOf(\"{\")+1,r.lastIndexOf(\"}\"))}catch(t){}return{name:t.name,body:r,proto:Object.getPrototypeOf(t).constructor.name}},fromSerializable:function(t){try{var r=function(){};return\"string\"==typeof t.name&&Object.defineProperty(r,\"name\",{value:t.name,writable:!1}),\"string\"==typeof t.body&&Object.defineProperty(r,\"body\",{value:t.body,writable:!1}),\"string\"==typeof t.proto&&(r.constructor={name:t.proto}),r}catch(r){return t}}}}(w);var A={};!function(t){var r;function e(t){for(var r={},e=0,n=t.attributes;e<n.length;e++){var a=n[e];r[a.name]=a.value}return r}t.__esModule=!0,t.default={type:\"HTMLElement\",shouldTransform:function(t,r){return r&&r.children&&\"string\"==typeof r.innerHTML&&\"string\"==typeof r.tagName},toSerializable:function(t){return{tagName:t.tagName.toLowerCase(),attributes:e(t),innerHTML:t.innerHTML}},fromSerializable:function(t){try{var e=(r||(r=document.implementation.createHTMLDocument(\"sandbox\"))).createElement(t.tagName);e.innerHTML=t.innerHTML;for(var n=0,a=Object.keys(t.attributes);n<a.length;n++){var o=a[n];try{e.setAttribute(o,t.attributes[o])}catch(t){}}return e}catch(r){return t}}}}(A);var j={};!function(r){var e=t&&t.__assign||function(){return e=Object.assign||function(t){for(var r,e=1,n=arguments.length;e<n;e++)for(var a in r=arguments[e])Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a]);return t},e.apply(this,arguments)};r.__esModule=!0,r.default={type:\"Map\",shouldTransform:function(t,r){return r&&r.constructor&&\"Map\"===r.constructor.name},toSerializable:function(t){var r={};return t.forEach((function(t,e){var n=\"object\"==typeof e?JSON.stringify(e):e;r[n]=t})),{name:\"Map\",body:r,proto:Object.getPrototypeOf(t).constructor.name}},fromSerializable:function(t){var r=t.body,n=e({},r);return\"string\"==typeof t.proto&&(n.constructor={name:t.proto}),n}}}(j);var z={};!function(t){t.__esModule=!0;var r=\"@t\",e=/^#*@(t|r)$/,n=(0,eval)(\"this\"),a=\"function\"==typeof ArrayBuffer,o=\"function\"==typeof Map,i=\"function\"==typeof Set,u=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\"],s=Array.prototype.slice,f={serialize:function(t){return JSON.stringify(t)},deserialize:function(t){return JSON.parse(t)}},c=function(){function t(t,r){this.references=t,this.transforms=r,this.transformsMap=this._makeTransformsMap(),this.circularCandidates=[],this.circularCandidatesDescrs=[],this.circularRefCount=0}return t._createRefMark=function(t){var r=Object.create(null);return r[\"@r\"]=t,r},t.prototype._createCircularCandidate=function(t,r,e){this.circularCandidates.push(t),this.circularCandidatesDescrs.push({parent:r,key:e,refIdx:-1})},t.prototype._applyTransform=function(t,e,n,a){var o=Object.create(null),i=a.toSerializable(t);return\"object\"==typeof i&&this._createCircularCandidate(t,e,n),o[r]=a.type,o.data=this._handleValue((function(){return i}),e,n),o},t.prototype._handleArray=function(t){for(var r=[],e=function(e){r[e]=n._handleValue((function(){return t[e]}),r,e)},n=this,a=0;a<t.length;a++)e(a);return r},t.prototype._handlePlainObject=function(t){var r,n,a=Object.create(null),o=function(r){if(Reflect.has(t,r)){var n=e.test(r)?\"#\"+r:r;a[n]=i._handleValue((function(){return t[r]}),a,n)}},i=this;for(var u in t)o(u);var s=null===(n=null===(r=null==t?void 0:t.__proto__)||void 0===r?void 0:r.constructor)||void 0===n?void 0:n.name;return s&&\"Object\"!==s&&(a.constructor={name:s}),a},t.prototype._handleObject=function(t,r,e){return this._createCircularCandidate(t,r,e),Array.isArray(t)?this._handleArray(t):this._handlePlainObject(t)},t.prototype._ensureCircularReference=function(r){var e=this.circularCandidates.indexOf(r);if(e>-1){var n=this.circularCandidatesDescrs[e];return-1===n.refIdx&&(n.refIdx=n.parent?++this.circularRefCount:0),t._createRefMark(n.refIdx)}return null},t.prototype._handleValue=function(t,r,e){try{var n=t(),a=typeof n,o=\"object\"===a&&null!==n;if(o){var i=this._ensureCircularReference(n);if(i)return i}var u=this._findTransform(a,n);return u?this._applyTransform(n,r,e,u):o?this._handleObject(n,r,e):n}catch(t){try{return this._handleValue((function(){return t instanceof Error?t:new Error(t)}),r,e)}catch(t){return null}}},t.prototype._makeTransformsMap=function(){if(o){var t=new Map;return this.transforms.forEach((function(r){r.lookup&&t.set(r.lookup,r)})),t}},t.prototype._findTransform=function(t,r){if(o&&r&&r.constructor&&(null==(a=this.transformsMap.get(r.constructor))?void 0:a.shouldTransform(t,r)))return a;for(var e=0,n=this.transforms;e<n.length;e++){var a;if((a=n[e]).shouldTransform(t,r))return a}},t.prototype.transform=function(){for(var r=this,e=[this._handleValue((function(){return r.references}),null,null)],n=0,a=this.circularCandidatesDescrs;n<a.length;n++){var o=a[n];o.refIdx>0&&(e[o.refIdx]=o.parent[o.key],o.parent[o.key]=t._createRefMark(o.refIdx))}return e},t}(),l=function(){function t(t,r){this.activeTransformsStack=[],this.visitedRefs=Object.create(null),this.references=t,this.transformMap=r}return t.prototype._handlePlainObject=function(t){var r=Object.create(null);for(var n in\"constructor\"in t&&(t.constructor&&\"string\"==typeof t.constructor.name||(t.constructor={name:\"Object\"})),t)t.hasOwnProperty(n)&&(this._handleValue(t[n],t,n),e.test(n)&&(r[n.substring(1)]=t[n],delete t[n]));for(var a in r)t[a]=r[a]},t.prototype._handleTransformedObject=function(t,e,n){var a=t[r],o=this.transformMap[a];if(!o)throw new Error(\"Can't find transform for \\\\\"\"+a+'\" type.');this.activeTransformsStack.push(t),this._handleValue(t.data,t,\"data\"),this.activeTransformsStack.pop(),e[n]=o.fromSerializable(t.data)},t.prototype._handleCircularSelfRefDuringTransform=function(t,r,e){var n=this.references;Object.defineProperty(r,e,{val:void 0,configurable:!0,enumerable:!0,get:function(){return void 0===this.val&&(this.val=n[t]),this.val},set:function(t){this.val=t}})},t.prototype._handleCircularRef=function(t,r,e){this.activeTransformsStack.includes(this.references[t])?this._handleCircularSelfRefDuringTransform(t,r,e):(this.visitedRefs[t]||(this.visitedRefs[t]=!0,this._handleValue(this.references[t],this.references,t)),r[e]=this.references[t])},t.prototype._handleValue=function(t,e,n){if(\"object\"==typeof t&&null!==t){var a=t[\"@r\"];if(void 0!==a)this._handleCircularRef(a,e,n);else if(t[r])this._handleTransformedObject(t,e,n);else if(Array.isArray(t))for(var o=0;o<t.length;o++)this._handleValue(t[o],t,o);else this._handlePlainObject(t)}},t.prototype.transform=function(){return this.visitedRefs[0]=!0,this._handleValue(this.references[0],this.references,0),this.references[0]},t}(),d=[{type:\"[[NaN]]\",shouldTransform:function(t,r){return\"number\"===t&&isNaN(r)},toSerializable:function(){return\"\"},fromSerializable:function(){return NaN}},{type:\"[[undefined]]\",shouldTransform:function(t){return\"undefined\"===t},toSerializable:function(){return\"\"},fromSerializable:function(){}},{type:\"[[Date]]\",lookup:Date,shouldTransform:function(t,r){return r instanceof Date},toSerializable:function(t){return t.getTime()},fromSerializable:function(t){var r=new Date;return r.setTime(t),r}},{type:\"[[RegExp]]\",lookup:RegExp,shouldTransform:function(t,r){return r instanceof RegExp},toSerializable:function(t){var r={src:t.source,flags:\"\"};return t.globalThis&&(r.flags+=\"g\"),t.ignoreCase&&(r.flags+=\"i\"),t.multiline&&(r.flags+=\"m\"),r},fromSerializable:function(t){return new RegExp(t.src,t.flags)}},{type:\"[[Error]]\",lookup:Error,shouldTransform:function(t,r){return r instanceof Error},toSerializable:function(t){var r,e;return t.stack||null===(e=(r=Error).captureStackTrace)||void 0===e||e.call(r,t),{name:t.name,message:t.message,stack:t.stack}},fromSerializable:function(t){var r=new(n[t.name]||Error)(t.message);return r.stack=t.stack,r}},{type:\"[[ArrayBuffer]]\",lookup:a&&ArrayBuffer,shouldTransform:function(t,r){return a&&r instanceof ArrayBuffer},toSerializable:function(t){var r=new Int8Array(t);return s.call(r)},fromSerializable:function(t){if(a){var r=new ArrayBuffer(t.length);return new Int8Array(r).set(t),r}return t}},{type:\"[[TypedArray]]\",shouldTransform:function(t,r){if(a)return ArrayBuffer.isView(r)&&!(r instanceof DataView);for(var e=0,o=u;e<o.length;e++){var i=o[e];if(\"function\"==typeof n[i]&&r instanceof n[i])return!0}return!1},toSerializable:function(t){return{ctorName:t.constructor.name,arr:s.call(t)}},fromSerializable:function(t){return\"function\"==typeof n[t.ctorName]?new n[t.ctorName](t.arr):t.arr}},{type:\"[[Map]]\",lookup:o&&Map,shouldTransform:function(t,r){return o&&r instanceof Map},toSerializable:function(t){var r=[];return t.forEach((function(t,e){r.push(e),r.push(t)})),r},fromSerializable:function(t){if(o){for(var r=new Map,e=0;e<t.length;e+=2)r.set(t[e],t[e+1]);return r}for(var n=[],a=0;a<t.length;a+=2)n.push([t[e],t[e+1]]);return n}},{type:\"[[Set]]\",lookup:i&&Set,shouldTransform:function(t,r){return i&&r instanceof Set},toSerializable:function(t){var r=[];return t.forEach((function(t){r.push(t)})),r},fromSerializable:function(t){if(i){for(var r=new Set,e=0;e<t.length;e++)r.add(t[e]);return r}return t}}],p=function(){function t(t){this.transforms=[],this.transformsMap=Object.create(null),this.serializer=t||f,this.addTransforms(d)}return t.prototype.addTransforms=function(t){for(var r=0,e=t=Array.isArray(t)?t:[t];r<e.length;r++){var n=e[r];if(this.transformsMap[n.type])throw new Error('Transform with type \"'+n.type+'\" was already added.');this.transforms.push(n),this.transformsMap[n.type]=n}return this},t.prototype.removeTransforms=function(t){for(var r=0,e=t=Array.isArray(t)?t:[t];r<e.length;r++){var n=e[r],a=this.transforms.indexOf(n);a>-1&&this.transforms.splice(a,1),delete this.transformsMap[n.type]}return this},t.prototype.encode=function(t){var r=new c(t,this.transforms).transform();return this.serializer.serialize(r)},t.prototype.decode=function(t){var r=this.serializer.deserialize(t);return new l(r,this.transformsMap).transform()},t}();t.default=p}(z);var E=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};S.__esModule=!0,S.Decode=P=S.Encode=void 0;var k=E(O),C=E(w),D=E(A),I=E(j),N=E(z),R=[D.default,C.default,k.default,I.default],x=new N.default;x.addTransforms(R);var P=S.Encode=function(t){return JSON.parse(x.encode(t))};S.Decode=function(t){return x.decode(JSON.stringify(t))},function(r){var e=t&&t.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};r.__esModule=!0;var a=e(n),i=e(o),u=S;r.default=function(t,r,e){void 0===e&&(e=!0);for(var n=t,o={pointers:{},src:{npm:\"https://npmjs.com/package/console-feed\",github:\"https://github.com/samdenty99/console-feed\"}},s=function(t){var a=n[t];n[t]=function(){a.apply(this,arguments);var n=[].slice.call(arguments);setTimeout((function(){var a=i.default(t,n);if(a){var o=a;e&&(o=u.Encode(a)),r(o,a)}}))},o.pointers[t]=a},f=0,c=a.default;f<c.length;f++)s(c[f]);return n.feed=o,n}}(e),r(e)(window.console,(function(t){var r=P(t);parent.postMessage({type:\"console\",codesandbox:!0,log:Array.isArray(r)?r[0]:r,channelId:scope.channelId},\"*\")}));\n`;\n    scripts = [{\n      code: setupHistoryListeners.toString(),\n      id: \"historyListener\"\n    }, {\n      code: \"function consoleHook({ scope }) {\" + consoleHook + \"\\n};\",\n      id: \"consoleHook\"\n    }];\n    injectScriptToIframe = function (iframe, channelId) {\n      scripts.forEach(function (_a2) {\n        var _b;\n        var code = _a2.code,\n          id = _a2.id;\n        var message = {\n          uid: id,\n          type: INJECT_MESSAGE_TYPE,\n          code: \"exports.activate = \" + code,\n          scope: {\n            channelId\n          }\n        };\n        (_b = iframe.contentWindow) === null || _b === void 0 ? void 0 : _b.postMessage(message, \"*\");\n      });\n    };\n    SandpackNode = /** @class */function (_super) {\n      __extends(SandpackNode2, _super);\n      function SandpackNode2(selector, sandboxInfo, options) {\n        if (options === void 0) {\n          options = {};\n        }\n        var _this = _super.call(this, selector, sandboxInfo, __assign(__assign({}, options), {\n          bundlerURL: options.bundlerURL\n        })) || this;\n        _this._modulesCache = /* @__PURE__ */new Map();\n        _this.messageChannelId = generateRandomId();\n        _this._initPromise = null;\n        _this.emitter = new EventEmitter();\n        _this.manageIframes(selector);\n        _this.emulator = new Nodebox({\n          iframe: _this.emulatorIframe,\n          runtimeUrl: _this.options.bundlerURL\n        });\n        _this.updateSandbox(sandboxInfo);\n        return _this;\n      }\n      SandpackNode2.prototype._init = function (files) {\n        return __awaiter(this, void 0, void 0, function () {\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                return [4, this.emulator.connect()];\n              case 1:\n                _a2.sent();\n                return [4, this.emulator.fs.init(files)];\n              case 2:\n                _a2.sent();\n                return [4, this.globalListeners()];\n              case 3:\n                _a2.sent();\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.compile = function (files) {\n        return __awaiter(this, void 0, void 0, function () {\n          var shellId, err_1;\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                _a2.trys.push([0, 5,, 6]);\n                this.status = \"initializing\";\n                this.dispatch({\n                  type: \"start\",\n                  firstLoad: true\n                });\n                if (!this._initPromise) {\n                  this._initPromise = this._init(files);\n                }\n                return [4, this._initPromise];\n              case 1:\n                _a2.sent();\n                this.dispatch({\n                  type: \"connected\"\n                });\n                return [4, this.createShellProcessFromTask(files)];\n              case 2:\n                shellId = _a2.sent().id;\n                return [4, this.createPreviewURLFromId(shellId)];\n              case 3:\n                _a2.sent();\n                return [4, this.setLocationURLIntoIFrame()];\n              case 4:\n                _a2.sent();\n                this.dispatchDoneMessage();\n                return [3, 6];\n              case 5:\n                err_1 = _a2.sent();\n                this.dispatch({\n                  type: \"action\",\n                  action: \"notification\",\n                  notificationType: \"error\",\n                  title: getMessageFromError(err_1)\n                });\n                this.dispatch({\n                  type: \"done\",\n                  compilatonError: true\n                });\n                return [3, 6];\n              case 6:\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.createShellProcessFromTask = function (files) {\n        return __awaiter(this, void 0, void 0, function () {\n          var packageJsonContent;\n          var _a2;\n          var _this = this;\n          return __generator(this, function (_b) {\n            switch (_b.label) {\n              case 0:\n                packageJsonContent = readBuffer(files[\"/package.json\"]);\n                this.emulatorCommand = findStartScriptPackageJson(packageJsonContent);\n                this.emulatorShellProcess = this.emulator.shell.create();\n                return [4, this.emulatorShellProcess.on(\"exit\", function (exitCode) {\n                  _this.dispatch({\n                    type: \"action\",\n                    action: \"notification\",\n                    notificationType: \"error\",\n                    title: createError(\"Error: process.exit(\" + exitCode + \") called.\")\n                  });\n                })];\n              case 1:\n                _b.sent();\n                return [4, this.emulatorShellProcess.on(\"progress\", function (data) {\n                  var _a3, _b2;\n                  if (data.state === \"command_running\" || data.state === \"starting_command\") {\n                    _this.dispatch({\n                      type: \"shell/progress\",\n                      data: __assign(__assign({}, data), {\n                        command: [(_a3 = _this.emulatorCommand) === null || _a3 === void 0 ? void 0 : _a3[0], (_b2 = _this.emulatorCommand) === null || _b2 === void 0 ? void 0 : _b2[1].join(\" \")].join(\" \")\n                      })\n                    });\n                    _this.status = \"installing-dependencies\";\n                    return;\n                  }\n                  _this.dispatch({\n                    type: \"shell/progress\",\n                    data\n                  });\n                })];\n              case 2:\n                _b.sent();\n                this.emulatorShellProcess.stdout.on(\"data\", function (data) {\n                  _this.dispatch({\n                    type: \"stdout\",\n                    payload: {\n                      data,\n                      type: \"out\"\n                    }\n                  });\n                });\n                this.emulatorShellProcess.stderr.on(\"data\", function (data) {\n                  _this.dispatch({\n                    type: \"stdout\",\n                    payload: {\n                      data,\n                      type: \"err\"\n                    }\n                  });\n                });\n                return [4, (_a2 = this.emulatorShellProcess).runCommand.apply(_a2, this.emulatorCommand)];\n              case 3:\n                return [2, _b.sent()];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.createPreviewURLFromId = function (id) {\n        return __awaiter(this, void 0, void 0, function () {\n          var url;\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                this.iframePreviewUrl = void 0;\n                return [4, this.emulator.preview.getByShellId(id)];\n              case 1:\n                url = _a2.sent().url;\n                this.iframePreviewUrl = url + this.options.startRoute;\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.manageIframes = function (selector) {\n        var _a2;\n        if (typeof selector === \"string\") {\n          var element = document.querySelector(selector);\n          nullthrows(element, \"The element '\" + selector + \"' was not found\");\n          this.iframe = document.createElement(\"iframe\");\n        } else {\n          this.iframe = selector;\n        }\n        setPreviewIframeProperties(this.iframe, this.options);\n        nullthrows(this.iframe.parentNode, \"The given iframe does not have a parent.\");\n        this.emulatorIframe = document.createElement(\"iframe\");\n        this.emulatorIframe.classList.add(\"sp-bridge-frame\");\n        (_a2 = this.iframe.parentNode) === null || _a2 === void 0 ? void 0 : _a2.appendChild(this.emulatorIframe);\n      };\n      SandpackNode2.prototype.setLocationURLIntoIFrame = function () {\n        return __awaiter(this, void 0, void 0, function () {\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                if (!this.iframePreviewUrl) return [3, 2];\n                return [4, loadPreviewIframe(this.iframe, this.iframePreviewUrl)];\n              case 1:\n                _a2.sent();\n                _a2.label = 2;\n              case 2:\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.dispatchDoneMessage = function () {\n        this.status = \"done\";\n        this.dispatch({\n          type: \"done\",\n          compilatonError: false\n        });\n        if (this.iframePreviewUrl) {\n          this.dispatch({\n            type: \"urlchange\",\n            url: this.iframePreviewUrl,\n            back: false,\n            forward: false\n          });\n        }\n      };\n      SandpackNode2.prototype.globalListeners = function () {\n        return __awaiter(this, void 0, void 0, function () {\n          var _this = this;\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                window.addEventListener(\"message\", function (event) {\n                  if (event.data.type === PREVIEW_LOADED_MESSAGE_TYPE) {\n                    injectScriptToIframe(_this.iframe, _this.messageChannelId);\n                  }\n                  if (event.data.type === \"urlchange\" && event.data.channelId === _this.messageChannelId) {\n                    _this.dispatch({\n                      type: \"urlchange\",\n                      url: event.data.url,\n                      back: event.data.back,\n                      forward: event.data.forward\n                    });\n                  } else if (event.data.channelId === _this.messageChannelId) {\n                    _this.dispatch(event.data);\n                  }\n                });\n                return [4, this.emulator.fs.watch([\"*\"], [\".next\", \"node_modules\", \"build\", \"dist\", \"vendor\", \".config\", \".vuepress\"], function (message) {\n                  return __awaiter(_this, void 0, void 0, function () {\n                    var event, path, type, _a3, content, newContent, err_2;\n                    return __generator(this, function (_b) {\n                      switch (_b.label) {\n                        case 0:\n                          if (!message) return [2];\n                          event = message;\n                          path = \"newPath\" in event ? event.newPath : \"path\" in event ? event.path : \"\";\n                          return [4, this.emulator.fs.stat(path)];\n                        case 1:\n                          type = _b.sent().type;\n                          if (type !== \"file\") return [2, null];\n                          _b.label = 2;\n                        case 2:\n                          _b.trys.push([2, 10,, 11]);\n                          _a3 = event.type;\n                          switch (_a3) {\n                            case \"change\":\n                              return [3, 3];\n                            case \"create\":\n                              return [3, 3];\n                            case \"remove\":\n                              return [3, 5];\n                            case \"rename\":\n                              return [3, 6];\n                            case \"close\":\n                              return [3, 8];\n                          }\n                          return [3, 9];\n                        case 3:\n                          return [4, this.emulator.fs.readFile(event.path, \"utf8\")];\n                        case 4:\n                          content = _b.sent();\n                          this.dispatch({\n                            type: \"fs/change\",\n                            path: event.path,\n                            content\n                          });\n                          this._modulesCache.set(event.path, writeBuffer(content));\n                          return [3, 9];\n                        case 5:\n                          this.dispatch({\n                            type: \"fs/remove\",\n                            path: event.path\n                          });\n                          this._modulesCache[\"delete\"](event.path);\n                          return [3, 9];\n                        case 6:\n                          this.dispatch({\n                            type: \"fs/remove\",\n                            path: event.oldPath\n                          });\n                          this._modulesCache[\"delete\"](event.oldPath);\n                          return [4, this.emulator.fs.readFile(event.newPath, \"utf8\")];\n                        case 7:\n                          newContent = _b.sent();\n                          this.dispatch({\n                            type: \"fs/change\",\n                            path: event.newPath,\n                            content: newContent\n                          });\n                          this._modulesCache.set(event.newPath, writeBuffer(newContent));\n                          return [3, 9];\n                        case 8:\n                          return [3, 9];\n                        case 9:\n                          return [3, 11];\n                        case 10:\n                          err_2 = _b.sent();\n                          this.dispatch({\n                            type: \"action\",\n                            action: \"notification\",\n                            notificationType: \"error\",\n                            title: getMessageFromError(err_2)\n                          });\n                          return [3, 11];\n                        case 11:\n                          return [2];\n                      }\n                    });\n                  });\n                })];\n              case 1:\n                _a2.sent();\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.restartShellProcess = function () {\n        var _a2;\n        return __awaiter(this, void 0, void 0, function () {\n          return __generator(this, function (_b) {\n            switch (_b.label) {\n              case 0:\n                if (!(this.emulatorShellProcess && this.emulatorCommand)) return [3, 3];\n                this.dispatch({\n                  type: \"start\",\n                  firstLoad: true\n                });\n                this.status = \"initializing\";\n                return [4, this.emulatorShellProcess.kill()];\n              case 1:\n                _b.sent();\n                (_a2 = this.iframe) === null || _a2 === void 0 ? void 0 : _a2.removeAttribute(\"attr\");\n                this.emulator.fs.rm(\"/node_modules/.vite\", {\n                  recursive: true,\n                  force: true\n                });\n                return [4, this.compile(Object.fromEntries(this._modulesCache))];\n              case 2:\n                _b.sent();\n                _b.label = 3;\n              case 3:\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.updateSandbox = function (setup) {\n        var _this = this;\n        var _a2;\n        var modules = fromBundlerFilesToFS(setup.files);\n        if (((_a2 = this.emulatorShellProcess) === null || _a2 === void 0 ? void 0 : _a2.state) === \"running\") {\n          Object.entries(modules).forEach(function (_a3) {\n            var key = _a3[0],\n              value = _a3[1];\n            if (!_this._modulesCache.get(key) || readBuffer(value) !== readBuffer(_this._modulesCache.get(key))) {\n              _this.emulator.fs.writeFile(key, value, {\n                recursive: true\n              });\n            }\n          });\n          return;\n        }\n        this.dispatch({\n          codesandbox: true,\n          modules,\n          template: setup.template,\n          type: \"compile\"\n        });\n        Object.entries(modules).forEach(function (_a3) {\n          var key = _a3[0],\n            value = _a3[1];\n          _this._modulesCache.set(key, writeBuffer(value));\n        });\n      };\n      SandpackNode2.prototype.dispatch = function (message) {\n        var _a2, _b;\n        return __awaiter(this, void 0, void 0, function () {\n          var _c;\n          return __generator(this, function (_d) {\n            switch (_d.label) {\n              case 0:\n                _c = message.type;\n                switch (_c) {\n                  case \"compile\":\n                    return [3, 1];\n                  case \"refresh\":\n                    return [3, 2];\n                  case \"urlback\":\n                    return [3, 4];\n                  case \"urlforward\":\n                    return [3, 4];\n                  case \"shell/restart\":\n                    return [3, 5];\n                  case \"shell/openPreview\":\n                    return [3, 6];\n                }\n                return [3, 7];\n              case 1:\n                this.compile(message.modules);\n                return [3, 8];\n              case 2:\n                return [4, this.setLocationURLIntoIFrame()];\n              case 3:\n                _d.sent();\n                return [3, 8];\n              case 4:\n                (_b = (_a2 = this.iframe) === null || _a2 === void 0 ? void 0 : _a2.contentWindow) === null || _b === void 0 ? void 0 : _b.postMessage(message, \"*\");\n                return [3, 8];\n              case 5:\n                this.restartShellProcess();\n                return [3, 8];\n              case 6:\n                window.open(this.iframePreviewUrl, \"_blank\");\n                return [3, 8];\n              case 7:\n                this.emitter.dispatch(message);\n                _d.label = 8;\n              case 8:\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackNode2.prototype.listen = function (listener) {\n        return this.emitter.listener(listener);\n      };\n      SandpackNode2.prototype.destroy = function () {\n        this.emulatorIframe.remove();\n        this.emitter.cleanup();\n      };\n      return SandpackNode2;\n    }(SandpackClient);\n  }\n}); // ../../node_modules/static-browser-server/out/lib/main.js\nvar require_main = __commonJS({\n  \"../../node_modules/static-browser-server/out/lib/main.js\"(exports, module) {\n    \"use strict\";\n\n    var __create2 = Object.create;\n    var __defProp2 = Object.defineProperty;\n    var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;\n    var __getOwnPropNames2 = Object.getOwnPropertyNames;\n    var __getProtoOf2 = Object.getPrototypeOf;\n    var __hasOwnProp2 = Object.prototype.hasOwnProperty;\n    var __commonJS2 = (cb, mod) => function __require() {\n      return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = {\n        exports: {}\n      }).exports, mod), mod.exports;\n    };\n    var __export2 = (target, all) => {\n      for (var name in all) __defProp2(target, name, {\n        get: all[name],\n        enumerable: true\n      });\n    };\n    var __copyProps2 = (to, from, except, desc) => {\n      if (from && typeof from === \"object\" || typeof from === \"function\") {\n        for (let key of __getOwnPropNames2(from)) if (!__hasOwnProp2.call(to, key) && key !== except) __defProp2(to, key, {\n          get: () => from[key],\n          enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable\n        });\n      }\n      return to;\n    };\n    var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2(\n    // If the importer is in node compatibility mode or this is not an ESM\n    // file that has been converted to a CommonJS file using a Babel-\n    // compatible transform (i.e. \"__esModule\" has not been set), then set\n    // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n    isNodeMode || !mod || !mod.__esModule ? __defProp2(target, \"default\", {\n      value: mod,\n      enumerable: true\n    }) : target, mod));\n    var __toCommonJS = mod => __copyProps2(__defProp2({}, \"__esModule\", {\n      value: true\n    }), mod);\n    var require_db = __commonJS2({\n      \"node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/db.json\"(exports2, module2) {\n        module2.exports = {\n          \"application/1d-interleaved-parityfec\": {\n            source: \"iana\"\n          },\n          \"application/3gpdash-qoe-report+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/3gpp-ims+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/3gpphal+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/3gpphalforms+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/a2l\": {\n            source: \"iana\"\n          },\n          \"application/ace+cbor\": {\n            source: \"iana\"\n          },\n          \"application/activemessage\": {\n            source: \"iana\"\n          },\n          \"application/activity+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-costmap+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-costmapfilter+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-directory+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-endpointcost+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-endpointcostparams+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-endpointprop+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-endpointpropparams+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-error+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-networkmap+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-networkmapfilter+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-updatestreamcontrol+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/alto-updatestreamparams+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/aml\": {\n            source: \"iana\"\n          },\n          \"application/andrew-inset\": {\n            source: \"iana\",\n            extensions: [\"ez\"]\n          },\n          \"application/applefile\": {\n            source: \"iana\"\n          },\n          \"application/applixware\": {\n            source: \"apache\",\n            extensions: [\"aw\"]\n          },\n          \"application/at+jwt\": {\n            source: \"iana\"\n          },\n          \"application/atf\": {\n            source: \"iana\"\n          },\n          \"application/atfx\": {\n            source: \"iana\"\n          },\n          \"application/atom+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"atom\"]\n          },\n          \"application/atomcat+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"atomcat\"]\n          },\n          \"application/atomdeleted+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"atomdeleted\"]\n          },\n          \"application/atomicmail\": {\n            source: \"iana\"\n          },\n          \"application/atomsvc+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"atomsvc\"]\n          },\n          \"application/atsc-dwd+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"dwd\"]\n          },\n          \"application/atsc-dynamic-event-message\": {\n            source: \"iana\"\n          },\n          \"application/atsc-held+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"held\"]\n          },\n          \"application/atsc-rdt+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/atsc-rsat+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rsat\"]\n          },\n          \"application/atxml\": {\n            source: \"iana\"\n          },\n          \"application/auth-policy+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/bacnet-xdd+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/batch-smtp\": {\n            source: \"iana\"\n          },\n          \"application/bdoc\": {\n            compressible: false,\n            extensions: [\"bdoc\"]\n          },\n          \"application/beep+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/calendar+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/calendar+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xcs\"]\n          },\n          \"application/call-completion\": {\n            source: \"iana\"\n          },\n          \"application/cals-1840\": {\n            source: \"iana\"\n          },\n          \"application/captive+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cbor\": {\n            source: \"iana\"\n          },\n          \"application/cbor-seq\": {\n            source: \"iana\"\n          },\n          \"application/cccex\": {\n            source: \"iana\"\n          },\n          \"application/ccmp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/ccxml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ccxml\"]\n          },\n          \"application/cdfx+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"cdfx\"]\n          },\n          \"application/cdmi-capability\": {\n            source: \"iana\",\n            extensions: [\"cdmia\"]\n          },\n          \"application/cdmi-container\": {\n            source: \"iana\",\n            extensions: [\"cdmic\"]\n          },\n          \"application/cdmi-domain\": {\n            source: \"iana\",\n            extensions: [\"cdmid\"]\n          },\n          \"application/cdmi-object\": {\n            source: \"iana\",\n            extensions: [\"cdmio\"]\n          },\n          \"application/cdmi-queue\": {\n            source: \"iana\",\n            extensions: [\"cdmiq\"]\n          },\n          \"application/cdni\": {\n            source: \"iana\"\n          },\n          \"application/cea\": {\n            source: \"iana\"\n          },\n          \"application/cea-2018+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cellml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cfw\": {\n            source: \"iana\"\n          },\n          \"application/city+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/clr\": {\n            source: \"iana\"\n          },\n          \"application/clue+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/clue_info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cms\": {\n            source: \"iana\"\n          },\n          \"application/cnrp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/coap-group+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/coap-payload\": {\n            source: \"iana\"\n          },\n          \"application/commonground\": {\n            source: \"iana\"\n          },\n          \"application/conference-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cose\": {\n            source: \"iana\"\n          },\n          \"application/cose-key\": {\n            source: \"iana\"\n          },\n          \"application/cose-key-set\": {\n            source: \"iana\"\n          },\n          \"application/cpl+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"cpl\"]\n          },\n          \"application/csrattrs\": {\n            source: \"iana\"\n          },\n          \"application/csta+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cstadata+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/csvm+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/cu-seeme\": {\n            source: \"apache\",\n            extensions: [\"cu\"]\n          },\n          \"application/cwt\": {\n            source: \"iana\"\n          },\n          \"application/cybercash\": {\n            source: \"iana\"\n          },\n          \"application/dart\": {\n            compressible: true\n          },\n          \"application/dash+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mpd\"]\n          },\n          \"application/dash-patch+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mpp\"]\n          },\n          \"application/dashdelta\": {\n            source: \"iana\"\n          },\n          \"application/davmount+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"davmount\"]\n          },\n          \"application/dca-rft\": {\n            source: \"iana\"\n          },\n          \"application/dcd\": {\n            source: \"iana\"\n          },\n          \"application/dec-dx\": {\n            source: \"iana\"\n          },\n          \"application/dialog-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/dicom\": {\n            source: \"iana\"\n          },\n          \"application/dicom+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/dicom+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/dii\": {\n            source: \"iana\"\n          },\n          \"application/dit\": {\n            source: \"iana\"\n          },\n          \"application/dns\": {\n            source: \"iana\"\n          },\n          \"application/dns+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/dns-message\": {\n            source: \"iana\"\n          },\n          \"application/docbook+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"dbk\"]\n          },\n          \"application/dots+cbor\": {\n            source: \"iana\"\n          },\n          \"application/dskpp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/dssc+der\": {\n            source: \"iana\",\n            extensions: [\"dssc\"]\n          },\n          \"application/dssc+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xdssc\"]\n          },\n          \"application/dvcs\": {\n            source: \"iana\"\n          },\n          \"application/ecmascript\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"es\", \"ecma\"]\n          },\n          \"application/edi-consent\": {\n            source: \"iana\"\n          },\n          \"application/edi-x12\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/edifact\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/efi\": {\n            source: \"iana\"\n          },\n          \"application/elm+json\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/elm+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.cap+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/emergencycalldata.comment+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.control+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.deviceinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.ecall.msd\": {\n            source: \"iana\"\n          },\n          \"application/emergencycalldata.providerinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.serviceinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.subscriberinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emergencycalldata.veds+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/emma+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"emma\"]\n          },\n          \"application/emotionml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"emotionml\"]\n          },\n          \"application/encaprtp\": {\n            source: \"iana\"\n          },\n          \"application/epp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/epub+zip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"epub\"]\n          },\n          \"application/eshop\": {\n            source: \"iana\"\n          },\n          \"application/exi\": {\n            source: \"iana\",\n            extensions: [\"exi\"]\n          },\n          \"application/expect-ct-report+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/express\": {\n            source: \"iana\",\n            extensions: [\"exp\"]\n          },\n          \"application/fastinfoset\": {\n            source: \"iana\"\n          },\n          \"application/fastsoap\": {\n            source: \"iana\"\n          },\n          \"application/fdt+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"fdt\"]\n          },\n          \"application/fhir+json\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/fhir+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/fido.trusted-apps+json\": {\n            compressible: true\n          },\n          \"application/fits\": {\n            source: \"iana\"\n          },\n          \"application/flexfec\": {\n            source: \"iana\"\n          },\n          \"application/font-sfnt\": {\n            source: \"iana\"\n          },\n          \"application/font-tdpfr\": {\n            source: \"iana\",\n            extensions: [\"pfr\"]\n          },\n          \"application/font-woff\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/framework-attributes+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/geo+json\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"geojson\"]\n          },\n          \"application/geo+json-seq\": {\n            source: \"iana\"\n          },\n          \"application/geopackage+sqlite3\": {\n            source: \"iana\"\n          },\n          \"application/geoxacml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/gltf-buffer\": {\n            source: \"iana\"\n          },\n          \"application/gml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"gml\"]\n          },\n          \"application/gpx+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"gpx\"]\n          },\n          \"application/gxf\": {\n            source: \"apache\",\n            extensions: [\"gxf\"]\n          },\n          \"application/gzip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"gz\"]\n          },\n          \"application/h224\": {\n            source: \"iana\"\n          },\n          \"application/held+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/hjson\": {\n            extensions: [\"hjson\"]\n          },\n          \"application/http\": {\n            source: \"iana\"\n          },\n          \"application/hyperstudio\": {\n            source: \"iana\",\n            extensions: [\"stk\"]\n          },\n          \"application/ibe-key-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/ibe-pkg-reply+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/ibe-pp-data\": {\n            source: \"iana\"\n          },\n          \"application/iges\": {\n            source: \"iana\"\n          },\n          \"application/im-iscomposing+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/index\": {\n            source: \"iana\"\n          },\n          \"application/index.cmd\": {\n            source: \"iana\"\n          },\n          \"application/index.obj\": {\n            source: \"iana\"\n          },\n          \"application/index.response\": {\n            source: \"iana\"\n          },\n          \"application/index.vnd\": {\n            source: \"iana\"\n          },\n          \"application/inkml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ink\", \"inkml\"]\n          },\n          \"application/iotp\": {\n            source: \"iana\"\n          },\n          \"application/ipfix\": {\n            source: \"iana\",\n            extensions: [\"ipfix\"]\n          },\n          \"application/ipp\": {\n            source: \"iana\"\n          },\n          \"application/isup\": {\n            source: \"iana\"\n          },\n          \"application/its+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"its\"]\n          },\n          \"application/java-archive\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"jar\", \"war\", \"ear\"]\n          },\n          \"application/java-serialized-object\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"ser\"]\n          },\n          \"application/java-vm\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"class\"]\n          },\n          \"application/javascript\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"js\", \"mjs\"]\n          },\n          \"application/jf2feed+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/jose\": {\n            source: \"iana\"\n          },\n          \"application/jose+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/jrd+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/jscalendar+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/json\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"json\", \"map\"]\n          },\n          \"application/json-patch+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/json-seq\": {\n            source: \"iana\"\n          },\n          \"application/json5\": {\n            extensions: [\"json5\"]\n          },\n          \"application/jsonml+json\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"jsonml\"]\n          },\n          \"application/jwk+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/jwk-set+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/jwt\": {\n            source: \"iana\"\n          },\n          \"application/kpml-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/kpml-response+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/ld+json\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"jsonld\"]\n          },\n          \"application/lgr+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"lgr\"]\n          },\n          \"application/link-format\": {\n            source: \"iana\"\n          },\n          \"application/load-control+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/lost+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"lostxml\"]\n          },\n          \"application/lostsync+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/lpf+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/lxf\": {\n            source: \"iana\"\n          },\n          \"application/mac-binhex40\": {\n            source: \"iana\",\n            extensions: [\"hqx\"]\n          },\n          \"application/mac-compactpro\": {\n            source: \"apache\",\n            extensions: [\"cpt\"]\n          },\n          \"application/macwriteii\": {\n            source: \"iana\"\n          },\n          \"application/mads+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mads\"]\n          },\n          \"application/manifest+json\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"webmanifest\"]\n          },\n          \"application/marc\": {\n            source: \"iana\",\n            extensions: [\"mrc\"]\n          },\n          \"application/marcxml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mrcx\"]\n          },\n          \"application/mathematica\": {\n            source: \"iana\",\n            extensions: [\"ma\", \"nb\", \"mb\"]\n          },\n          \"application/mathml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mathml\"]\n          },\n          \"application/mathml-content+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mathml-presentation+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-associated-procedure-description+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-deregister+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-envelope+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-msk+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-msk-response+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-protection-description+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-reception-report+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-register+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-register-response+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-schedule+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbms-user-service-description+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mbox\": {\n            source: \"iana\",\n            extensions: [\"mbox\"]\n          },\n          \"application/media-policy-dataset+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mpf\"]\n          },\n          \"application/media_control+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mediaservercontrol+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mscml\"]\n          },\n          \"application/merge-patch+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/metalink+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"metalink\"]\n          },\n          \"application/metalink4+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"meta4\"]\n          },\n          \"application/mets+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mets\"]\n          },\n          \"application/mf4\": {\n            source: \"iana\"\n          },\n          \"application/mikey\": {\n            source: \"iana\"\n          },\n          \"application/mipc\": {\n            source: \"iana\"\n          },\n          \"application/missing-blocks+cbor-seq\": {\n            source: \"iana\"\n          },\n          \"application/mmt-aei+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"maei\"]\n          },\n          \"application/mmt-usd+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"musd\"]\n          },\n          \"application/mods+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mods\"]\n          },\n          \"application/moss-keys\": {\n            source: \"iana\"\n          },\n          \"application/moss-signature\": {\n            source: \"iana\"\n          },\n          \"application/mosskey-data\": {\n            source: \"iana\"\n          },\n          \"application/mosskey-request\": {\n            source: \"iana\"\n          },\n          \"application/mp21\": {\n            source: \"iana\",\n            extensions: [\"m21\", \"mp21\"]\n          },\n          \"application/mp4\": {\n            source: \"iana\",\n            extensions: [\"mp4s\", \"m4p\"]\n          },\n          \"application/mpeg4-generic\": {\n            source: \"iana\"\n          },\n          \"application/mpeg4-iod\": {\n            source: \"iana\"\n          },\n          \"application/mpeg4-iod-xmt\": {\n            source: \"iana\"\n          },\n          \"application/mrb-consumer+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/mrb-publish+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/msc-ivr+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/msc-mixer+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/msword\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"doc\", \"dot\"]\n          },\n          \"application/mud+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/multipart-core\": {\n            source: \"iana\"\n          },\n          \"application/mxf\": {\n            source: \"iana\",\n            extensions: [\"mxf\"]\n          },\n          \"application/n-quads\": {\n            source: \"iana\",\n            extensions: [\"nq\"]\n          },\n          \"application/n-triples\": {\n            source: \"iana\",\n            extensions: [\"nt\"]\n          },\n          \"application/nasdata\": {\n            source: \"iana\"\n          },\n          \"application/news-checkgroups\": {\n            source: \"iana\",\n            charset: \"US-ASCII\"\n          },\n          \"application/news-groupinfo\": {\n            source: \"iana\",\n            charset: \"US-ASCII\"\n          },\n          \"application/news-transmission\": {\n            source: \"iana\"\n          },\n          \"application/nlsml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/node\": {\n            source: \"iana\",\n            extensions: [\"cjs\"]\n          },\n          \"application/nss\": {\n            source: \"iana\"\n          },\n          \"application/oauth-authz-req+jwt\": {\n            source: \"iana\"\n          },\n          \"application/oblivious-dns-message\": {\n            source: \"iana\"\n          },\n          \"application/ocsp-request\": {\n            source: \"iana\"\n          },\n          \"application/ocsp-response\": {\n            source: \"iana\"\n          },\n          \"application/octet-stream\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"bin\", \"dms\", \"lrf\", \"mar\", \"so\", \"dist\", \"distz\", \"pkg\", \"bpk\", \"dump\", \"elc\", \"deploy\", \"exe\", \"dll\", \"deb\", \"dmg\", \"iso\", \"img\", \"msi\", \"msp\", \"msm\", \"buffer\"]\n          },\n          \"application/oda\": {\n            source: \"iana\",\n            extensions: [\"oda\"]\n          },\n          \"application/odm+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/odx\": {\n            source: \"iana\"\n          },\n          \"application/oebps-package+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"opf\"]\n          },\n          \"application/ogg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"ogx\"]\n          },\n          \"application/omdoc+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"omdoc\"]\n          },\n          \"application/onenote\": {\n            source: \"apache\",\n            extensions: [\"onetoc\", \"onetoc2\", \"onetmp\", \"onepkg\"]\n          },\n          \"application/opc-nodeset+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/oscore\": {\n            source: \"iana\"\n          },\n          \"application/oxps\": {\n            source: \"iana\",\n            extensions: [\"oxps\"]\n          },\n          \"application/p21\": {\n            source: \"iana\"\n          },\n          \"application/p21+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/p2p-overlay+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"relo\"]\n          },\n          \"application/parityfec\": {\n            source: \"iana\"\n          },\n          \"application/passport\": {\n            source: \"iana\"\n          },\n          \"application/patch-ops-error+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xer\"]\n          },\n          \"application/pdf\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"pdf\"]\n          },\n          \"application/pdx\": {\n            source: \"iana\"\n          },\n          \"application/pem-certificate-chain\": {\n            source: \"iana\"\n          },\n          \"application/pgp-encrypted\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"pgp\"]\n          },\n          \"application/pgp-keys\": {\n            source: \"iana\",\n            extensions: [\"asc\"]\n          },\n          \"application/pgp-signature\": {\n            source: \"iana\",\n            extensions: [\"asc\", \"sig\"]\n          },\n          \"application/pics-rules\": {\n            source: \"apache\",\n            extensions: [\"prf\"]\n          },\n          \"application/pidf+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/pidf-diff+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/pkcs10\": {\n            source: \"iana\",\n            extensions: [\"p10\"]\n          },\n          \"application/pkcs12\": {\n            source: \"iana\"\n          },\n          \"application/pkcs7-mime\": {\n            source: \"iana\",\n            extensions: [\"p7m\", \"p7c\"]\n          },\n          \"application/pkcs7-signature\": {\n            source: \"iana\",\n            extensions: [\"p7s\"]\n          },\n          \"application/pkcs8\": {\n            source: \"iana\",\n            extensions: [\"p8\"]\n          },\n          \"application/pkcs8-encrypted\": {\n            source: \"iana\"\n          },\n          \"application/pkix-attr-cert\": {\n            source: \"iana\",\n            extensions: [\"ac\"]\n          },\n          \"application/pkix-cert\": {\n            source: \"iana\",\n            extensions: [\"cer\"]\n          },\n          \"application/pkix-crl\": {\n            source: \"iana\",\n            extensions: [\"crl\"]\n          },\n          \"application/pkix-pkipath\": {\n            source: \"iana\",\n            extensions: [\"pkipath\"]\n          },\n          \"application/pkixcmp\": {\n            source: \"iana\",\n            extensions: [\"pki\"]\n          },\n          \"application/pls+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"pls\"]\n          },\n          \"application/poc-settings+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/postscript\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ai\", \"eps\", \"ps\"]\n          },\n          \"application/ppsp-tracker+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/problem+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/problem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/provenance+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"provx\"]\n          },\n          \"application/prs.alvestrand.titrax-sheet\": {\n            source: \"iana\"\n          },\n          \"application/prs.cww\": {\n            source: \"iana\",\n            extensions: [\"cww\"]\n          },\n          \"application/prs.cyn\": {\n            source: \"iana\",\n            charset: \"7-BIT\"\n          },\n          \"application/prs.hpub+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/prs.nprend\": {\n            source: \"iana\"\n          },\n          \"application/prs.plucker\": {\n            source: \"iana\"\n          },\n          \"application/prs.rdf-xml-crypt\": {\n            source: \"iana\"\n          },\n          \"application/prs.xsf+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/pskc+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"pskcxml\"]\n          },\n          \"application/pvd+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/qsig\": {\n            source: \"iana\"\n          },\n          \"application/raml+yaml\": {\n            compressible: true,\n            extensions: [\"raml\"]\n          },\n          \"application/raptorfec\": {\n            source: \"iana\"\n          },\n          \"application/rdap+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/rdf+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rdf\", \"owl\"]\n          },\n          \"application/reginfo+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rif\"]\n          },\n          \"application/relax-ng-compact-syntax\": {\n            source: \"iana\",\n            extensions: [\"rnc\"]\n          },\n          \"application/remote-printing\": {\n            source: \"iana\"\n          },\n          \"application/reputon+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/resource-lists+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rl\"]\n          },\n          \"application/resource-lists-diff+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rld\"]\n          },\n          \"application/rfc+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/riscos\": {\n            source: \"iana\"\n          },\n          \"application/rlmi+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/rls-services+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rs\"]\n          },\n          \"application/route-apd+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rapd\"]\n          },\n          \"application/route-s-tsid+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"sls\"]\n          },\n          \"application/route-usd+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rusd\"]\n          },\n          \"application/rpki-ghostbusters\": {\n            source: \"iana\",\n            extensions: [\"gbr\"]\n          },\n          \"application/rpki-manifest\": {\n            source: \"iana\",\n            extensions: [\"mft\"]\n          },\n          \"application/rpki-publication\": {\n            source: \"iana\"\n          },\n          \"application/rpki-roa\": {\n            source: \"iana\",\n            extensions: [\"roa\"]\n          },\n          \"application/rpki-updown\": {\n            source: \"iana\"\n          },\n          \"application/rsd+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"rsd\"]\n          },\n          \"application/rss+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"rss\"]\n          },\n          \"application/rtf\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rtf\"]\n          },\n          \"application/rtploopback\": {\n            source: \"iana\"\n          },\n          \"application/rtx\": {\n            source: \"iana\"\n          },\n          \"application/samlassertion+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/samlmetadata+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sarif+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sarif-external-properties+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sbe\": {\n            source: \"iana\"\n          },\n          \"application/sbml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"sbml\"]\n          },\n          \"application/scaip+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/scim+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/scvp-cv-request\": {\n            source: \"iana\",\n            extensions: [\"scq\"]\n          },\n          \"application/scvp-cv-response\": {\n            source: \"iana\",\n            extensions: [\"scs\"]\n          },\n          \"application/scvp-vp-request\": {\n            source: \"iana\",\n            extensions: [\"spq\"]\n          },\n          \"application/scvp-vp-response\": {\n            source: \"iana\",\n            extensions: [\"spp\"]\n          },\n          \"application/sdp\": {\n            source: \"iana\",\n            extensions: [\"sdp\"]\n          },\n          \"application/secevent+jwt\": {\n            source: \"iana\"\n          },\n          \"application/senml+cbor\": {\n            source: \"iana\"\n          },\n          \"application/senml+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/senml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"senmlx\"]\n          },\n          \"application/senml-etch+cbor\": {\n            source: \"iana\"\n          },\n          \"application/senml-etch+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/senml-exi\": {\n            source: \"iana\"\n          },\n          \"application/sensml+cbor\": {\n            source: \"iana\"\n          },\n          \"application/sensml+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sensml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"sensmlx\"]\n          },\n          \"application/sensml-exi\": {\n            source: \"iana\"\n          },\n          \"application/sep+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sep-exi\": {\n            source: \"iana\"\n          },\n          \"application/session-info\": {\n            source: \"iana\"\n          },\n          \"application/set-payment\": {\n            source: \"iana\"\n          },\n          \"application/set-payment-initiation\": {\n            source: \"iana\",\n            extensions: [\"setpay\"]\n          },\n          \"application/set-registration\": {\n            source: \"iana\"\n          },\n          \"application/set-registration-initiation\": {\n            source: \"iana\",\n            extensions: [\"setreg\"]\n          },\n          \"application/sgml\": {\n            source: \"iana\"\n          },\n          \"application/sgml-open-catalog\": {\n            source: \"iana\"\n          },\n          \"application/shf+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"shf\"]\n          },\n          \"application/sieve\": {\n            source: \"iana\",\n            extensions: [\"siv\", \"sieve\"]\n          },\n          \"application/simple-filter+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/simple-message-summary\": {\n            source: \"iana\"\n          },\n          \"application/simplesymbolcontainer\": {\n            source: \"iana\"\n          },\n          \"application/sipc\": {\n            source: \"iana\"\n          },\n          \"application/slate\": {\n            source: \"iana\"\n          },\n          \"application/smil\": {\n            source: \"iana\"\n          },\n          \"application/smil+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"smi\", \"smil\"]\n          },\n          \"application/smpte336m\": {\n            source: \"iana\"\n          },\n          \"application/soap+fastinfoset\": {\n            source: \"iana\"\n          },\n          \"application/soap+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sparql-query\": {\n            source: \"iana\",\n            extensions: [\"rq\"]\n          },\n          \"application/sparql-results+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"srx\"]\n          },\n          \"application/spdx+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/spirits-event+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/sql\": {\n            source: \"iana\"\n          },\n          \"application/srgs\": {\n            source: \"iana\",\n            extensions: [\"gram\"]\n          },\n          \"application/srgs+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"grxml\"]\n          },\n          \"application/sru+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"sru\"]\n          },\n          \"application/ssdl+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"ssdl\"]\n          },\n          \"application/ssml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ssml\"]\n          },\n          \"application/stix+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/swid+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"swidtag\"]\n          },\n          \"application/tamp-apex-update\": {\n            source: \"iana\"\n          },\n          \"application/tamp-apex-update-confirm\": {\n            source: \"iana\"\n          },\n          \"application/tamp-community-update\": {\n            source: \"iana\"\n          },\n          \"application/tamp-community-update-confirm\": {\n            source: \"iana\"\n          },\n          \"application/tamp-error\": {\n            source: \"iana\"\n          },\n          \"application/tamp-sequence-adjust\": {\n            source: \"iana\"\n          },\n          \"application/tamp-sequence-adjust-confirm\": {\n            source: \"iana\"\n          },\n          \"application/tamp-status-query\": {\n            source: \"iana\"\n          },\n          \"application/tamp-status-response\": {\n            source: \"iana\"\n          },\n          \"application/tamp-update\": {\n            source: \"iana\"\n          },\n          \"application/tamp-update-confirm\": {\n            source: \"iana\"\n          },\n          \"application/tar\": {\n            compressible: true\n          },\n          \"application/taxii+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/td+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/tei+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"tei\", \"teicorpus\"]\n          },\n          \"application/tetra_isi\": {\n            source: \"iana\"\n          },\n          \"application/thraud+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"tfi\"]\n          },\n          \"application/timestamp-query\": {\n            source: \"iana\"\n          },\n          \"application/timestamp-reply\": {\n            source: \"iana\"\n          },\n          \"application/timestamped-data\": {\n            source: \"iana\",\n            extensions: [\"tsd\"]\n          },\n          \"application/tlsrpt+gzip\": {\n            source: \"iana\"\n          },\n          \"application/tlsrpt+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/tnauthlist\": {\n            source: \"iana\"\n          },\n          \"application/token-introspection+jwt\": {\n            source: \"iana\"\n          },\n          \"application/toml\": {\n            compressible: true,\n            extensions: [\"toml\"]\n          },\n          \"application/trickle-ice-sdpfrag\": {\n            source: \"iana\"\n          },\n          \"application/trig\": {\n            source: \"iana\",\n            extensions: [\"trig\"]\n          },\n          \"application/ttml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ttml\"]\n          },\n          \"application/tve-trigger\": {\n            source: \"iana\"\n          },\n          \"application/tzif\": {\n            source: \"iana\"\n          },\n          \"application/tzif-leap\": {\n            source: \"iana\"\n          },\n          \"application/ubjson\": {\n            compressible: false,\n            extensions: [\"ubj\"]\n          },\n          \"application/ulpfec\": {\n            source: \"iana\"\n          },\n          \"application/urc-grpsheet+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/urc-ressheet+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rsheet\"]\n          },\n          \"application/urc-targetdesc+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"td\"]\n          },\n          \"application/urc-uisocketdesc+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vcard+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vcard+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vemmi\": {\n            source: \"iana\"\n          },\n          \"application/vividence.scriptfile\": {\n            source: \"apache\"\n          },\n          \"application/vnd.1000minds.decision-model+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"1km\"]\n          },\n          \"application/vnd.3gpp-prose+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp-prose-pc3ch+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp-v2x-local-service-information\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.5gnas\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.access-transfer-events+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.bsf+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.gmop+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.gtpc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.interworking-data\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.lpp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.mc-signalling-ear\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.mcdata-affiliation-command+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcdata-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcdata-payload\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.mcdata-service-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcdata-signalling\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.mcdata-ue-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcdata-user-profile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-affiliation-command+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-floor-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-location-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-mbms-usage-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-service-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-signed+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-ue-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-ue-init-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcptt-user-profile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-affiliation-command+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-affiliation-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-location-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-mbms-usage-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-service-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-transmission-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-ue-config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mcvideo-user-profile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.mid-call+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.ngap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.pfcp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.pic-bw-large\": {\n            source: \"iana\",\n            extensions: [\"plb\"]\n          },\n          \"application/vnd.3gpp.pic-bw-small\": {\n            source: \"iana\",\n            extensions: [\"psb\"]\n          },\n          \"application/vnd.3gpp.pic-bw-var\": {\n            source: \"iana\",\n            extensions: [\"pvb\"]\n          },\n          \"application/vnd.3gpp.s1ap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.sms\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp.sms+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.srvcc-ext+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.srvcc-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.state-and-event-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp.ussd+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp2.bcmcsinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.3gpp2.sms\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3gpp2.tcap\": {\n            source: \"iana\",\n            extensions: [\"tcap\"]\n          },\n          \"application/vnd.3lightssoftware.imagescal\": {\n            source: \"iana\"\n          },\n          \"application/vnd.3m.post-it-notes\": {\n            source: \"iana\",\n            extensions: [\"pwn\"]\n          },\n          \"application/vnd.accpac.simply.aso\": {\n            source: \"iana\",\n            extensions: [\"aso\"]\n          },\n          \"application/vnd.accpac.simply.imp\": {\n            source: \"iana\",\n            extensions: [\"imp\"]\n          },\n          \"application/vnd.acucobol\": {\n            source: \"iana\",\n            extensions: [\"acu\"]\n          },\n          \"application/vnd.acucorp\": {\n            source: \"iana\",\n            extensions: [\"atc\", \"acutc\"]\n          },\n          \"application/vnd.adobe.air-application-installer-package+zip\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"air\"]\n          },\n          \"application/vnd.adobe.flash.movie\": {\n            source: \"iana\"\n          },\n          \"application/vnd.adobe.formscentral.fcdt\": {\n            source: \"iana\",\n            extensions: [\"fcdt\"]\n          },\n          \"application/vnd.adobe.fxp\": {\n            source: \"iana\",\n            extensions: [\"fxp\", \"fxpl\"]\n          },\n          \"application/vnd.adobe.partial-upload\": {\n            source: \"iana\"\n          },\n          \"application/vnd.adobe.xdp+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xdp\"]\n          },\n          \"application/vnd.adobe.xfdf\": {\n            source: \"iana\",\n            extensions: [\"xfdf\"]\n          },\n          \"application/vnd.aether.imp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.afplinedata\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.afplinedata-pagedef\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.cmoca-cmresource\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.foca-charset\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.foca-codedfont\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.foca-codepage\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-cmtable\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-formdef\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-mediummap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-objectcontainer\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-overlay\": {\n            source: \"iana\"\n          },\n          \"application/vnd.afpc.modca-pagesegment\": {\n            source: \"iana\"\n          },\n          \"application/vnd.age\": {\n            source: \"iana\",\n            extensions: [\"age\"]\n          },\n          \"application/vnd.ah-barcode\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ahead.space\": {\n            source: \"iana\",\n            extensions: [\"ahead\"]\n          },\n          \"application/vnd.airzip.filesecure.azf\": {\n            source: \"iana\",\n            extensions: [\"azf\"]\n          },\n          \"application/vnd.airzip.filesecure.azs\": {\n            source: \"iana\",\n            extensions: [\"azs\"]\n          },\n          \"application/vnd.amadeus+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.amazon.ebook\": {\n            source: \"apache\",\n            extensions: [\"azw\"]\n          },\n          \"application/vnd.amazon.mobi8-ebook\": {\n            source: \"iana\"\n          },\n          \"application/vnd.americandynamics.acc\": {\n            source: \"iana\",\n            extensions: [\"acc\"]\n          },\n          \"application/vnd.amiga.ami\": {\n            source: \"iana\",\n            extensions: [\"ami\"]\n          },\n          \"application/vnd.amundsen.maze+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.android.ota\": {\n            source: \"iana\"\n          },\n          \"application/vnd.android.package-archive\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"apk\"]\n          },\n          \"application/vnd.anki\": {\n            source: \"iana\"\n          },\n          \"application/vnd.anser-web-certificate-issue-initiation\": {\n            source: \"iana\",\n            extensions: [\"cii\"]\n          },\n          \"application/vnd.anser-web-funds-transfer-initiation\": {\n            source: \"apache\",\n            extensions: [\"fti\"]\n          },\n          \"application/vnd.antix.game-component\": {\n            source: \"iana\",\n            extensions: [\"atx\"]\n          },\n          \"application/vnd.apache.arrow.file\": {\n            source: \"iana\"\n          },\n          \"application/vnd.apache.arrow.stream\": {\n            source: \"iana\"\n          },\n          \"application/vnd.apache.thrift.binary\": {\n            source: \"iana\"\n          },\n          \"application/vnd.apache.thrift.compact\": {\n            source: \"iana\"\n          },\n          \"application/vnd.apache.thrift.json\": {\n            source: \"iana\"\n          },\n          \"application/vnd.api+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.aplextor.warrp+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.apothekende.reservation+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.apple.installer+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mpkg\"]\n          },\n          \"application/vnd.apple.keynote\": {\n            source: \"iana\",\n            extensions: [\"key\"]\n          },\n          \"application/vnd.apple.mpegurl\": {\n            source: \"iana\",\n            extensions: [\"m3u8\"]\n          },\n          \"application/vnd.apple.numbers\": {\n            source: \"iana\",\n            extensions: [\"numbers\"]\n          },\n          \"application/vnd.apple.pages\": {\n            source: \"iana\",\n            extensions: [\"pages\"]\n          },\n          \"application/vnd.apple.pkpass\": {\n            compressible: false,\n            extensions: [\"pkpass\"]\n          },\n          \"application/vnd.arastra.swi\": {\n            source: \"iana\"\n          },\n          \"application/vnd.aristanetworks.swi\": {\n            source: \"iana\",\n            extensions: [\"swi\"]\n          },\n          \"application/vnd.artisan+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.artsquare\": {\n            source: \"iana\"\n          },\n          \"application/vnd.astraea-software.iota\": {\n            source: \"iana\",\n            extensions: [\"iota\"]\n          },\n          \"application/vnd.audiograph\": {\n            source: \"iana\",\n            extensions: [\"aep\"]\n          },\n          \"application/vnd.autopackage\": {\n            source: \"iana\"\n          },\n          \"application/vnd.avalon+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.avistar+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.balsamiq.bmml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"bmml\"]\n          },\n          \"application/vnd.balsamiq.bmpr\": {\n            source: \"iana\"\n          },\n          \"application/vnd.banana-accounting\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bbf.usp.error\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bbf.usp.msg\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bbf.usp.msg+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.bekitzur-stech+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.bint.med-content\": {\n            source: \"iana\"\n          },\n          \"application/vnd.biopax.rdf+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.blink-idb-value-wrapper\": {\n            source: \"iana\"\n          },\n          \"application/vnd.blueice.multipass\": {\n            source: \"iana\",\n            extensions: [\"mpm\"]\n          },\n          \"application/vnd.bluetooth.ep.oob\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bluetooth.le.oob\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bmi\": {\n            source: \"iana\",\n            extensions: [\"bmi\"]\n          },\n          \"application/vnd.bpf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.bpf3\": {\n            source: \"iana\"\n          },\n          \"application/vnd.businessobjects\": {\n            source: \"iana\",\n            extensions: [\"rep\"]\n          },\n          \"application/vnd.byu.uapi+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cab-jscript\": {\n            source: \"iana\"\n          },\n          \"application/vnd.canon-cpdl\": {\n            source: \"iana\"\n          },\n          \"application/vnd.canon-lips\": {\n            source: \"iana\"\n          },\n          \"application/vnd.capasystems-pg+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cendio.thinlinc.clientconf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.century-systems.tcp_stream\": {\n            source: \"iana\"\n          },\n          \"application/vnd.chemdraw+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"cdxml\"]\n          },\n          \"application/vnd.chess-pgn\": {\n            source: \"iana\"\n          },\n          \"application/vnd.chipnuts.karaoke-mmd\": {\n            source: \"iana\",\n            extensions: [\"mmd\"]\n          },\n          \"application/vnd.ciedi\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cinderella\": {\n            source: \"iana\",\n            extensions: [\"cdy\"]\n          },\n          \"application/vnd.cirpack.isdn-ext\": {\n            source: \"iana\"\n          },\n          \"application/vnd.citationstyles.style+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"csl\"]\n          },\n          \"application/vnd.claymore\": {\n            source: \"iana\",\n            extensions: [\"cla\"]\n          },\n          \"application/vnd.cloanto.rp9\": {\n            source: \"iana\",\n            extensions: [\"rp9\"]\n          },\n          \"application/vnd.clonk.c4group\": {\n            source: \"iana\",\n            extensions: [\"c4g\", \"c4d\", \"c4f\", \"c4p\", \"c4u\"]\n          },\n          \"application/vnd.cluetrust.cartomobile-config\": {\n            source: \"iana\",\n            extensions: [\"c11amc\"]\n          },\n          \"application/vnd.cluetrust.cartomobile-config-pkg\": {\n            source: \"iana\",\n            extensions: [\"c11amz\"]\n          },\n          \"application/vnd.coffeescript\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.document\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.document-template\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.presentation\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.presentation-template\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.spreadsheet\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collabio.xodocuments.spreadsheet-template\": {\n            source: \"iana\"\n          },\n          \"application/vnd.collection+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.collection.doc+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.collection.next+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.comicbook+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.comicbook-rar\": {\n            source: \"iana\"\n          },\n          \"application/vnd.commerce-battelle\": {\n            source: \"iana\"\n          },\n          \"application/vnd.commonspace\": {\n            source: \"iana\",\n            extensions: [\"csp\"]\n          },\n          \"application/vnd.contact.cmsg\": {\n            source: \"iana\",\n            extensions: [\"cdbcmsg\"]\n          },\n          \"application/vnd.coreos.ignition+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cosmocaller\": {\n            source: \"iana\",\n            extensions: [\"cmc\"]\n          },\n          \"application/vnd.crick.clicker\": {\n            source: \"iana\",\n            extensions: [\"clkx\"]\n          },\n          \"application/vnd.crick.clicker.keyboard\": {\n            source: \"iana\",\n            extensions: [\"clkk\"]\n          },\n          \"application/vnd.crick.clicker.palette\": {\n            source: \"iana\",\n            extensions: [\"clkp\"]\n          },\n          \"application/vnd.crick.clicker.template\": {\n            source: \"iana\",\n            extensions: [\"clkt\"]\n          },\n          \"application/vnd.crick.clicker.wordbank\": {\n            source: \"iana\",\n            extensions: [\"clkw\"]\n          },\n          \"application/vnd.criticaltools.wbs+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wbs\"]\n          },\n          \"application/vnd.cryptii.pipe+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.crypto-shade-file\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cryptomator.encrypted\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cryptomator.vault\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ctc-posml\": {\n            source: \"iana\",\n            extensions: [\"pml\"]\n          },\n          \"application/vnd.ctct.ws+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cups-pdf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cups-postscript\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cups-ppd\": {\n            source: \"iana\",\n            extensions: [\"ppd\"]\n          },\n          \"application/vnd.cups-raster\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cups-raw\": {\n            source: \"iana\"\n          },\n          \"application/vnd.curl\": {\n            source: \"iana\"\n          },\n          \"application/vnd.curl.car\": {\n            source: \"apache\",\n            extensions: [\"car\"]\n          },\n          \"application/vnd.curl.pcurl\": {\n            source: \"apache\",\n            extensions: [\"pcurl\"]\n          },\n          \"application/vnd.cyan.dean.root+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cybank\": {\n            source: \"iana\"\n          },\n          \"application/vnd.cyclonedx+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.cyclonedx+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.d2l.coursepackage1p0+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.d3m-dataset\": {\n            source: \"iana\"\n          },\n          \"application/vnd.d3m-problem\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dart\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"dart\"]\n          },\n          \"application/vnd.data-vision.rdz\": {\n            source: \"iana\",\n            extensions: [\"rdz\"]\n          },\n          \"application/vnd.datapackage+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dataresource+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dbf\": {\n            source: \"iana\",\n            extensions: [\"dbf\"]\n          },\n          \"application/vnd.debian.binary-package\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dece.data\": {\n            source: \"iana\",\n            extensions: [\"uvf\", \"uvvf\", \"uvd\", \"uvvd\"]\n          },\n          \"application/vnd.dece.ttml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"uvt\", \"uvvt\"]\n          },\n          \"application/vnd.dece.unspecified\": {\n            source: \"iana\",\n            extensions: [\"uvx\", \"uvvx\"]\n          },\n          \"application/vnd.dece.zip\": {\n            source: \"iana\",\n            extensions: [\"uvz\", \"uvvz\"]\n          },\n          \"application/vnd.denovo.fcselayout-link\": {\n            source: \"iana\",\n            extensions: [\"fe_launch\"]\n          },\n          \"application/vnd.desmume.movie\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dir-bi.plate-dl-nosuffix\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dm.delegation+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dna\": {\n            source: \"iana\",\n            extensions: [\"dna\"]\n          },\n          \"application/vnd.document+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dolby.mlp\": {\n            source: \"apache\",\n            extensions: [\"mlp\"]\n          },\n          \"application/vnd.dolby.mobile.1\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dolby.mobile.2\": {\n            source: \"iana\"\n          },\n          \"application/vnd.doremir.scorecloud-binary-document\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dpgraph\": {\n            source: \"iana\",\n            extensions: [\"dpg\"]\n          },\n          \"application/vnd.dreamfactory\": {\n            source: \"iana\",\n            extensions: [\"dfac\"]\n          },\n          \"application/vnd.drive+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ds-keypoint\": {\n            source: \"apache\",\n            extensions: [\"kpxx\"]\n          },\n          \"application/vnd.dtg.local\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dtg.local.flash\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dtg.local.html\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ait\": {\n            source: \"iana\",\n            extensions: [\"ait\"]\n          },\n          \"application/vnd.dvb.dvbisl+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.dvbj\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.esgcontainer\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ipdcdftnotifaccess\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ipdcesgaccess\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ipdcesgaccess2\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ipdcesgpdd\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.ipdcroaming\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.iptv.alfec-base\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.iptv.alfec-enhancement\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.notif-aggregate-root+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-container+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-generic+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-ia-msglist+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-ia-registration-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-ia-registration-response+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.notif-init+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.dvb.pfr\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dvb.service\": {\n            source: \"iana\",\n            extensions: [\"svc\"]\n          },\n          \"application/vnd.dxr\": {\n            source: \"iana\"\n          },\n          \"application/vnd.dynageo\": {\n            source: \"iana\",\n            extensions: [\"geo\"]\n          },\n          \"application/vnd.dzr\": {\n            source: \"iana\"\n          },\n          \"application/vnd.easykaraoke.cdgdownload\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecdis-update\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecip.rlp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.eclipse.ditto+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ecowin.chart\": {\n            source: \"iana\",\n            extensions: [\"mag\"]\n          },\n          \"application/vnd.ecowin.filerequest\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecowin.fileupdate\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecowin.series\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecowin.seriesrequest\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ecowin.seriesupdate\": {\n            source: \"iana\"\n          },\n          \"application/vnd.efi.img\": {\n            source: \"iana\"\n          },\n          \"application/vnd.efi.iso\": {\n            source: \"iana\"\n          },\n          \"application/vnd.emclient.accessrequest+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.enliven\": {\n            source: \"iana\",\n            extensions: [\"nml\"]\n          },\n          \"application/vnd.enphase.envoy\": {\n            source: \"iana\"\n          },\n          \"application/vnd.eprints.data+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.epson.esf\": {\n            source: \"iana\",\n            extensions: [\"esf\"]\n          },\n          \"application/vnd.epson.msf\": {\n            source: \"iana\",\n            extensions: [\"msf\"]\n          },\n          \"application/vnd.epson.quickanime\": {\n            source: \"iana\",\n            extensions: [\"qam\"]\n          },\n          \"application/vnd.epson.salt\": {\n            source: \"iana\",\n            extensions: [\"slt\"]\n          },\n          \"application/vnd.epson.ssf\": {\n            source: \"iana\",\n            extensions: [\"ssf\"]\n          },\n          \"application/vnd.ericsson.quickcall\": {\n            source: \"iana\"\n          },\n          \"application/vnd.espass-espass+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.eszigno3+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"es3\", \"et3\"]\n          },\n          \"application/vnd.etsi.aoc+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.asic-e+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.etsi.asic-s+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.etsi.cug+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvcommand+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvdiscovery+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvprofile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvsad-bc+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvsad-cod+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvsad-npvr+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvservice+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvsync+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.iptvueprofile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.mcid+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.mheg5\": {\n            source: \"iana\"\n          },\n          \"application/vnd.etsi.overload-control-policy-dataset+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.pstn+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.sci+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.simservs+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.timestamp-token\": {\n            source: \"iana\"\n          },\n          \"application/vnd.etsi.tsl+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.etsi.tsl.der\": {\n            source: \"iana\"\n          },\n          \"application/vnd.eu.kasparian.car+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.eudora.data\": {\n            source: \"iana\"\n          },\n          \"application/vnd.evolv.ecig.profile\": {\n            source: \"iana\"\n          },\n          \"application/vnd.evolv.ecig.settings\": {\n            source: \"iana\"\n          },\n          \"application/vnd.evolv.ecig.theme\": {\n            source: \"iana\"\n          },\n          \"application/vnd.exstream-empower+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.exstream-package\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ezpix-album\": {\n            source: \"iana\",\n            extensions: [\"ez2\"]\n          },\n          \"application/vnd.ezpix-package\": {\n            source: \"iana\",\n            extensions: [\"ez3\"]\n          },\n          \"application/vnd.f-secure.mobile\": {\n            source: \"iana\"\n          },\n          \"application/vnd.familysearch.gedcom+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.fastcopy-disk-image\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fdf\": {\n            source: \"iana\",\n            extensions: [\"fdf\"]\n          },\n          \"application/vnd.fdsn.mseed\": {\n            source: \"iana\",\n            extensions: [\"mseed\"]\n          },\n          \"application/vnd.fdsn.seed\": {\n            source: \"iana\",\n            extensions: [\"seed\", \"dataless\"]\n          },\n          \"application/vnd.ffsns\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ficlab.flb+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.filmit.zfc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fints\": {\n            source: \"iana\"\n          },\n          \"application/vnd.firemonkeys.cloudcell\": {\n            source: \"iana\"\n          },\n          \"application/vnd.flographit\": {\n            source: \"iana\",\n            extensions: [\"gph\"]\n          },\n          \"application/vnd.fluxtime.clip\": {\n            source: \"iana\",\n            extensions: [\"ftc\"]\n          },\n          \"application/vnd.font-fontforge-sfd\": {\n            source: \"iana\"\n          },\n          \"application/vnd.framemaker\": {\n            source: \"iana\",\n            extensions: [\"fm\", \"frame\", \"maker\", \"book\"]\n          },\n          \"application/vnd.frogans.fnc\": {\n            source: \"iana\",\n            extensions: [\"fnc\"]\n          },\n          \"application/vnd.frogans.ltf\": {\n            source: \"iana\",\n            extensions: [\"ltf\"]\n          },\n          \"application/vnd.fsc.weblaunch\": {\n            source: \"iana\",\n            extensions: [\"fsc\"]\n          },\n          \"application/vnd.fujifilm.fb.docuworks\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujifilm.fb.docuworks.binder\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujifilm.fb.docuworks.container\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujifilm.fb.jfi+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.fujitsu.oasys\": {\n            source: \"iana\",\n            extensions: [\"oas\"]\n          },\n          \"application/vnd.fujitsu.oasys2\": {\n            source: \"iana\",\n            extensions: [\"oa2\"]\n          },\n          \"application/vnd.fujitsu.oasys3\": {\n            source: \"iana\",\n            extensions: [\"oa3\"]\n          },\n          \"application/vnd.fujitsu.oasysgp\": {\n            source: \"iana\",\n            extensions: [\"fg5\"]\n          },\n          \"application/vnd.fujitsu.oasysprs\": {\n            source: \"iana\",\n            extensions: [\"bh2\"]\n          },\n          \"application/vnd.fujixerox.art-ex\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujixerox.art4\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujixerox.ddd\": {\n            source: \"iana\",\n            extensions: [\"ddd\"]\n          },\n          \"application/vnd.fujixerox.docuworks\": {\n            source: \"iana\",\n            extensions: [\"xdw\"]\n          },\n          \"application/vnd.fujixerox.docuworks.binder\": {\n            source: \"iana\",\n            extensions: [\"xbd\"]\n          },\n          \"application/vnd.fujixerox.docuworks.container\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fujixerox.hbpl\": {\n            source: \"iana\"\n          },\n          \"application/vnd.fut-misnet\": {\n            source: \"iana\"\n          },\n          \"application/vnd.futoin+cbor\": {\n            source: \"iana\"\n          },\n          \"application/vnd.futoin+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.fuzzysheet\": {\n            source: \"iana\",\n            extensions: [\"fzs\"]\n          },\n          \"application/vnd.genomatix.tuxedo\": {\n            source: \"iana\",\n            extensions: [\"txd\"]\n          },\n          \"application/vnd.gentics.grd+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.geo+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.geocube+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.geogebra.file\": {\n            source: \"iana\",\n            extensions: [\"ggb\"]\n          },\n          \"application/vnd.geogebra.slides\": {\n            source: \"iana\"\n          },\n          \"application/vnd.geogebra.tool\": {\n            source: \"iana\",\n            extensions: [\"ggt\"]\n          },\n          \"application/vnd.geometry-explorer\": {\n            source: \"iana\",\n            extensions: [\"gex\", \"gre\"]\n          },\n          \"application/vnd.geonext\": {\n            source: \"iana\",\n            extensions: [\"gxt\"]\n          },\n          \"application/vnd.geoplan\": {\n            source: \"iana\",\n            extensions: [\"g2w\"]\n          },\n          \"application/vnd.geospace\": {\n            source: \"iana\",\n            extensions: [\"g3w\"]\n          },\n          \"application/vnd.gerber\": {\n            source: \"iana\"\n          },\n          \"application/vnd.globalplatform.card-content-mgt\": {\n            source: \"iana\"\n          },\n          \"application/vnd.globalplatform.card-content-mgt-response\": {\n            source: \"iana\"\n          },\n          \"application/vnd.gmx\": {\n            source: \"iana\",\n            extensions: [\"gmx\"]\n          },\n          \"application/vnd.google-apps.document\": {\n            compressible: false,\n            extensions: [\"gdoc\"]\n          },\n          \"application/vnd.google-apps.presentation\": {\n            compressible: false,\n            extensions: [\"gslides\"]\n          },\n          \"application/vnd.google-apps.spreadsheet\": {\n            compressible: false,\n            extensions: [\"gsheet\"]\n          },\n          \"application/vnd.google-earth.kml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"kml\"]\n          },\n          \"application/vnd.google-earth.kmz\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"kmz\"]\n          },\n          \"application/vnd.gov.sk.e-form+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.gov.sk.e-form+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.gov.sk.xmldatacontainer+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.grafeq\": {\n            source: \"iana\",\n            extensions: [\"gqf\", \"gqs\"]\n          },\n          \"application/vnd.gridmp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.groove-account\": {\n            source: \"iana\",\n            extensions: [\"gac\"]\n          },\n          \"application/vnd.groove-help\": {\n            source: \"iana\",\n            extensions: [\"ghf\"]\n          },\n          \"application/vnd.groove-identity-message\": {\n            source: \"iana\",\n            extensions: [\"gim\"]\n          },\n          \"application/vnd.groove-injector\": {\n            source: \"iana\",\n            extensions: [\"grv\"]\n          },\n          \"application/vnd.groove-tool-message\": {\n            source: \"iana\",\n            extensions: [\"gtm\"]\n          },\n          \"application/vnd.groove-tool-template\": {\n            source: \"iana\",\n            extensions: [\"tpl\"]\n          },\n          \"application/vnd.groove-vcard\": {\n            source: \"iana\",\n            extensions: [\"vcg\"]\n          },\n          \"application/vnd.hal+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hal+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"hal\"]\n          },\n          \"application/vnd.handheld-entertainment+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"zmm\"]\n          },\n          \"application/vnd.hbci\": {\n            source: \"iana\",\n            extensions: [\"hbci\"]\n          },\n          \"application/vnd.hc+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hcl-bireports\": {\n            source: \"iana\"\n          },\n          \"application/vnd.hdt\": {\n            source: \"iana\"\n          },\n          \"application/vnd.heroku+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hhe.lesson-player\": {\n            source: \"iana\",\n            extensions: [\"les\"]\n          },\n          \"application/vnd.hl7cda+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.hl7v2+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.hp-hpgl\": {\n            source: \"iana\",\n            extensions: [\"hpgl\"]\n          },\n          \"application/vnd.hp-hpid\": {\n            source: \"iana\",\n            extensions: [\"hpid\"]\n          },\n          \"application/vnd.hp-hps\": {\n            source: \"iana\",\n            extensions: [\"hps\"]\n          },\n          \"application/vnd.hp-jlyt\": {\n            source: \"iana\",\n            extensions: [\"jlt\"]\n          },\n          \"application/vnd.hp-pcl\": {\n            source: \"iana\",\n            extensions: [\"pcl\"]\n          },\n          \"application/vnd.hp-pclxl\": {\n            source: \"iana\",\n            extensions: [\"pclxl\"]\n          },\n          \"application/vnd.httphone\": {\n            source: \"iana\"\n          },\n          \"application/vnd.hydrostatix.sof-data\": {\n            source: \"iana\",\n            extensions: [\"sfd-hdstx\"]\n          },\n          \"application/vnd.hyper+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hyper-item+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hyperdrive+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.hzn-3d-crossword\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ibm.afplinedata\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ibm.electronic-media\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ibm.minipay\": {\n            source: \"iana\",\n            extensions: [\"mpy\"]\n          },\n          \"application/vnd.ibm.modcap\": {\n            source: \"iana\",\n            extensions: [\"afp\", \"listafp\", \"list3820\"]\n          },\n          \"application/vnd.ibm.rights-management\": {\n            source: \"iana\",\n            extensions: [\"irm\"]\n          },\n          \"application/vnd.ibm.secure-container\": {\n            source: \"iana\",\n            extensions: [\"sc\"]\n          },\n          \"application/vnd.iccprofile\": {\n            source: \"iana\",\n            extensions: [\"icc\", \"icm\"]\n          },\n          \"application/vnd.ieee.1905\": {\n            source: \"iana\"\n          },\n          \"application/vnd.igloader\": {\n            source: \"iana\",\n            extensions: [\"igl\"]\n          },\n          \"application/vnd.imagemeter.folder+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.imagemeter.image+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.immervision-ivp\": {\n            source: \"iana\",\n            extensions: [\"ivp\"]\n          },\n          \"application/vnd.immervision-ivu\": {\n            source: \"iana\",\n            extensions: [\"ivu\"]\n          },\n          \"application/vnd.ims.imsccv1p1\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ims.imsccv1p2\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ims.imsccv1p3\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ims.lis.v2.result+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ims.lti.v2.toolconsumerprofile+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ims.lti.v2.toolproxy+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ims.lti.v2.toolproxy.id+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ims.lti.v2.toolsettings+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ims.lti.v2.toolsettings.simple+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.informedcontrol.rms+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.informix-visionary\": {\n            source: \"iana\"\n          },\n          \"application/vnd.infotech.project\": {\n            source: \"iana\"\n          },\n          \"application/vnd.infotech.project+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.innopath.wamp.notification\": {\n            source: \"iana\"\n          },\n          \"application/vnd.insors.igm\": {\n            source: \"iana\",\n            extensions: [\"igm\"]\n          },\n          \"application/vnd.intercon.formnet\": {\n            source: \"iana\",\n            extensions: [\"xpw\", \"xpx\"]\n          },\n          \"application/vnd.intergeo\": {\n            source: \"iana\",\n            extensions: [\"i2g\"]\n          },\n          \"application/vnd.intertrust.digibox\": {\n            source: \"iana\"\n          },\n          \"application/vnd.intertrust.nncp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.intu.qbo\": {\n            source: \"iana\",\n            extensions: [\"qbo\"]\n          },\n          \"application/vnd.intu.qfx\": {\n            source: \"iana\",\n            extensions: [\"qfx\"]\n          },\n          \"application/vnd.iptc.g2.catalogitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.conceptitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.knowledgeitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.newsitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.newsmessage+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.packageitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.iptc.g2.planningitem+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ipunplugged.rcprofile\": {\n            source: \"iana\",\n            extensions: [\"rcprofile\"]\n          },\n          \"application/vnd.irepository.package+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"irp\"]\n          },\n          \"application/vnd.is-xpr\": {\n            source: \"iana\",\n            extensions: [\"xpr\"]\n          },\n          \"application/vnd.isac.fcs\": {\n            source: \"iana\",\n            extensions: [\"fcs\"]\n          },\n          \"application/vnd.iso11783-10+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.jam\": {\n            source: \"iana\",\n            extensions: [\"jam\"]\n          },\n          \"application/vnd.japannet-directory-service\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-jpnstore-wakeup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-payment-wakeup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-registration\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-registration-wakeup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-setstore-wakeup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-verification\": {\n            source: \"iana\"\n          },\n          \"application/vnd.japannet-verification-wakeup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.jcp.javame.midlet-rms\": {\n            source: \"iana\",\n            extensions: [\"rms\"]\n          },\n          \"application/vnd.jisp\": {\n            source: \"iana\",\n            extensions: [\"jisp\"]\n          },\n          \"application/vnd.joost.joda-archive\": {\n            source: \"iana\",\n            extensions: [\"joda\"]\n          },\n          \"application/vnd.jsk.isdn-ngn\": {\n            source: \"iana\"\n          },\n          \"application/vnd.kahootz\": {\n            source: \"iana\",\n            extensions: [\"ktz\", \"ktr\"]\n          },\n          \"application/vnd.kde.karbon\": {\n            source: \"iana\",\n            extensions: [\"karbon\"]\n          },\n          \"application/vnd.kde.kchart\": {\n            source: \"iana\",\n            extensions: [\"chrt\"]\n          },\n          \"application/vnd.kde.kformula\": {\n            source: \"iana\",\n            extensions: [\"kfo\"]\n          },\n          \"application/vnd.kde.kivio\": {\n            source: \"iana\",\n            extensions: [\"flw\"]\n          },\n          \"application/vnd.kde.kontour\": {\n            source: \"iana\",\n            extensions: [\"kon\"]\n          },\n          \"application/vnd.kde.kpresenter\": {\n            source: \"iana\",\n            extensions: [\"kpr\", \"kpt\"]\n          },\n          \"application/vnd.kde.kspread\": {\n            source: \"iana\",\n            extensions: [\"ksp\"]\n          },\n          \"application/vnd.kde.kword\": {\n            source: \"iana\",\n            extensions: [\"kwd\", \"kwt\"]\n          },\n          \"application/vnd.kenameaapp\": {\n            source: \"iana\",\n            extensions: [\"htke\"]\n          },\n          \"application/vnd.kidspiration\": {\n            source: \"iana\",\n            extensions: [\"kia\"]\n          },\n          \"application/vnd.kinar\": {\n            source: \"iana\",\n            extensions: [\"kne\", \"knp\"]\n          },\n          \"application/vnd.koan\": {\n            source: \"iana\",\n            extensions: [\"skp\", \"skd\", \"skt\", \"skm\"]\n          },\n          \"application/vnd.kodak-descriptor\": {\n            source: \"iana\",\n            extensions: [\"sse\"]\n          },\n          \"application/vnd.las\": {\n            source: \"iana\"\n          },\n          \"application/vnd.las.las+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.las.las+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"lasxml\"]\n          },\n          \"application/vnd.laszip\": {\n            source: \"iana\"\n          },\n          \"application/vnd.leap+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.liberty-request+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.llamagraphics.life-balance.desktop\": {\n            source: \"iana\",\n            extensions: [\"lbd\"]\n          },\n          \"application/vnd.llamagraphics.life-balance.exchange+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"lbe\"]\n          },\n          \"application/vnd.logipipe.circuit+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.loom\": {\n            source: \"iana\"\n          },\n          \"application/vnd.lotus-1-2-3\": {\n            source: \"iana\",\n            extensions: [\"123\"]\n          },\n          \"application/vnd.lotus-approach\": {\n            source: \"iana\",\n            extensions: [\"apr\"]\n          },\n          \"application/vnd.lotus-freelance\": {\n            source: \"iana\",\n            extensions: [\"pre\"]\n          },\n          \"application/vnd.lotus-notes\": {\n            source: \"iana\",\n            extensions: [\"nsf\"]\n          },\n          \"application/vnd.lotus-organizer\": {\n            source: \"iana\",\n            extensions: [\"org\"]\n          },\n          \"application/vnd.lotus-screencam\": {\n            source: \"iana\",\n            extensions: [\"scm\"]\n          },\n          \"application/vnd.lotus-wordpro\": {\n            source: \"iana\",\n            extensions: [\"lwp\"]\n          },\n          \"application/vnd.macports.portpkg\": {\n            source: \"iana\",\n            extensions: [\"portpkg\"]\n          },\n          \"application/vnd.mapbox-vector-tile\": {\n            source: \"iana\",\n            extensions: [\"mvt\"]\n          },\n          \"application/vnd.marlin.drm.actiontoken+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.marlin.drm.conftoken+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.marlin.drm.license+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.marlin.drm.mdcf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mason+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.maxar.archive.3tz+zip\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"application/vnd.maxmind.maxmind-db\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mcd\": {\n            source: \"iana\",\n            extensions: [\"mcd\"]\n          },\n          \"application/vnd.medcalcdata\": {\n            source: \"iana\",\n            extensions: [\"mc1\"]\n          },\n          \"application/vnd.mediastation.cdkey\": {\n            source: \"iana\",\n            extensions: [\"cdkey\"]\n          },\n          \"application/vnd.meridian-slingshot\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mfer\": {\n            source: \"iana\",\n            extensions: [\"mwf\"]\n          },\n          \"application/vnd.mfmp\": {\n            source: \"iana\",\n            extensions: [\"mfm\"]\n          },\n          \"application/vnd.micro+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.micrografx.flo\": {\n            source: \"iana\",\n            extensions: [\"flo\"]\n          },\n          \"application/vnd.micrografx.igx\": {\n            source: \"iana\",\n            extensions: [\"igx\"]\n          },\n          \"application/vnd.microsoft.portable-executable\": {\n            source: \"iana\"\n          },\n          \"application/vnd.microsoft.windows.thumbnail-cache\": {\n            source: \"iana\"\n          },\n          \"application/vnd.miele+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.mif\": {\n            source: \"iana\",\n            extensions: [\"mif\"]\n          },\n          \"application/vnd.minisoft-hp3000-save\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mitsubishi.misty-guard.trustweb\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mobius.daf\": {\n            source: \"iana\",\n            extensions: [\"daf\"]\n          },\n          \"application/vnd.mobius.dis\": {\n            source: \"iana\",\n            extensions: [\"dis\"]\n          },\n          \"application/vnd.mobius.mbk\": {\n            source: \"iana\",\n            extensions: [\"mbk\"]\n          },\n          \"application/vnd.mobius.mqy\": {\n            source: \"iana\",\n            extensions: [\"mqy\"]\n          },\n          \"application/vnd.mobius.msl\": {\n            source: \"iana\",\n            extensions: [\"msl\"]\n          },\n          \"application/vnd.mobius.plc\": {\n            source: \"iana\",\n            extensions: [\"plc\"]\n          },\n          \"application/vnd.mobius.txf\": {\n            source: \"iana\",\n            extensions: [\"txf\"]\n          },\n          \"application/vnd.mophun.application\": {\n            source: \"iana\",\n            extensions: [\"mpn\"]\n          },\n          \"application/vnd.mophun.certificate\": {\n            source: \"iana\",\n            extensions: [\"mpc\"]\n          },\n          \"application/vnd.motorola.flexsuite\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.adsi\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.fis\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.gotap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.kmr\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.ttc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.flexsuite.wem\": {\n            source: \"iana\"\n          },\n          \"application/vnd.motorola.iprm\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mozilla.xul+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xul\"]\n          },\n          \"application/vnd.ms-3mfdocument\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-artgalry\": {\n            source: \"iana\",\n            extensions: [\"cil\"]\n          },\n          \"application/vnd.ms-asf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-cab-compressed\": {\n            source: \"iana\",\n            extensions: [\"cab\"]\n          },\n          \"application/vnd.ms-color.iccprofile\": {\n            source: \"apache\"\n          },\n          \"application/vnd.ms-excel\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"xls\", \"xlm\", \"xla\", \"xlc\", \"xlt\", \"xlw\"]\n          },\n          \"application/vnd.ms-excel.addin.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"xlam\"]\n          },\n          \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"xlsb\"]\n          },\n          \"application/vnd.ms-excel.sheet.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"xlsm\"]\n          },\n          \"application/vnd.ms-excel.template.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"xltm\"]\n          },\n          \"application/vnd.ms-fontobject\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"eot\"]\n          },\n          \"application/vnd.ms-htmlhelp\": {\n            source: \"iana\",\n            extensions: [\"chm\"]\n          },\n          \"application/vnd.ms-ims\": {\n            source: \"iana\",\n            extensions: [\"ims\"]\n          },\n          \"application/vnd.ms-lrm\": {\n            source: \"iana\",\n            extensions: [\"lrm\"]\n          },\n          \"application/vnd.ms-office.activex+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ms-officetheme\": {\n            source: \"iana\",\n            extensions: [\"thmx\"]\n          },\n          \"application/vnd.ms-opentype\": {\n            source: \"apache\",\n            compressible: true\n          },\n          \"application/vnd.ms-outlook\": {\n            compressible: false,\n            extensions: [\"msg\"]\n          },\n          \"application/vnd.ms-package.obfuscated-opentype\": {\n            source: \"apache\"\n          },\n          \"application/vnd.ms-pki.seccat\": {\n            source: \"apache\",\n            extensions: [\"cat\"]\n          },\n          \"application/vnd.ms-pki.stl\": {\n            source: \"apache\",\n            extensions: [\"stl\"]\n          },\n          \"application/vnd.ms-playready.initiator+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ms-powerpoint\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"ppt\", \"pps\", \"pot\"]\n          },\n          \"application/vnd.ms-powerpoint.addin.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"ppam\"]\n          },\n          \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"pptm\"]\n          },\n          \"application/vnd.ms-powerpoint.slide.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"sldm\"]\n          },\n          \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"ppsm\"]\n          },\n          \"application/vnd.ms-powerpoint.template.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"potm\"]\n          },\n          \"application/vnd.ms-printdevicecapabilities+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ms-printing.printticket+xml\": {\n            source: \"apache\",\n            compressible: true\n          },\n          \"application/vnd.ms-printschematicket+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ms-project\": {\n            source: \"iana\",\n            extensions: [\"mpp\", \"mpt\"]\n          },\n          \"application/vnd.ms-tnef\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-windows.devicepairing\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-windows.nwprinting.oob\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-windows.printerpairing\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-windows.wsd.oob\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-wmdrm.lic-chlg-req\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-wmdrm.lic-resp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-wmdrm.meter-chlg-req\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-wmdrm.meter-resp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ms-word.document.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"docm\"]\n          },\n          \"application/vnd.ms-word.template.macroenabled.12\": {\n            source: \"iana\",\n            extensions: [\"dotm\"]\n          },\n          \"application/vnd.ms-works\": {\n            source: \"iana\",\n            extensions: [\"wps\", \"wks\", \"wcm\", \"wdb\"]\n          },\n          \"application/vnd.ms-wpl\": {\n            source: \"iana\",\n            extensions: [\"wpl\"]\n          },\n          \"application/vnd.ms-xpsdocument\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"xps\"]\n          },\n          \"application/vnd.msa-disk-image\": {\n            source: \"iana\"\n          },\n          \"application/vnd.mseq\": {\n            source: \"iana\",\n            extensions: [\"mseq\"]\n          },\n          \"application/vnd.msign\": {\n            source: \"iana\"\n          },\n          \"application/vnd.multiad.creator\": {\n            source: \"iana\"\n          },\n          \"application/vnd.multiad.creator.cif\": {\n            source: \"iana\"\n          },\n          \"application/vnd.music-niff\": {\n            source: \"iana\"\n          },\n          \"application/vnd.musician\": {\n            source: \"iana\",\n            extensions: [\"mus\"]\n          },\n          \"application/vnd.muvee.style\": {\n            source: \"iana\",\n            extensions: [\"msty\"]\n          },\n          \"application/vnd.mynfc\": {\n            source: \"iana\",\n            extensions: [\"taglet\"]\n          },\n          \"application/vnd.nacamar.ybrid+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.ncd.control\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ncd.reference\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nearst.inv+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nebumind.line\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nervana\": {\n            source: \"iana\"\n          },\n          \"application/vnd.netfpx\": {\n            source: \"iana\"\n          },\n          \"application/vnd.neurolanguage.nlu\": {\n            source: \"iana\",\n            extensions: [\"nlu\"]\n          },\n          \"application/vnd.nimn\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nintendo.nitro.rom\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nintendo.snes.rom\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nitf\": {\n            source: \"iana\",\n            extensions: [\"ntf\", \"nitf\"]\n          },\n          \"application/vnd.noblenet-directory\": {\n            source: \"iana\",\n            extensions: [\"nnd\"]\n          },\n          \"application/vnd.noblenet-sealer\": {\n            source: \"iana\",\n            extensions: [\"nns\"]\n          },\n          \"application/vnd.noblenet-web\": {\n            source: \"iana\",\n            extensions: [\"nnw\"]\n          },\n          \"application/vnd.nokia.catalogs\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.conml+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.conml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nokia.iptv.config+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nokia.isds-radio-presets\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.landmark+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.landmark+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nokia.landmarkcollection+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nokia.n-gage.ac+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ac\"]\n          },\n          \"application/vnd.nokia.n-gage.data\": {\n            source: \"iana\",\n            extensions: [\"ngdat\"]\n          },\n          \"application/vnd.nokia.n-gage.symbian.install\": {\n            source: \"iana\",\n            extensions: [\"n-gage\"]\n          },\n          \"application/vnd.nokia.ncd\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.pcd+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.nokia.pcd+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.nokia.radio-preset\": {\n            source: \"iana\",\n            extensions: [\"rpst\"]\n          },\n          \"application/vnd.nokia.radio-presets\": {\n            source: \"iana\",\n            extensions: [\"rpss\"]\n          },\n          \"application/vnd.novadigm.edm\": {\n            source: \"iana\",\n            extensions: [\"edm\"]\n          },\n          \"application/vnd.novadigm.edx\": {\n            source: \"iana\",\n            extensions: [\"edx\"]\n          },\n          \"application/vnd.novadigm.ext\": {\n            source: \"iana\",\n            extensions: [\"ext\"]\n          },\n          \"application/vnd.ntt-local.content-share\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ntt-local.file-transfer\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ntt-local.ogw_remote-access\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ntt-local.sip-ta_remote\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ntt-local.sip-ta_tcp_stream\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oasis.opendocument.chart\": {\n            source: \"iana\",\n            extensions: [\"odc\"]\n          },\n          \"application/vnd.oasis.opendocument.chart-template\": {\n            source: \"iana\",\n            extensions: [\"otc\"]\n          },\n          \"application/vnd.oasis.opendocument.database\": {\n            source: \"iana\",\n            extensions: [\"odb\"]\n          },\n          \"application/vnd.oasis.opendocument.formula\": {\n            source: \"iana\",\n            extensions: [\"odf\"]\n          },\n          \"application/vnd.oasis.opendocument.formula-template\": {\n            source: \"iana\",\n            extensions: [\"odft\"]\n          },\n          \"application/vnd.oasis.opendocument.graphics\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"odg\"]\n          },\n          \"application/vnd.oasis.opendocument.graphics-template\": {\n            source: \"iana\",\n            extensions: [\"otg\"]\n          },\n          \"application/vnd.oasis.opendocument.image\": {\n            source: \"iana\",\n            extensions: [\"odi\"]\n          },\n          \"application/vnd.oasis.opendocument.image-template\": {\n            source: \"iana\",\n            extensions: [\"oti\"]\n          },\n          \"application/vnd.oasis.opendocument.presentation\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"odp\"]\n          },\n          \"application/vnd.oasis.opendocument.presentation-template\": {\n            source: \"iana\",\n            extensions: [\"otp\"]\n          },\n          \"application/vnd.oasis.opendocument.spreadsheet\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"ods\"]\n          },\n          \"application/vnd.oasis.opendocument.spreadsheet-template\": {\n            source: \"iana\",\n            extensions: [\"ots\"]\n          },\n          \"application/vnd.oasis.opendocument.text\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"odt\"]\n          },\n          \"application/vnd.oasis.opendocument.text-master\": {\n            source: \"iana\",\n            extensions: [\"odm\"]\n          },\n          \"application/vnd.oasis.opendocument.text-template\": {\n            source: \"iana\",\n            extensions: [\"ott\"]\n          },\n          \"application/vnd.oasis.opendocument.text-web\": {\n            source: \"iana\",\n            extensions: [\"oth\"]\n          },\n          \"application/vnd.obn\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ocf+cbor\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oci.image.manifest.v1+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oftn.l10n+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.contentaccessdownload+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.contentaccessstreaming+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.cspg-hexbinary\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oipf.dae.svg+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.dae.xhtml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.mippvcontrolmessage+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.pae.gem\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oipf.spdiscovery+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.spdlist+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.ueprofile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oipf.userprofile+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.olpc-sugar\": {\n            source: \"iana\",\n            extensions: [\"xo\"]\n          },\n          \"application/vnd.oma-scws-config\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma-scws-http-request\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma-scws-http-response\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.associated-procedure-parameter+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.drm-trigger+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.imd+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.ltkm\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.notification+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.provisioningtrigger\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.sgboot\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.sgdd+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.sgdu\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.simple-symbol-container\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.bcast.smartcard-trigger+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.sprov+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.bcast.stkm\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.cab-address-book+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.cab-feature-handler+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.cab-pcc+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.cab-subs-invite+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.cab-user-prefs+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.dcd\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.dcdc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.dd2+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"dd2\"]\n          },\n          \"application/vnd.oma.drm.risd+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.group-usage-list+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.lwm2m+cbor\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.lwm2m+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.lwm2m+tlv\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.pal+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.poc.detailed-progress-report+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.poc.final-report+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.poc.groups+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.poc.invocation-descriptor+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.poc.optimized-progress-report+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.push\": {\n            source: \"iana\"\n          },\n          \"application/vnd.oma.scidm.messages+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oma.xcap-directory+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.omads-email+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.omads-file+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.omads-folder+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.omaloc-supl-init\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepager\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepagertamp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepagertamx\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepagertat\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepagertatp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.onepagertatx\": {\n            source: \"iana\"\n          },\n          \"application/vnd.openblox.game+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"obgx\"]\n          },\n          \"application/vnd.openblox.game-binary\": {\n            source: \"iana\"\n          },\n          \"application/vnd.openeye.oeb\": {\n            source: \"iana\"\n          },\n          \"application/vnd.openofficeorg.extension\": {\n            source: \"apache\",\n            extensions: [\"oxt\"]\n          },\n          \"application/vnd.openstreetmap.data+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"osm\"]\n          },\n          \"application/vnd.opentimestamps.ots\": {\n            source: \"iana\"\n          },\n          \"application/vnd.openxmlformats-officedocument.custom-properties+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.customxmlproperties+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawing+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.extended-properties+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.comments+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"pptx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slide\": {\n            source: \"iana\",\n            extensions: [\"sldx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": {\n            source: \"iana\",\n            extensions: [\"ppsx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.tags+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.template\": {\n            source: \"iana\",\n            extensions: [\"potx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"xlsx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": {\n            source: \"iana\",\n            extensions: [\"xltx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.theme+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.themeoverride+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.vmldrawing\": {\n            source: \"iana\"\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"docx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": {\n            source: \"iana\",\n            extensions: [\"dotx\"]\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-package.core-properties+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.openxmlformats-package.relationships+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oracle.resource+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.orange.indata\": {\n            source: \"iana\"\n          },\n          \"application/vnd.osa.netdeploy\": {\n            source: \"iana\"\n          },\n          \"application/vnd.osgeo.mapguide.package\": {\n            source: \"iana\",\n            extensions: [\"mgp\"]\n          },\n          \"application/vnd.osgi.bundle\": {\n            source: \"iana\"\n          },\n          \"application/vnd.osgi.dp\": {\n            source: \"iana\",\n            extensions: [\"dp\"]\n          },\n          \"application/vnd.osgi.subsystem\": {\n            source: \"iana\",\n            extensions: [\"esa\"]\n          },\n          \"application/vnd.otps.ct-kip+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.oxli.countgraph\": {\n            source: \"iana\"\n          },\n          \"application/vnd.pagerduty+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.palm\": {\n            source: \"iana\",\n            extensions: [\"pdb\", \"pqa\", \"oprc\"]\n          },\n          \"application/vnd.panoply\": {\n            source: \"iana\"\n          },\n          \"application/vnd.paos.xml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.patentdive\": {\n            source: \"iana\"\n          },\n          \"application/vnd.patientecommsdoc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.pawaafile\": {\n            source: \"iana\",\n            extensions: [\"paw\"]\n          },\n          \"application/vnd.pcos\": {\n            source: \"iana\"\n          },\n          \"application/vnd.pg.format\": {\n            source: \"iana\",\n            extensions: [\"str\"]\n          },\n          \"application/vnd.pg.osasli\": {\n            source: \"iana\",\n            extensions: [\"ei6\"]\n          },\n          \"application/vnd.piaccess.application-licence\": {\n            source: \"iana\"\n          },\n          \"application/vnd.picsel\": {\n            source: \"iana\",\n            extensions: [\"efif\"]\n          },\n          \"application/vnd.pmi.widget\": {\n            source: \"iana\",\n            extensions: [\"wg\"]\n          },\n          \"application/vnd.poc.group-advertisement+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.pocketlearn\": {\n            source: \"iana\",\n            extensions: [\"plf\"]\n          },\n          \"application/vnd.powerbuilder6\": {\n            source: \"iana\",\n            extensions: [\"pbd\"]\n          },\n          \"application/vnd.powerbuilder6-s\": {\n            source: \"iana\"\n          },\n          \"application/vnd.powerbuilder7\": {\n            source: \"iana\"\n          },\n          \"application/vnd.powerbuilder7-s\": {\n            source: \"iana\"\n          },\n          \"application/vnd.powerbuilder75\": {\n            source: \"iana\"\n          },\n          \"application/vnd.powerbuilder75-s\": {\n            source: \"iana\"\n          },\n          \"application/vnd.preminet\": {\n            source: \"iana\"\n          },\n          \"application/vnd.previewsystems.box\": {\n            source: \"iana\",\n            extensions: [\"box\"]\n          },\n          \"application/vnd.proteus.magazine\": {\n            source: \"iana\",\n            extensions: [\"mgz\"]\n          },\n          \"application/vnd.psfs\": {\n            source: \"iana\"\n          },\n          \"application/vnd.publishare-delta-tree\": {\n            source: \"iana\",\n            extensions: [\"qps\"]\n          },\n          \"application/vnd.pvi.ptid1\": {\n            source: \"iana\",\n            extensions: [\"ptid\"]\n          },\n          \"application/vnd.pwg-multiplexed\": {\n            source: \"iana\"\n          },\n          \"application/vnd.pwg-xhtml-print+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.qualcomm.brew-app-res\": {\n            source: \"iana\"\n          },\n          \"application/vnd.quarantainenet\": {\n            source: \"iana\"\n          },\n          \"application/vnd.quark.quarkxpress\": {\n            source: \"iana\",\n            extensions: [\"qxd\", \"qxt\", \"qwd\", \"qwt\", \"qxl\", \"qxb\"]\n          },\n          \"application/vnd.quobject-quoxdocument\": {\n            source: \"iana\"\n          },\n          \"application/vnd.radisys.moml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-audit+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-audit-conf+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-audit-conn+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-audit-dialog+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-audit-stream+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-conf+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-base+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-fax-detect+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-fax-sendrecv+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-group+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-speech+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.radisys.msml-dialog-transform+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.rainstor.data\": {\n            source: \"iana\"\n          },\n          \"application/vnd.rapid\": {\n            source: \"iana\"\n          },\n          \"application/vnd.rar\": {\n            source: \"iana\",\n            extensions: [\"rar\"]\n          },\n          \"application/vnd.realvnc.bed\": {\n            source: \"iana\",\n            extensions: [\"bed\"]\n          },\n          \"application/vnd.recordare.musicxml\": {\n            source: \"iana\",\n            extensions: [\"mxl\"]\n          },\n          \"application/vnd.recordare.musicxml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"musicxml\"]\n          },\n          \"application/vnd.renlearn.rlprint\": {\n            source: \"iana\"\n          },\n          \"application/vnd.resilient.logic\": {\n            source: \"iana\"\n          },\n          \"application/vnd.restful+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.rig.cryptonote\": {\n            source: \"iana\",\n            extensions: [\"cryptonote\"]\n          },\n          \"application/vnd.rim.cod\": {\n            source: \"apache\",\n            extensions: [\"cod\"]\n          },\n          \"application/vnd.rn-realmedia\": {\n            source: \"apache\",\n            extensions: [\"rm\"]\n          },\n          \"application/vnd.rn-realmedia-vbr\": {\n            source: \"apache\",\n            extensions: [\"rmvb\"]\n          },\n          \"application/vnd.route66.link66+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"link66\"]\n          },\n          \"application/vnd.rs-274x\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ruckus.download\": {\n            source: \"iana\"\n          },\n          \"application/vnd.s3sms\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sailingtracker.track\": {\n            source: \"iana\",\n            extensions: [\"st\"]\n          },\n          \"application/vnd.sar\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sbm.cid\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sbm.mid2\": {\n            source: \"iana\"\n          },\n          \"application/vnd.scribus\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.3df\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.csf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.doc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.eml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.mht\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.net\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.ppt\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.tiff\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealed.xls\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealedmedia.softseal.html\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sealedmedia.softseal.pdf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.seemail\": {\n            source: \"iana\",\n            extensions: [\"see\"]\n          },\n          \"application/vnd.seis+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.sema\": {\n            source: \"iana\",\n            extensions: [\"sema\"]\n          },\n          \"application/vnd.semd\": {\n            source: \"iana\",\n            extensions: [\"semd\"]\n          },\n          \"application/vnd.semf\": {\n            source: \"iana\",\n            extensions: [\"semf\"]\n          },\n          \"application/vnd.shade-save-file\": {\n            source: \"iana\"\n          },\n          \"application/vnd.shana.informed.formdata\": {\n            source: \"iana\",\n            extensions: [\"ifm\"]\n          },\n          \"application/vnd.shana.informed.formtemplate\": {\n            source: \"iana\",\n            extensions: [\"itp\"]\n          },\n          \"application/vnd.shana.informed.interchange\": {\n            source: \"iana\",\n            extensions: [\"iif\"]\n          },\n          \"application/vnd.shana.informed.package\": {\n            source: \"iana\",\n            extensions: [\"ipk\"]\n          },\n          \"application/vnd.shootproof+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.shopkick+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.shp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.shx\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sigrok.session\": {\n            source: \"iana\"\n          },\n          \"application/vnd.simtech-mindmapper\": {\n            source: \"iana\",\n            extensions: [\"twd\", \"twds\"]\n          },\n          \"application/vnd.siren+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.smaf\": {\n            source: \"iana\",\n            extensions: [\"mmf\"]\n          },\n          \"application/vnd.smart.notebook\": {\n            source: \"iana\"\n          },\n          \"application/vnd.smart.teacher\": {\n            source: \"iana\",\n            extensions: [\"teacher\"]\n          },\n          \"application/vnd.snesdev-page-table\": {\n            source: \"iana\"\n          },\n          \"application/vnd.software602.filler.form+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"fo\"]\n          },\n          \"application/vnd.software602.filler.form-xml-zip\": {\n            source: \"iana\"\n          },\n          \"application/vnd.solent.sdkm+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"sdkm\", \"sdkd\"]\n          },\n          \"application/vnd.spotfire.dxp\": {\n            source: \"iana\",\n            extensions: [\"dxp\"]\n          },\n          \"application/vnd.spotfire.sfs\": {\n            source: \"iana\",\n            extensions: [\"sfs\"]\n          },\n          \"application/vnd.sqlite3\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sss-cod\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sss-dtf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sss-ntf\": {\n            source: \"iana\"\n          },\n          \"application/vnd.stardivision.calc\": {\n            source: \"apache\",\n            extensions: [\"sdc\"]\n          },\n          \"application/vnd.stardivision.draw\": {\n            source: \"apache\",\n            extensions: [\"sda\"]\n          },\n          \"application/vnd.stardivision.impress\": {\n            source: \"apache\",\n            extensions: [\"sdd\"]\n          },\n          \"application/vnd.stardivision.math\": {\n            source: \"apache\",\n            extensions: [\"smf\"]\n          },\n          \"application/vnd.stardivision.writer\": {\n            source: \"apache\",\n            extensions: [\"sdw\", \"vor\"]\n          },\n          \"application/vnd.stardivision.writer-global\": {\n            source: \"apache\",\n            extensions: [\"sgl\"]\n          },\n          \"application/vnd.stepmania.package\": {\n            source: \"iana\",\n            extensions: [\"smzip\"]\n          },\n          \"application/vnd.stepmania.stepchart\": {\n            source: \"iana\",\n            extensions: [\"sm\"]\n          },\n          \"application/vnd.street-stream\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sun.wadl+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wadl\"]\n          },\n          \"application/vnd.sun.xml.calc\": {\n            source: \"apache\",\n            extensions: [\"sxc\"]\n          },\n          \"application/vnd.sun.xml.calc.template\": {\n            source: \"apache\",\n            extensions: [\"stc\"]\n          },\n          \"application/vnd.sun.xml.draw\": {\n            source: \"apache\",\n            extensions: [\"sxd\"]\n          },\n          \"application/vnd.sun.xml.draw.template\": {\n            source: \"apache\",\n            extensions: [\"std\"]\n          },\n          \"application/vnd.sun.xml.impress\": {\n            source: \"apache\",\n            extensions: [\"sxi\"]\n          },\n          \"application/vnd.sun.xml.impress.template\": {\n            source: \"apache\",\n            extensions: [\"sti\"]\n          },\n          \"application/vnd.sun.xml.math\": {\n            source: \"apache\",\n            extensions: [\"sxm\"]\n          },\n          \"application/vnd.sun.xml.writer\": {\n            source: \"apache\",\n            extensions: [\"sxw\"]\n          },\n          \"application/vnd.sun.xml.writer.global\": {\n            source: \"apache\",\n            extensions: [\"sxg\"]\n          },\n          \"application/vnd.sun.xml.writer.template\": {\n            source: \"apache\",\n            extensions: [\"stw\"]\n          },\n          \"application/vnd.sus-calendar\": {\n            source: \"iana\",\n            extensions: [\"sus\", \"susp\"]\n          },\n          \"application/vnd.svd\": {\n            source: \"iana\",\n            extensions: [\"svd\"]\n          },\n          \"application/vnd.swiftview-ics\": {\n            source: \"iana\"\n          },\n          \"application/vnd.sycle+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.syft+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.symbian.install\": {\n            source: \"apache\",\n            extensions: [\"sis\", \"sisx\"]\n          },\n          \"application/vnd.syncml+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"xsm\"]\n          },\n          \"application/vnd.syncml.dm+wbxml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            extensions: [\"bdm\"]\n          },\n          \"application/vnd.syncml.dm+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"xdm\"]\n          },\n          \"application/vnd.syncml.dm.notification\": {\n            source: \"iana\"\n          },\n          \"application/vnd.syncml.dmddf+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.syncml.dmddf+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"ddf\"]\n          },\n          \"application/vnd.syncml.dmtnds+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.syncml.dmtnds+xml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true\n          },\n          \"application/vnd.syncml.ds.notification\": {\n            source: \"iana\"\n          },\n          \"application/vnd.tableschema+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.tao.intent-module-archive\": {\n            source: \"iana\",\n            extensions: [\"tao\"]\n          },\n          \"application/vnd.tcpdump.pcap\": {\n            source: \"iana\",\n            extensions: [\"pcap\", \"cap\", \"dmp\"]\n          },\n          \"application/vnd.think-cell.ppttc+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.tmd.mediaflex.api+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.tml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.tmobile-livetv\": {\n            source: \"iana\",\n            extensions: [\"tmo\"]\n          },\n          \"application/vnd.tri.onesource\": {\n            source: \"iana\"\n          },\n          \"application/vnd.trid.tpt\": {\n            source: \"iana\",\n            extensions: [\"tpt\"]\n          },\n          \"application/vnd.triscape.mxs\": {\n            source: \"iana\",\n            extensions: [\"mxs\"]\n          },\n          \"application/vnd.trueapp\": {\n            source: \"iana\",\n            extensions: [\"tra\"]\n          },\n          \"application/vnd.truedoc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ubisoft.webplayer\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ufdl\": {\n            source: \"iana\",\n            extensions: [\"ufd\", \"ufdl\"]\n          },\n          \"application/vnd.uiq.theme\": {\n            source: \"iana\",\n            extensions: [\"utz\"]\n          },\n          \"application/vnd.umajin\": {\n            source: \"iana\",\n            extensions: [\"umj\"]\n          },\n          \"application/vnd.unity\": {\n            source: \"iana\",\n            extensions: [\"unityweb\"]\n          },\n          \"application/vnd.uoml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"uoml\"]\n          },\n          \"application/vnd.uplanet.alert\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.alert-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.bearer-choice\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.bearer-choice-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.cacheop\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.cacheop-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.channel\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.channel-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.list\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.list-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.listcmd\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.listcmd-wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uplanet.signal\": {\n            source: \"iana\"\n          },\n          \"application/vnd.uri-map\": {\n            source: \"iana\"\n          },\n          \"application/vnd.valve.source.material\": {\n            source: \"iana\"\n          },\n          \"application/vnd.vcx\": {\n            source: \"iana\",\n            extensions: [\"vcx\"]\n          },\n          \"application/vnd.vd-study\": {\n            source: \"iana\"\n          },\n          \"application/vnd.vectorworks\": {\n            source: \"iana\"\n          },\n          \"application/vnd.vel+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.verimatrix.vcas\": {\n            source: \"iana\"\n          },\n          \"application/vnd.veritone.aion+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.veryant.thin\": {\n            source: \"iana\"\n          },\n          \"application/vnd.ves.encrypted\": {\n            source: \"iana\"\n          },\n          \"application/vnd.vidsoft.vidconference\": {\n            source: \"iana\"\n          },\n          \"application/vnd.visio\": {\n            source: \"iana\",\n            extensions: [\"vsd\", \"vst\", \"vss\", \"vsw\"]\n          },\n          \"application/vnd.visionary\": {\n            source: \"iana\",\n            extensions: [\"vis\"]\n          },\n          \"application/vnd.vividence.scriptfile\": {\n            source: \"iana\"\n          },\n          \"application/vnd.vsf\": {\n            source: \"iana\",\n            extensions: [\"vsf\"]\n          },\n          \"application/vnd.wap.sic\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wap.slc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wap.wbxml\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            extensions: [\"wbxml\"]\n          },\n          \"application/vnd.wap.wmlc\": {\n            source: \"iana\",\n            extensions: [\"wmlc\"]\n          },\n          \"application/vnd.wap.wmlscriptc\": {\n            source: \"iana\",\n            extensions: [\"wmlsc\"]\n          },\n          \"application/vnd.webturbo\": {\n            source: \"iana\",\n            extensions: [\"wtb\"]\n          },\n          \"application/vnd.wfa.dpp\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wfa.p2p\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wfa.wsc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.windows.devicepairing\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wmc\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wmf.bootstrap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wolfram.mathematica\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wolfram.mathematica.package\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wolfram.player\": {\n            source: \"iana\",\n            extensions: [\"nbp\"]\n          },\n          \"application/vnd.wordperfect\": {\n            source: \"iana\",\n            extensions: [\"wpd\"]\n          },\n          \"application/vnd.wqd\": {\n            source: \"iana\",\n            extensions: [\"wqd\"]\n          },\n          \"application/vnd.wrq-hp3000-labelled\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wt.stf\": {\n            source: \"iana\",\n            extensions: [\"stf\"]\n          },\n          \"application/vnd.wv.csp+wbxml\": {\n            source: \"iana\"\n          },\n          \"application/vnd.wv.csp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.wv.ssp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.xacml+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.xara\": {\n            source: \"iana\",\n            extensions: [\"xar\"]\n          },\n          \"application/vnd.xfdl\": {\n            source: \"iana\",\n            extensions: [\"xfdl\"]\n          },\n          \"application/vnd.xfdl.webform\": {\n            source: \"iana\"\n          },\n          \"application/vnd.xmi+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vnd.xmpie.cpkg\": {\n            source: \"iana\"\n          },\n          \"application/vnd.xmpie.dpkg\": {\n            source: \"iana\"\n          },\n          \"application/vnd.xmpie.plan\": {\n            source: \"iana\"\n          },\n          \"application/vnd.xmpie.ppkg\": {\n            source: \"iana\"\n          },\n          \"application/vnd.xmpie.xlim\": {\n            source: \"iana\"\n          },\n          \"application/vnd.yamaha.hv-dic\": {\n            source: \"iana\",\n            extensions: [\"hvd\"]\n          },\n          \"application/vnd.yamaha.hv-script\": {\n            source: \"iana\",\n            extensions: [\"hvs\"]\n          },\n          \"application/vnd.yamaha.hv-voice\": {\n            source: \"iana\",\n            extensions: [\"hvp\"]\n          },\n          \"application/vnd.yamaha.openscoreformat\": {\n            source: \"iana\",\n            extensions: [\"osf\"]\n          },\n          \"application/vnd.yamaha.openscoreformat.osfpvg+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"osfpvg\"]\n          },\n          \"application/vnd.yamaha.remote-setup\": {\n            source: \"iana\"\n          },\n          \"application/vnd.yamaha.smaf-audio\": {\n            source: \"iana\",\n            extensions: [\"saf\"]\n          },\n          \"application/vnd.yamaha.smaf-phrase\": {\n            source: \"iana\",\n            extensions: [\"spf\"]\n          },\n          \"application/vnd.yamaha.through-ngn\": {\n            source: \"iana\"\n          },\n          \"application/vnd.yamaha.tunnel-udpencap\": {\n            source: \"iana\"\n          },\n          \"application/vnd.yaoweme\": {\n            source: \"iana\"\n          },\n          \"application/vnd.yellowriver-custom-menu\": {\n            source: \"iana\",\n            extensions: [\"cmp\"]\n          },\n          \"application/vnd.youtube.yt\": {\n            source: \"iana\"\n          },\n          \"application/vnd.zul\": {\n            source: \"iana\",\n            extensions: [\"zir\", \"zirz\"]\n          },\n          \"application/vnd.zzazz.deck+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"zaz\"]\n          },\n          \"application/voicexml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"vxml\"]\n          },\n          \"application/voucher-cms+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/vq-rtcpxr\": {\n            source: \"iana\"\n          },\n          \"application/wasm\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wasm\"]\n          },\n          \"application/watcherinfo+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wif\"]\n          },\n          \"application/webpush-options+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/whoispp-query\": {\n            source: \"iana\"\n          },\n          \"application/whoispp-response\": {\n            source: \"iana\"\n          },\n          \"application/widget\": {\n            source: \"iana\",\n            extensions: [\"wgt\"]\n          },\n          \"application/winhlp\": {\n            source: \"apache\",\n            extensions: [\"hlp\"]\n          },\n          \"application/wita\": {\n            source: \"iana\"\n          },\n          \"application/wordperfect5.1\": {\n            source: \"iana\"\n          },\n          \"application/wsdl+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wsdl\"]\n          },\n          \"application/wspolicy+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"wspolicy\"]\n          },\n          \"application/x-7z-compressed\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"7z\"]\n          },\n          \"application/x-abiword\": {\n            source: \"apache\",\n            extensions: [\"abw\"]\n          },\n          \"application/x-ace-compressed\": {\n            source: \"apache\",\n            extensions: [\"ace\"]\n          },\n          \"application/x-amf\": {\n            source: \"apache\"\n          },\n          \"application/x-apple-diskimage\": {\n            source: \"apache\",\n            extensions: [\"dmg\"]\n          },\n          \"application/x-arj\": {\n            compressible: false,\n            extensions: [\"arj\"]\n          },\n          \"application/x-authorware-bin\": {\n            source: \"apache\",\n            extensions: [\"aab\", \"x32\", \"u32\", \"vox\"]\n          },\n          \"application/x-authorware-map\": {\n            source: \"apache\",\n            extensions: [\"aam\"]\n          },\n          \"application/x-authorware-seg\": {\n            source: \"apache\",\n            extensions: [\"aas\"]\n          },\n          \"application/x-bcpio\": {\n            source: \"apache\",\n            extensions: [\"bcpio\"]\n          },\n          \"application/x-bdoc\": {\n            compressible: false,\n            extensions: [\"bdoc\"]\n          },\n          \"application/x-bittorrent\": {\n            source: \"apache\",\n            extensions: [\"torrent\"]\n          },\n          \"application/x-blorb\": {\n            source: \"apache\",\n            extensions: [\"blb\", \"blorb\"]\n          },\n          \"application/x-bzip\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"bz\"]\n          },\n          \"application/x-bzip2\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"bz2\", \"boz\"]\n          },\n          \"application/x-cbr\": {\n            source: \"apache\",\n            extensions: [\"cbr\", \"cba\", \"cbt\", \"cbz\", \"cb7\"]\n          },\n          \"application/x-cdlink\": {\n            source: \"apache\",\n            extensions: [\"vcd\"]\n          },\n          \"application/x-cfs-compressed\": {\n            source: \"apache\",\n            extensions: [\"cfs\"]\n          },\n          \"application/x-chat\": {\n            source: \"apache\",\n            extensions: [\"chat\"]\n          },\n          \"application/x-chess-pgn\": {\n            source: \"apache\",\n            extensions: [\"pgn\"]\n          },\n          \"application/x-chrome-extension\": {\n            extensions: [\"crx\"]\n          },\n          \"application/x-cocoa\": {\n            source: \"nginx\",\n            extensions: [\"cco\"]\n          },\n          \"application/x-compress\": {\n            source: \"apache\"\n          },\n          \"application/x-conference\": {\n            source: \"apache\",\n            extensions: [\"nsc\"]\n          },\n          \"application/x-cpio\": {\n            source: \"apache\",\n            extensions: [\"cpio\"]\n          },\n          \"application/x-csh\": {\n            source: \"apache\",\n            extensions: [\"csh\"]\n          },\n          \"application/x-deb\": {\n            compressible: false\n          },\n          \"application/x-debian-package\": {\n            source: \"apache\",\n            extensions: [\"deb\", \"udeb\"]\n          },\n          \"application/x-dgc-compressed\": {\n            source: \"apache\",\n            extensions: [\"dgc\"]\n          },\n          \"application/x-director\": {\n            source: \"apache\",\n            extensions: [\"dir\", \"dcr\", \"dxr\", \"cst\", \"cct\", \"cxt\", \"w3d\", \"fgd\", \"swa\"]\n          },\n          \"application/x-doom\": {\n            source: \"apache\",\n            extensions: [\"wad\"]\n          },\n          \"application/x-dtbncx+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"ncx\"]\n          },\n          \"application/x-dtbook+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"dtb\"]\n          },\n          \"application/x-dtbresource+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"res\"]\n          },\n          \"application/x-dvi\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"dvi\"]\n          },\n          \"application/x-envoy\": {\n            source: \"apache\",\n            extensions: [\"evy\"]\n          },\n          \"application/x-eva\": {\n            source: \"apache\",\n            extensions: [\"eva\"]\n          },\n          \"application/x-font-bdf\": {\n            source: \"apache\",\n            extensions: [\"bdf\"]\n          },\n          \"application/x-font-dos\": {\n            source: \"apache\"\n          },\n          \"application/x-font-framemaker\": {\n            source: \"apache\"\n          },\n          \"application/x-font-ghostscript\": {\n            source: \"apache\",\n            extensions: [\"gsf\"]\n          },\n          \"application/x-font-libgrx\": {\n            source: \"apache\"\n          },\n          \"application/x-font-linux-psf\": {\n            source: \"apache\",\n            extensions: [\"psf\"]\n          },\n          \"application/x-font-pcf\": {\n            source: \"apache\",\n            extensions: [\"pcf\"]\n          },\n          \"application/x-font-snf\": {\n            source: \"apache\",\n            extensions: [\"snf\"]\n          },\n          \"application/x-font-speedo\": {\n            source: \"apache\"\n          },\n          \"application/x-font-sunos-news\": {\n            source: \"apache\"\n          },\n          \"application/x-font-type1\": {\n            source: \"apache\",\n            extensions: [\"pfa\", \"pfb\", \"pfm\", \"afm\"]\n          },\n          \"application/x-font-vfont\": {\n            source: \"apache\"\n          },\n          \"application/x-freearc\": {\n            source: \"apache\",\n            extensions: [\"arc\"]\n          },\n          \"application/x-futuresplash\": {\n            source: \"apache\",\n            extensions: [\"spl\"]\n          },\n          \"application/x-gca-compressed\": {\n            source: \"apache\",\n            extensions: [\"gca\"]\n          },\n          \"application/x-glulx\": {\n            source: \"apache\",\n            extensions: [\"ulx\"]\n          },\n          \"application/x-gnumeric\": {\n            source: \"apache\",\n            extensions: [\"gnumeric\"]\n          },\n          \"application/x-gramps-xml\": {\n            source: \"apache\",\n            extensions: [\"gramps\"]\n          },\n          \"application/x-gtar\": {\n            source: \"apache\",\n            extensions: [\"gtar\"]\n          },\n          \"application/x-gzip\": {\n            source: \"apache\"\n          },\n          \"application/x-hdf\": {\n            source: \"apache\",\n            extensions: [\"hdf\"]\n          },\n          \"application/x-httpd-php\": {\n            compressible: true,\n            extensions: [\"php\"]\n          },\n          \"application/x-install-instructions\": {\n            source: \"apache\",\n            extensions: [\"install\"]\n          },\n          \"application/x-iso9660-image\": {\n            source: \"apache\",\n            extensions: [\"iso\"]\n          },\n          \"application/x-iwork-keynote-sffkey\": {\n            extensions: [\"key\"]\n          },\n          \"application/x-iwork-numbers-sffnumbers\": {\n            extensions: [\"numbers\"]\n          },\n          \"application/x-iwork-pages-sffpages\": {\n            extensions: [\"pages\"]\n          },\n          \"application/x-java-archive-diff\": {\n            source: \"nginx\",\n            extensions: [\"jardiff\"]\n          },\n          \"application/x-java-jnlp-file\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"jnlp\"]\n          },\n          \"application/x-javascript\": {\n            compressible: true\n          },\n          \"application/x-keepass2\": {\n            extensions: [\"kdbx\"]\n          },\n          \"application/x-latex\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"latex\"]\n          },\n          \"application/x-lua-bytecode\": {\n            extensions: [\"luac\"]\n          },\n          \"application/x-lzh-compressed\": {\n            source: \"apache\",\n            extensions: [\"lzh\", \"lha\"]\n          },\n          \"application/x-makeself\": {\n            source: \"nginx\",\n            extensions: [\"run\"]\n          },\n          \"application/x-mie\": {\n            source: \"apache\",\n            extensions: [\"mie\"]\n          },\n          \"application/x-mobipocket-ebook\": {\n            source: \"apache\",\n            extensions: [\"prc\", \"mobi\"]\n          },\n          \"application/x-mpegurl\": {\n            compressible: false\n          },\n          \"application/x-ms-application\": {\n            source: \"apache\",\n            extensions: [\"application\"]\n          },\n          \"application/x-ms-shortcut\": {\n            source: \"apache\",\n            extensions: [\"lnk\"]\n          },\n          \"application/x-ms-wmd\": {\n            source: \"apache\",\n            extensions: [\"wmd\"]\n          },\n          \"application/x-ms-wmz\": {\n            source: \"apache\",\n            extensions: [\"wmz\"]\n          },\n          \"application/x-ms-xbap\": {\n            source: \"apache\",\n            extensions: [\"xbap\"]\n          },\n          \"application/x-msaccess\": {\n            source: \"apache\",\n            extensions: [\"mdb\"]\n          },\n          \"application/x-msbinder\": {\n            source: \"apache\",\n            extensions: [\"obd\"]\n          },\n          \"application/x-mscardfile\": {\n            source: \"apache\",\n            extensions: [\"crd\"]\n          },\n          \"application/x-msclip\": {\n            source: \"apache\",\n            extensions: [\"clp\"]\n          },\n          \"application/x-msdos-program\": {\n            extensions: [\"exe\"]\n          },\n          \"application/x-msdownload\": {\n            source: \"apache\",\n            extensions: [\"exe\", \"dll\", \"com\", \"bat\", \"msi\"]\n          },\n          \"application/x-msmediaview\": {\n            source: \"apache\",\n            extensions: [\"mvb\", \"m13\", \"m14\"]\n          },\n          \"application/x-msmetafile\": {\n            source: \"apache\",\n            extensions: [\"wmf\", \"wmz\", \"emf\", \"emz\"]\n          },\n          \"application/x-msmoney\": {\n            source: \"apache\",\n            extensions: [\"mny\"]\n          },\n          \"application/x-mspublisher\": {\n            source: \"apache\",\n            extensions: [\"pub\"]\n          },\n          \"application/x-msschedule\": {\n            source: \"apache\",\n            extensions: [\"scd\"]\n          },\n          \"application/x-msterminal\": {\n            source: \"apache\",\n            extensions: [\"trm\"]\n          },\n          \"application/x-mswrite\": {\n            source: \"apache\",\n            extensions: [\"wri\"]\n          },\n          \"application/x-netcdf\": {\n            source: \"apache\",\n            extensions: [\"nc\", \"cdf\"]\n          },\n          \"application/x-ns-proxy-autoconfig\": {\n            compressible: true,\n            extensions: [\"pac\"]\n          },\n          \"application/x-nzb\": {\n            source: \"apache\",\n            extensions: [\"nzb\"]\n          },\n          \"application/x-perl\": {\n            source: \"nginx\",\n            extensions: [\"pl\", \"pm\"]\n          },\n          \"application/x-pilot\": {\n            source: \"nginx\",\n            extensions: [\"prc\", \"pdb\"]\n          },\n          \"application/x-pkcs12\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"p12\", \"pfx\"]\n          },\n          \"application/x-pkcs7-certificates\": {\n            source: \"apache\",\n            extensions: [\"p7b\", \"spc\"]\n          },\n          \"application/x-pkcs7-certreqresp\": {\n            source: \"apache\",\n            extensions: [\"p7r\"]\n          },\n          \"application/x-pki-message\": {\n            source: \"iana\"\n          },\n          \"application/x-rar-compressed\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"rar\"]\n          },\n          \"application/x-redhat-package-manager\": {\n            source: \"nginx\",\n            extensions: [\"rpm\"]\n          },\n          \"application/x-research-info-systems\": {\n            source: \"apache\",\n            extensions: [\"ris\"]\n          },\n          \"application/x-sea\": {\n            source: \"nginx\",\n            extensions: [\"sea\"]\n          },\n          \"application/x-sh\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"sh\"]\n          },\n          \"application/x-shar\": {\n            source: \"apache\",\n            extensions: [\"shar\"]\n          },\n          \"application/x-shockwave-flash\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"swf\"]\n          },\n          \"application/x-silverlight-app\": {\n            source: \"apache\",\n            extensions: [\"xap\"]\n          },\n          \"application/x-sql\": {\n            source: \"apache\",\n            extensions: [\"sql\"]\n          },\n          \"application/x-stuffit\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"sit\"]\n          },\n          \"application/x-stuffitx\": {\n            source: \"apache\",\n            extensions: [\"sitx\"]\n          },\n          \"application/x-subrip\": {\n            source: \"apache\",\n            extensions: [\"srt\"]\n          },\n          \"application/x-sv4cpio\": {\n            source: \"apache\",\n            extensions: [\"sv4cpio\"]\n          },\n          \"application/x-sv4crc\": {\n            source: \"apache\",\n            extensions: [\"sv4crc\"]\n          },\n          \"application/x-t3vm-image\": {\n            source: \"apache\",\n            extensions: [\"t3\"]\n          },\n          \"application/x-tads\": {\n            source: \"apache\",\n            extensions: [\"gam\"]\n          },\n          \"application/x-tar\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"tar\"]\n          },\n          \"application/x-tcl\": {\n            source: \"apache\",\n            extensions: [\"tcl\", \"tk\"]\n          },\n          \"application/x-tex\": {\n            source: \"apache\",\n            extensions: [\"tex\"]\n          },\n          \"application/x-tex-tfm\": {\n            source: \"apache\",\n            extensions: [\"tfm\"]\n          },\n          \"application/x-texinfo\": {\n            source: \"apache\",\n            extensions: [\"texinfo\", \"texi\"]\n          },\n          \"application/x-tgif\": {\n            source: \"apache\",\n            extensions: [\"obj\"]\n          },\n          \"application/x-ustar\": {\n            source: \"apache\",\n            extensions: [\"ustar\"]\n          },\n          \"application/x-virtualbox-hdd\": {\n            compressible: true,\n            extensions: [\"hdd\"]\n          },\n          \"application/x-virtualbox-ova\": {\n            compressible: true,\n            extensions: [\"ova\"]\n          },\n          \"application/x-virtualbox-ovf\": {\n            compressible: true,\n            extensions: [\"ovf\"]\n          },\n          \"application/x-virtualbox-vbox\": {\n            compressible: true,\n            extensions: [\"vbox\"]\n          },\n          \"application/x-virtualbox-vbox-extpack\": {\n            compressible: false,\n            extensions: [\"vbox-extpack\"]\n          },\n          \"application/x-virtualbox-vdi\": {\n            compressible: true,\n            extensions: [\"vdi\"]\n          },\n          \"application/x-virtualbox-vhd\": {\n            compressible: true,\n            extensions: [\"vhd\"]\n          },\n          \"application/x-virtualbox-vmdk\": {\n            compressible: true,\n            extensions: [\"vmdk\"]\n          },\n          \"application/x-wais-source\": {\n            source: \"apache\",\n            extensions: [\"src\"]\n          },\n          \"application/x-web-app-manifest+json\": {\n            compressible: true,\n            extensions: [\"webapp\"]\n          },\n          \"application/x-www-form-urlencoded\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/x-x509-ca-cert\": {\n            source: \"iana\",\n            extensions: [\"der\", \"crt\", \"pem\"]\n          },\n          \"application/x-x509-ca-ra-cert\": {\n            source: \"iana\"\n          },\n          \"application/x-x509-next-ca-cert\": {\n            source: \"iana\"\n          },\n          \"application/x-xfig\": {\n            source: \"apache\",\n            extensions: [\"fig\"]\n          },\n          \"application/x-xliff+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"xlf\"]\n          },\n          \"application/x-xpinstall\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"xpi\"]\n          },\n          \"application/x-xz\": {\n            source: \"apache\",\n            extensions: [\"xz\"]\n          },\n          \"application/x-zmachine\": {\n            source: \"apache\",\n            extensions: [\"z1\", \"z2\", \"z3\", \"z4\", \"z5\", \"z6\", \"z7\", \"z8\"]\n          },\n          \"application/x400-bp\": {\n            source: \"iana\"\n          },\n          \"application/xacml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xaml+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"xaml\"]\n          },\n          \"application/xcap-att+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xav\"]\n          },\n          \"application/xcap-caps+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xca\"]\n          },\n          \"application/xcap-diff+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xdf\"]\n          },\n          \"application/xcap-el+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xel\"]\n          },\n          \"application/xcap-error+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xcap-ns+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xns\"]\n          },\n          \"application/xcon-conference-info+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xcon-conference-info-diff+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xenc+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xenc\"]\n          },\n          \"application/xhtml+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xhtml\", \"xht\"]\n          },\n          \"application/xhtml-voice+xml\": {\n            source: \"apache\",\n            compressible: true\n          },\n          \"application/xliff+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xlf\"]\n          },\n          \"application/xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xml\", \"xsl\", \"xsd\", \"rng\"]\n          },\n          \"application/xml-dtd\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"dtd\"]\n          },\n          \"application/xml-external-parsed-entity\": {\n            source: \"iana\"\n          },\n          \"application/xml-patch+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xmpp+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/xop+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xop\"]\n          },\n          \"application/xproc+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"xpl\"]\n          },\n          \"application/xslt+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xsl\", \"xslt\"]\n          },\n          \"application/xspf+xml\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"xspf\"]\n          },\n          \"application/xv+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"mxml\", \"xhvml\", \"xvml\", \"xvm\"]\n          },\n          \"application/yang\": {\n            source: \"iana\",\n            extensions: [\"yang\"]\n          },\n          \"application/yang-data+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/yang-data+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/yang-patch+json\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/yang-patch+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"application/yin+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"yin\"]\n          },\n          \"application/zip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"zip\"]\n          },\n          \"application/zlib\": {\n            source: \"iana\"\n          },\n          \"application/zstd\": {\n            source: \"iana\"\n          },\n          \"audio/1d-interleaved-parityfec\": {\n            source: \"iana\"\n          },\n          \"audio/32kadpcm\": {\n            source: \"iana\"\n          },\n          \"audio/3gpp\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"3gpp\"]\n          },\n          \"audio/3gpp2\": {\n            source: \"iana\"\n          },\n          \"audio/aac\": {\n            source: \"iana\"\n          },\n          \"audio/ac3\": {\n            source: \"iana\"\n          },\n          \"audio/adpcm\": {\n            source: \"apache\",\n            extensions: [\"adp\"]\n          },\n          \"audio/amr\": {\n            source: \"iana\",\n            extensions: [\"amr\"]\n          },\n          \"audio/amr-wb\": {\n            source: \"iana\"\n          },\n          \"audio/amr-wb+\": {\n            source: \"iana\"\n          },\n          \"audio/aptx\": {\n            source: \"iana\"\n          },\n          \"audio/asc\": {\n            source: \"iana\"\n          },\n          \"audio/atrac-advanced-lossless\": {\n            source: \"iana\"\n          },\n          \"audio/atrac-x\": {\n            source: \"iana\"\n          },\n          \"audio/atrac3\": {\n            source: \"iana\"\n          },\n          \"audio/basic\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"au\", \"snd\"]\n          },\n          \"audio/bv16\": {\n            source: \"iana\"\n          },\n          \"audio/bv32\": {\n            source: \"iana\"\n          },\n          \"audio/clearmode\": {\n            source: \"iana\"\n          },\n          \"audio/cn\": {\n            source: \"iana\"\n          },\n          \"audio/dat12\": {\n            source: \"iana\"\n          },\n          \"audio/dls\": {\n            source: \"iana\"\n          },\n          \"audio/dsr-es201108\": {\n            source: \"iana\"\n          },\n          \"audio/dsr-es202050\": {\n            source: \"iana\"\n          },\n          \"audio/dsr-es202211\": {\n            source: \"iana\"\n          },\n          \"audio/dsr-es202212\": {\n            source: \"iana\"\n          },\n          \"audio/dv\": {\n            source: \"iana\"\n          },\n          \"audio/dvi4\": {\n            source: \"iana\"\n          },\n          \"audio/eac3\": {\n            source: \"iana\"\n          },\n          \"audio/encaprtp\": {\n            source: \"iana\"\n          },\n          \"audio/evrc\": {\n            source: \"iana\"\n          },\n          \"audio/evrc-qcp\": {\n            source: \"iana\"\n          },\n          \"audio/evrc0\": {\n            source: \"iana\"\n          },\n          \"audio/evrc1\": {\n            source: \"iana\"\n          },\n          \"audio/evrcb\": {\n            source: \"iana\"\n          },\n          \"audio/evrcb0\": {\n            source: \"iana\"\n          },\n          \"audio/evrcb1\": {\n            source: \"iana\"\n          },\n          \"audio/evrcnw\": {\n            source: \"iana\"\n          },\n          \"audio/evrcnw0\": {\n            source: \"iana\"\n          },\n          \"audio/evrcnw1\": {\n            source: \"iana\"\n          },\n          \"audio/evrcwb\": {\n            source: \"iana\"\n          },\n          \"audio/evrcwb0\": {\n            source: \"iana\"\n          },\n          \"audio/evrcwb1\": {\n            source: \"iana\"\n          },\n          \"audio/evs\": {\n            source: \"iana\"\n          },\n          \"audio/flexfec\": {\n            source: \"iana\"\n          },\n          \"audio/fwdred\": {\n            source: \"iana\"\n          },\n          \"audio/g711-0\": {\n            source: \"iana\"\n          },\n          \"audio/g719\": {\n            source: \"iana\"\n          },\n          \"audio/g722\": {\n            source: \"iana\"\n          },\n          \"audio/g7221\": {\n            source: \"iana\"\n          },\n          \"audio/g723\": {\n            source: \"iana\"\n          },\n          \"audio/g726-16\": {\n            source: \"iana\"\n          },\n          \"audio/g726-24\": {\n            source: \"iana\"\n          },\n          \"audio/g726-32\": {\n            source: \"iana\"\n          },\n          \"audio/g726-40\": {\n            source: \"iana\"\n          },\n          \"audio/g728\": {\n            source: \"iana\"\n          },\n          \"audio/g729\": {\n            source: \"iana\"\n          },\n          \"audio/g7291\": {\n            source: \"iana\"\n          },\n          \"audio/g729d\": {\n            source: \"iana\"\n          },\n          \"audio/g729e\": {\n            source: \"iana\"\n          },\n          \"audio/gsm\": {\n            source: \"iana\"\n          },\n          \"audio/gsm-efr\": {\n            source: \"iana\"\n          },\n          \"audio/gsm-hr-08\": {\n            source: \"iana\"\n          },\n          \"audio/ilbc\": {\n            source: \"iana\"\n          },\n          \"audio/ip-mr_v2.5\": {\n            source: \"iana\"\n          },\n          \"audio/isac\": {\n            source: \"apache\"\n          },\n          \"audio/l16\": {\n            source: \"iana\"\n          },\n          \"audio/l20\": {\n            source: \"iana\"\n          },\n          \"audio/l24\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"audio/l8\": {\n            source: \"iana\"\n          },\n          \"audio/lpc\": {\n            source: \"iana\"\n          },\n          \"audio/melp\": {\n            source: \"iana\"\n          },\n          \"audio/melp1200\": {\n            source: \"iana\"\n          },\n          \"audio/melp2400\": {\n            source: \"iana\"\n          },\n          \"audio/melp600\": {\n            source: \"iana\"\n          },\n          \"audio/mhas\": {\n            source: \"iana\"\n          },\n          \"audio/midi\": {\n            source: \"apache\",\n            extensions: [\"mid\", \"midi\", \"kar\", \"rmi\"]\n          },\n          \"audio/mobile-xmf\": {\n            source: \"iana\",\n            extensions: [\"mxmf\"]\n          },\n          \"audio/mp3\": {\n            compressible: false,\n            extensions: [\"mp3\"]\n          },\n          \"audio/mp4\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"m4a\", \"mp4a\"]\n          },\n          \"audio/mp4a-latm\": {\n            source: \"iana\"\n          },\n          \"audio/mpa\": {\n            source: \"iana\"\n          },\n          \"audio/mpa-robust\": {\n            source: \"iana\"\n          },\n          \"audio/mpeg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"mpga\", \"mp2\", \"mp2a\", \"mp3\", \"m2a\", \"m3a\"]\n          },\n          \"audio/mpeg4-generic\": {\n            source: \"iana\"\n          },\n          \"audio/musepack\": {\n            source: \"apache\"\n          },\n          \"audio/ogg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"oga\", \"ogg\", \"spx\", \"opus\"]\n          },\n          \"audio/opus\": {\n            source: \"iana\"\n          },\n          \"audio/parityfec\": {\n            source: \"iana\"\n          },\n          \"audio/pcma\": {\n            source: \"iana\"\n          },\n          \"audio/pcma-wb\": {\n            source: \"iana\"\n          },\n          \"audio/pcmu\": {\n            source: \"iana\"\n          },\n          \"audio/pcmu-wb\": {\n            source: \"iana\"\n          },\n          \"audio/prs.sid\": {\n            source: \"iana\"\n          },\n          \"audio/qcelp\": {\n            source: \"iana\"\n          },\n          \"audio/raptorfec\": {\n            source: \"iana\"\n          },\n          \"audio/red\": {\n            source: \"iana\"\n          },\n          \"audio/rtp-enc-aescm128\": {\n            source: \"iana\"\n          },\n          \"audio/rtp-midi\": {\n            source: \"iana\"\n          },\n          \"audio/rtploopback\": {\n            source: \"iana\"\n          },\n          \"audio/rtx\": {\n            source: \"iana\"\n          },\n          \"audio/s3m\": {\n            source: \"apache\",\n            extensions: [\"s3m\"]\n          },\n          \"audio/scip\": {\n            source: \"iana\"\n          },\n          \"audio/silk\": {\n            source: \"apache\",\n            extensions: [\"sil\"]\n          },\n          \"audio/smv\": {\n            source: \"iana\"\n          },\n          \"audio/smv-qcp\": {\n            source: \"iana\"\n          },\n          \"audio/smv0\": {\n            source: \"iana\"\n          },\n          \"audio/sofa\": {\n            source: \"iana\"\n          },\n          \"audio/sp-midi\": {\n            source: \"iana\"\n          },\n          \"audio/speex\": {\n            source: \"iana\"\n          },\n          \"audio/t140c\": {\n            source: \"iana\"\n          },\n          \"audio/t38\": {\n            source: \"iana\"\n          },\n          \"audio/telephone-event\": {\n            source: \"iana\"\n          },\n          \"audio/tetra_acelp\": {\n            source: \"iana\"\n          },\n          \"audio/tetra_acelp_bb\": {\n            source: \"iana\"\n          },\n          \"audio/tone\": {\n            source: \"iana\"\n          },\n          \"audio/tsvcis\": {\n            source: \"iana\"\n          },\n          \"audio/uemclip\": {\n            source: \"iana\"\n          },\n          \"audio/ulpfec\": {\n            source: \"iana\"\n          },\n          \"audio/usac\": {\n            source: \"iana\"\n          },\n          \"audio/vdvi\": {\n            source: \"iana\"\n          },\n          \"audio/vmr-wb\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.3gpp.iufp\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.4sb\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.audiokoz\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.celp\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.cisco.nse\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.cmles.radio-events\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.cns.anp1\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.cns.inf1\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dece.audio\": {\n            source: \"iana\",\n            extensions: [\"uva\", \"uvva\"]\n          },\n          \"audio/vnd.digital-winds\": {\n            source: \"iana\",\n            extensions: [\"eol\"]\n          },\n          \"audio/vnd.dlna.adts\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.heaac.1\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.heaac.2\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.mlp\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.mps\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.pl2\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.pl2x\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.pl2z\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dolby.pulse.1\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dra\": {\n            source: \"iana\",\n            extensions: [\"dra\"]\n          },\n          \"audio/vnd.dts\": {\n            source: \"iana\",\n            extensions: [\"dts\"]\n          },\n          \"audio/vnd.dts.hd\": {\n            source: \"iana\",\n            extensions: [\"dtshd\"]\n          },\n          \"audio/vnd.dts.uhd\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.dvb.file\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.everad.plj\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.hns.audio\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.lucent.voice\": {\n            source: \"iana\",\n            extensions: [\"lvp\"]\n          },\n          \"audio/vnd.ms-playready.media.pya\": {\n            source: \"iana\",\n            extensions: [\"pya\"]\n          },\n          \"audio/vnd.nokia.mobile-xmf\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.nortel.vbk\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.nuera.ecelp4800\": {\n            source: \"iana\",\n            extensions: [\"ecelp4800\"]\n          },\n          \"audio/vnd.nuera.ecelp7470\": {\n            source: \"iana\",\n            extensions: [\"ecelp7470\"]\n          },\n          \"audio/vnd.nuera.ecelp9600\": {\n            source: \"iana\",\n            extensions: [\"ecelp9600\"]\n          },\n          \"audio/vnd.octel.sbc\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.presonus.multitrack\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.qcelp\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.rhetorex.32kadpcm\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.rip\": {\n            source: \"iana\",\n            extensions: [\"rip\"]\n          },\n          \"audio/vnd.rn-realaudio\": {\n            compressible: false\n          },\n          \"audio/vnd.sealedmedia.softseal.mpeg\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.vmx.cvsd\": {\n            source: \"iana\"\n          },\n          \"audio/vnd.wave\": {\n            compressible: false\n          },\n          \"audio/vorbis\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"audio/vorbis-config\": {\n            source: \"iana\"\n          },\n          \"audio/wav\": {\n            compressible: false,\n            extensions: [\"wav\"]\n          },\n          \"audio/wave\": {\n            compressible: false,\n            extensions: [\"wav\"]\n          },\n          \"audio/webm\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"weba\"]\n          },\n          \"audio/x-aac\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"aac\"]\n          },\n          \"audio/x-aiff\": {\n            source: \"apache\",\n            extensions: [\"aif\", \"aiff\", \"aifc\"]\n          },\n          \"audio/x-caf\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"caf\"]\n          },\n          \"audio/x-flac\": {\n            source: \"apache\",\n            extensions: [\"flac\"]\n          },\n          \"audio/x-m4a\": {\n            source: \"nginx\",\n            extensions: [\"m4a\"]\n          },\n          \"audio/x-matroska\": {\n            source: \"apache\",\n            extensions: [\"mka\"]\n          },\n          \"audio/x-mpegurl\": {\n            source: \"apache\",\n            extensions: [\"m3u\"]\n          },\n          \"audio/x-ms-wax\": {\n            source: \"apache\",\n            extensions: [\"wax\"]\n          },\n          \"audio/x-ms-wma\": {\n            source: \"apache\",\n            extensions: [\"wma\"]\n          },\n          \"audio/x-pn-realaudio\": {\n            source: \"apache\",\n            extensions: [\"ram\", \"ra\"]\n          },\n          \"audio/x-pn-realaudio-plugin\": {\n            source: \"apache\",\n            extensions: [\"rmp\"]\n          },\n          \"audio/x-realaudio\": {\n            source: \"nginx\",\n            extensions: [\"ra\"]\n          },\n          \"audio/x-tta\": {\n            source: \"apache\"\n          },\n          \"audio/x-wav\": {\n            source: \"apache\",\n            extensions: [\"wav\"]\n          },\n          \"audio/xm\": {\n            source: \"apache\",\n            extensions: [\"xm\"]\n          },\n          \"chemical/x-cdx\": {\n            source: \"apache\",\n            extensions: [\"cdx\"]\n          },\n          \"chemical/x-cif\": {\n            source: \"apache\",\n            extensions: [\"cif\"]\n          },\n          \"chemical/x-cmdf\": {\n            source: \"apache\",\n            extensions: [\"cmdf\"]\n          },\n          \"chemical/x-cml\": {\n            source: \"apache\",\n            extensions: [\"cml\"]\n          },\n          \"chemical/x-csml\": {\n            source: \"apache\",\n            extensions: [\"csml\"]\n          },\n          \"chemical/x-pdb\": {\n            source: \"apache\"\n          },\n          \"chemical/x-xyz\": {\n            source: \"apache\",\n            extensions: [\"xyz\"]\n          },\n          \"font/collection\": {\n            source: \"iana\",\n            extensions: [\"ttc\"]\n          },\n          \"font/otf\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"otf\"]\n          },\n          \"font/sfnt\": {\n            source: \"iana\"\n          },\n          \"font/ttf\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ttf\"]\n          },\n          \"font/woff\": {\n            source: \"iana\",\n            extensions: [\"woff\"]\n          },\n          \"font/woff2\": {\n            source: \"iana\",\n            extensions: [\"woff2\"]\n          },\n          \"image/aces\": {\n            source: \"iana\",\n            extensions: [\"exr\"]\n          },\n          \"image/apng\": {\n            compressible: false,\n            extensions: [\"apng\"]\n          },\n          \"image/avci\": {\n            source: \"iana\",\n            extensions: [\"avci\"]\n          },\n          \"image/avcs\": {\n            source: \"iana\",\n            extensions: [\"avcs\"]\n          },\n          \"image/avif\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"avif\"]\n          },\n          \"image/bmp\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"bmp\"]\n          },\n          \"image/cgm\": {\n            source: \"iana\",\n            extensions: [\"cgm\"]\n          },\n          \"image/dicom-rle\": {\n            source: \"iana\",\n            extensions: [\"drle\"]\n          },\n          \"image/emf\": {\n            source: \"iana\",\n            extensions: [\"emf\"]\n          },\n          \"image/fits\": {\n            source: \"iana\",\n            extensions: [\"fits\"]\n          },\n          \"image/g3fax\": {\n            source: \"iana\",\n            extensions: [\"g3\"]\n          },\n          \"image/gif\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"gif\"]\n          },\n          \"image/heic\": {\n            source: \"iana\",\n            extensions: [\"heic\"]\n          },\n          \"image/heic-sequence\": {\n            source: \"iana\",\n            extensions: [\"heics\"]\n          },\n          \"image/heif\": {\n            source: \"iana\",\n            extensions: [\"heif\"]\n          },\n          \"image/heif-sequence\": {\n            source: \"iana\",\n            extensions: [\"heifs\"]\n          },\n          \"image/hej2k\": {\n            source: \"iana\",\n            extensions: [\"hej2\"]\n          },\n          \"image/hsj2\": {\n            source: \"iana\",\n            extensions: [\"hsj2\"]\n          },\n          \"image/ief\": {\n            source: \"iana\",\n            extensions: [\"ief\"]\n          },\n          \"image/jls\": {\n            source: \"iana\",\n            extensions: [\"jls\"]\n          },\n          \"image/jp2\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"jp2\", \"jpg2\"]\n          },\n          \"image/jpeg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"jpeg\", \"jpg\", \"jpe\"]\n          },\n          \"image/jph\": {\n            source: \"iana\",\n            extensions: [\"jph\"]\n          },\n          \"image/jphc\": {\n            source: \"iana\",\n            extensions: [\"jhc\"]\n          },\n          \"image/jpm\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"jpm\"]\n          },\n          \"image/jpx\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"jpx\", \"jpf\"]\n          },\n          \"image/jxr\": {\n            source: \"iana\",\n            extensions: [\"jxr\"]\n          },\n          \"image/jxra\": {\n            source: \"iana\",\n            extensions: [\"jxra\"]\n          },\n          \"image/jxrs\": {\n            source: \"iana\",\n            extensions: [\"jxrs\"]\n          },\n          \"image/jxs\": {\n            source: \"iana\",\n            extensions: [\"jxs\"]\n          },\n          \"image/jxsc\": {\n            source: \"iana\",\n            extensions: [\"jxsc\"]\n          },\n          \"image/jxsi\": {\n            source: \"iana\",\n            extensions: [\"jxsi\"]\n          },\n          \"image/jxss\": {\n            source: \"iana\",\n            extensions: [\"jxss\"]\n          },\n          \"image/ktx\": {\n            source: \"iana\",\n            extensions: [\"ktx\"]\n          },\n          \"image/ktx2\": {\n            source: \"iana\",\n            extensions: [\"ktx2\"]\n          },\n          \"image/naplps\": {\n            source: \"iana\"\n          },\n          \"image/pjpeg\": {\n            compressible: false\n          },\n          \"image/png\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"png\"]\n          },\n          \"image/prs.btif\": {\n            source: \"iana\",\n            extensions: [\"btif\"]\n          },\n          \"image/prs.pti\": {\n            source: \"iana\",\n            extensions: [\"pti\"]\n          },\n          \"image/pwg-raster\": {\n            source: \"iana\"\n          },\n          \"image/sgi\": {\n            source: \"apache\",\n            extensions: [\"sgi\"]\n          },\n          \"image/svg+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"svg\", \"svgz\"]\n          },\n          \"image/t38\": {\n            source: \"iana\",\n            extensions: [\"t38\"]\n          },\n          \"image/tiff\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"tif\", \"tiff\"]\n          },\n          \"image/tiff-fx\": {\n            source: \"iana\",\n            extensions: [\"tfx\"]\n          },\n          \"image/vnd.adobe.photoshop\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"psd\"]\n          },\n          \"image/vnd.airzip.accelerator.azv\": {\n            source: \"iana\",\n            extensions: [\"azv\"]\n          },\n          \"image/vnd.cns.inf2\": {\n            source: \"iana\"\n          },\n          \"image/vnd.dece.graphic\": {\n            source: \"iana\",\n            extensions: [\"uvi\", \"uvvi\", \"uvg\", \"uvvg\"]\n          },\n          \"image/vnd.djvu\": {\n            source: \"iana\",\n            extensions: [\"djvu\", \"djv\"]\n          },\n          \"image/vnd.dvb.subtitle\": {\n            source: \"iana\",\n            extensions: [\"sub\"]\n          },\n          \"image/vnd.dwg\": {\n            source: \"iana\",\n            extensions: [\"dwg\"]\n          },\n          \"image/vnd.dxf\": {\n            source: \"iana\",\n            extensions: [\"dxf\"]\n          },\n          \"image/vnd.fastbidsheet\": {\n            source: \"iana\",\n            extensions: [\"fbs\"]\n          },\n          \"image/vnd.fpx\": {\n            source: \"iana\",\n            extensions: [\"fpx\"]\n          },\n          \"image/vnd.fst\": {\n            source: \"iana\",\n            extensions: [\"fst\"]\n          },\n          \"image/vnd.fujixerox.edmics-mmr\": {\n            source: \"iana\",\n            extensions: [\"mmr\"]\n          },\n          \"image/vnd.fujixerox.edmics-rlc\": {\n            source: \"iana\",\n            extensions: [\"rlc\"]\n          },\n          \"image/vnd.globalgraphics.pgb\": {\n            source: \"iana\"\n          },\n          \"image/vnd.microsoft.icon\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"ico\"]\n          },\n          \"image/vnd.mix\": {\n            source: \"iana\"\n          },\n          \"image/vnd.mozilla.apng\": {\n            source: \"iana\"\n          },\n          \"image/vnd.ms-dds\": {\n            compressible: true,\n            extensions: [\"dds\"]\n          },\n          \"image/vnd.ms-modi\": {\n            source: \"iana\",\n            extensions: [\"mdi\"]\n          },\n          \"image/vnd.ms-photo\": {\n            source: \"apache\",\n            extensions: [\"wdp\"]\n          },\n          \"image/vnd.net-fpx\": {\n            source: \"iana\",\n            extensions: [\"npx\"]\n          },\n          \"image/vnd.pco.b16\": {\n            source: \"iana\",\n            extensions: [\"b16\"]\n          },\n          \"image/vnd.radiance\": {\n            source: \"iana\"\n          },\n          \"image/vnd.sealed.png\": {\n            source: \"iana\"\n          },\n          \"image/vnd.sealedmedia.softseal.gif\": {\n            source: \"iana\"\n          },\n          \"image/vnd.sealedmedia.softseal.jpg\": {\n            source: \"iana\"\n          },\n          \"image/vnd.svf\": {\n            source: \"iana\"\n          },\n          \"image/vnd.tencent.tap\": {\n            source: \"iana\",\n            extensions: [\"tap\"]\n          },\n          \"image/vnd.valve.source.texture\": {\n            source: \"iana\",\n            extensions: [\"vtf\"]\n          },\n          \"image/vnd.wap.wbmp\": {\n            source: \"iana\",\n            extensions: [\"wbmp\"]\n          },\n          \"image/vnd.xiff\": {\n            source: \"iana\",\n            extensions: [\"xif\"]\n          },\n          \"image/vnd.zbrush.pcx\": {\n            source: \"iana\",\n            extensions: [\"pcx\"]\n          },\n          \"image/webp\": {\n            source: \"apache\",\n            extensions: [\"webp\"]\n          },\n          \"image/wmf\": {\n            source: \"iana\",\n            extensions: [\"wmf\"]\n          },\n          \"image/x-3ds\": {\n            source: \"apache\",\n            extensions: [\"3ds\"]\n          },\n          \"image/x-cmu-raster\": {\n            source: \"apache\",\n            extensions: [\"ras\"]\n          },\n          \"image/x-cmx\": {\n            source: \"apache\",\n            extensions: [\"cmx\"]\n          },\n          \"image/x-freehand\": {\n            source: \"apache\",\n            extensions: [\"fh\", \"fhc\", \"fh4\", \"fh5\", \"fh7\"]\n          },\n          \"image/x-icon\": {\n            source: \"apache\",\n            compressible: true,\n            extensions: [\"ico\"]\n          },\n          \"image/x-jng\": {\n            source: \"nginx\",\n            extensions: [\"jng\"]\n          },\n          \"image/x-mrsid-image\": {\n            source: \"apache\",\n            extensions: [\"sid\"]\n          },\n          \"image/x-ms-bmp\": {\n            source: \"nginx\",\n            compressible: true,\n            extensions: [\"bmp\"]\n          },\n          \"image/x-pcx\": {\n            source: \"apache\",\n            extensions: [\"pcx\"]\n          },\n          \"image/x-pict\": {\n            source: \"apache\",\n            extensions: [\"pic\", \"pct\"]\n          },\n          \"image/x-portable-anymap\": {\n            source: \"apache\",\n            extensions: [\"pnm\"]\n          },\n          \"image/x-portable-bitmap\": {\n            source: \"apache\",\n            extensions: [\"pbm\"]\n          },\n          \"image/x-portable-graymap\": {\n            source: \"apache\",\n            extensions: [\"pgm\"]\n          },\n          \"image/x-portable-pixmap\": {\n            source: \"apache\",\n            extensions: [\"ppm\"]\n          },\n          \"image/x-rgb\": {\n            source: \"apache\",\n            extensions: [\"rgb\"]\n          },\n          \"image/x-tga\": {\n            source: \"apache\",\n            extensions: [\"tga\"]\n          },\n          \"image/x-xbitmap\": {\n            source: \"apache\",\n            extensions: [\"xbm\"]\n          },\n          \"image/x-xcf\": {\n            compressible: false\n          },\n          \"image/x-xpixmap\": {\n            source: \"apache\",\n            extensions: [\"xpm\"]\n          },\n          \"image/x-xwindowdump\": {\n            source: \"apache\",\n            extensions: [\"xwd\"]\n          },\n          \"message/cpim\": {\n            source: \"iana\"\n          },\n          \"message/delivery-status\": {\n            source: \"iana\"\n          },\n          \"message/disposition-notification\": {\n            source: \"iana\",\n            extensions: [\"disposition-notification\"]\n          },\n          \"message/external-body\": {\n            source: \"iana\"\n          },\n          \"message/feedback-report\": {\n            source: \"iana\"\n          },\n          \"message/global\": {\n            source: \"iana\",\n            extensions: [\"u8msg\"]\n          },\n          \"message/global-delivery-status\": {\n            source: \"iana\",\n            extensions: [\"u8dsn\"]\n          },\n          \"message/global-disposition-notification\": {\n            source: \"iana\",\n            extensions: [\"u8mdn\"]\n          },\n          \"message/global-headers\": {\n            source: \"iana\",\n            extensions: [\"u8hdr\"]\n          },\n          \"message/http\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"message/imdn+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"message/news\": {\n            source: \"iana\"\n          },\n          \"message/partial\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"message/rfc822\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"eml\", \"mime\"]\n          },\n          \"message/s-http\": {\n            source: \"iana\"\n          },\n          \"message/sip\": {\n            source: \"iana\"\n          },\n          \"message/sipfrag\": {\n            source: \"iana\"\n          },\n          \"message/tracking-status\": {\n            source: \"iana\"\n          },\n          \"message/vnd.si.simp\": {\n            source: \"iana\"\n          },\n          \"message/vnd.wfa.wsc\": {\n            source: \"iana\",\n            extensions: [\"wsc\"]\n          },\n          \"model/3mf\": {\n            source: \"iana\",\n            extensions: [\"3mf\"]\n          },\n          \"model/e57\": {\n            source: \"iana\"\n          },\n          \"model/gltf+json\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"gltf\"]\n          },\n          \"model/gltf-binary\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"glb\"]\n          },\n          \"model/iges\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"igs\", \"iges\"]\n          },\n          \"model/mesh\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"msh\", \"mesh\", \"silo\"]\n          },\n          \"model/mtl\": {\n            source: \"iana\",\n            extensions: [\"mtl\"]\n          },\n          \"model/obj\": {\n            source: \"iana\",\n            extensions: [\"obj\"]\n          },\n          \"model/step\": {\n            source: \"iana\"\n          },\n          \"model/step+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"stpx\"]\n          },\n          \"model/step+zip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"stpz\"]\n          },\n          \"model/step-xml+zip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"stpxz\"]\n          },\n          \"model/stl\": {\n            source: \"iana\",\n            extensions: [\"stl\"]\n          },\n          \"model/vnd.collada+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"dae\"]\n          },\n          \"model/vnd.dwf\": {\n            source: \"iana\",\n            extensions: [\"dwf\"]\n          },\n          \"model/vnd.flatland.3dml\": {\n            source: \"iana\"\n          },\n          \"model/vnd.gdl\": {\n            source: \"iana\",\n            extensions: [\"gdl\"]\n          },\n          \"model/vnd.gs-gdl\": {\n            source: \"apache\"\n          },\n          \"model/vnd.gs.gdl\": {\n            source: \"iana\"\n          },\n          \"model/vnd.gtw\": {\n            source: \"iana\",\n            extensions: [\"gtw\"]\n          },\n          \"model/vnd.moml+xml\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"model/vnd.mts\": {\n            source: \"iana\",\n            extensions: [\"mts\"]\n          },\n          \"model/vnd.opengex\": {\n            source: \"iana\",\n            extensions: [\"ogex\"]\n          },\n          \"model/vnd.parasolid.transmit.binary\": {\n            source: \"iana\",\n            extensions: [\"x_b\"]\n          },\n          \"model/vnd.parasolid.transmit.text\": {\n            source: \"iana\",\n            extensions: [\"x_t\"]\n          },\n          \"model/vnd.pytha.pyox\": {\n            source: \"iana\"\n          },\n          \"model/vnd.rosette.annotated-data-model\": {\n            source: \"iana\"\n          },\n          \"model/vnd.sap.vds\": {\n            source: \"iana\",\n            extensions: [\"vds\"]\n          },\n          \"model/vnd.usdz+zip\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"usdz\"]\n          },\n          \"model/vnd.valve.source.compiled-map\": {\n            source: \"iana\",\n            extensions: [\"bsp\"]\n          },\n          \"model/vnd.vtu\": {\n            source: \"iana\",\n            extensions: [\"vtu\"]\n          },\n          \"model/vrml\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"wrl\", \"vrml\"]\n          },\n          \"model/x3d+binary\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"x3db\", \"x3dbz\"]\n          },\n          \"model/x3d+fastinfoset\": {\n            source: \"iana\",\n            extensions: [\"x3db\"]\n          },\n          \"model/x3d+vrml\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"x3dv\", \"x3dvz\"]\n          },\n          \"model/x3d+xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"x3d\", \"x3dz\"]\n          },\n          \"model/x3d-vrml\": {\n            source: \"iana\",\n            extensions: [\"x3dv\"]\n          },\n          \"multipart/alternative\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"multipart/appledouble\": {\n            source: \"iana\"\n          },\n          \"multipart/byteranges\": {\n            source: \"iana\"\n          },\n          \"multipart/digest\": {\n            source: \"iana\"\n          },\n          \"multipart/encrypted\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"multipart/form-data\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"multipart/header-set\": {\n            source: \"iana\"\n          },\n          \"multipart/mixed\": {\n            source: \"iana\"\n          },\n          \"multipart/multilingual\": {\n            source: \"iana\"\n          },\n          \"multipart/parallel\": {\n            source: \"iana\"\n          },\n          \"multipart/related\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"multipart/report\": {\n            source: \"iana\"\n          },\n          \"multipart/signed\": {\n            source: \"iana\",\n            compressible: false\n          },\n          \"multipart/vnd.bint.med-plus\": {\n            source: \"iana\"\n          },\n          \"multipart/voice-message\": {\n            source: \"iana\"\n          },\n          \"multipart/x-mixed-replace\": {\n            source: \"iana\"\n          },\n          \"text/1d-interleaved-parityfec\": {\n            source: \"iana\"\n          },\n          \"text/cache-manifest\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"appcache\", \"manifest\"]\n          },\n          \"text/calendar\": {\n            source: \"iana\",\n            extensions: [\"ics\", \"ifb\"]\n          },\n          \"text/calender\": {\n            compressible: true\n          },\n          \"text/cmd\": {\n            compressible: true\n          },\n          \"text/coffeescript\": {\n            extensions: [\"coffee\", \"litcoffee\"]\n          },\n          \"text/cql\": {\n            source: \"iana\"\n          },\n          \"text/cql-expression\": {\n            source: \"iana\"\n          },\n          \"text/cql-identifier\": {\n            source: \"iana\"\n          },\n          \"text/css\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"css\"]\n          },\n          \"text/csv\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"csv\"]\n          },\n          \"text/csv-schema\": {\n            source: \"iana\"\n          },\n          \"text/directory\": {\n            source: \"iana\"\n          },\n          \"text/dns\": {\n            source: \"iana\"\n          },\n          \"text/ecmascript\": {\n            source: \"iana\"\n          },\n          \"text/encaprtp\": {\n            source: \"iana\"\n          },\n          \"text/enriched\": {\n            source: \"iana\"\n          },\n          \"text/fhirpath\": {\n            source: \"iana\"\n          },\n          \"text/flexfec\": {\n            source: \"iana\"\n          },\n          \"text/fwdred\": {\n            source: \"iana\"\n          },\n          \"text/gff3\": {\n            source: \"iana\"\n          },\n          \"text/grammar-ref-list\": {\n            source: \"iana\"\n          },\n          \"text/html\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"html\", \"htm\", \"shtml\"]\n          },\n          \"text/jade\": {\n            extensions: [\"jade\"]\n          },\n          \"text/javascript\": {\n            source: \"iana\",\n            compressible: true\n          },\n          \"text/jcr-cnd\": {\n            source: \"iana\"\n          },\n          \"text/jsx\": {\n            compressible: true,\n            extensions: [\"jsx\"]\n          },\n          \"text/less\": {\n            compressible: true,\n            extensions: [\"less\"]\n          },\n          \"text/markdown\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"markdown\", \"md\"]\n          },\n          \"text/mathml\": {\n            source: \"nginx\",\n            extensions: [\"mml\"]\n          },\n          \"text/mdx\": {\n            compressible: true,\n            extensions: [\"mdx\"]\n          },\n          \"text/mizar\": {\n            source: \"iana\"\n          },\n          \"text/n3\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"n3\"]\n          },\n          \"text/parameters\": {\n            source: \"iana\",\n            charset: \"UTF-8\"\n          },\n          \"text/parityfec\": {\n            source: \"iana\"\n          },\n          \"text/plain\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\", \"in\", \"ini\"]\n          },\n          \"text/provenance-notation\": {\n            source: \"iana\",\n            charset: \"UTF-8\"\n          },\n          \"text/prs.fallenstein.rst\": {\n            source: \"iana\"\n          },\n          \"text/prs.lines.tag\": {\n            source: \"iana\",\n            extensions: [\"dsc\"]\n          },\n          \"text/prs.prop.logic\": {\n            source: \"iana\"\n          },\n          \"text/raptorfec\": {\n            source: \"iana\"\n          },\n          \"text/red\": {\n            source: \"iana\"\n          },\n          \"text/rfc822-headers\": {\n            source: \"iana\"\n          },\n          \"text/richtext\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rtx\"]\n          },\n          \"text/rtf\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"rtf\"]\n          },\n          \"text/rtp-enc-aescm128\": {\n            source: \"iana\"\n          },\n          \"text/rtploopback\": {\n            source: \"iana\"\n          },\n          \"text/rtx\": {\n            source: \"iana\"\n          },\n          \"text/sgml\": {\n            source: \"iana\",\n            extensions: [\"sgml\", \"sgm\"]\n          },\n          \"text/shaclc\": {\n            source: \"iana\"\n          },\n          \"text/shex\": {\n            source: \"iana\",\n            extensions: [\"shex\"]\n          },\n          \"text/slim\": {\n            extensions: [\"slim\", \"slm\"]\n          },\n          \"text/spdx\": {\n            source: \"iana\",\n            extensions: [\"spdx\"]\n          },\n          \"text/strings\": {\n            source: \"iana\"\n          },\n          \"text/stylus\": {\n            extensions: [\"stylus\", \"styl\"]\n          },\n          \"text/t140\": {\n            source: \"iana\"\n          },\n          \"text/tab-separated-values\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"tsv\"]\n          },\n          \"text/troff\": {\n            source: \"iana\",\n            extensions: [\"t\", \"tr\", \"roff\", \"man\", \"me\", \"ms\"]\n          },\n          \"text/turtle\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            extensions: [\"ttl\"]\n          },\n          \"text/ulpfec\": {\n            source: \"iana\"\n          },\n          \"text/uri-list\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"uri\", \"uris\", \"urls\"]\n          },\n          \"text/vcard\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"vcard\"]\n          },\n          \"text/vnd.a\": {\n            source: \"iana\"\n          },\n          \"text/vnd.abc\": {\n            source: \"iana\"\n          },\n          \"text/vnd.ascii-art\": {\n            source: \"iana\"\n          },\n          \"text/vnd.curl\": {\n            source: \"iana\",\n            extensions: [\"curl\"]\n          },\n          \"text/vnd.curl.dcurl\": {\n            source: \"apache\",\n            extensions: [\"dcurl\"]\n          },\n          \"text/vnd.curl.mcurl\": {\n            source: \"apache\",\n            extensions: [\"mcurl\"]\n          },\n          \"text/vnd.curl.scurl\": {\n            source: \"apache\",\n            extensions: [\"scurl\"]\n          },\n          \"text/vnd.debian.copyright\": {\n            source: \"iana\",\n            charset: \"UTF-8\"\n          },\n          \"text/vnd.dmclientscript\": {\n            source: \"iana\"\n          },\n          \"text/vnd.dvb.subtitle\": {\n            source: \"iana\",\n            extensions: [\"sub\"]\n          },\n          \"text/vnd.esmertec.theme-descriptor\": {\n            source: \"iana\",\n            charset: \"UTF-8\"\n          },\n          \"text/vnd.familysearch.gedcom\": {\n            source: \"iana\",\n            extensions: [\"ged\"]\n          },\n          \"text/vnd.ficlab.flt\": {\n            source: \"iana\"\n          },\n          \"text/vnd.fly\": {\n            source: \"iana\",\n            extensions: [\"fly\"]\n          },\n          \"text/vnd.fmi.flexstor\": {\n            source: \"iana\",\n            extensions: [\"flx\"]\n          },\n          \"text/vnd.gml\": {\n            source: \"iana\"\n          },\n          \"text/vnd.graphviz\": {\n            source: \"iana\",\n            extensions: [\"gv\"]\n          },\n          \"text/vnd.hans\": {\n            source: \"iana\"\n          },\n          \"text/vnd.hgl\": {\n            source: \"iana\"\n          },\n          \"text/vnd.in3d.3dml\": {\n            source: \"iana\",\n            extensions: [\"3dml\"]\n          },\n          \"text/vnd.in3d.spot\": {\n            source: \"iana\",\n            extensions: [\"spot\"]\n          },\n          \"text/vnd.iptc.newsml\": {\n            source: \"iana\"\n          },\n          \"text/vnd.iptc.nitf\": {\n            source: \"iana\"\n          },\n          \"text/vnd.latex-z\": {\n            source: \"iana\"\n          },\n          \"text/vnd.motorola.reflex\": {\n            source: \"iana\"\n          },\n          \"text/vnd.ms-mediapackage\": {\n            source: \"iana\"\n          },\n          \"text/vnd.net2phone.commcenter.command\": {\n            source: \"iana\"\n          },\n          \"text/vnd.radisys.msml-basic-layout\": {\n            source: \"iana\"\n          },\n          \"text/vnd.senx.warpscript\": {\n            source: \"iana\"\n          },\n          \"text/vnd.si.uricatalogue\": {\n            source: \"iana\"\n          },\n          \"text/vnd.sosi\": {\n            source: \"iana\"\n          },\n          \"text/vnd.sun.j2me.app-descriptor\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            extensions: [\"jad\"]\n          },\n          \"text/vnd.trolltech.linguist\": {\n            source: \"iana\",\n            charset: \"UTF-8\"\n          },\n          \"text/vnd.wap.si\": {\n            source: \"iana\"\n          },\n          \"text/vnd.wap.sl\": {\n            source: \"iana\"\n          },\n          \"text/vnd.wap.wml\": {\n            source: \"iana\",\n            extensions: [\"wml\"]\n          },\n          \"text/vnd.wap.wmlscript\": {\n            source: \"iana\",\n            extensions: [\"wmls\"]\n          },\n          \"text/vtt\": {\n            source: \"iana\",\n            charset: \"UTF-8\",\n            compressible: true,\n            extensions: [\"vtt\"]\n          },\n          \"text/x-asm\": {\n            source: \"apache\",\n            extensions: [\"s\", \"asm\"]\n          },\n          \"text/x-c\": {\n            source: \"apache\",\n            extensions: [\"c\", \"cc\", \"cxx\", \"cpp\", \"h\", \"hh\", \"dic\"]\n          },\n          \"text/x-component\": {\n            source: \"nginx\",\n            extensions: [\"htc\"]\n          },\n          \"text/x-fortran\": {\n            source: \"apache\",\n            extensions: [\"f\", \"for\", \"f77\", \"f90\"]\n          },\n          \"text/x-gwt-rpc\": {\n            compressible: true\n          },\n          \"text/x-handlebars-template\": {\n            extensions: [\"hbs\"]\n          },\n          \"text/x-java-source\": {\n            source: \"apache\",\n            extensions: [\"java\"]\n          },\n          \"text/x-jquery-tmpl\": {\n            compressible: true\n          },\n          \"text/x-lua\": {\n            extensions: [\"lua\"]\n          },\n          \"text/x-markdown\": {\n            compressible: true,\n            extensions: [\"mkd\"]\n          },\n          \"text/x-nfo\": {\n            source: \"apache\",\n            extensions: [\"nfo\"]\n          },\n          \"text/x-opml\": {\n            source: \"apache\",\n            extensions: [\"opml\"]\n          },\n          \"text/x-org\": {\n            compressible: true,\n            extensions: [\"org\"]\n          },\n          \"text/x-pascal\": {\n            source: \"apache\",\n            extensions: [\"p\", \"pas\"]\n          },\n          \"text/x-processing\": {\n            compressible: true,\n            extensions: [\"pde\"]\n          },\n          \"text/x-sass\": {\n            extensions: [\"sass\"]\n          },\n          \"text/x-scss\": {\n            extensions: [\"scss\"]\n          },\n          \"text/x-setext\": {\n            source: \"apache\",\n            extensions: [\"etx\"]\n          },\n          \"text/x-sfv\": {\n            source: \"apache\",\n            extensions: [\"sfv\"]\n          },\n          \"text/x-suse-ymp\": {\n            compressible: true,\n            extensions: [\"ymp\"]\n          },\n          \"text/x-uuencode\": {\n            source: \"apache\",\n            extensions: [\"uu\"]\n          },\n          \"text/x-vcalendar\": {\n            source: \"apache\",\n            extensions: [\"vcs\"]\n          },\n          \"text/x-vcard\": {\n            source: \"apache\",\n            extensions: [\"vcf\"]\n          },\n          \"text/xml\": {\n            source: \"iana\",\n            compressible: true,\n            extensions: [\"xml\"]\n          },\n          \"text/xml-external-parsed-entity\": {\n            source: \"iana\"\n          },\n          \"text/yaml\": {\n            compressible: true,\n            extensions: [\"yaml\", \"yml\"]\n          },\n          \"video/1d-interleaved-parityfec\": {\n            source: \"iana\"\n          },\n          \"video/3gpp\": {\n            source: \"iana\",\n            extensions: [\"3gp\", \"3gpp\"]\n          },\n          \"video/3gpp-tt\": {\n            source: \"iana\"\n          },\n          \"video/3gpp2\": {\n            source: \"iana\",\n            extensions: [\"3g2\"]\n          },\n          \"video/av1\": {\n            source: \"iana\"\n          },\n          \"video/bmpeg\": {\n            source: \"iana\"\n          },\n          \"video/bt656\": {\n            source: \"iana\"\n          },\n          \"video/celb\": {\n            source: \"iana\"\n          },\n          \"video/dv\": {\n            source: \"iana\"\n          },\n          \"video/encaprtp\": {\n            source: \"iana\"\n          },\n          \"video/ffv1\": {\n            source: \"iana\"\n          },\n          \"video/flexfec\": {\n            source: \"iana\"\n          },\n          \"video/h261\": {\n            source: \"iana\",\n            extensions: [\"h261\"]\n          },\n          \"video/h263\": {\n            source: \"iana\",\n            extensions: [\"h263\"]\n          },\n          \"video/h263-1998\": {\n            source: \"iana\"\n          },\n          \"video/h263-2000\": {\n            source: \"iana\"\n          },\n          \"video/h264\": {\n            source: \"iana\",\n            extensions: [\"h264\"]\n          },\n          \"video/h264-rcdo\": {\n            source: \"iana\"\n          },\n          \"video/h264-svc\": {\n            source: \"iana\"\n          },\n          \"video/h265\": {\n            source: \"iana\"\n          },\n          \"video/iso.segment\": {\n            source: \"iana\",\n            extensions: [\"m4s\"]\n          },\n          \"video/jpeg\": {\n            source: \"iana\",\n            extensions: [\"jpgv\"]\n          },\n          \"video/jpeg2000\": {\n            source: \"iana\"\n          },\n          \"video/jpm\": {\n            source: \"apache\",\n            extensions: [\"jpm\", \"jpgm\"]\n          },\n          \"video/jxsv\": {\n            source: \"iana\"\n          },\n          \"video/mj2\": {\n            source: \"iana\",\n            extensions: [\"mj2\", \"mjp2\"]\n          },\n          \"video/mp1s\": {\n            source: \"iana\"\n          },\n          \"video/mp2p\": {\n            source: \"iana\"\n          },\n          \"video/mp2t\": {\n            source: \"iana\",\n            extensions: [\"ts\"]\n          },\n          \"video/mp4\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"mp4\", \"mp4v\", \"mpg4\"]\n          },\n          \"video/mp4v-es\": {\n            source: \"iana\"\n          },\n          \"video/mpeg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"mpeg\", \"mpg\", \"mpe\", \"m1v\", \"m2v\"]\n          },\n          \"video/mpeg4-generic\": {\n            source: \"iana\"\n          },\n          \"video/mpv\": {\n            source: \"iana\"\n          },\n          \"video/nv\": {\n            source: \"iana\"\n          },\n          \"video/ogg\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"ogv\"]\n          },\n          \"video/parityfec\": {\n            source: \"iana\"\n          },\n          \"video/pointer\": {\n            source: \"iana\"\n          },\n          \"video/quicktime\": {\n            source: \"iana\",\n            compressible: false,\n            extensions: [\"qt\", \"mov\"]\n          },\n          \"video/raptorfec\": {\n            source: \"iana\"\n          },\n          \"video/raw\": {\n            source: \"iana\"\n          },\n          \"video/rtp-enc-aescm128\": {\n            source: \"iana\"\n          },\n          \"video/rtploopback\": {\n            source: \"iana\"\n          },\n          \"video/rtx\": {\n            source: \"iana\"\n          },\n          \"video/scip\": {\n            source: \"iana\"\n          },\n          \"video/smpte291\": {\n            source: \"iana\"\n          },\n          \"video/smpte292m\": {\n            source: \"iana\"\n          },\n          \"video/ulpfec\": {\n            source: \"iana\"\n          },\n          \"video/vc1\": {\n            source: \"iana\"\n          },\n          \"video/vc2\": {\n            source: \"iana\"\n          },\n          \"video/vnd.cctv\": {\n            source: \"iana\"\n          },\n          \"video/vnd.dece.hd\": {\n            source: \"iana\",\n            extensions: [\"uvh\", \"uvvh\"]\n          },\n          \"video/vnd.dece.mobile\": {\n            source: \"iana\",\n            extensions: [\"uvm\", \"uvvm\"]\n          },\n          \"video/vnd.dece.mp4\": {\n            source: \"iana\"\n          },\n          \"video/vnd.dece.pd\": {\n            source: \"iana\",\n            extensions: [\"uvp\", \"uvvp\"]\n          },\n          \"video/vnd.dece.sd\": {\n            source: \"iana\",\n            extensions: [\"uvs\", \"uvvs\"]\n          },\n          \"video/vnd.dece.video\": {\n            source: \"iana\",\n            extensions: [\"uvv\", \"uvvv\"]\n          },\n          \"video/vnd.directv.mpeg\": {\n            source: \"iana\"\n          },\n          \"video/vnd.directv.mpeg-tts\": {\n            source: \"iana\"\n          },\n          \"video/vnd.dlna.mpeg-tts\": {\n            source: \"iana\"\n          },\n          \"video/vnd.dvb.file\": {\n            source: \"iana\",\n            extensions: [\"dvb\"]\n          },\n          \"video/vnd.fvt\": {\n            source: \"iana\",\n            extensions: [\"fvt\"]\n          },\n          \"video/vnd.hns.video\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.1dparityfec-1010\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.1dparityfec-2005\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.2dparityfec-1010\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.2dparityfec-2005\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.ttsavc\": {\n            source: \"iana\"\n          },\n          \"video/vnd.iptvforum.ttsmpeg2\": {\n            source: \"iana\"\n          },\n          \"video/vnd.motorola.video\": {\n            source: \"iana\"\n          },\n          \"video/vnd.motorola.videop\": {\n            source: \"iana\"\n          },\n          \"video/vnd.mpegurl\": {\n            source: \"iana\",\n            extensions: [\"mxu\", \"m4u\"]\n          },\n          \"video/vnd.ms-playready.media.pyv\": {\n            source: \"iana\",\n            extensions: [\"pyv\"]\n          },\n          \"video/vnd.nokia.interleaved-multimedia\": {\n            source: \"iana\"\n          },\n          \"video/vnd.nokia.mp4vr\": {\n            source: \"iana\"\n          },\n          \"video/vnd.nokia.videovoip\": {\n            source: \"iana\"\n          },\n          \"video/vnd.objectvideo\": {\n            source: \"iana\"\n          },\n          \"video/vnd.radgamettools.bink\": {\n            source: \"iana\"\n          },\n          \"video/vnd.radgamettools.smacker\": {\n            source: \"iana\"\n          },\n          \"video/vnd.sealed.mpeg1\": {\n            source: \"iana\"\n          },\n          \"video/vnd.sealed.mpeg4\": {\n            source: \"iana\"\n          },\n          \"video/vnd.sealed.swf\": {\n            source: \"iana\"\n          },\n          \"video/vnd.sealedmedia.softseal.mov\": {\n            source: \"iana\"\n          },\n          \"video/vnd.uvvu.mp4\": {\n            source: \"iana\",\n            extensions: [\"uvu\", \"uvvu\"]\n          },\n          \"video/vnd.vivo\": {\n            source: \"iana\",\n            extensions: [\"viv\"]\n          },\n          \"video/vnd.youtube.yt\": {\n            source: \"iana\"\n          },\n          \"video/vp8\": {\n            source: \"iana\"\n          },\n          \"video/vp9\": {\n            source: \"iana\"\n          },\n          \"video/webm\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"webm\"]\n          },\n          \"video/x-f4v\": {\n            source: \"apache\",\n            extensions: [\"f4v\"]\n          },\n          \"video/x-fli\": {\n            source: \"apache\",\n            extensions: [\"fli\"]\n          },\n          \"video/x-flv\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"flv\"]\n          },\n          \"video/x-m4v\": {\n            source: \"apache\",\n            extensions: [\"m4v\"]\n          },\n          \"video/x-matroska\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"mkv\", \"mk3d\", \"mks\"]\n          },\n          \"video/x-mng\": {\n            source: \"apache\",\n            extensions: [\"mng\"]\n          },\n          \"video/x-ms-asf\": {\n            source: \"apache\",\n            extensions: [\"asf\", \"asx\"]\n          },\n          \"video/x-ms-vob\": {\n            source: \"apache\",\n            extensions: [\"vob\"]\n          },\n          \"video/x-ms-wm\": {\n            source: \"apache\",\n            extensions: [\"wm\"]\n          },\n          \"video/x-ms-wmv\": {\n            source: \"apache\",\n            compressible: false,\n            extensions: [\"wmv\"]\n          },\n          \"video/x-ms-wmx\": {\n            source: \"apache\",\n            extensions: [\"wmx\"]\n          },\n          \"video/x-ms-wvx\": {\n            source: \"apache\",\n            extensions: [\"wvx\"]\n          },\n          \"video/x-msvideo\": {\n            source: \"apache\",\n            extensions: [\"avi\"]\n          },\n          \"video/x-sgi-movie\": {\n            source: \"apache\",\n            extensions: [\"movie\"]\n          },\n          \"video/x-smv\": {\n            source: \"apache\",\n            extensions: [\"smv\"]\n          },\n          \"x-conference/x-cooltalk\": {\n            source: \"apache\",\n            extensions: [\"ice\"]\n          },\n          \"x-shader/x-fragment\": {\n            compressible: true\n          },\n          \"x-shader/x-vertex\": {\n            compressible: true\n          }\n        };\n      }\n    });\n    var require_mime_db = __commonJS2({\n      \"node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/index.js\"(exports2, module2) {\n        module2.exports = require_db();\n      }\n    });\n    var main_exports = {};\n    __export2(main_exports, {\n      PreviewController: () => PreviewController2,\n      getExtension: () => getExtension,\n      joinFilepath: () => joinFilepath,\n      normalizeFilepath: () => normalizeFilepath\n    });\n    module.exports = __toCommonJS(main_exports);\n    var CHANNEL_NAME = \"$CSB_RELAY\";\n    var import_mime_db = __toESM2(require_mime_db());\n    var extensionMap = /* @__PURE__ */new Map();\n    var entries = Object.entries(import_mime_db.default);\n    for (const [mimetype, entry] of entries) {\n      const extensions = entry.extensions;\n      if (extensions === null || extensions === void 0 ? void 0 : extensions.length) {\n        for (const ext of extensions) {\n          extensionMap.set(ext, mimetype);\n        }\n      }\n    }\n    var EXTENSIONS_MAP = extensionMap;\n    var counter2 = 0;\n    function generateRandomId2() {\n      const now = Date.now();\n      const randomNumber = Math.round(Math.random() * 1e4);\n      const count = counter2 += 1;\n      return (+`${now}${randomNumber}${count}`).toString(16);\n    }\n    function normalizeFilepath(filepath) {\n      const split = filepath.split(\"/\").filter(Boolean);\n      const normalized = split.join(\"/\");\n      return \"/\" + normalized;\n    }\n    function joinFilepath(filepath, addition) {\n      return normalizeFilepath(filepath + \"/\" + addition);\n    }\n    function getExtension(filepath) {\n      const parts = filepath.split(\".\");\n      if (parts.length <= 1) {\n        return \"\";\n      } else {\n        const ext = parts[parts.length - 1];\n        return ext;\n      }\n    }\n    var PreviewController2 = class {\n      async getIndexAtPath(filepath) {\n        for (const index of this.indexFiles) {\n          try {\n            const content = await this.getFileContent(joinFilepath(filepath, index));\n            return content;\n          } catch (err) {}\n        }\n        throw new Error(\"No index file not found\");\n      }\n      async handleWorkerRequest(request) {\n        if (!this.initPromise) {\n          throw new Error(\"Init promise is null\");\n        }\n        const [previewRoot, port] = await this.initPromise;\n        try {\n          const filepath = normalizeFilepath(new URL(request.url, previewRoot).pathname);\n          let body = null;\n          const headers = {};\n          try {\n            body = await this.getFileContent(filepath);\n          } catch (err) {}\n          if (body == null) {\n            body = await this.getIndexAtPath(filepath);\n            headers[\"Content-Type\"] = \"text/html; charset=utf-8\";\n          }\n          if (body == null) {\n            throw new Error(\"File not found\");\n          }\n          if (!headers[\"Content-Type\"]) {\n            const extension = getExtension(filepath);\n            const foundMimetype = EXTENSIONS_MAP.get(extension);\n            if (foundMimetype) {\n              headers[\"Content-Type\"] = foundMimetype;\n            }\n          }\n          const responseMessage = {\n            $channel: CHANNEL_NAME,\n            $type: \"preview/response\",\n            id: request.id,\n            headers,\n            status: 200,\n            body\n          };\n          port.postMessage(responseMessage);\n        } catch (err1) {\n          const responseMessage1 = {\n            $channel: CHANNEL_NAME,\n            $type: \"preview/response\",\n            id: request.id,\n            headers: {\n              [\"Content-Type\"]: \"text/html; charset=utf-8\"\n            },\n            status: 404,\n            body: \"File not found\"\n          };\n          port.postMessage(responseMessage1);\n        }\n      }\n      getRelayUrl(previewUrl) {\n        const relayUrl = new URL(previewUrl);\n        relayUrl.pathname = \"/__csb_relay/\";\n        return relayUrl.toString();\n      }\n      async _initPreview() {\n        const id = generateRandomId2();\n        const previewUrl = new URL(this.baseUrl);\n        previewUrl.hostname = id + \"-\" + previewUrl.hostname;\n        previewUrl.pathname = \"/\";\n        const relayUrl = this.getRelayUrl(previewUrl.toString());\n        const iframe = document.createElement(\"iframe\");\n        iframe.setAttribute(\"src\", relayUrl.toString());\n        iframe.style.display = \"none\";\n        document.body.appendChild(iframe);\n        const channel = new MessageChannel();\n        const iframeContentWindow = iframe.contentWindow;\n        if (!iframeContentWindow) {\n          throw new Error(\"Could not get iframe contentWindow\");\n        }\n        return new Promise(resolve => {\n          const port = channel.port1;\n          port.onmessage = evt => {\n            if (typeof evt.data === \"object\" && evt.data.$channel === CHANNEL_NAME) {\n              switch (evt.data.$type) {\n                case \"preview/ready\":\n                  resolve([previewUrl.toString(), port, iframe]);\n                  break;\n                case \"preview/request\":\n                  this.handleWorkerRequest(evt.data);\n                  break;\n              }\n            }\n          };\n          iframe.onload = () => {\n            const initMsg = {\n              $channel: CHANNEL_NAME,\n              $type: \"preview/init\"\n            };\n            iframeContentWindow.postMessage(initMsg, \"*\", [channel.port2]);\n          };\n        });\n      } /**\n        * Initialize a preview and return the url at which the preview is being served\n        **/\n      initPreview() {\n        if (!this.initPromise) {\n          this.initPromise = this._initPreview();\n        }\n        return this.initPromise.then(v => v[0]);\n      }\n      destroy() {\n        if (this.initPromise) {\n          const p = this.initPromise;\n          p.then(val => {\n            val[1].close();\n            const url = this.getRelayUrl(val[0]);\n            const foundElements = document.body.querySelectorAll(`src=\"${url}\"`);\n            foundElements.forEach(el => el.remove());\n          });\n          this.initPromise = null;\n        }\n      }\n      constructor(options) {\n        this.initPromise = null;\n        this.baseUrl = new URL(options.baseUrl);\n        this.getFileContent = options.getFileContent;\n        var _indexFiles;\n        this.indexFiles = (_indexFiles = options.indexFiles) !== null && _indexFiles !== void 0 ? _indexFiles : [\"index.html\", \"index.html\"];\n      }\n    };\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/index-bd1ff004.mjs\nvar index_bd1ff004_exports = {};\n__export(index_bd1ff004_exports, {\n  SandpackStatic: () => SandpackStatic\n});\nvar import_static_browser_server, insertHtmlAfterRegex, readBuffer2, validateHtml, SandpackStatic;\nvar init_index_bd1ff004 = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/index-bd1ff004.mjs\"() {\n    init_types_36e5ec0d();\n    import_static_browser_server = __toESM(require_main(), 1);\n    init_base_80a1f760();\n    init_client_utils_7a723432();\n    init_lib();\n    init_dist();\n    insertHtmlAfterRegex = function (regex, content, insertable) {\n      var match = regex.exec(content);\n      if (match && match.length >= 1) {\n        var offset = match.index + match[0].length;\n        var prefix = content.substring(0, offset);\n        var suffix = content.substring(offset);\n        return prefix + insertable + suffix;\n      }\n    };\n    readBuffer2 = function (content) {\n      if (typeof content === \"string\") {\n        return content;\n      } else {\n        return new TextDecoder().decode(content);\n      }\n    };\n    validateHtml = function (content) {\n      var contentString = readBuffer2(content);\n      var domParser = new DOMParser();\n      var doc = domParser.parseFromString(contentString, \"text/html\");\n      if (!doc.documentElement.getAttribute(\"lang\")) {\n        doc.documentElement.setAttribute(\"lang\", \"en\");\n      }\n      var html = doc.documentElement.outerHTML;\n      return \"<!DOCTYPE html>\\n\" + html;\n    };\n    SandpackStatic = /** @class */function (_super) {\n      __extends(SandpackStatic2, _super);\n      function SandpackStatic2(selector, sandboxSetup, options) {\n        if (options === void 0) {\n          options = {};\n        }\n        var _a2;\n        var _this = _super.call(this, selector, sandboxSetup, options) || this;\n        _this.files = /* @__PURE__ */new Map();\n        _this.status = \"initializing\";\n        _this.emitter = new EventEmitter();\n        _this.previewController = new import_static_browser_server.PreviewController({\n          baseUrl: (_a2 = options.bundlerURL) !== null && _a2 !== void 0 ? _a2 : \"https://preview.sandpack-static-server.codesandbox.io\",\n          // filepath is always normalized to start with / and not end with a slash\n          getFileContent: function (filepath) {\n            var content = _this.files.get(filepath);\n            if (!content) {\n              throw new Error(\"File not found\");\n            }\n            if (filepath.endsWith(\".html\") || filepath.endsWith(\".htm\")) {\n              try {\n                content = validateHtml(content);\n                content = _this.injectProtocolScript(content);\n                content = _this.injectExternalResources(content, options.externalResources);\n              } catch (err) {\n                console.error(\"Runtime injection failed\", err);\n              }\n            }\n            return content;\n          }\n        });\n        if (typeof selector === \"string\") {\n          _this.selector = selector;\n          var element = document.querySelector(selector);\n          _this.element = element;\n          _this.iframe = document.createElement(\"iframe\");\n        } else {\n          _this.element = selector;\n          _this.iframe = selector;\n        }\n        if (!_this.iframe.getAttribute(\"sandbox\")) {\n          _this.iframe.setAttribute(\"sandbox\", \"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\");\n          _this.iframe.setAttribute(\"allow\", \"accelerometer; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; clipboard-write;\");\n        }\n        _this.updateSandbox();\n        return _this;\n      }\n      SandpackStatic2.prototype.injectContentIntoHead = function (content, contentToInsert) {\n        var _a2;\n        content = readBuffer2(content);\n        content = (_a2 = insertHtmlAfterRegex(/<head[^<>]*>/g, content, \"\\n\" + contentToInsert)) !== null && _a2 !== void 0 ? _a2 : contentToInsert + \"\\n\" + content;\n        return content;\n      };\n      SandpackStatic2.prototype.injectProtocolScript = function (content) {\n        var scriptToInsert = '<script>\\n  window.addEventListener(\"message\", (message) => {\\n    if(message.data.type === \"refresh\") {\\n      window.location.reload();\\n    }\\n  })\\n</script>';\n        return this.injectContentIntoHead(content, scriptToInsert);\n      };\n      SandpackStatic2.prototype.injectExternalResources = function (content, externalResources) {\n        if (externalResources === void 0) {\n          externalResources = [];\n        }\n        var tagsToInsert = externalResources.map(function (resource) {\n          var match = resource.match(/\\.([^.]*)$/);\n          var fileType = match === null || match === void 0 ? void 0 : match[1];\n          if (fileType === \"css\" || resource.includes(\"fonts.googleapis\")) {\n            return '<link rel=\"stylesheet\" href=\"' + resource + '\">';\n          }\n          if (fileType === \"js\") {\n            return '<script src=\"' + resource + '\"></script>';\n          }\n          throw new Error(\"Unable to determine file type for external resource: \" + resource);\n        }).join(\"\\n\");\n        return this.injectContentIntoHead(content, tagsToInsert);\n      };\n      SandpackStatic2.prototype.updateSandbox = function (setup, _isInitializationCompile) {\n        if (setup === void 0) {\n          setup = this.sandboxSetup;\n        }\n        var modules = fromBundlerFilesToFS(setup.files);\n        this.dispatch({\n          codesandbox: true,\n          modules,\n          template: setup.template,\n          type: \"compile\"\n        });\n      };\n      SandpackStatic2.prototype.compile = function (files) {\n        return __awaiter(this, void 0, void 0, function () {\n          var previewUrl;\n          return __generator(this, function (_a2) {\n            switch (_a2.label) {\n              case 0:\n                this.files = new Map(Object.entries(files));\n                return [4, this.previewController.initPreview()];\n              case 1:\n                previewUrl = _a2.sent();\n                this.iframe.setAttribute(\"src\", previewUrl);\n                this.status = \"done\";\n                this.dispatch({\n                  type: \"done\",\n                  compilatonError: false\n                });\n                this.dispatch({\n                  type: \"urlchange\",\n                  url: previewUrl,\n                  back: false,\n                  forward: false\n                });\n                return [2];\n            }\n          });\n        });\n      };\n      SandpackStatic2.prototype.dispatch = function (message) {\n        var _a2;\n        switch (message.type) {\n          case \"compile\":\n            this.compile(message.modules);\n            break;\n          default:\n            (_a2 = this.iframe.contentWindow) === null || _a2 === void 0 ? void 0 : _a2.postMessage(message, \"*\");\n            this.emitter.dispatch(message);\n        }\n      };\n      SandpackStatic2.prototype.listen = function (listener) {\n        return this.emitter.listener(listener);\n      };\n      SandpackStatic2.prototype.destroy = function () {\n        this.emitter.cleanup();\n      };\n      return SandpackStatic2;\n    }(SandpackClient);\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/clients/runtime/index.mjs\nvar runtime_exports = {};\n__export(runtime_exports, {\n  SandpackRuntime: () => SandpackRuntime\n});\nfunction getTemplate(pkg, modules) {\n  if (!pkg) {\n    return \"static\";\n  }\n  var _a2 = pkg.dependencies,\n    dependencies = _a2 === void 0 ? {} : _a2,\n    _b = pkg.devDependencies,\n    devDependencies = _b === void 0 ? {} : _b;\n  var totalDependencies = __spreadArray(__spreadArray([], Object.keys(dependencies), true), Object.keys(devDependencies), true);\n  var moduleNames = Object.keys(modules);\n  var adonis = [\"@adonisjs/framework\", \"@adonisjs/core\"];\n  if (totalDependencies.some(function (dep) {\n    return adonis.indexOf(dep) > -1;\n  })) {\n    return \"adonis\";\n  }\n  var nuxt = [\"nuxt\", \"nuxt-edge\", \"nuxt-ts\", \"nuxt-ts-edge\", \"nuxt3\"];\n  if (totalDependencies.some(function (dep) {\n    return nuxt.indexOf(dep) > -1;\n  })) {\n    return \"nuxt\";\n  }\n  if (totalDependencies.indexOf(\"next\") > -1) {\n    return \"next\";\n  }\n  var apollo = [\"apollo-server\", \"apollo-server-express\", \"apollo-server-hapi\", \"apollo-server-koa\", \"apollo-server-lambda\", \"apollo-server-micro\"];\n  if (totalDependencies.some(function (dep) {\n    return apollo.indexOf(dep) > -1;\n  })) {\n    return \"apollo\";\n  }\n  if (totalDependencies.indexOf(\"mdx-deck\") > -1) {\n    return \"mdx-deck\";\n  }\n  if (totalDependencies.indexOf(\"gridsome\") > -1) {\n    return \"gridsome\";\n  }\n  if (totalDependencies.indexOf(\"vuepress\") > -1) {\n    return \"vuepress\";\n  }\n  if (totalDependencies.indexOf(\"ember-cli\") > -1) {\n    return \"ember\";\n  }\n  if (totalDependencies.indexOf(\"sapper\") > -1) {\n    return \"sapper\";\n  }\n  if (totalDependencies.indexOf(\"gatsby\") > -1) {\n    return \"gatsby\";\n  }\n  if (totalDependencies.indexOf(\"quasar\") > -1) {\n    return \"quasar\";\n  }\n  if (totalDependencies.indexOf(\"@docusaurus/core\") > -1) {\n    return \"docusaurus\";\n  }\n  if (totalDependencies.indexOf(\"remix\") > -1) {\n    return \"remix\";\n  }\n  if (totalDependencies.indexOf(\"astro\") > -1) {\n    return \"node\";\n  }\n  if (moduleNames.some(function (m) {\n    return m.endsWith(\".re\");\n  })) {\n    return \"reason\";\n  }\n  var parcel = [\"parcel-bundler\", \"parcel\"];\n  if (totalDependencies.some(function (dep) {\n    return parcel.indexOf(dep) > -1;\n  })) {\n    return \"parcel\";\n  }\n  var dojo = [\"@dojo/core\", \"@dojo/framework\"];\n  if (totalDependencies.some(function (dep) {\n    return dojo.indexOf(dep) > -1;\n  })) {\n    return \"@dojo/cli-create-app\";\n  }\n  if (totalDependencies.indexOf(\"@nestjs/core\") > -1 || totalDependencies.indexOf(\"@nestjs/common\") > -1) {\n    return \"nest\";\n  }\n  if (totalDependencies.indexOf(\"react-styleguidist\") > -1) {\n    return \"styleguidist\";\n  }\n  if (totalDependencies.indexOf(\"react-scripts\") > -1) {\n    return \"create-react-app\";\n  }\n  if (totalDependencies.indexOf(\"react-scripts-ts\") > -1) {\n    return \"create-react-app-typescript\";\n  }\n  if (totalDependencies.indexOf(\"@angular/core\") > -1) {\n    return \"angular-cli\";\n  }\n  if (totalDependencies.indexOf(\"preact-cli\") > -1) {\n    return \"preact-cli\";\n  }\n  if (totalDependencies.indexOf(\"@sveltech/routify\") > -1 || totalDependencies.indexOf(\"@roxi/routify\") > -1) {\n    return \"node\";\n  }\n  if (totalDependencies.indexOf(\"vite\") > -1) {\n    return \"node\";\n  }\n  if (totalDependencies.indexOf(\"@frontity/core\") > -1) {\n    return \"node\";\n  }\n  if (totalDependencies.indexOf(\"svelte\") > -1) {\n    return \"svelte\";\n  }\n  if (totalDependencies.indexOf(\"vue\") > -1) {\n    return \"vue-cli\";\n  }\n  if (totalDependencies.indexOf(\"cx\") > -1) {\n    return \"cxjs\";\n  }\n  var nodeDeps = [\"express\", \"koa\", \"nodemon\", \"ts-node\", \"@tensorflow/tfjs-node\", \"webpack-dev-server\", \"snowpack\"];\n  if (totalDependencies.some(function (dep) {\n    return nodeDeps.indexOf(dep) > -1;\n  })) {\n    return \"node\";\n  }\n  if (Object.keys(dependencies).length >= MAX_CLIENT_DEPENDENCY_COUNT) {\n    return \"node\";\n  }\n  return void 0;\n}\nvar Protocol, IFrameProtocol, MAX_CLIENT_DEPENDENCY_COUNT, _a, BUNDLER_URL, SandpackRuntime;\nvar init_runtime = __esm({\n  \"../../node_modules/@codesandbox/sandpack-client/dist/clients/runtime/index.mjs\"() {\n    init_types_36e5ec0d();\n    init_dist();\n    init_base_80a1f760();\n    init_lib();\n    Protocol = /** @class */function () {\n      function Protocol2(type, handleMessage, protocol) {\n        var _this = this;\n        this.type = type;\n        this.handleMessage = handleMessage;\n        this.protocol = protocol;\n        this._disposeMessageListener = this.protocol.channelListen(function (msg) {\n          return __awaiter(_this, void 0, void 0, function () {\n            var message, result, response, err_1, response;\n            return __generator(this, function (_a2) {\n              switch (_a2.label) {\n                case 0:\n                  if (!(msg.type === this.getTypeId() && msg.method)) return [3, 4];\n                  message = msg;\n                  _a2.label = 1;\n                case 1:\n                  _a2.trys.push([1, 3,, 4]);\n                  return [4, this.handleMessage(message)];\n                case 2:\n                  result = _a2.sent();\n                  response = {\n                    type: this.getTypeId(),\n                    msgId: message.msgId,\n                    result\n                  };\n                  this.protocol.dispatch(response);\n                  return [3, 4];\n                case 3:\n                  err_1 = _a2.sent();\n                  response = {\n                    type: this.getTypeId(),\n                    msgId: message.msgId,\n                    error: {\n                      message: err_1.message\n                    }\n                  };\n                  this.protocol.dispatch(response);\n                  return [3, 4];\n                case 4:\n                  return [2];\n              }\n            });\n          });\n        });\n      }\n      Protocol2.prototype.getTypeId = function () {\n        return \"protocol-\" + this.type;\n      };\n      Protocol2.prototype.dispose = function () {\n        this._disposeMessageListener();\n      };\n      return Protocol2;\n    }();\n    IFrameProtocol = /** @class */function () {\n      function IFrameProtocol2(iframe, origin) {\n        this.globalListeners = {};\n        this.globalListenersCount = 0;\n        this.channelListeners = {};\n        this.channelListenersCount = 0;\n        this.channelId = Math.floor(Math.random() * 1e6);\n        this.frameWindow = iframe.contentWindow;\n        this.origin = origin;\n        this.globalListeners = [];\n        this.channelListeners = [];\n        this.eventListener = this.eventListener.bind(this);\n        if (typeof window !== \"undefined\") {\n          window.addEventListener(\"message\", this.eventListener);\n        }\n      }\n      IFrameProtocol2.prototype.cleanup = function () {\n        window.removeEventListener(\"message\", this.eventListener);\n        this.globalListeners = {};\n        this.channelListeners = {};\n        this.globalListenersCount = 0;\n        this.channelListenersCount = 0;\n      };\n      IFrameProtocol2.prototype.register = function () {\n        if (!this.frameWindow) {\n          return;\n        }\n        this.frameWindow.postMessage({\n          type: \"register-frame\",\n          origin: document.location.origin,\n          id: this.channelId\n        }, this.origin);\n      };\n      IFrameProtocol2.prototype.dispatch = function (message) {\n        if (!this.frameWindow) {\n          return;\n        }\n        this.frameWindow.postMessage(__assign({\n          $id: this.channelId,\n          codesandbox: true\n        }, message), this.origin);\n      };\n      IFrameProtocol2.prototype.globalListen = function (listener) {\n        var _this = this;\n        if (typeof listener !== \"function\") {\n          return function () {\n            return;\n          };\n        }\n        var listenerId = this.globalListenersCount;\n        this.globalListeners[listenerId] = listener;\n        this.globalListenersCount++;\n        return function () {\n          delete _this.globalListeners[listenerId];\n        };\n      };\n      IFrameProtocol2.prototype.channelListen = function (listener) {\n        var _this = this;\n        if (typeof listener !== \"function\") {\n          return function () {\n            return;\n          };\n        }\n        var listenerId = this.channelListenersCount;\n        this.channelListeners[listenerId] = listener;\n        this.channelListenersCount++;\n        return function () {\n          delete _this.channelListeners[listenerId];\n        };\n      };\n      IFrameProtocol2.prototype.eventListener = function (evt) {\n        if (evt.source !== this.frameWindow) {\n          return;\n        }\n        var message = evt.data;\n        if (!message.codesandbox) {\n          return;\n        }\n        Object.values(this.globalListeners).forEach(function (listener) {\n          return listener(message);\n        });\n        if (message.$id !== this.channelId) {\n          return;\n        }\n        Object.values(this.channelListeners).forEach(function (listener) {\n          return listener(message);\n        });\n      };\n      return IFrameProtocol2;\n    }();\n    MAX_CLIENT_DEPENDENCY_COUNT = 50;\n    BUNDLER_URL = \"https://\" + ((_a = \"2.6.7\") === null || _a === void 0 ? void 0 : _a.replace(/\\./g, \"-\")) + \"-sandpack.codesandbox.io/\";\n    SandpackRuntime = /** @class */function (_super) {\n      __extends(SandpackRuntime2, _super);\n      function SandpackRuntime2(selector, sandboxSetup, options) {\n        if (options === void 0) {\n          options = {};\n        }\n        var _this = _super.call(this, selector, sandboxSetup, options) || this;\n        _this.getTranspilerContext = function () {\n          return new Promise(function (resolve) {\n            var unsubscribe = _this.listen(function (message) {\n              if (message.type === \"transpiler-context\") {\n                resolve(message.data);\n                unsubscribe();\n              }\n            });\n            _this.dispatch({\n              type: \"get-transpiler-context\"\n            });\n          });\n        };\n        _this.bundlerURL = options.bundlerURL || BUNDLER_URL;\n        if (options.teamId) {\n          _this.bundlerURL = _this.bundlerURL.replace(\"https://\", \"https://\" + options.teamId + \"-\") + (\"?cache=\" + Date.now());\n        }\n        _this.bundlerState = void 0;\n        _this.errors = [];\n        _this.status = \"initializing\";\n        if (typeof selector === \"string\") {\n          _this.selector = selector;\n          var element = document.querySelector(selector);\n          nullthrows(element, \"The element '\" + selector + \"' was not found\");\n          _this.element = element;\n          _this.iframe = document.createElement(\"iframe\");\n          _this.initializeElement();\n        } else {\n          _this.element = selector;\n          _this.iframe = selector;\n        }\n        if (!_this.iframe.getAttribute(\"sandbox\")) {\n          _this.iframe.setAttribute(\"sandbox\", \"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\");\n          _this.iframe.setAttribute(\"allow\", \"accelerometer; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; clipboard-write;\");\n        }\n        _this.setLocationURLIntoIFrame();\n        _this.iframeProtocol = new IFrameProtocol(_this.iframe, _this.bundlerURL);\n        _this.unsubscribeGlobalListener = _this.iframeProtocol.globalListen(function (mes) {\n          if (mes.type !== \"initialized\" || !_this.iframe.contentWindow) {\n            return;\n          }\n          _this.iframeProtocol.register();\n          if (_this.options.fileResolver) {\n            _this.fileResolverProtocol = new Protocol(\"fs\", function (data) {\n              return __awaiter(_this, void 0, void 0, function () {\n                return __generator(this, function (_a2) {\n                  if (data.method === \"isFile\") {\n                    return [2, this.options.fileResolver.isFile(data.params[0])];\n                  } else if (data.method === \"readFile\") {\n                    return [2, this.options.fileResolver.readFile(data.params[0])];\n                  } else {\n                    throw new Error(\"Method not supported\");\n                  }\n                });\n              });\n            }, _this.iframeProtocol);\n          }\n          _this.updateSandbox(_this.sandboxSetup, true);\n        });\n        _this.unsubscribeChannelListener = _this.iframeProtocol.channelListen(function (mes) {\n          switch (mes.type) {\n            case \"start\":\n              {\n                _this.errors = [];\n                break;\n              }\n            case \"status\":\n              {\n                _this.status = mes.status;\n                break;\n              }\n            case \"action\":\n              {\n                if (mes.action === \"show-error\") {\n                  _this.errors = __spreadArray(__spreadArray([], _this.errors, true), [extractErrorDetails(mes)], false);\n                }\n                break;\n              }\n            case \"done\":\n              {\n                _this.status = \"done\";\n                break;\n              }\n            case \"state\":\n              {\n                _this.bundlerState = mes.state;\n                break;\n              }\n          }\n        });\n        return _this;\n      }\n      SandpackRuntime2.prototype.setLocationURLIntoIFrame = function () {\n        var _a2;\n        var urlSource = this.options.startRoute ? new URL(this.options.startRoute, this.bundlerURL).toString() : this.bundlerURL;\n        (_a2 = this.iframe.contentWindow) === null || _a2 === void 0 ? void 0 : _a2.location.replace(urlSource);\n        this.iframe.src = urlSource;\n      };\n      SandpackRuntime2.prototype.destroy = function () {\n        this.unsubscribeChannelListener();\n        this.unsubscribeGlobalListener();\n        this.iframeProtocol.cleanup();\n      };\n      SandpackRuntime2.prototype.updateOptions = function (options) {\n        if (!dequal(this.options, options)) {\n          this.options = options;\n          this.updateSandbox();\n        }\n      };\n      SandpackRuntime2.prototype.updateSandbox = function (sandboxSetup, isInitializationCompile) {\n        var _a2, _b, _c, _d;\n        if (sandboxSetup === void 0) {\n          sandboxSetup = this.sandboxSetup;\n        }\n        this.sandboxSetup = __assign(__assign({}, this.sandboxSetup), sandboxSetup);\n        var files = this.getFiles();\n        var modules = Object.keys(files).reduce(function (prev, next) {\n          var _a3;\n          return __assign(__assign({}, prev), (_a3 = {}, _a3[next] = {\n            code: files[next].code,\n            path: next\n          }, _a3));\n        }, {});\n        var packageJSON = JSON.parse(createPackageJSON(this.sandboxSetup.dependencies, this.sandboxSetup.devDependencies, this.sandboxSetup.entry));\n        try {\n          packageJSON = JSON.parse(files[\"/package.json\"].code);\n        } catch (e) {\n          console.error(createError(\"could not parse package.json file: \" + e.message));\n        }\n        var normalizedModules = Object.keys(files).reduce(function (prev, next) {\n          var _a3;\n          return __assign(__assign({}, prev), (_a3 = {}, _a3[next] = {\n            content: files[next].code,\n            path: next\n          }, _a3));\n        }, {});\n        this.dispatch({\n          type: \"compile\",\n          codesandbox: true,\n          version: 3,\n          isInitializationCompile,\n          modules,\n          reactDevTools: this.options.reactDevTools,\n          externalResources: this.options.externalResources || [],\n          hasFileResolver: Boolean(this.options.fileResolver),\n          disableDependencyPreprocessing: this.sandboxSetup.disableDependencyPreprocessing,\n          template: this.sandboxSetup.template || getTemplate(packageJSON, normalizedModules),\n          showOpenInCodeSandbox: (_a2 = this.options.showOpenInCodeSandbox) !== null && _a2 !== void 0 ? _a2 : true,\n          showErrorScreen: (_b = this.options.showErrorScreen) !== null && _b !== void 0 ? _b : true,\n          showLoadingScreen: (_c = this.options.showLoadingScreen) !== null && _c !== void 0 ? _c : false,\n          skipEval: this.options.skipEval || false,\n          clearConsoleDisabled: !this.options.clearConsoleOnFirstCompile,\n          logLevel: (_d = this.options.logLevel) !== null && _d !== void 0 ? _d : SandpackLogLevel.Info,\n          customNpmRegistries: this.options.customNpmRegistries,\n          teamId: this.options.teamId\n        });\n      };\n      SandpackRuntime2.prototype.dispatch = function (message) {\n        if (message.type === \"refresh\") {\n          this.setLocationURLIntoIFrame();\n        }\n        this.iframeProtocol.dispatch(message);\n      };\n      SandpackRuntime2.prototype.listen = function (listener) {\n        return this.iframeProtocol.channelListen(listener);\n      };\n      SandpackRuntime2.prototype.getCodeSandboxURL = function () {\n        var files = this.getFiles();\n        var paramFiles = Object.keys(files).reduce(function (prev, next) {\n          var _a2;\n          return __assign(__assign({}, prev), (_a2 = {}, _a2[next.replace(\"/\", \"\")] = {\n            content: files[next].code,\n            isBinary: false\n          }, _a2));\n        }, {});\n        return fetch(\"https://codesandbox.io/api/v1/sandboxes/define?json=1\", {\n          method: \"POST\",\n          body: JSON.stringify({\n            files: paramFiles\n          }),\n          headers: {\n            Accept: \"application/json\",\n            \"Content-Type\": \"application/json\"\n          }\n        }).then(function (x) {\n          return x.json();\n        }).then(function (res) {\n          return {\n            sandboxId: res.sandbox_id,\n            editorUrl: \"https://codesandbox.io/s/\" + res.sandbox_id,\n            embedUrl: \"https://codesandbox.io/embed/\" + res.sandbox_id\n          };\n        });\n      };\n      SandpackRuntime2.prototype.getFiles = function () {\n        var sandboxSetup = this.sandboxSetup;\n        if (sandboxSetup.files[\"/package.json\"] === void 0) {\n          return addPackageJSONIfNeeded(sandboxSetup.files, sandboxSetup.dependencies, sandboxSetup.devDependencies, sandboxSetup.entry);\n        }\n        return this.sandboxSetup.files;\n      };\n      SandpackRuntime2.prototype.initializeElement = function () {\n        this.iframe.style.border = \"0\";\n        this.iframe.style.width = this.options.width || \"100%\";\n        this.iframe.style.height = this.options.height || \"100%\";\n        this.iframe.style.overflow = \"hidden\";\n        nullthrows(this.element.parentNode, \"The given iframe does not have a parent.\");\n        this.element.parentNode.replaceChild(this.iframe, this.element);\n      };\n      return SandpackRuntime2;\n    }(SandpackClient);\n  }\n}); // ../../node_modules/@codesandbox/sandpack-client/dist/index.mjs\ninit_types_36e5ec0d();\ninit_types_36e5ec0d();\ninit_lib();\nfunction loadSandpackClient(iframeSelector, sandboxSetup, options) {\n  var _a2;\n  if (options === void 0) {\n    options = {};\n  }\n  return __awaiter(this, void 0, void 0, function () {\n    var template, Client, _b;\n    return __generator(this, function (_c) {\n      switch (_c.label) {\n        case 0:\n          template = (_a2 = sandboxSetup.template) !== null && _a2 !== void 0 ? _a2 : \"parcel\";\n          _b = template;\n          switch (_b) {\n            case \"node\":\n              return [3, 1];\n            case \"static\":\n              return [3, 3];\n          }\n          return [3, 5];\n        case 1:\n          return [4, Promise.resolve().then(() => (init_node(), node_exports)).then(function (m) {\n            return m.SandpackNode;\n          })];\n        case 2:\n          Client = _c.sent();\n          return [3, 7];\n        case 3:\n          return [4, Promise.resolve().then(() => (init_index_bd1ff004(), index_bd1ff004_exports)).then(function (m) {\n            return m.SandpackStatic;\n          })];\n        case 4:\n          Client = _c.sent();\n          return [3, 7];\n        case 5:\n          return [4, Promise.resolve().then(() => (init_runtime(), runtime_exports)).then(function (m) {\n            return m.SandpackRuntime;\n          })];\n        case 6:\n          Client = _c.sent();\n          _c.label = 7;\n        case 7:\n          return [2, new Client(iframeSelector, sandboxSetup, options)];\n      }\n    });\n  });\n}\nexport { SandpackLogLevel, addPackageJSONIfNeeded, createError, createPackageJSON, extractErrorDetails, loadSandpackClient, normalizePath, nullthrows }; /*! Bundled license information:\n                                                                                                                                                         static-browser-server/out/lib/main.js:\n                                                                                                                                                         (*! Bundled license information:\n                                                                                                                                                         mime-db/index.js:\n                                                                                                                                                         (*!\n                                                                                                                                                         * mime-db\n                                                                                                                                                         * Copyright(c) 2014 Jonathan Ong\n                                                                                                                                                         * Copyright(c) 2015-2022 Douglas Christopher Wilson\n                                                                                                                                                         * MIT Licensed\n                                                                                                                                                         *)\n                                                                                                                                                         *)\n                                                                                                                                                         */\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"loadSandpackClient\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"addPackageJSONIfNeeded\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"normalizePath\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"createPackageJSON\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"nullthrows\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"createError\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"extractErrorDetails\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackLogLevel\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};", "// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */ // ../../node_modules/@codemirror/commands/dist/index.js\nimport { Annotation, Facet, combineConfig, StateField, EditorSelection, Transaction, ChangeSet, ChangeDesc, StateEffect, Text, findClusterBreak, countColumn, CharCategory } from \"https://framerusercontent.com/modules/wFkXxZqfKOPeEQtsYrsa/Xcw7qvncyogRPQtf9aNn/codemirror_state.js\";\nimport { EditorView, Direction } from \"https://framerusercontent.com/modules/wKCR2JyUW8wZdYweJrou/EndxaPZLF2o4GndkIvF9/codemirror_view.js\";\nimport { IndentContext, getIndentation, indentString, matchBrackets, syntaxTree, getIndentUnit, indentUnit } from \"https://framerusercontent.com/modules/aJsTBlWNkIaM900KNIXT/TeoF57xeGMuVMjiI2ooR/codemirror_language.js\";\nimport { NodeProp } from \"https://framerusercontent.com/modules/CO9ruPlVDRTCLVInyri7/dIK6ma4pzS0qSHWtJ4s1/lezer_common.js\";\nvar toggleComment = target => {\n  let {\n      state\n    } = target,\n    line = state.doc.lineAt(state.selection.main.from),\n    config = getConfig(target.state, line.from);\n  return config.line ? toggleLineComment(target) : config.block ? toggleBlockCommentByLine(target) : false;\n};\nfunction command(f, option) {\n  return ({\n    state,\n    dispatch\n  }) => {\n    if (state.readOnly) return false;\n    let tr = f(option, state);\n    if (!tr) return false;\n    dispatch(state.update(tr));\n    return true;\n  };\n}\nvar toggleLineComment = /* @__PURE__ */command(changeLineComment, 0);\nvar lineComment = /* @__PURE__ */command(changeLineComment, 1);\nvar lineUncomment = /* @__PURE__ */command(changeLineComment, 2);\nvar toggleBlockComment = /* @__PURE__ */command(changeBlockComment, 0);\nvar blockComment = /* @__PURE__ */command(changeBlockComment, 1);\nvar blockUncomment = /* @__PURE__ */command(changeBlockComment, 2);\nvar toggleBlockCommentByLine = /* @__PURE__ */command((o, s) => changeBlockComment(o, s, selectedLineRanges(s)), 0);\nfunction getConfig(state, pos) {\n  let data = state.languageDataAt(\"commentTokens\", pos);\n  return data.length ? data[0] : {};\n}\nvar SearchMargin = 50;\nfunction findBlockComment(state, {\n  open,\n  close\n}, from, to) {\n  let textBefore = state.sliceDoc(from - SearchMargin, from);\n  let textAfter = state.sliceDoc(to, to + SearchMargin);\n  let spaceBefore = /\\s*$/.exec(textBefore)[0].length,\n    spaceAfter = /^\\s*/.exec(textAfter)[0].length;\n  let beforeOff = textBefore.length - spaceBefore;\n  if (textBefore.slice(beforeOff - open.length, beforeOff) == open && textAfter.slice(spaceAfter, spaceAfter + close.length) == close) {\n    return {\n      open: {\n        pos: from - spaceBefore,\n        margin: spaceBefore && 1\n      },\n      close: {\n        pos: to + spaceAfter,\n        margin: spaceAfter && 1\n      }\n    };\n  }\n  let startText, endText;\n  if (to - from <= 2 * SearchMargin) {\n    startText = endText = state.sliceDoc(from, to);\n  } else {\n    startText = state.sliceDoc(from, from + SearchMargin);\n    endText = state.sliceDoc(to - SearchMargin, to);\n  }\n  let startSpace = /^\\s*/.exec(startText)[0].length,\n    endSpace = /\\s*$/.exec(endText)[0].length;\n  let endOff = endText.length - endSpace - close.length;\n  if (startText.slice(startSpace, startSpace + open.length) == open && endText.slice(endOff, endOff + close.length) == close) {\n    return {\n      open: {\n        pos: from + startSpace + open.length,\n        margin: /\\s/.test(startText.charAt(startSpace + open.length)) ? 1 : 0\n      },\n      close: {\n        pos: to - endSpace - close.length,\n        margin: /\\s/.test(endText.charAt(endOff - 1)) ? 1 : 0\n      }\n    };\n  }\n  return null;\n}\nfunction selectedLineRanges(state) {\n  let ranges = [];\n  for (let r of state.selection.ranges) {\n    let fromLine = state.doc.lineAt(r.from);\n    let toLine = r.to <= fromLine.to ? fromLine : state.doc.lineAt(r.to);\n    let last = ranges.length - 1;\n    if (last >= 0 && ranges[last].to > fromLine.from) ranges[last].to = toLine.to;else ranges.push({\n      from: fromLine.from + /^\\s*/.exec(fromLine.text)[0].length,\n      to: toLine.to\n    });\n  }\n  return ranges;\n}\nfunction changeBlockComment(option, state, ranges = state.selection.ranges) {\n  let tokens = ranges.map(r => getConfig(state, r.from).block);\n  if (!tokens.every(c => c)) return null;\n  let comments = ranges.map((r, i) => findBlockComment(state, tokens[i], r.from, r.to));\n  if (option != 2 && !comments.every(c => c)) {\n    return {\n      changes: state.changes(ranges.map((range, i) => {\n        if (comments[i]) return [];\n        return [{\n          from: range.from,\n          insert: tokens[i].open + \" \"\n        }, {\n          from: range.to,\n          insert: \" \" + tokens[i].close\n        }];\n      }))\n    };\n  } else if (option != 1 && comments.some(c => c)) {\n    let changes = [];\n    for (let i = 0, comment; i < comments.length; i++) if (comment = comments[i]) {\n      let token = tokens[i],\n        {\n          open,\n          close\n        } = comment;\n      changes.push({\n        from: open.pos - token.open.length,\n        to: open.pos + open.margin\n      }, {\n        from: close.pos - close.margin,\n        to: close.pos + token.close.length\n      });\n    }\n    return {\n      changes\n    };\n  }\n  return null;\n}\nfunction changeLineComment(option, state, ranges = state.selection.ranges) {\n  let lines = [];\n  let prevLine = -1;\n  for (let {\n    from,\n    to\n  } of ranges) {\n    let startI = lines.length,\n      minIndent = 1e9;\n    let token = getConfig(state, from).line;\n    if (!token) continue;\n    for (let pos = from; pos <= to;) {\n      let line = state.doc.lineAt(pos);\n      if (line.from > prevLine && (from == to || to > line.from)) {\n        prevLine = line.from;\n        let indent = /^\\s*/.exec(line.text)[0].length;\n        let empty = indent == line.length;\n        let comment = line.text.slice(indent, indent + token.length) == token ? indent : -1;\n        if (indent < line.text.length && indent < minIndent) minIndent = indent;\n        lines.push({\n          line,\n          comment,\n          token,\n          indent,\n          empty,\n          single: false\n        });\n      }\n      pos = line.to + 1;\n    }\n    if (minIndent < 1e9) {\n      for (let i = startI; i < lines.length; i++) if (lines[i].indent < lines[i].line.text.length) lines[i].indent = minIndent;\n    }\n    if (lines.length == startI + 1) lines[startI].single = true;\n  }\n  if (option != 2 && lines.some(l => l.comment < 0 && (!l.empty || l.single))) {\n    let changes = [];\n    for (let {\n      line: line1,\n      token: token1,\n      indent: indent1,\n      empty: empty1,\n      single\n    } of lines) if (single || !empty1) changes.push({\n      from: line1.from + indent1,\n      insert: token1 + \" \"\n    });\n    let changeSet = state.changes(changes);\n    return {\n      changes: changeSet,\n      selection: state.selection.map(changeSet, 1)\n    };\n  } else if (option != 1 && lines.some(l => l.comment >= 0)) {\n    let changes1 = [];\n    for (let {\n      line: line2,\n      comment: comment1,\n      token: token2\n    } of lines) if (comment1 >= 0) {\n      let from1 = line2.from + comment1,\n        to1 = from1 + token2.length;\n      if (line2.text[to1 - line2.from] == \" \") to1++;\n      changes1.push({\n        from: from1,\n        to: to1\n      });\n    }\n    return {\n      changes: changes1\n    };\n  }\n  return null;\n}\nvar fromHistory = /* @__PURE__ */Annotation.define();\nvar isolateHistory = /* @__PURE__ */Annotation.define();\nvar invertedEffects = /* @__PURE__ */Facet.define();\nvar historyConfig = /* @__PURE__ */Facet.define({\n  combine(configs) {\n    return combineConfig(configs, {\n      minDepth: 100,\n      newGroupDelay: 500,\n      joinToEvent: (_t, isAdjacent2) => isAdjacent2\n    }, {\n      minDepth: Math.max,\n      newGroupDelay: Math.min,\n      joinToEvent: (a, b) => (tr, adj) => a(tr, adj) || b(tr, adj)\n    });\n  }\n});\nfunction changeEnd(changes) {\n  let end = 0;\n  changes.iterChangedRanges((_, to) => end = to);\n  return end;\n}\nvar historyField_ = /* @__PURE__ */StateField.define({\n  create() {\n    return HistoryState.empty;\n  },\n  update(state, tr) {\n    let config = tr.state.facet(historyConfig);\n    let fromHist = tr.annotation(fromHistory);\n    if (fromHist) {\n      let selection = tr.docChanged ? EditorSelection.single(changeEnd(tr.changes)) : void 0;\n      let item = HistEvent.fromTransaction(tr, selection),\n        from = fromHist.side;\n      let other = from == 0 ? state.undone : state.done;\n      if (item) other = updateBranch(other, other.length, config.minDepth, item);else other = addSelection(other, tr.startState.selection);\n      return new HistoryState(from == 0 ? fromHist.rest : other, from == 0 ? other : fromHist.rest);\n    }\n    let isolate = tr.annotation(isolateHistory);\n    if (isolate == \"full\" || isolate == \"before\") state = state.isolate();\n    if (tr.annotation(Transaction.addToHistory) === false) return !tr.changes.empty ? state.addMapping(tr.changes.desc) : state;\n    let event = HistEvent.fromTransaction(tr);\n    let time = tr.annotation(Transaction.time),\n      userEvent = tr.annotation(Transaction.userEvent);\n    if (event) state = state.addChanges(event, time, userEvent, config, tr);else if (tr.selection) state = state.addSelection(tr.startState.selection, time, userEvent, config.newGroupDelay);\n    if (isolate == \"full\" || isolate == \"after\") state = state.isolate();\n    return state;\n  },\n  toJSON(value) {\n    return {\n      done: value.done.map(e => e.toJSON()),\n      undone: value.undone.map(e => e.toJSON())\n    };\n  },\n  fromJSON(json) {\n    return new HistoryState(json.done.map(HistEvent.fromJSON), json.undone.map(HistEvent.fromJSON));\n  }\n});\nfunction history(config = {}) {\n  return [historyField_, historyConfig.of(config), EditorView.domEventHandlers({\n    beforeinput(e, view) {\n      let command2 = e.inputType == \"historyUndo\" ? undo : e.inputType == \"historyRedo\" ? redo : null;\n      if (!command2) return false;\n      e.preventDefault();\n      return command2(view);\n    }\n  })];\n}\nvar historyField = historyField_;\nfunction cmd(side, selection) {\n  return function ({\n    state,\n    dispatch\n  }) {\n    if (!selection && state.readOnly) return false;\n    let historyState = state.field(historyField_, false);\n    if (!historyState) return false;\n    let tr = historyState.pop(side, state, selection);\n    if (!tr) return false;\n    dispatch(tr);\n    return true;\n  };\n}\nvar undo = /* @__PURE__ */cmd(0, false);\nvar redo = /* @__PURE__ */cmd(1, false);\nvar undoSelection = /* @__PURE__ */cmd(0, true);\nvar redoSelection = /* @__PURE__ */cmd(1, true);\nfunction depth(side) {\n  return function (state) {\n    let histState = state.field(historyField_, false);\n    if (!histState) return 0;\n    let branch = side == 0 ? histState.done : histState.undone;\n    return branch.length - (branch.length && !branch[0].changes ? 1 : 0);\n  };\n}\nvar undoDepth = /* @__PURE__ */depth(0);\nvar redoDepth = /* @__PURE__ */depth(1);\nvar HistEvent = class {\n  setSelAfter(after) {\n    return new HistEvent(this.changes, this.effects, this.mapped, this.startSelection, after);\n  }\n  toJSON() {\n    var _a, _b, _c;\n    return {\n      changes: (_a = this.changes) === null || _a === void 0 ? void 0 : _a.toJSON(),\n      mapped: (_b = this.mapped) === null || _b === void 0 ? void 0 : _b.toJSON(),\n      startSelection: (_c = this.startSelection) === null || _c === void 0 ? void 0 : _c.toJSON(),\n      selectionsAfter: this.selectionsAfter.map(s => s.toJSON())\n    };\n  }\n  static fromJSON(json) {\n    return new HistEvent(json.changes && ChangeSet.fromJSON(json.changes), [], json.mapped && ChangeDesc.fromJSON(json.mapped), json.startSelection && EditorSelection.fromJSON(json.startSelection), json.selectionsAfter.map(EditorSelection.fromJSON));\n  } // This does not check `addToHistory` and such, it assumes the\n  // transaction needs to be converted to an item. Returns null when\n  // there are no changes or effects in the transaction.\n  static fromTransaction(tr, selection) {\n    let effects = none;\n    for (let invert of tr.startState.facet(invertedEffects)) {\n      let result = invert(tr);\n      if (result.length) effects = effects.concat(result);\n    }\n    if (!effects.length && tr.changes.empty) return null;\n    return new HistEvent(tr.changes.invert(tr.startState.doc), effects, void 0, selection || tr.startState.selection, none);\n  }\n  static selection(selections) {\n    return new HistEvent(void 0, none, void 0, void 0, selections);\n  }\n  constructor(changes, effects, mapped, startSelection, selectionsAfter) {\n    this.changes = changes;\n    this.effects = effects;\n    this.mapped = mapped;\n    this.startSelection = startSelection;\n    this.selectionsAfter = selectionsAfter;\n  }\n};\nfunction updateBranch(branch, to, maxLen, newEvent) {\n  let start = to + 1 > maxLen + 20 ? to - maxLen - 1 : 0;\n  let newBranch = branch.slice(start, to);\n  newBranch.push(newEvent);\n  return newBranch;\n}\nfunction isAdjacent(a, b) {\n  let ranges = [],\n    isAdjacent2 = false;\n  a.iterChangedRanges((f, t) => ranges.push(f, t));\n  b.iterChangedRanges((_f, _t, f, t) => {\n    for (let i = 0; i < ranges.length;) {\n      let from = ranges[i++],\n        to = ranges[i++];\n      if (t >= from && f <= to) isAdjacent2 = true;\n    }\n  });\n  return isAdjacent2;\n}\nfunction eqSelectionShape(a, b) {\n  return a.ranges.length == b.ranges.length && a.ranges.filter((r, i) => r.empty != b.ranges[i].empty).length === 0;\n}\nfunction conc(a, b) {\n  return !a.length ? b : !b.length ? a : a.concat(b);\n}\nvar none = [];\nvar MaxSelectionsPerEvent = 200;\nfunction addSelection(branch, selection) {\n  if (!branch.length) {\n    return [HistEvent.selection([selection])];\n  } else {\n    let lastEvent = branch[branch.length - 1];\n    let sels = lastEvent.selectionsAfter.slice(Math.max(0, lastEvent.selectionsAfter.length - MaxSelectionsPerEvent));\n    if (sels.length && sels[sels.length - 1].eq(selection)) return branch;\n    sels.push(selection);\n    return updateBranch(branch, branch.length - 1, 1e9, lastEvent.setSelAfter(sels));\n  }\n}\nfunction popSelection(branch) {\n  let last = branch[branch.length - 1];\n  let newBranch = branch.slice();\n  newBranch[branch.length - 1] = last.setSelAfter(last.selectionsAfter.slice(0, last.selectionsAfter.length - 1));\n  return newBranch;\n}\nfunction addMappingToBranch(branch, mapping) {\n  if (!branch.length) return branch;\n  let length = branch.length,\n    selections = none;\n  while (length) {\n    let event = mapEvent(branch[length - 1], mapping, selections);\n    if (event.changes && !event.changes.empty || event.effects.length) {\n      let result = branch.slice(0, length);\n      result[length - 1] = event;\n      return result;\n    } else {\n      mapping = event.mapped;\n      length--;\n      selections = event.selectionsAfter;\n    }\n  }\n  return selections.length ? [HistEvent.selection(selections)] : none;\n}\nfunction mapEvent(event, mapping, extraSelections) {\n  let selections = conc(event.selectionsAfter.length ? event.selectionsAfter.map(s => s.map(mapping)) : none, extraSelections);\n  if (!event.changes) return HistEvent.selection(selections);\n  let mappedChanges = event.changes.map(mapping),\n    before = mapping.mapDesc(event.changes, true);\n  let fullMapping = event.mapped ? event.mapped.composeDesc(before) : before;\n  return new HistEvent(mappedChanges, StateEffect.mapEffects(event.effects, mapping), fullMapping, event.startSelection.map(before), selections);\n}\nvar joinableUserEvent = /^(input\\.type|delete)($|\\.)/;\nvar HistoryState = class {\n  isolate() {\n    return this.prevTime ? new HistoryState(this.done, this.undone) : this;\n  }\n  addChanges(event, time, userEvent, config, tr) {\n    let done = this.done,\n      lastEvent = done[done.length - 1];\n    if (lastEvent && lastEvent.changes && !lastEvent.changes.empty && event.changes && (!userEvent || joinableUserEvent.test(userEvent)) && (!lastEvent.selectionsAfter.length && time - this.prevTime < config.newGroupDelay && config.joinToEvent(tr, isAdjacent(lastEvent.changes, event.changes)) || userEvent == \"input.type.compose\")) {\n      done = updateBranch(done, done.length - 1, config.minDepth, new HistEvent(event.changes.compose(lastEvent.changes), conc(event.effects, lastEvent.effects), lastEvent.mapped, lastEvent.startSelection, none));\n    } else {\n      done = updateBranch(done, done.length, config.minDepth, event);\n    }\n    return new HistoryState(done, none, time, userEvent);\n  }\n  addSelection(selection, time, userEvent, newGroupDelay) {\n    let last = this.done.length ? this.done[this.done.length - 1].selectionsAfter : none;\n    if (last.length > 0 && time - this.prevTime < newGroupDelay && userEvent == this.prevUserEvent && userEvent && /^select($|\\.)/.test(userEvent) && eqSelectionShape(last[last.length - 1], selection)) return this;\n    return new HistoryState(addSelection(this.done, selection), this.undone, time, userEvent);\n  }\n  addMapping(mapping) {\n    return new HistoryState(addMappingToBranch(this.done, mapping), addMappingToBranch(this.undone, mapping), this.prevTime, this.prevUserEvent);\n  }\n  pop(side, state, selection) {\n    let branch = side == 0 ? this.done : this.undone;\n    if (branch.length == 0) return null;\n    let event = branch[branch.length - 1];\n    if (selection && event.selectionsAfter.length) {\n      return state.update({\n        selection: event.selectionsAfter[event.selectionsAfter.length - 1],\n        annotations: fromHistory.of({\n          side,\n          rest: popSelection(branch)\n        }),\n        userEvent: side == 0 ? \"select.undo\" : \"select.redo\",\n        scrollIntoView: true\n      });\n    } else if (!event.changes) {\n      return null;\n    } else {\n      let rest = branch.length == 1 ? none : branch.slice(0, branch.length - 1);\n      if (event.mapped) rest = addMappingToBranch(rest, event.mapped);\n      return state.update({\n        changes: event.changes,\n        selection: event.startSelection,\n        effects: event.effects,\n        annotations: fromHistory.of({\n          side,\n          rest\n        }),\n        filter: false,\n        userEvent: side == 0 ? \"undo\" : \"redo\",\n        scrollIntoView: true\n      });\n    }\n  }\n  constructor(done, undone, prevTime = 0, prevUserEvent = void 0) {\n    this.done = done;\n    this.undone = undone;\n    this.prevTime = prevTime;\n    this.prevUserEvent = prevUserEvent;\n  }\n};\nHistoryState.empty = /* @__PURE__ */new HistoryState(none, none);\nvar historyKeymap = [{\n  key: \"Mod-z\",\n  run: undo,\n  preventDefault: true\n}, {\n  key: \"Mod-y\",\n  mac: \"Mod-Shift-z\",\n  run: redo,\n  preventDefault: true\n}, {\n  linux: \"Ctrl-Shift-z\",\n  run: redo,\n  preventDefault: true\n}, {\n  key: \"Mod-u\",\n  run: undoSelection,\n  preventDefault: true\n}, {\n  key: \"Alt-u\",\n  mac: \"Mod-Shift-u\",\n  run: redoSelection,\n  preventDefault: true\n}];\nfunction updateSel(sel, by) {\n  return EditorSelection.create(sel.ranges.map(by), sel.mainIndex);\n}\nfunction setSel(state, selection) {\n  return state.update({\n    selection,\n    scrollIntoView: true,\n    userEvent: \"select\"\n  });\n}\nfunction moveSel({\n  state,\n  dispatch\n}, how) {\n  let selection = updateSel(state.selection, how);\n  if (selection.eq(state.selection)) return false;\n  dispatch(setSel(state, selection));\n  return true;\n}\nfunction rangeEnd(range, forward) {\n  return EditorSelection.cursor(forward ? range.to : range.from);\n}\nfunction cursorByChar(view, forward) {\n  return moveSel(view, range => range.empty ? view.moveByChar(range, forward) : rangeEnd(range, forward));\n}\nfunction ltrAtCursor(view) {\n  return view.textDirectionAt(view.state.selection.main.head) == Direction.LTR;\n}\nvar cursorCharLeft = view => cursorByChar(view, !ltrAtCursor(view));\nvar cursorCharRight = view => cursorByChar(view, ltrAtCursor(view));\nvar cursorCharForward = view => cursorByChar(view, true);\nvar cursorCharBackward = view => cursorByChar(view, false);\nfunction cursorByGroup(view, forward) {\n  return moveSel(view, range => range.empty ? view.moveByGroup(range, forward) : rangeEnd(range, forward));\n}\nvar cursorGroupLeft = view => cursorByGroup(view, !ltrAtCursor(view));\nvar cursorGroupRight = view => cursorByGroup(view, ltrAtCursor(view));\nvar cursorGroupForward = view => cursorByGroup(view, true);\nvar cursorGroupBackward = view => cursorByGroup(view, false);\nfunction moveBySubword(view, range, forward) {\n  let categorize = view.state.charCategorizer(range.from);\n  return view.moveByChar(range, forward, start => {\n    let cat = CharCategory.Space,\n      pos = range.from;\n    let done = false,\n      sawUpper = false,\n      sawLower = false;\n    let step = next => {\n      if (done) return false;\n      pos += forward ? next.length : -next.length;\n      let nextCat = categorize(next),\n        ahead;\n      if (nextCat == CharCategory.Word && next.charCodeAt(0) < 128 && /[\\W_]/.test(next)) nextCat = -1;\n      if (cat == CharCategory.Space) cat = nextCat;\n      if (cat != nextCat) return false;\n      if (cat == CharCategory.Word) {\n        if (next.toLowerCase() == next) {\n          if (!forward && sawUpper) return false;\n          sawLower = true;\n        } else if (sawLower) {\n          if (forward) return false;\n          done = true;\n        } else {\n          if (sawUpper && forward && categorize(ahead = view.state.sliceDoc(pos, pos + 1)) == CharCategory.Word && ahead.toLowerCase() == ahead) return false;\n          sawUpper = true;\n        }\n      }\n      return true;\n    };\n    step(start);\n    return step;\n  });\n}\nfunction cursorBySubword(view, forward) {\n  return moveSel(view, range => range.empty ? moveBySubword(view, range, forward) : rangeEnd(range, forward));\n}\nvar cursorSubwordForward = view => cursorBySubword(view, true);\nvar cursorSubwordBackward = view => cursorBySubword(view, false);\nfunction interestingNode(state, node, bracketProp) {\n  if (node.type.prop(bracketProp)) return true;\n  let len = node.to - node.from;\n  return len && (len > 2 || /[^\\s,.;:]/.test(state.sliceDoc(node.from, node.to))) || node.firstChild;\n}\nfunction moveBySyntax(state, start, forward) {\n  let pos = syntaxTree(state).resolveInner(start.head);\n  let bracketProp = forward ? NodeProp.closedBy : NodeProp.openedBy;\n  for (let at = start.head;;) {\n    let next = forward ? pos.childAfter(at) : pos.childBefore(at);\n    if (!next) break;\n    if (interestingNode(state, next, bracketProp)) pos = next;else at = forward ? next.to : next.from;\n  }\n  let bracket = pos.type.prop(bracketProp),\n    match,\n    newPos;\n  if (bracket && (match = forward ? matchBrackets(state, pos.from, 1) : matchBrackets(state, pos.to, -1)) && match.matched) newPos = forward ? match.end.to : match.end.from;else newPos = forward ? pos.to : pos.from;\n  return EditorSelection.cursor(newPos, forward ? -1 : 1);\n}\nvar cursorSyntaxLeft = view => moveSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view)));\nvar cursorSyntaxRight = view => moveSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view)));\nfunction cursorByLine(view, forward) {\n  return moveSel(view, range => {\n    if (!range.empty) return rangeEnd(range, forward);\n    let moved = view.moveVertically(range, forward);\n    return moved.head != range.head ? moved : view.moveToLineBoundary(range, forward);\n  });\n}\nvar cursorLineUp = view => cursorByLine(view, false);\nvar cursorLineDown = view => cursorByLine(view, true);\nfunction pageInfo(view) {\n  let selfScroll = view.scrollDOM.clientHeight < view.scrollDOM.scrollHeight - 2;\n  let marginTop = 0,\n    marginBottom = 0,\n    height;\n  if (selfScroll) {\n    for (let source of view.state.facet(EditorView.scrollMargins)) {\n      let margins = source(view);\n      if (margins === null || margins === void 0 ? void 0 : margins.top) marginTop = Math.max(margins === null || margins === void 0 ? void 0 : margins.top, marginTop);\n      if (margins === null || margins === void 0 ? void 0 : margins.bottom) marginBottom = Math.max(margins === null || margins === void 0 ? void 0 : margins.bottom, marginBottom);\n    }\n    height = view.scrollDOM.clientHeight - marginTop - marginBottom;\n  } else {\n    height = (view.dom.ownerDocument.defaultView || window).innerHeight;\n  }\n  return {\n    marginTop,\n    marginBottom,\n    selfScroll,\n    height: Math.max(view.defaultLineHeight, height - 5)\n  };\n}\nfunction cursorByPage(view, forward) {\n  let page = pageInfo(view);\n  let {\n      state\n    } = view,\n    selection = updateSel(state.selection, range => {\n      return range.empty ? view.moveVertically(range, forward, page.height) : rangeEnd(range, forward);\n    });\n  if (selection.eq(state.selection)) return false;\n  let effect;\n  if (page.selfScroll) {\n    let startPos = view.coordsAtPos(state.selection.main.head);\n    let scrollRect = view.scrollDOM.getBoundingClientRect();\n    let scrollTop = scrollRect.top + page.marginTop,\n      scrollBottom = scrollRect.bottom - page.marginBottom;\n    if (startPos && startPos.top > scrollTop && startPos.bottom < scrollBottom) effect = EditorView.scrollIntoView(selection.main.head, {\n      y: \"start\",\n      yMargin: startPos.top - scrollTop\n    });\n  }\n  view.dispatch(setSel(state, selection), {\n    effects: effect\n  });\n  return true;\n}\nvar cursorPageUp = view => cursorByPage(view, false);\nvar cursorPageDown = view => cursorByPage(view, true);\nfunction moveByLineBoundary(view, start, forward) {\n  let line = view.lineBlockAt(start.head),\n    moved = view.moveToLineBoundary(start, forward);\n  if (moved.head == start.head && moved.head != (forward ? line.to : line.from)) moved = view.moveToLineBoundary(start, forward, false);\n  if (!forward && moved.head == line.from && line.length) {\n    let space = /^\\s*/.exec(view.state.sliceDoc(line.from, Math.min(line.from + 100, line.to)))[0].length;\n    if (space && start.head != line.from + space) moved = EditorSelection.cursor(line.from + space);\n  }\n  return moved;\n}\nvar cursorLineBoundaryForward = view => moveSel(view, range => moveByLineBoundary(view, range, true));\nvar cursorLineBoundaryBackward = view => moveSel(view, range => moveByLineBoundary(view, range, false));\nvar cursorLineBoundaryLeft = view => moveSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view)));\nvar cursorLineBoundaryRight = view => moveSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view)));\nvar cursorLineStart = view => moveSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).from, 1));\nvar cursorLineEnd = view => moveSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).to, -1));\nfunction toMatchingBracket(state, dispatch, extend) {\n  let found = false,\n    selection = updateSel(state.selection, range => {\n      let matching = matchBrackets(state, range.head, -1) || matchBrackets(state, range.head, 1) || range.head > 0 && matchBrackets(state, range.head - 1, 1) || range.head < state.doc.length && matchBrackets(state, range.head + 1, -1);\n      if (!matching || !matching.end) return range;\n      found = true;\n      let head = matching.start.from == range.head ? matching.end.to : matching.end.from;\n      return extend ? EditorSelection.range(range.anchor, head) : EditorSelection.cursor(head);\n    });\n  if (!found) return false;\n  dispatch(setSel(state, selection));\n  return true;\n}\nvar cursorMatchingBracket = ({\n  state,\n  dispatch\n}) => toMatchingBracket(state, dispatch, false);\nvar selectMatchingBracket = ({\n  state,\n  dispatch\n}) => toMatchingBracket(state, dispatch, true);\nfunction extendSel(view, how) {\n  let selection = updateSel(view.state.selection, range => {\n    let head = how(range);\n    return EditorSelection.range(range.anchor, head.head, head.goalColumn, head.bidiLevel || void 0);\n  });\n  if (selection.eq(view.state.selection)) return false;\n  view.dispatch(setSel(view.state, selection));\n  return true;\n}\nfunction selectByChar(view, forward) {\n  return extendSel(view, range => view.moveByChar(range, forward));\n}\nvar selectCharLeft = view => selectByChar(view, !ltrAtCursor(view));\nvar selectCharRight = view => selectByChar(view, ltrAtCursor(view));\nvar selectCharForward = view => selectByChar(view, true);\nvar selectCharBackward = view => selectByChar(view, false);\nfunction selectByGroup(view, forward) {\n  return extendSel(view, range => view.moveByGroup(range, forward));\n}\nvar selectGroupLeft = view => selectByGroup(view, !ltrAtCursor(view));\nvar selectGroupRight = view => selectByGroup(view, ltrAtCursor(view));\nvar selectGroupForward = view => selectByGroup(view, true);\nvar selectGroupBackward = view => selectByGroup(view, false);\nfunction selectBySubword(view, forward) {\n  return extendSel(view, range => moveBySubword(view, range, forward));\n}\nvar selectSubwordForward = view => selectBySubword(view, true);\nvar selectSubwordBackward = view => selectBySubword(view, false);\nvar selectSyntaxLeft = view => extendSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view)));\nvar selectSyntaxRight = view => extendSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view)));\nfunction selectByLine(view, forward) {\n  return extendSel(view, range => view.moveVertically(range, forward));\n}\nvar selectLineUp = view => selectByLine(view, false);\nvar selectLineDown = view => selectByLine(view, true);\nfunction selectByPage(view, forward) {\n  return extendSel(view, range => view.moveVertically(range, forward, pageInfo(view).height));\n}\nvar selectPageUp = view => selectByPage(view, false);\nvar selectPageDown = view => selectByPage(view, true);\nvar selectLineBoundaryForward = view => extendSel(view, range => moveByLineBoundary(view, range, true));\nvar selectLineBoundaryBackward = view => extendSel(view, range => moveByLineBoundary(view, range, false));\nvar selectLineBoundaryLeft = view => extendSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view)));\nvar selectLineBoundaryRight = view => extendSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view)));\nvar selectLineStart = view => extendSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).from));\nvar selectLineEnd = view => extendSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).to));\nvar cursorDocStart = ({\n  state,\n  dispatch\n}) => {\n  dispatch(setSel(state, {\n    anchor: 0\n  }));\n  return true;\n};\nvar cursorDocEnd = ({\n  state,\n  dispatch\n}) => {\n  dispatch(setSel(state, {\n    anchor: state.doc.length\n  }));\n  return true;\n};\nvar selectDocStart = ({\n  state,\n  dispatch\n}) => {\n  dispatch(setSel(state, {\n    anchor: state.selection.main.anchor,\n    head: 0\n  }));\n  return true;\n};\nvar selectDocEnd = ({\n  state,\n  dispatch\n}) => {\n  dispatch(setSel(state, {\n    anchor: state.selection.main.anchor,\n    head: state.doc.length\n  }));\n  return true;\n};\nvar selectAll = ({\n  state,\n  dispatch\n}) => {\n  dispatch(state.update({\n    selection: {\n      anchor: 0,\n      head: state.doc.length\n    },\n    userEvent: \"select\"\n  }));\n  return true;\n};\nvar selectLine = ({\n  state,\n  dispatch\n}) => {\n  let ranges = selectedLineBlocks(state).map(({\n    from,\n    to\n  }) => EditorSelection.range(from, Math.min(to + 1, state.doc.length)));\n  dispatch(state.update({\n    selection: EditorSelection.create(ranges),\n    userEvent: \"select\"\n  }));\n  return true;\n};\nvar selectParentSyntax = ({\n  state,\n  dispatch\n}) => {\n  let selection = updateSel(state.selection, range => {\n    var _a;\n    let context = syntaxTree(state).resolveInner(range.head, 1);\n    while (!(context.from < range.from && context.to >= range.to || context.to > range.to && context.from <= range.from || !((_a = context.parent) === null || _a === void 0 ? void 0 : _a.parent))) context = context.parent;\n    return EditorSelection.range(context.to, context.from);\n  });\n  dispatch(setSel(state, selection));\n  return true;\n};\nvar simplifySelection = ({\n  state,\n  dispatch\n}) => {\n  let cur = state.selection,\n    selection = null;\n  if (cur.ranges.length > 1) selection = EditorSelection.create([cur.main]);else if (!cur.main.empty) selection = EditorSelection.create([EditorSelection.cursor(cur.main.head)]);\n  if (!selection) return false;\n  dispatch(setSel(state, selection));\n  return true;\n};\nfunction deleteBy(target, by) {\n  if (target.state.readOnly) return false;\n  let event = \"delete.selection\",\n    {\n      state\n    } = target;\n  let changes = state.changeByRange(range => {\n    let {\n      from,\n      to\n    } = range;\n    if (from == to) {\n      let towards = by(from);\n      if (towards < from) {\n        event = \"delete.backward\";\n        towards = skipAtomic(target, towards, false);\n      } else if (towards > from) {\n        event = \"delete.forward\";\n        towards = skipAtomic(target, towards, true);\n      }\n      from = Math.min(from, towards);\n      to = Math.max(to, towards);\n    } else {\n      from = skipAtomic(target, from, false);\n      to = skipAtomic(target, to, true);\n    }\n    return from == to ? {\n      range\n    } : {\n      changes: {\n        from,\n        to\n      },\n      range: EditorSelection.cursor(from)\n    };\n  });\n  if (changes.changes.empty) return false;\n  target.dispatch(state.update(changes, {\n    scrollIntoView: true,\n    userEvent: event,\n    effects: event == \"delete.selection\" ? EditorView.announce.of(state.phrase(\"Selection deleted\")) : void 0\n  }));\n  return true;\n}\nfunction skipAtomic(target, pos, forward) {\n  if (target instanceof EditorView) for (let ranges of target.state.facet(EditorView.atomicRanges).map(f => f(target))) ranges.between(pos, pos, (from, to) => {\n    if (from < pos && to > pos) pos = forward ? to : from;\n  });\n  return pos;\n}\nvar deleteByChar = (target, forward) => deleteBy(target, pos => {\n  let {\n      state\n    } = target,\n    line = state.doc.lineAt(pos),\n    before,\n    targetPos;\n  if (!forward && pos > line.from && pos < line.from + 200 && !/[^ \\t]/.test(before = line.text.slice(0, pos - line.from))) {\n    if (before[before.length - 1] == \"\t\") return pos - 1;\n    let col = countColumn(before, state.tabSize),\n      drop = col % getIndentUnit(state) || getIndentUnit(state);\n    for (let i = 0; i < drop && before[before.length - 1 - i] == \" \"; i++) pos--;\n    targetPos = pos;\n  } else {\n    targetPos = findClusterBreak(line.text, pos - line.from, forward, forward) + line.from;\n    if (targetPos == pos && line.number != (forward ? state.doc.lines : 1)) targetPos += forward ? 1 : -1;\n  }\n  return targetPos;\n});\nvar deleteCharBackward = view => deleteByChar(view, false);\nvar deleteCharForward = view => deleteByChar(view, true);\nvar deleteByGroup = (target, forward) => deleteBy(target, start => {\n  let pos = start,\n    {\n      state\n    } = target,\n    line = state.doc.lineAt(pos);\n  let categorize = state.charCategorizer(pos);\n  for (let cat = null;;) {\n    if (pos == (forward ? line.to : line.from)) {\n      if (pos == start && line.number != (forward ? state.doc.lines : 1)) pos += forward ? 1 : -1;\n      break;\n    }\n    let next = findClusterBreak(line.text, pos - line.from, forward) + line.from;\n    let nextChar = line.text.slice(Math.min(pos, next) - line.from, Math.max(pos, next) - line.from);\n    let nextCat = categorize(nextChar);\n    if (cat != null && nextCat != cat) break;\n    if (nextChar != \" \" || pos != start) cat = nextCat;\n    pos = next;\n  }\n  return pos;\n});\nvar deleteGroupBackward = target => deleteByGroup(target, false);\nvar deleteGroupForward = target => deleteByGroup(target, true);\nvar deleteToLineEnd = view => deleteBy(view, pos => {\n  let lineEnd = view.lineBlockAt(pos).to;\n  return pos < lineEnd ? lineEnd : Math.min(view.state.doc.length, pos + 1);\n});\nvar deleteToLineStart = view => deleteBy(view, pos => {\n  let lineStart = view.lineBlockAt(pos).from;\n  return pos > lineStart ? lineStart : Math.max(0, pos - 1);\n});\nvar deleteTrailingWhitespace = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  let changes = [];\n  for (let pos = 0, prev = \"\", iter = state.doc.iter();;) {\n    iter.next();\n    if (iter.lineBreak || iter.done) {\n      let trailing = prev.search(/\\s+$/);\n      if (trailing > -1) changes.push({\n        from: pos - (prev.length - trailing),\n        to: pos\n      });\n      if (iter.done) break;\n      prev = \"\";\n    } else {\n      prev = iter.value;\n    }\n    pos += iter.value.length;\n  }\n  if (!changes.length) return false;\n  dispatch(state.update({\n    changes,\n    userEvent: \"delete\"\n  }));\n  return true;\n};\nvar splitLine = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  let changes = state.changeByRange(range => {\n    return {\n      changes: {\n        from: range.from,\n        to: range.to,\n        insert: Text.of([\"\", \"\"])\n      },\n      range: EditorSelection.cursor(range.from)\n    };\n  });\n  dispatch(state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"input\"\n  }));\n  return true;\n};\nvar transposeChars = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  let changes = state.changeByRange(range => {\n    if (!range.empty || range.from == 0 || range.from == state.doc.length) return {\n      range\n    };\n    let pos = range.from,\n      line = state.doc.lineAt(pos);\n    let from = pos == line.from ? pos - 1 : findClusterBreak(line.text, pos - line.from, false) + line.from;\n    let to = pos == line.to ? pos + 1 : findClusterBreak(line.text, pos - line.from, true) + line.from;\n    return {\n      changes: {\n        from,\n        to,\n        insert: state.doc.slice(pos, to).append(state.doc.slice(from, pos))\n      },\n      range: EditorSelection.cursor(to)\n    };\n  });\n  if (changes.changes.empty) return false;\n  dispatch(state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"move.character\"\n  }));\n  return true;\n};\nfunction selectedLineBlocks(state) {\n  let blocks = [],\n    upto = -1;\n  for (let range of state.selection.ranges) {\n    let startLine = state.doc.lineAt(range.from),\n      endLine = state.doc.lineAt(range.to);\n    if (!range.empty && range.to == endLine.from) endLine = state.doc.lineAt(range.to - 1);\n    if (upto >= startLine.number) {\n      let prev = blocks[blocks.length - 1];\n      prev.to = endLine.to;\n      prev.ranges.push(range);\n    } else {\n      blocks.push({\n        from: startLine.from,\n        to: endLine.to,\n        ranges: [range]\n      });\n    }\n    upto = endLine.number + 1;\n  }\n  return blocks;\n}\nfunction moveLine(state, dispatch, forward) {\n  if (state.readOnly) return false;\n  let changes = [],\n    ranges = [];\n  for (let block of selectedLineBlocks(state)) {\n    if (forward ? block.to == state.doc.length : block.from == 0) continue;\n    let nextLine = state.doc.lineAt(forward ? block.to + 1 : block.from - 1);\n    let size = nextLine.length + 1;\n    if (forward) {\n      changes.push({\n        from: block.to,\n        to: nextLine.to\n      }, {\n        from: block.from,\n        insert: nextLine.text + state.lineBreak\n      });\n      for (let r of block.ranges) ranges.push(EditorSelection.range(Math.min(state.doc.length, r.anchor + size), Math.min(state.doc.length, r.head + size)));\n    } else {\n      changes.push({\n        from: nextLine.from,\n        to: block.from\n      }, {\n        from: block.to,\n        insert: state.lineBreak + nextLine.text\n      });\n      for (let r1 of block.ranges) ranges.push(EditorSelection.range(r1.anchor - size, r1.head - size));\n    }\n  }\n  if (!changes.length) return false;\n  dispatch(state.update({\n    changes,\n    scrollIntoView: true,\n    selection: EditorSelection.create(ranges, state.selection.mainIndex),\n    userEvent: \"move.line\"\n  }));\n  return true;\n}\nvar moveLineUp = ({\n  state,\n  dispatch\n}) => moveLine(state, dispatch, false);\nvar moveLineDown = ({\n  state,\n  dispatch\n}) => moveLine(state, dispatch, true);\nfunction copyLine(state, dispatch, forward) {\n  if (state.readOnly) return false;\n  let changes = [];\n  for (let block of selectedLineBlocks(state)) {\n    if (forward) changes.push({\n      from: block.from,\n      insert: state.doc.slice(block.from, block.to) + state.lineBreak\n    });else changes.push({\n      from: block.to,\n      insert: state.lineBreak + state.doc.slice(block.from, block.to)\n    });\n  }\n  dispatch(state.update({\n    changes,\n    scrollIntoView: true,\n    userEvent: \"input.copyline\"\n  }));\n  return true;\n}\nvar copyLineUp = ({\n  state,\n  dispatch\n}) => copyLine(state, dispatch, false);\nvar copyLineDown = ({\n  state,\n  dispatch\n}) => copyLine(state, dispatch, true);\nvar deleteLine = view => {\n  if (view.state.readOnly) return false;\n  let {\n      state\n    } = view,\n    changes = state.changes(selectedLineBlocks(state).map(({\n      from,\n      to\n    }) => {\n      if (from > 0) from--;else if (to < state.doc.length) to++;\n      return {\n        from,\n        to\n      };\n    }));\n  let selection = updateSel(state.selection, range => view.moveVertically(range, true)).map(changes);\n  view.dispatch({\n    changes,\n    selection,\n    scrollIntoView: true,\n    userEvent: \"delete.line\"\n  });\n  return true;\n};\nvar insertNewline = ({\n  state,\n  dispatch\n}) => {\n  dispatch(state.update(state.replaceSelection(state.lineBreak), {\n    scrollIntoView: true,\n    userEvent: \"input\"\n  }));\n  return true;\n};\nfunction isBetweenBrackets(state, pos) {\n  if (/\\(\\)|\\[\\]|\\{\\}/.test(state.sliceDoc(pos - 1, pos + 1))) return {\n    from: pos,\n    to: pos\n  };\n  let context = syntaxTree(state).resolveInner(pos);\n  let before = context.childBefore(pos),\n    after = context.childAfter(pos),\n    closedBy;\n  if (before && after && before.to <= pos && after.from >= pos && (closedBy = before.type.prop(NodeProp.closedBy)) && closedBy.indexOf(after.name) > -1 && state.doc.lineAt(before.to).from == state.doc.lineAt(after.from).from) return {\n    from: before.to,\n    to: after.from\n  };\n  return null;\n}\nvar insertNewlineAndIndent = /* @__PURE__ */newlineAndIndent(false);\nvar insertBlankLine = /* @__PURE__ */newlineAndIndent(true);\nfunction newlineAndIndent(atEof) {\n  return ({\n    state,\n    dispatch\n  }) => {\n    if (state.readOnly) return false;\n    let changes = state.changeByRange(range => {\n      let {\n          from,\n          to\n        } = range,\n        line = state.doc.lineAt(from);\n      let explode = !atEof && from == to && isBetweenBrackets(state, from);\n      if (atEof) from = to = (to <= line.to ? line : state.doc.lineAt(to)).to;\n      let cx = new IndentContext(state, {\n        simulateBreak: from,\n        simulateDoubleBreak: !!explode\n      });\n      let indent = getIndentation(cx, from);\n      if (indent == null) indent = /^\\s*/.exec(state.doc.lineAt(from).text)[0].length;\n      while (to < line.to && /\\s/.test(line.text[to - line.from])) to++;\n      if (explode) ({\n        from,\n        to\n      } = explode);else if (from > line.from && from < line.from + 100 && !/\\S/.test(line.text.slice(0, from))) from = line.from;\n      let insert = [\"\", indentString(state, indent)];\n      if (explode) insert.push(indentString(state, cx.lineIndent(line.from, -1)));\n      return {\n        changes: {\n          from,\n          to,\n          insert: Text.of(insert)\n        },\n        range: EditorSelection.cursor(from + 1 + insert[1].length)\n      };\n    });\n    dispatch(state.update(changes, {\n      scrollIntoView: true,\n      userEvent: \"input\"\n    }));\n    return true;\n  };\n}\nfunction changeBySelectedLine(state, f) {\n  let atLine = -1;\n  return state.changeByRange(range => {\n    let changes = [];\n    for (let pos = range.from; pos <= range.to;) {\n      let line = state.doc.lineAt(pos);\n      if (line.number > atLine && (range.empty || range.to > line.from)) {\n        f(line, changes, range);\n        atLine = line.number;\n      }\n      pos = line.to + 1;\n    }\n    let changeSet = state.changes(changes);\n    return {\n      changes,\n      range: EditorSelection.range(changeSet.mapPos(range.anchor, 1), changeSet.mapPos(range.head, 1))\n    };\n  });\n}\nvar indentSelection = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  let updated = /* @__PURE__ */Object.create(null);\n  let context = new IndentContext(state, {\n    overrideIndentation: start => {\n      let found = updated[start];\n      return found == null ? -1 : found;\n    }\n  });\n  let changes = changeBySelectedLine(state, (line, changes2, range) => {\n    let indent = getIndentation(context, line.from);\n    if (indent == null) return;\n    if (!/\\S/.test(line.text)) indent = 0;\n    let cur = /^\\s*/.exec(line.text)[0];\n    let norm = indentString(state, indent);\n    if (cur != norm || range.from < line.from + cur.length) {\n      updated[line.from] = indent;\n      changes2.push({\n        from: line.from,\n        to: line.from + cur.length,\n        insert: norm\n      });\n    }\n  });\n  if (!changes.changes.empty) dispatch(state.update(changes, {\n    userEvent: \"indent\"\n  }));\n  return true;\n};\nvar indentMore = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  dispatch(state.update(changeBySelectedLine(state, (line, changes) => {\n    changes.push({\n      from: line.from,\n      insert: state.facet(indentUnit)\n    });\n  }), {\n    userEvent: \"input.indent\"\n  }));\n  return true;\n};\nvar indentLess = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  dispatch(state.update(changeBySelectedLine(state, (line, changes) => {\n    let space = /^\\s*/.exec(line.text)[0];\n    if (!space) return;\n    let col = countColumn(space, state.tabSize),\n      keep = 0;\n    let insert = indentString(state, Math.max(0, col - getIndentUnit(state)));\n    while (keep < space.length && keep < insert.length && space.charCodeAt(keep) == insert.charCodeAt(keep)) keep++;\n    changes.push({\n      from: line.from + keep,\n      to: line.from + space.length,\n      insert: insert.slice(keep)\n    });\n  }), {\n    userEvent: \"delete.dedent\"\n  }));\n  return true;\n};\nvar insertTab = ({\n  state,\n  dispatch\n}) => {\n  if (state.selection.ranges.some(r => !r.empty)) return indentMore({\n    state,\n    dispatch\n  });\n  dispatch(state.update(state.replaceSelection(\"\t\"), {\n    scrollIntoView: true,\n    userEvent: \"input\"\n  }));\n  return true;\n};\nvar emacsStyleKeymap = [{\n  key: \"Ctrl-b\",\n  run: cursorCharLeft,\n  shift: selectCharLeft,\n  preventDefault: true\n}, {\n  key: \"Ctrl-f\",\n  run: cursorCharRight,\n  shift: selectCharRight\n}, {\n  key: \"Ctrl-p\",\n  run: cursorLineUp,\n  shift: selectLineUp\n}, {\n  key: \"Ctrl-n\",\n  run: cursorLineDown,\n  shift: selectLineDown\n}, {\n  key: \"Ctrl-a\",\n  run: cursorLineStart,\n  shift: selectLineStart\n}, {\n  key: \"Ctrl-e\",\n  run: cursorLineEnd,\n  shift: selectLineEnd\n}, {\n  key: \"Ctrl-d\",\n  run: deleteCharForward\n}, {\n  key: \"Ctrl-h\",\n  run: deleteCharBackward\n}, {\n  key: \"Ctrl-k\",\n  run: deleteToLineEnd\n}, {\n  key: \"Ctrl-Alt-h\",\n  run: deleteGroupBackward\n}, {\n  key: \"Ctrl-o\",\n  run: splitLine\n}, {\n  key: \"Ctrl-t\",\n  run: transposeChars\n}, {\n  key: \"Ctrl-v\",\n  run: cursorPageDown\n}];\nvar standardKeymap = /* @__PURE__ */[{\n  key: \"ArrowLeft\",\n  run: cursorCharLeft,\n  shift: selectCharLeft,\n  preventDefault: true\n}, {\n  key: \"Mod-ArrowLeft\",\n  mac: \"Alt-ArrowLeft\",\n  run: cursorGroupLeft,\n  shift: selectGroupLeft,\n  preventDefault: true\n}, {\n  mac: \"Cmd-ArrowLeft\",\n  run: cursorLineBoundaryLeft,\n  shift: selectLineBoundaryLeft,\n  preventDefault: true\n}, {\n  key: \"ArrowRight\",\n  run: cursorCharRight,\n  shift: selectCharRight,\n  preventDefault: true\n}, {\n  key: \"Mod-ArrowRight\",\n  mac: \"Alt-ArrowRight\",\n  run: cursorGroupRight,\n  shift: selectGroupRight,\n  preventDefault: true\n}, {\n  mac: \"Cmd-ArrowRight\",\n  run: cursorLineBoundaryRight,\n  shift: selectLineBoundaryRight,\n  preventDefault: true\n}, {\n  key: \"ArrowUp\",\n  run: cursorLineUp,\n  shift: selectLineUp,\n  preventDefault: true\n}, {\n  mac: \"Cmd-ArrowUp\",\n  run: cursorDocStart,\n  shift: selectDocStart\n}, {\n  mac: \"Ctrl-ArrowUp\",\n  run: cursorPageUp,\n  shift: selectPageUp\n}, {\n  key: \"ArrowDown\",\n  run: cursorLineDown,\n  shift: selectLineDown,\n  preventDefault: true\n}, {\n  mac: \"Cmd-ArrowDown\",\n  run: cursorDocEnd,\n  shift: selectDocEnd\n}, {\n  mac: \"Ctrl-ArrowDown\",\n  run: cursorPageDown,\n  shift: selectPageDown\n}, {\n  key: \"PageUp\",\n  run: cursorPageUp,\n  shift: selectPageUp\n}, {\n  key: \"PageDown\",\n  run: cursorPageDown,\n  shift: selectPageDown\n}, {\n  key: \"Home\",\n  run: cursorLineBoundaryBackward,\n  shift: selectLineBoundaryBackward,\n  preventDefault: true\n}, {\n  key: \"Mod-Home\",\n  run: cursorDocStart,\n  shift: selectDocStart\n}, {\n  key: \"End\",\n  run: cursorLineBoundaryForward,\n  shift: selectLineBoundaryForward,\n  preventDefault: true\n}, {\n  key: \"Mod-End\",\n  run: cursorDocEnd,\n  shift: selectDocEnd\n}, {\n  key: \"Enter\",\n  run: insertNewlineAndIndent\n}, {\n  key: \"Mod-a\",\n  run: selectAll\n}, {\n  key: \"Backspace\",\n  run: deleteCharBackward,\n  shift: deleteCharBackward\n}, {\n  key: \"Delete\",\n  run: deleteCharForward\n}, {\n  key: \"Mod-Backspace\",\n  mac: \"Alt-Backspace\",\n  run: deleteGroupBackward\n}, {\n  key: \"Mod-Delete\",\n  mac: \"Alt-Delete\",\n  run: deleteGroupForward\n}, {\n  mac: \"Mod-Backspace\",\n  run: deleteToLineStart\n}, {\n  mac: \"Mod-Delete\",\n  run: deleteToLineEnd\n}].concat( /* @__PURE__ */emacsStyleKeymap.map(b => ({\n  mac: b.key,\n  run: b.run,\n  shift: b.shift\n})));\nvar defaultKeymap = /* @__PURE__ */[{\n  key: \"Alt-ArrowLeft\",\n  mac: \"Ctrl-ArrowLeft\",\n  run: cursorSyntaxLeft,\n  shift: selectSyntaxLeft\n}, {\n  key: \"Alt-ArrowRight\",\n  mac: \"Ctrl-ArrowRight\",\n  run: cursorSyntaxRight,\n  shift: selectSyntaxRight\n}, {\n  key: \"Alt-ArrowUp\",\n  run: moveLineUp\n}, {\n  key: \"Shift-Alt-ArrowUp\",\n  run: copyLineUp\n}, {\n  key: \"Alt-ArrowDown\",\n  run: moveLineDown\n}, {\n  key: \"Shift-Alt-ArrowDown\",\n  run: copyLineDown\n}, {\n  key: \"Escape\",\n  run: simplifySelection\n}, {\n  key: \"Mod-Enter\",\n  run: insertBlankLine\n}, {\n  key: \"Alt-l\",\n  mac: \"Ctrl-l\",\n  run: selectLine\n}, {\n  key: \"Mod-i\",\n  run: selectParentSyntax,\n  preventDefault: true\n}, {\n  key: \"Mod-[\",\n  run: indentLess\n}, {\n  key: \"Mod-]\",\n  run: indentMore\n}, {\n  key: \"Mod-Alt-\\\\\",\n  run: indentSelection\n}, {\n  key: \"Shift-Mod-k\",\n  run: deleteLine\n}, {\n  key: \"Shift-Mod-\\\\\",\n  run: cursorMatchingBracket\n}, {\n  key: \"Mod-/\",\n  run: toggleComment\n}, {\n  key: \"Alt-A\",\n  run: toggleBlockComment\n}].concat(standardKeymap);\nvar indentWithTab = {\n  key: \"Tab\",\n  run: indentMore,\n  shift: indentLess\n};\nexport { blockComment, blockUncomment, copyLineDown, copyLineUp, cursorCharBackward, cursorCharForward, cursorCharLeft, cursorCharRight, cursorDocEnd, cursorDocStart, cursorGroupBackward, cursorGroupForward, cursorGroupLeft, cursorGroupRight, cursorLineBoundaryBackward, cursorLineBoundaryForward, cursorLineBoundaryLeft, cursorLineBoundaryRight, cursorLineDown, cursorLineEnd, cursorLineStart, cursorLineUp, cursorMatchingBracket, cursorPageDown, cursorPageUp, cursorSubwordBackward, cursorSubwordForward, cursorSyntaxLeft, cursorSyntaxRight, defaultKeymap, deleteCharBackward, deleteCharForward, deleteGroupBackward, deleteGroupForward, deleteLine, deleteToLineEnd, deleteToLineStart, deleteTrailingWhitespace, emacsStyleKeymap, history, historyField, historyKeymap, indentLess, indentMore, indentSelection, indentWithTab, insertBlankLine, insertNewline, insertNewlineAndIndent, insertTab, invertedEffects, isolateHistory, lineComment, lineUncomment, moveLineDown, moveLineUp, redo, redoDepth, redoSelection, selectAll, selectCharBackward, selectCharForward, selectCharLeft, selectCharRight, selectDocEnd, selectDocStart, selectGroupBackward, selectGroupForward, selectGroupLeft, selectGroupRight, selectLine, selectLineBoundaryBackward, selectLineBoundaryForward, selectLineBoundaryLeft, selectLineBoundaryRight, selectLineDown, selectLineEnd, selectLineStart, selectLineUp, selectMatchingBracket, selectPageDown, selectPageUp, selectParentSyntax, selectSubwordBackward, selectSubwordForward, selectSyntaxLeft, selectSyntaxRight, simplifySelection, splitLine, standardKeymap, toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment, transposeChars, undo, undoDepth, undoSelection };\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"copyLineUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"toggleBlockCommentByLine\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectSyntaxLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"toggleComment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectPageDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineStart\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorDocEnd\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"invertedEffects\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorCharLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineStart\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"splitLine\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"toggleBlockComment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectParentSyntax\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertNewline\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"undoDepth\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"redoSelection\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"redo\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteGroupForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorMatchingBracket\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectCharRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineBoundaryForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectDocStart\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"lineUncomment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"defaultKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorSyntaxRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorCharBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"undo\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertNewlineAndIndent\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorGroupRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineEnd\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"simplifySelection\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectDocEnd\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteCharForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectCharBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectPageUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"emacsStyleKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"isolateHistory\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorDocStart\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorSubwordForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineBoundaryForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineBoundaryRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"blockUncomment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteLine\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectSubwordBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"moveLineUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"toggleLineComment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"lineComment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorCharForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"indentWithTab\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteTrailingWhitespace\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectCharForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorPageDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"historyKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectGroupForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"historyField\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"indentLess\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineBoundaryRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorCharRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"moveLineDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineBoundaryLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectGroupLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteCharBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"undoSelection\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"indentMore\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteGroupBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"copyLineDown\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"redoDepth\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineBoundaryBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineBoundaryBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectMatchingBracket\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"standardKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineBoundaryLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertTab\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorLineUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectGroupBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectGroupRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteToLineEnd\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteToLineStart\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectCharLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertBlankLine\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorSubwordBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectAll\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"indentSelection\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"history\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorSyntaxLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLine\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorGroupBackward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"blockComment\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorPageUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorGroupLeft\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectSyntaxRight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectSubwordForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cursorGroupForward\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectLineEnd\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"transposeChars\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};", "// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n    exports: {}\n  }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n      get: () => from[key],\n      enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n    });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n// If the importer is in node compatibility mode or this is not an ESM\n// file that has been converted to a CommonJS file using a Babel-\n// compatible transform (i.e. \"__esModule\" has not been set), then set\n// \"default\" to the CommonJS \"module.exports\" for node compatibility.\nisNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n  value: mod,\n  enumerable: true\n}) : target, mod)); // ../../node_modules/anser/lib/index.js\nvar require_lib = __commonJS({\n  \"../../node_modules/anser/lib/index.js\"(exports, module) {\n    \"use strict\";\n\n    var _createClass = function () {\n      function defineProperties(target, props) {\n        for (var i2 = 0; i2 < props.length; i2++) {\n          var descriptor = props[i2];\n          descriptor.enumerable = descriptor.enumerable || false;\n          descriptor.configurable = true;\n          if (\"value\" in descriptor) descriptor.writable = true;\n          Object.defineProperty(target, descriptor.key, descriptor);\n        }\n      }\n      return function (Constructor, protoProps, staticProps) {\n        if (protoProps) defineProperties(Constructor.prototype, protoProps);\n        if (staticProps) defineProperties(Constructor, staticProps);\n        return Constructor;\n      };\n    }();\n    function _classCallCheck(instance, Constructor) {\n      if (!(instance instanceof Constructor)) {\n        throw new TypeError(\"Cannot call a class as a function\");\n      }\n    }\n    var ANSI_COLORS = [[{\n      color: \"0, 0, 0\",\n      class: \"ansi-black\"\n    }, {\n      color: \"187, 0, 0\",\n      class: \"ansi-red\"\n    }, {\n      color: \"0, 187, 0\",\n      class: \"ansi-green\"\n    }, {\n      color: \"187, 187, 0\",\n      class: \"ansi-yellow\"\n    }, {\n      color: \"0, 0, 187\",\n      class: \"ansi-blue\"\n    }, {\n      color: \"187, 0, 187\",\n      class: \"ansi-magenta\"\n    }, {\n      color: \"0, 187, 187\",\n      class: \"ansi-cyan\"\n    }, {\n      color: \"255,255,255\",\n      class: \"ansi-white\"\n    }], [{\n      color: \"85, 85, 85\",\n      class: \"ansi-bright-black\"\n    }, {\n      color: \"255, 85, 85\",\n      class: \"ansi-bright-red\"\n    }, {\n      color: \"0, 255, 0\",\n      class: \"ansi-bright-green\"\n    }, {\n      color: \"255, 255, 85\",\n      class: \"ansi-bright-yellow\"\n    }, {\n      color: \"85, 85, 255\",\n      class: \"ansi-bright-blue\"\n    }, {\n      color: \"255, 85, 255\",\n      class: \"ansi-bright-magenta\"\n    }, {\n      color: \"85, 255, 255\",\n      class: \"ansi-bright-cyan\"\n    }, {\n      color: \"255, 255, 255\",\n      class: \"ansi-bright-white\"\n    }]];\n    var Anser2 = function () {\n      _createClass(Anser3, null, [{\n        key: \"escapeForHtml\",\n        /**\n        * Anser.escapeForHtml\n        * Escape the input HTML.\n        *\n        * This does the minimum escaping of text to make it compliant with HTML.\n        * In particular, the '&','<', and '>' characters are escaped. This should\n        * be run prior to `ansiToHtml`.\n        *\n        * @name Anser.escapeForHtml\n        * @function\n        * @param {String} txt The input text (containing the ANSI snippets).\n        * @returns {String} The escaped html.\n        */\n        value: function escapeForHtml(txt) {\n          return new Anser3().escapeForHtml(txt);\n        }\n      }, {\n        key: \"linkify\",\n        value: function linkify(txt) {\n          return new Anser3().linkify(txt);\n        }\n      }, {\n        key: \"ansiToHtml\",\n        value: function ansiToHtml(txt, options) {\n          return new Anser3().ansiToHtml(txt, options);\n        }\n      }, {\n        key: \"ansiToJson\",\n        value: function ansiToJson(txt, options) {\n          return new Anser3().ansiToJson(txt, options);\n        }\n      }, {\n        key: \"ansiToText\",\n        value: function ansiToText(txt) {\n          return new Anser3().ansiToText(txt);\n        }\n      }]);\n      function Anser3() {\n        _classCallCheck(this, Anser3);\n        this.fg = this.bg = this.fg_truecolor = this.bg_truecolor = null;\n        this.bright = 0;\n        this.decorations = [];\n      }\n      _createClass(Anser3, [{\n        key: \"setupPalette\",\n        value: function setupPalette() {\n          this.PALETTE_COLORS = [];\n          for (var i2 = 0; i2 < 2; ++i2) {\n            for (var j2 = 0; j2 < 8; ++j2) {\n              this.PALETTE_COLORS.push(ANSI_COLORS[i2][j2].color);\n            }\n          }\n          var levels = [0, 95, 135, 175, 215, 255];\n          var format = function format2(r4, g3, b3) {\n            return levels[r4] + \", \" + levels[g3] + \", \" + levels[b3];\n          };\n          var r3 = void 0,\n            g2 = void 0,\n            b2 = void 0;\n          for (var _r = 0; _r < 6; ++_r) {\n            for (var _g = 0; _g < 6; ++_g) {\n              for (var _b2 = 0; _b2 < 6; ++_b2) {\n                this.PALETTE_COLORS.push(format(_r, _g, _b2));\n              }\n            }\n          }\n          var level = 8;\n          for (var _i = 0; _i < 24; ++_i, level += 10) {\n            this.PALETTE_COLORS.push(format(level, level, level));\n          }\n        }\n      }, {\n        key: \"escapeForHtml\",\n        value: function escapeForHtml(txt) {\n          return txt.replace(/[&<>\\\"]/gm, function (str) {\n            return str == \"&\" ? \"&amp;\" : str == '\"' ? \"&quot;\" : str == \"<\" ? \"&lt;\" : str == \">\" ? \"&gt;\" : \"\";\n          });\n        }\n      }, {\n        key: \"linkify\",\n        value: function linkify(txt) {\n          return txt.replace(/(https?:\\/\\/[^\\s]+)/gm, function (str) {\n            return '<a href=\"' + str + '\">' + str + \"</a>\";\n          });\n        }\n      }, {\n        key: \"ansiToHtml\",\n        value: function ansiToHtml(txt, options) {\n          return this.process(txt, options, true);\n        }\n      }, {\n        key: \"ansiToJson\",\n        value: function ansiToJson(txt, options) {\n          options = options || {};\n          options.json = true;\n          options.clearLine = false;\n          return this.process(txt, options, true);\n        }\n      }, {\n        key: \"ansiToText\",\n        value: function ansiToText(txt) {\n          return this.process(txt, {}, false);\n        }\n      }, {\n        key: \"process\",\n        value: function process(txt, options, markup) {\n          var _this = this;\n          var self = this;\n          var raw_text_chunks = txt.split(/\\033\\[/);\n          var first_chunk = raw_text_chunks.shift();\n          if (options === void 0 || options === null) {\n            options = {};\n          }\n          options.clearLine = /\\r/.test(txt);\n          var color_chunks = raw_text_chunks.map(function (chunk) {\n            return _this.processChunk(chunk, options, markup);\n          });\n          if (options && options.json) {\n            var first = self.processChunkJson(\"\");\n            first.content = first_chunk;\n            first.clearLine = options.clearLine;\n            color_chunks.unshift(first);\n            if (options.remove_empty) {\n              color_chunks = color_chunks.filter(function (c2) {\n                return !c2.isEmpty();\n              });\n            }\n            return color_chunks;\n          } else {\n            color_chunks.unshift(first_chunk);\n          }\n          return color_chunks.join(\"\");\n        }\n      }, {\n        key: \"processChunkJson\",\n        value: function processChunkJson(text, options, markup) {\n          options = typeof options == \"undefined\" ? {} : options;\n          var use_classes = options.use_classes = typeof options.use_classes != \"undefined\" && options.use_classes;\n          var key = options.key = use_classes ? \"class\" : \"color\";\n          var result = {\n            content: text,\n            fg: null,\n            bg: null,\n            fg_truecolor: null,\n            bg_truecolor: null,\n            isInverted: false,\n            clearLine: options.clearLine,\n            decoration: null,\n            decorations: [],\n            was_processed: false,\n            isEmpty: function isEmpty2() {\n              return !result.content;\n            }\n          };\n          var matches = text.match(/^([!\\x3c-\\x3f]*)([\\d;]*)([\\x20-\\x2c]*[\\x40-\\x7e])([\\s\\S]*)/m);\n          if (!matches) return result;\n          var orig_txt = result.content = matches[4];\n          var nums = matches[2].split(\";\");\n          if (matches[1] !== \"\" || matches[3] !== \"m\") {\n            return result;\n          }\n          if (!markup) {\n            return result;\n          }\n          var self = this;\n          while (nums.length > 0) {\n            var num_str = nums.shift();\n            var num = parseInt(num_str);\n            if (isNaN(num) || num === 0) {\n              self.fg = self.bg = null;\n              self.decorations = [];\n            } else if (num === 1) {\n              self.decorations.push(\"bold\");\n            } else if (num === 2) {\n              self.decorations.push(\"dim\");\n            } else if (num === 3) {\n              self.decorations.push(\"italic\");\n            } else if (num === 4) {\n              self.decorations.push(\"underline\");\n            } else if (num === 5) {\n              self.decorations.push(\"blink\");\n            } else if (num === 7) {\n              self.decorations.push(\"reverse\");\n            } else if (num === 8) {\n              self.decorations.push(\"hidden\");\n            } else if (num === 9) {\n              self.decorations.push(\"strikethrough\");\n            } else if (num === 21) {\n              self.removeDecoration(\"bold\");\n            } else if (num === 22) {\n              self.removeDecoration(\"bold\");\n              self.removeDecoration(\"dim\");\n            } else if (num === 23) {\n              self.removeDecoration(\"italic\");\n            } else if (num === 24) {\n              self.removeDecoration(\"underline\");\n            } else if (num === 25) {\n              self.removeDecoration(\"blink\");\n            } else if (num === 27) {\n              self.removeDecoration(\"reverse\");\n            } else if (num === 28) {\n              self.removeDecoration(\"hidden\");\n            } else if (num === 29) {\n              self.removeDecoration(\"strikethrough\");\n            } else if (num === 39) {\n              self.fg = null;\n            } else if (num === 49) {\n              self.bg = null;\n            } else if (num >= 30 && num < 38) {\n              self.fg = ANSI_COLORS[0][num % 10][key];\n            } else if (num >= 90 && num < 98) {\n              self.fg = ANSI_COLORS[1][num % 10][key];\n            } else if (num >= 40 && num < 48) {\n              self.bg = ANSI_COLORS[0][num % 10][key];\n            } else if (num >= 100 && num < 108) {\n              self.bg = ANSI_COLORS[1][num % 10][key];\n            } else if (num === 38 || num === 48) {\n              var is_foreground = num === 38;\n              if (nums.length >= 1) {\n                var mode = nums.shift();\n                if (mode === \"5\" && nums.length >= 1) {\n                  var palette_index = parseInt(nums.shift());\n                  if (palette_index >= 0 && palette_index <= 255) {\n                    if (!use_classes) {\n                      if (!this.PALETTE_COLORS) {\n                        self.setupPalette();\n                      }\n                      if (is_foreground) {\n                        self.fg = this.PALETTE_COLORS[palette_index];\n                      } else {\n                        self.bg = this.PALETTE_COLORS[palette_index];\n                      }\n                    } else {\n                      var klass = palette_index >= 16 ? \"ansi-palette-\" + palette_index : ANSI_COLORS[palette_index > 7 ? 1 : 0][palette_index % 8][\"class\"];\n                      if (is_foreground) {\n                        self.fg = klass;\n                      } else {\n                        self.bg = klass;\n                      }\n                    }\n                  }\n                } else if (mode === \"2\" && nums.length >= 3) {\n                  var r3 = parseInt(nums.shift());\n                  var g2 = parseInt(nums.shift());\n                  var b2 = parseInt(nums.shift());\n                  if (r3 >= 0 && r3 <= 255 && g2 >= 0 && g2 <= 255 && b2 >= 0 && b2 <= 255) {\n                    var color2 = r3 + \", \" + g2 + \", \" + b2;\n                    if (!use_classes) {\n                      if (is_foreground) {\n                        self.fg = color2;\n                      } else {\n                        self.bg = color2;\n                      }\n                    } else {\n                      if (is_foreground) {\n                        self.fg = \"ansi-truecolor\";\n                        self.fg_truecolor = color2;\n                      } else {\n                        self.bg = \"ansi-truecolor\";\n                        self.bg_truecolor = color2;\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n          if (self.fg === null && self.bg === null && self.decorations.length === 0) {\n            return result;\n          } else {\n            var styles = [];\n            var classes = [];\n            var data = {};\n            result.fg = self.fg;\n            result.bg = self.bg;\n            result.fg_truecolor = self.fg_truecolor;\n            result.bg_truecolor = self.bg_truecolor;\n            result.decorations = self.decorations;\n            result.decoration = self.decorations.slice(-1).pop() || null;\n            result.was_processed = true;\n            return result;\n          }\n        }\n      }, {\n        key: \"processChunk\",\n        value: function processChunk(text, options, markup) {\n          var _this2 = this;\n          options = options || {};\n          var jsonChunk = this.processChunkJson(text, options, markup);\n          var use_classes = options.use_classes;\n          jsonChunk.decorations = jsonChunk.decorations.filter(function (decoration) {\n            if (decoration === \"reverse\") {\n              if (!jsonChunk.fg) {\n                jsonChunk.fg = ANSI_COLORS[0][7][use_classes ? \"class\" : \"color\"];\n              }\n              if (!jsonChunk.bg) {\n                jsonChunk.bg = ANSI_COLORS[0][0][use_classes ? \"class\" : \"color\"];\n              }\n              var tmpFg = jsonChunk.fg;\n              jsonChunk.fg = jsonChunk.bg;\n              jsonChunk.bg = tmpFg;\n              var tmpFgTrue = jsonChunk.fg_truecolor;\n              jsonChunk.fg_truecolor = jsonChunk.bg_truecolor;\n              jsonChunk.bg_truecolor = tmpFgTrue;\n              jsonChunk.isInverted = true;\n              return false;\n            }\n            return true;\n          });\n          if (options.json) {\n            return jsonChunk;\n          }\n          if (jsonChunk.isEmpty()) {\n            return \"\";\n          }\n          if (!jsonChunk.was_processed) {\n            return jsonChunk.content;\n          }\n          var colors = [];\n          var decorations = [];\n          var textDecorations = [];\n          var data = {};\n          var render_data = function render_data2(data2) {\n            var fragments = [];\n            var key = void 0;\n            for (key in data2) {\n              if (data2.hasOwnProperty(key)) {\n                fragments.push(\"data-\" + key + '=\"' + _this2.escapeForHtml(data2[key]) + '\"');\n              }\n            }\n            return fragments.length > 0 ? \" \" + fragments.join(\" \") : \"\";\n          };\n          if (jsonChunk.isInverted) {\n            data[\"ansi-is-inverted\"] = \"true\";\n          }\n          if (jsonChunk.fg) {\n            if (use_classes) {\n              colors.push(jsonChunk.fg + \"-fg\");\n              if (jsonChunk.fg_truecolor !== null) {\n                data[\"ansi-truecolor-fg\"] = jsonChunk.fg_truecolor;\n                jsonChunk.fg_truecolor = null;\n              }\n            } else {\n              colors.push(\"color:rgb(\" + jsonChunk.fg + \")\");\n            }\n          }\n          if (jsonChunk.bg) {\n            if (use_classes) {\n              colors.push(jsonChunk.bg + \"-bg\");\n              if (jsonChunk.bg_truecolor !== null) {\n                data[\"ansi-truecolor-bg\"] = jsonChunk.bg_truecolor;\n                jsonChunk.bg_truecolor = null;\n              }\n            } else {\n              colors.push(\"background-color:rgb(\" + jsonChunk.bg + \")\");\n            }\n          }\n          jsonChunk.decorations.forEach(function (decoration) {\n            if (use_classes) {\n              decorations.push(\"ansi-\" + decoration);\n              return;\n            }\n            if (decoration === \"bold\") {\n              decorations.push(\"font-weight:bold\");\n            } else if (decoration === \"dim\") {\n              decorations.push(\"opacity:0.5\");\n            } else if (decoration === \"italic\") {\n              decorations.push(\"font-style:italic\");\n            } else if (decoration === \"hidden\") {\n              decorations.push(\"visibility:hidden\");\n            } else if (decoration === \"strikethrough\") {\n              textDecorations.push(\"line-through\");\n            } else {\n              textDecorations.push(decoration);\n            }\n          });\n          if (textDecorations.length) {\n            decorations.push(\"text-decoration:\" + textDecorations.join(\" \"));\n          }\n          if (use_classes) {\n            return '<span class=\"' + colors.concat(decorations).join(\" \") + '\"' + render_data(data) + \">\" + jsonChunk.content + \"</span>\";\n          } else {\n            return '<span style=\"' + colors.concat(decorations).join(\";\") + '\"' + render_data(data) + \">\" + jsonChunk.content + \"</span>\";\n          }\n        }\n      }, {\n        key: \"removeDecoration\",\n        value: function removeDecoration(decoration) {\n          var index = this.decorations.indexOf(decoration);\n          if (index >= 0) {\n            this.decorations.splice(index, 1);\n          }\n        }\n      }]);\n      return Anser3;\n    }();\n    module.exports = Anser2;\n  }\n}); // ../../node_modules/escape-carriage/index.js\nvar require_escape_carriage = __commonJS({\n  \"../../node_modules/escape-carriage/index.js\"(exports, module) {\n    function escapeCarriageReturn2(txt) {\n      if (!txt) return \"\";\n      if (!/\\r/.test(txt)) return txt;\n      txt = txt.replace(/\\r+\\n/gm, \"\\n\");\n      while (/\\r./.test(txt)) {\n        txt = txt.replace(/^([^\\r\\n]*)\\r+([^\\r\\n]+)/gm, function (_, base, insert) {\n          return insert + base.slice(insert.length);\n        });\n      }\n      return txt;\n    }\n    function findLongestString(arr) {\n      var longest = 0;\n      for (var i2 = 0; i2 < arr.length; i2++) {\n        if (arr[longest].length <= arr[i2].length) {\n          longest = i2;\n        }\n      }\n      return longest;\n    }\n    function escapeSingleLineSafe(txt) {\n      if (!/\\r/.test(txt)) return txt;\n      var arr = txt.split(\"\\r\");\n      var res = [];\n      while (arr.length > 0) {\n        var longest = findLongestString(arr);\n        res.push(arr[longest]);\n        arr = arr.slice(longest + 1);\n      }\n      return res.join(\"\\r\");\n    }\n    function escapeCarriageReturnSafe(txt) {\n      if (!txt) return \"\";\n      if (!/\\r/.test(txt)) return txt;\n      if (!/\\n/.test(txt)) return escapeSingleLineSafe(txt);\n      txt = txt.replace(/\\r+\\n/gm, \"\\n\");\n      var idx = txt.lastIndexOf(\"\\n\");\n      return escapeCarriageReturn2(txt.slice(0, idx)) + \"\\n\" + escapeSingleLineSafe(txt.slice(idx + 1));\n    }\n    module.exports = escapeCarriageReturn2;\n    module.exports.escapeCarriageReturn = escapeCarriageReturn2;\n    module.exports.escapeCarriageReturnSafe = escapeCarriageReturnSafe;\n  }\n}); // ../../node_modules/lz-string/libs/lz-string.js\nvar require_lz_string = __commonJS({\n  \"../../node_modules/lz-string/libs/lz-string.js\"(exports, module) {\n    var LZString2 = function () {\n      var f2 = String.fromCharCode;\n      var keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n      var keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\n      var baseReverseDic = {};\n      function getBaseValue(alphabet, character) {\n        if (!baseReverseDic[alphabet]) {\n          baseReverseDic[alphabet] = {};\n          for (var i2 = 0; i2 < alphabet.length; i2++) {\n            baseReverseDic[alphabet][alphabet.charAt(i2)] = i2;\n          }\n        }\n        return baseReverseDic[alphabet][character];\n      }\n      var LZString3 = {\n        compressToBase64: function (input) {\n          if (input == null) return \"\";\n          var res = LZString3._compress(input, 6, function (a2) {\n            return keyStrBase64.charAt(a2);\n          });\n          switch (res.length % 4) {\n            default:\n            case 0:\n              return res;\n            case 1:\n              return res + \"===\";\n            case 2:\n              return res + \"==\";\n            case 3:\n              return res + \"=\";\n          }\n        },\n        decompressFromBase64: function (input) {\n          if (input == null) return \"\";\n          if (input == \"\") return null;\n          return LZString3._decompress(input.length, 32, function (index) {\n            return getBaseValue(keyStrBase64, input.charAt(index));\n          });\n        },\n        compressToUTF16: function (input) {\n          if (input == null) return \"\";\n          return LZString3._compress(input, 15, function (a2) {\n            return f2(a2 + 32);\n          }) + \" \";\n        },\n        decompressFromUTF16: function (compressed) {\n          if (compressed == null) return \"\";\n          if (compressed == \"\") return null;\n          return LZString3._decompress(compressed.length, 16384, function (index) {\n            return compressed.charCodeAt(index) - 32;\n          });\n        },\n        //compress into uint8array (UCS-2 big endian format)\n        compressToUint8Array: function (uncompressed) {\n          var compressed = LZString3.compress(uncompressed);\n          var buf = new Uint8Array(compressed.length * 2);\n          for (var i2 = 0, TotalLen = compressed.length; i2 < TotalLen; i2++) {\n            var current_value = compressed.charCodeAt(i2);\n            buf[i2 * 2] = current_value >>> 8;\n            buf[i2 * 2 + 1] = current_value % 256;\n          }\n          return buf;\n        },\n        //decompress from uint8array (UCS-2 big endian format)\n        decompressFromUint8Array: function (compressed) {\n          if (compressed === null || compressed === void 0) {\n            return LZString3.decompress(compressed);\n          } else {\n            var buf = new Array(compressed.length / 2);\n            for (var i2 = 0, TotalLen = buf.length; i2 < TotalLen; i2++) {\n              buf[i2] = compressed[i2 * 2] * 256 + compressed[i2 * 2 + 1];\n            }\n            var result = [];\n            buf.forEach(function (c2) {\n              result.push(f2(c2));\n            });\n            return LZString3.decompress(result.join(\"\"));\n          }\n        },\n        //compress into a string that is already URI encoded\n        compressToEncodedURIComponent: function (input) {\n          if (input == null) return \"\";\n          return LZString3._compress(input, 6, function (a2) {\n            return keyStrUriSafe.charAt(a2);\n          });\n        },\n        //decompress from an output of compressToEncodedURIComponent\n        decompressFromEncodedURIComponent: function (input) {\n          if (input == null) return \"\";\n          if (input == \"\") return null;\n          input = input.replace(/ /g, \"+\");\n          return LZString3._decompress(input.length, 32, function (index) {\n            return getBaseValue(keyStrUriSafe, input.charAt(index));\n          });\n        },\n        compress: function (uncompressed) {\n          return LZString3._compress(uncompressed, 16, function (a2) {\n            return f2(a2);\n          });\n        },\n        _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n          if (uncompressed == null) return \"\";\n          var i2,\n            value,\n            context_dictionary = {},\n            context_dictionaryToCreate = {},\n            context_c = \"\",\n            context_wc = \"\",\n            context_w = \"\",\n            context_enlargeIn = 2,\n            context_dictSize = 3,\n            context_numBits = 2,\n            context_data = [],\n            context_data_val = 0,\n            context_data_position = 0,\n            ii;\n          for (ii = 0; ii < uncompressed.length; ii += 1) {\n            context_c = uncompressed.charAt(ii);\n            if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {\n              context_dictionary[context_c] = context_dictSize++;\n              context_dictionaryToCreate[context_c] = true;\n            }\n            context_wc = context_w + context_c;\n            if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) {\n              context_w = context_wc;\n            } else {\n              if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {\n                if (context_w.charCodeAt(0) < 256) {\n                  for (i2 = 0; i2 < context_numBits; i2++) {\n                    context_data_val = context_data_val << 1;\n                    if (context_data_position == bitsPerChar - 1) {\n                      context_data_position = 0;\n                      context_data.push(getCharFromInt(context_data_val));\n                      context_data_val = 0;\n                    } else {\n                      context_data_position++;\n                    }\n                  }\n                  value = context_w.charCodeAt(0);\n                  for (i2 = 0; i2 < 8; i2++) {\n                    context_data_val = context_data_val << 1 | value & 1;\n                    if (context_data_position == bitsPerChar - 1) {\n                      context_data_position = 0;\n                      context_data.push(getCharFromInt(context_data_val));\n                      context_data_val = 0;\n                    } else {\n                      context_data_position++;\n                    }\n                    value = value >> 1;\n                  }\n                } else {\n                  value = 1;\n                  for (i2 = 0; i2 < context_numBits; i2++) {\n                    context_data_val = context_data_val << 1 | value;\n                    if (context_data_position == bitsPerChar - 1) {\n                      context_data_position = 0;\n                      context_data.push(getCharFromInt(context_data_val));\n                      context_data_val = 0;\n                    } else {\n                      context_data_position++;\n                    }\n                    value = 0;\n                  }\n                  value = context_w.charCodeAt(0);\n                  for (i2 = 0; i2 < 16; i2++) {\n                    context_data_val = context_data_val << 1 | value & 1;\n                    if (context_data_position == bitsPerChar - 1) {\n                      context_data_position = 0;\n                      context_data.push(getCharFromInt(context_data_val));\n                      context_data_val = 0;\n                    } else {\n                      context_data_position++;\n                    }\n                    value = value >> 1;\n                  }\n                }\n                context_enlargeIn--;\n                if (context_enlargeIn == 0) {\n                  context_enlargeIn = Math.pow(2, context_numBits);\n                  context_numBits++;\n                }\n                delete context_dictionaryToCreate[context_w];\n              } else {\n                value = context_dictionary[context_w];\n                for (i2 = 0; i2 < context_numBits; i2++) {\n                  context_data_val = context_data_val << 1 | value & 1;\n                  if (context_data_position == bitsPerChar - 1) {\n                    context_data_position = 0;\n                    context_data.push(getCharFromInt(context_data_val));\n                    context_data_val = 0;\n                  } else {\n                    context_data_position++;\n                  }\n                  value = value >> 1;\n                }\n              }\n              context_enlargeIn--;\n              if (context_enlargeIn == 0) {\n                context_enlargeIn = Math.pow(2, context_numBits);\n                context_numBits++;\n              }\n              context_dictionary[context_wc] = context_dictSize++;\n              context_w = String(context_c);\n            }\n          }\n          if (context_w !== \"\") {\n            if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {\n              if (context_w.charCodeAt(0) < 256) {\n                for (i2 = 0; i2 < context_numBits; i2++) {\n                  context_data_val = context_data_val << 1;\n                  if (context_data_position == bitsPerChar - 1) {\n                    context_data_position = 0;\n                    context_data.push(getCharFromInt(context_data_val));\n                    context_data_val = 0;\n                  } else {\n                    context_data_position++;\n                  }\n                }\n                value = context_w.charCodeAt(0);\n                for (i2 = 0; i2 < 8; i2++) {\n                  context_data_val = context_data_val << 1 | value & 1;\n                  if (context_data_position == bitsPerChar - 1) {\n                    context_data_position = 0;\n                    context_data.push(getCharFromInt(context_data_val));\n                    context_data_val = 0;\n                  } else {\n                    context_data_position++;\n                  }\n                  value = value >> 1;\n                }\n              } else {\n                value = 1;\n                for (i2 = 0; i2 < context_numBits; i2++) {\n                  context_data_val = context_data_val << 1 | value;\n                  if (context_data_position == bitsPerChar - 1) {\n                    context_data_position = 0;\n                    context_data.push(getCharFromInt(context_data_val));\n                    context_data_val = 0;\n                  } else {\n                    context_data_position++;\n                  }\n                  value = 0;\n                }\n                value = context_w.charCodeAt(0);\n                for (i2 = 0; i2 < 16; i2++) {\n                  context_data_val = context_data_val << 1 | value & 1;\n                  if (context_data_position == bitsPerChar - 1) {\n                    context_data_position = 0;\n                    context_data.push(getCharFromInt(context_data_val));\n                    context_data_val = 0;\n                  } else {\n                    context_data_position++;\n                  }\n                  value = value >> 1;\n                }\n              }\n              context_enlargeIn--;\n              if (context_enlargeIn == 0) {\n                context_enlargeIn = Math.pow(2, context_numBits);\n                context_numBits++;\n              }\n              delete context_dictionaryToCreate[context_w];\n            } else {\n              value = context_dictionary[context_w];\n              for (i2 = 0; i2 < context_numBits; i2++) {\n                context_data_val = context_data_val << 1 | value & 1;\n                if (context_data_position == bitsPerChar - 1) {\n                  context_data_position = 0;\n                  context_data.push(getCharFromInt(context_data_val));\n                  context_data_val = 0;\n                } else {\n                  context_data_position++;\n                }\n                value = value >> 1;\n              }\n            }\n            context_enlargeIn--;\n            if (context_enlargeIn == 0) {\n              context_enlargeIn = Math.pow(2, context_numBits);\n              context_numBits++;\n            }\n          }\n          value = 2;\n          for (i2 = 0; i2 < context_numBits; i2++) {\n            context_data_val = context_data_val << 1 | value & 1;\n            if (context_data_position == bitsPerChar - 1) {\n              context_data_position = 0;\n              context_data.push(getCharFromInt(context_data_val));\n              context_data_val = 0;\n            } else {\n              context_data_position++;\n            }\n            value = value >> 1;\n          }\n          while (true) {\n            context_data_val = context_data_val << 1;\n            if (context_data_position == bitsPerChar - 1) {\n              context_data.push(getCharFromInt(context_data_val));\n              break;\n            } else context_data_position++;\n          }\n          return context_data.join(\"\");\n        },\n        decompress: function (compressed) {\n          if (compressed == null) return \"\";\n          if (compressed == \"\") return null;\n          return LZString3._decompress(compressed.length, 32768, function (index) {\n            return compressed.charCodeAt(index);\n          });\n        },\n        _decompress: function (length, resetValue, getNextValue) {\n          var dictionary = [],\n            next,\n            enlargeIn = 4,\n            dictSize = 4,\n            numBits = 3,\n            entry = \"\",\n            result = [],\n            i2,\n            w2,\n            bits,\n            resb,\n            maxpower,\n            power,\n            c2,\n            data = {\n              val: getNextValue(0),\n              position: resetValue,\n              index: 1\n            };\n          for (i2 = 0; i2 < 3; i2 += 1) {\n            dictionary[i2] = i2;\n          }\n          bits = 0;\n          maxpower = Math.pow(2, 2);\n          power = 1;\n          while (power != maxpower) {\n            resb = data.val & data.position;\n            data.position >>= 1;\n            if (data.position == 0) {\n              data.position = resetValue;\n              data.val = getNextValue(data.index++);\n            }\n            bits |= (resb > 0 ? 1 : 0) * power;\n            power <<= 1;\n          }\n          switch (next = bits) {\n            case 0:\n              bits = 0;\n              maxpower = Math.pow(2, 8);\n              power = 1;\n              while (power != maxpower) {\n                resb = data.val & data.position;\n                data.position >>= 1;\n                if (data.position == 0) {\n                  data.position = resetValue;\n                  data.val = getNextValue(data.index++);\n                }\n                bits |= (resb > 0 ? 1 : 0) * power;\n                power <<= 1;\n              }\n              c2 = f2(bits);\n              break;\n            case 1:\n              bits = 0;\n              maxpower = Math.pow(2, 16);\n              power = 1;\n              while (power != maxpower) {\n                resb = data.val & data.position;\n                data.position >>= 1;\n                if (data.position == 0) {\n                  data.position = resetValue;\n                  data.val = getNextValue(data.index++);\n                }\n                bits |= (resb > 0 ? 1 : 0) * power;\n                power <<= 1;\n              }\n              c2 = f2(bits);\n              break;\n            case 2:\n              return \"\";\n          }\n          dictionary[3] = c2;\n          w2 = c2;\n          result.push(c2);\n          while (true) {\n            if (data.index > length) {\n              return \"\";\n            }\n            bits = 0;\n            maxpower = Math.pow(2, numBits);\n            power = 1;\n            while (power != maxpower) {\n              resb = data.val & data.position;\n              data.position >>= 1;\n              if (data.position == 0) {\n                data.position = resetValue;\n                data.val = getNextValue(data.index++);\n              }\n              bits |= (resb > 0 ? 1 : 0) * power;\n              power <<= 1;\n            }\n            switch (c2 = bits) {\n              case 0:\n                bits = 0;\n                maxpower = Math.pow(2, 8);\n                power = 1;\n                while (power != maxpower) {\n                  resb = data.val & data.position;\n                  data.position >>= 1;\n                  if (data.position == 0) {\n                    data.position = resetValue;\n                    data.val = getNextValue(data.index++);\n                  }\n                  bits |= (resb > 0 ? 1 : 0) * power;\n                  power <<= 1;\n                }\n                dictionary[dictSize++] = f2(bits);\n                c2 = dictSize - 1;\n                enlargeIn--;\n                break;\n              case 1:\n                bits = 0;\n                maxpower = Math.pow(2, 16);\n                power = 1;\n                while (power != maxpower) {\n                  resb = data.val & data.position;\n                  data.position >>= 1;\n                  if (data.position == 0) {\n                    data.position = resetValue;\n                    data.val = getNextValue(data.index++);\n                  }\n                  bits |= (resb > 0 ? 1 : 0) * power;\n                  power <<= 1;\n                }\n                dictionary[dictSize++] = f2(bits);\n                c2 = dictSize - 1;\n                enlargeIn--;\n                break;\n              case 2:\n                return result.join(\"\");\n            }\n            if (enlargeIn == 0) {\n              enlargeIn = Math.pow(2, numBits);\n              numBits++;\n            }\n            if (dictionary[c2]) {\n              entry = dictionary[c2];\n            } else {\n              if (c2 === dictSize) {\n                entry = w2 + w2.charAt(0);\n              } else {\n                return null;\n              }\n            }\n            result.push(entry);\n            dictionary[dictSize++] = w2 + entry.charAt(0);\n            enlargeIn--;\n            w2 = entry;\n            if (enlargeIn == 0) {\n              enlargeIn = Math.pow(2, numBits);\n              numBits++;\n            }\n          }\n        }\n      };\n      return LZString3;\n    }();\n    if (typeof define === \"function\" && define.amd) {\n      define(function () {\n        return LZString2;\n      });\n    } else if (typeof module !== \"undefined\" && module != null) {\n      module.exports = LZString2;\n    }\n  }\n}); // ../../node_modules/@codesandbox/sandpack-react/dist/index.mjs\nimport { jsxs, jsx, Fragment } from \"react/jsx-runtime\";\nimport * as React3 from \"react\";\nimport { createContext as createContext2, useContext as useContext2, useState as useState3, useRef as useRef2, useCallback as useCallback2, useEffect as useEffect3, createElement as createElement2, forwardRef as forwardRef2 } from \"react\"; // ../../node_modules/@stitches/core/dist/index.mjs\nvar t = \"colors\";\nvar n = \"sizes\";\nvar r = \"space\";\nvar i = {\n  gap: r,\n  gridGap: r,\n  columnGap: r,\n  gridColumnGap: r,\n  rowGap: r,\n  gridRowGap: r,\n  inset: r,\n  insetBlock: r,\n  insetBlockEnd: r,\n  insetBlockStart: r,\n  insetInline: r,\n  insetInlineEnd: r,\n  insetInlineStart: r,\n  margin: r,\n  marginTop: r,\n  marginRight: r,\n  marginBottom: r,\n  marginLeft: r,\n  marginBlock: r,\n  marginBlockEnd: r,\n  marginBlockStart: r,\n  marginInline: r,\n  marginInlineEnd: r,\n  marginInlineStart: r,\n  padding: r,\n  paddingTop: r,\n  paddingRight: r,\n  paddingBottom: r,\n  paddingLeft: r,\n  paddingBlock: r,\n  paddingBlockEnd: r,\n  paddingBlockStart: r,\n  paddingInline: r,\n  paddingInlineEnd: r,\n  paddingInlineStart: r,\n  top: r,\n  right: r,\n  bottom: r,\n  left: r,\n  scrollMargin: r,\n  scrollMarginTop: r,\n  scrollMarginRight: r,\n  scrollMarginBottom: r,\n  scrollMarginLeft: r,\n  scrollMarginX: r,\n  scrollMarginY: r,\n  scrollMarginBlock: r,\n  scrollMarginBlockEnd: r,\n  scrollMarginBlockStart: r,\n  scrollMarginInline: r,\n  scrollMarginInlineEnd: r,\n  scrollMarginInlineStart: r,\n  scrollPadding: r,\n  scrollPaddingTop: r,\n  scrollPaddingRight: r,\n  scrollPaddingBottom: r,\n  scrollPaddingLeft: r,\n  scrollPaddingX: r,\n  scrollPaddingY: r,\n  scrollPaddingBlock: r,\n  scrollPaddingBlockEnd: r,\n  scrollPaddingBlockStart: r,\n  scrollPaddingInline: r,\n  scrollPaddingInlineEnd: r,\n  scrollPaddingInlineStart: r,\n  fontSize: \"fontSizes\",\n  background: t,\n  backgroundColor: t,\n  backgroundImage: t,\n  borderImage: t,\n  border: t,\n  borderBlock: t,\n  borderBlockEnd: t,\n  borderBlockStart: t,\n  borderBottom: t,\n  borderBottomColor: t,\n  borderColor: t,\n  borderInline: t,\n  borderInlineEnd: t,\n  borderInlineStart: t,\n  borderLeft: t,\n  borderLeftColor: t,\n  borderRight: t,\n  borderRightColor: t,\n  borderTop: t,\n  borderTopColor: t,\n  caretColor: t,\n  color: t,\n  columnRuleColor: t,\n  fill: t,\n  outline: t,\n  outlineColor: t,\n  stroke: t,\n  textDecorationColor: t,\n  fontFamily: \"fonts\",\n  fontWeight: \"fontWeights\",\n  lineHeight: \"lineHeights\",\n  letterSpacing: \"letterSpacings\",\n  blockSize: n,\n  minBlockSize: n,\n  maxBlockSize: n,\n  inlineSize: n,\n  minInlineSize: n,\n  maxInlineSize: n,\n  width: n,\n  minWidth: n,\n  maxWidth: n,\n  height: n,\n  minHeight: n,\n  maxHeight: n,\n  flexBasis: n,\n  gridTemplateColumns: n,\n  gridTemplateRows: n,\n  borderWidth: \"borderWidths\",\n  borderTopWidth: \"borderWidths\",\n  borderRightWidth: \"borderWidths\",\n  borderBottomWidth: \"borderWidths\",\n  borderLeftWidth: \"borderWidths\",\n  borderStyle: \"borderStyles\",\n  borderTopStyle: \"borderStyles\",\n  borderRightStyle: \"borderStyles\",\n  borderBottomStyle: \"borderStyles\",\n  borderLeftStyle: \"borderStyles\",\n  borderRadius: \"radii\",\n  borderTopLeftRadius: \"radii\",\n  borderTopRightRadius: \"radii\",\n  borderBottomRightRadius: \"radii\",\n  borderBottomLeftRadius: \"radii\",\n  boxShadow: \"shadows\",\n  textShadow: \"shadows\",\n  transition: \"transitions\",\n  zIndex: \"zIndices\"\n};\nvar o = (e, t2) => \"function\" == typeof t2 ? {\n  \"()\": Function.prototype.toString.call(t2)\n} : t2;\nvar l = () => {\n  const e = /* @__PURE__ */Object.create(null);\n  return (t2, n2, ...r3) => {\n    const i2 = (e2 => JSON.stringify(e2, o))(t2);\n    return i2 in e ? e[i2] : e[i2] = n2(t2, ...r3);\n  };\n};\nvar s = Symbol.for(\"sxs.internal\");\nvar a = (e, t2) => Object.defineProperties(e, Object.getOwnPropertyDescriptors(t2));\nvar c = e => {\n  for (const t2 in e) return true;\n  return false;\n};\nvar {\n  hasOwnProperty: d\n} = Object.prototype;\nvar g = e => e.includes(\"-\") ? e : e.replace(/[A-Z]/g, e2 => \"-\" + e2.toLowerCase());\nvar p = /\\s+(?![^()]*\\))/;\nvar u = e => t2 => e(...(\"string\" == typeof t2 ? String(t2).split(p) : [t2]));\nvar h = {\n  appearance: e => ({\n    WebkitAppearance: e,\n    appearance: e\n  }),\n  backfaceVisibility: e => ({\n    WebkitBackfaceVisibility: e,\n    backfaceVisibility: e\n  }),\n  backdropFilter: e => ({\n    WebkitBackdropFilter: e,\n    backdropFilter: e\n  }),\n  backgroundClip: e => ({\n    WebkitBackgroundClip: e,\n    backgroundClip: e\n  }),\n  boxDecorationBreak: e => ({\n    WebkitBoxDecorationBreak: e,\n    boxDecorationBreak: e\n  }),\n  clipPath: e => ({\n    WebkitClipPath: e,\n    clipPath: e\n  }),\n  content: e => ({\n    content: e.includes('\"') || e.includes(\"'\") || /^([A-Za-z]+\\([^]*|[^]*-quote|inherit|initial|none|normal|revert|unset)$/.test(e) ? e : `\"${e}\"`\n  }),\n  hyphens: e => ({\n    WebkitHyphens: e,\n    hyphens: e\n  }),\n  maskImage: e => ({\n    WebkitMaskImage: e,\n    maskImage: e\n  }),\n  maskSize: e => ({\n    WebkitMaskSize: e,\n    maskSize: e\n  }),\n  tabSize: e => ({\n    MozTabSize: e,\n    tabSize: e\n  }),\n  textSizeAdjust: e => ({\n    WebkitTextSizeAdjust: e,\n    textSizeAdjust: e\n  }),\n  userSelect: e => ({\n    WebkitUserSelect: e,\n    userSelect: e\n  }),\n  marginBlock: u((e, t2) => ({\n    marginBlockStart: e,\n    marginBlockEnd: t2 || e\n  })),\n  marginInline: u((e, t2) => ({\n    marginInlineStart: e,\n    marginInlineEnd: t2 || e\n  })),\n  maxSize: u((e, t2) => ({\n    maxBlockSize: e,\n    maxInlineSize: t2 || e\n  })),\n  minSize: u((e, t2) => ({\n    minBlockSize: e,\n    minInlineSize: t2 || e\n  })),\n  paddingBlock: u((e, t2) => ({\n    paddingBlockStart: e,\n    paddingBlockEnd: t2 || e\n  })),\n  paddingInline: u((e, t2) => ({\n    paddingInlineStart: e,\n    paddingInlineEnd: t2 || e\n  }))\n};\nvar f = /([\\d.]+)([^]*)/;\nvar m = (e, t2) => e.length ? e.reduce((e2, n2) => (e2.push(...t2.map(e3 => e3.includes(\"&\") ? e3.replace(/&/g, /[ +>|~]/.test(n2) && /&.*&/.test(e3) ? `:is(${n2})` : n2) : n2 + \" \" + e3)), e2), []) : t2;\nvar b = (e, t2) => e in S && \"string\" == typeof t2 ? t2.replace(/^((?:[^]*[^\\w-])?)(fit-content|stretch)((?:[^\\w-][^]*)?)$/, (t3, n2, r3, i2) => n2 + (\"stretch\" === r3 ? `-moz-available${i2};${g(e)}:${n2}-webkit-fill-available` : `-moz-fit-content${i2};${g(e)}:${n2}fit-content`) + i2) : String(t2);\nvar S = {\n  blockSize: 1,\n  height: 1,\n  inlineSize: 1,\n  maxBlockSize: 1,\n  maxHeight: 1,\n  maxInlineSize: 1,\n  maxWidth: 1,\n  minBlockSize: 1,\n  minHeight: 1,\n  minInlineSize: 1,\n  minWidth: 1,\n  width: 1\n};\nvar k = e => e ? e + \"-\" : \"\";\nvar y = (e, t2, n2) => e.replace(/([+-])?((?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?)?(\\$|--)([$\\w-]+)/g, (e2, r3, i2, o2, l2) => \"$\" == o2 == !!i2 ? e2 : (r3 || \"--\" == o2 ? \"calc(\" : \"\") + \"var(--\" + (\"$\" === o2 ? k(t2) + (l2.includes(\"$\") ? \"\" : k(n2)) + l2.replace(/\\$/g, \"-\") : l2) + \")\" + (r3 || \"--\" == o2 ? \"*\" + (r3 || \"\") + (i2 || \"1\") + \")\" : \"\"));\nvar B = /\\s*,\\s*(?![^()]*\\))/;\nvar $ = Object.prototype.toString;\nvar x = (e, t2, n2, r3, i2) => {\n  let o2, l2, s2;\n  const a2 = (e2, t3, n3) => {\n    let c2, d2;\n    const p2 = e3 => {\n      for (c2 in e3) {\n        const x2 = 64 === c2.charCodeAt(0),\n          z2 = x2 && Array.isArray(e3[c2]) ? e3[c2] : [e3[c2]];\n        for (d2 of z2) {\n          const e4 = /[A-Z]/.test(S2 = c2) ? S2 : S2.replace(/-[^]/g, e5 => e5[1].toUpperCase()),\n            z3 = \"object\" == typeof d2 && d2 && d2.toString === $ && (!r3.utils[e4] || !t3.length);\n          if (e4 in r3.utils && !z3) {\n            const t4 = r3.utils[e4];\n            if (t4 !== l2) {\n              l2 = t4, p2(t4(d2)), l2 = null;\n              continue;\n            }\n          } else if (e4 in h) {\n            const t41 = h[e4];\n            if (t41 !== s2) {\n              s2 = t41, p2(t41(d2)), s2 = null;\n              continue;\n            }\n          }\n          if (x2 && (u2 = c2.slice(1) in r3.media ? \"@media \" + r3.media[c2.slice(1)] : c2, c2 = u2.replace(/\\(\\s*([\\w-]+)\\s*(=|<|<=|>|>=)\\s*([\\w-]+)\\s*(?:(<|<=|>|>=)\\s*([\\w-]+)\\s*)?\\)/g, (e5, t4, n4, r4, i3, o3) => {\n            const l3 = f.test(t4),\n              s3 = .0625 * (l3 ? -1 : 1),\n              [a3, c3] = l3 ? [r4, t4] : [t4, r4];\n            return \"(\" + (\"=\" === n4[0] ? \"\" : \">\" === n4[0] === l3 ? \"max-\" : \"min-\") + a3 + \":\" + (\"=\" !== n4[0] && 1 === n4.length ? c3.replace(f, (e6, t5, r5) => Number(t5) + s3 * (\">\" === n4 ? 1 : -1) + r5) : c3) + (i3 ? \") and (\" + (\">\" === i3[0] ? \"min-\" : \"max-\") + a3 + \":\" + (1 === i3.length ? o3.replace(f, (e6, t5, n5) => Number(t5) + s3 * (\">\" === i3 ? -1 : 1) + n5) : o3) : \"\") + \")\";\n          })), z3) {\n            const e5 = x2 ? n3.concat(c2) : [...n3],\n              r4 = x2 ? [...t3] : m(t3, c2.split(B));\n            void 0 !== o2 && i2(I(...o2)), o2 = void 0, a2(d2, r4, e5);\n          } else void 0 === o2 && (o2 = [[], t3, n3]), c2 = x2 || 36 !== c2.charCodeAt(0) ? c2 : `--${k(r3.prefix)}${c2.slice(1).replace(/\\$/g, \"-\")}`, d2 = z3 ? d2 : \"number\" == typeof d2 ? d2 && e4 in R ? String(d2) + \"px\" : String(d2) : y(b(e4, null == d2 ? \"\" : d2), r3.prefix, r3.themeMap[e4]), o2[0].push(`${x2 ? `${c2} ` : `${g(c2)}:`}${d2}`);\n        }\n      }\n      var u2, S2;\n    };\n    p2(e2), void 0 !== o2 && i2(I(...o2)), o2 = void 0;\n  };\n  a2(e, t2, n2);\n};\nvar I = (e, t2, n2) => `${n2.map(e2 => `${e2}{`).join(\"\")}${t2.length ? `${t2.join(\",\")}{` : \"\"}${e.join(\";\")}${t2.length ? \"}\" : \"\"}${Array(n2.length ? n2.length + 1 : 0).join(\"}\")}`;\nvar R = {\n  animationDelay: 1,\n  animationDuration: 1,\n  backgroundSize: 1,\n  blockSize: 1,\n  border: 1,\n  borderBlock: 1,\n  borderBlockEnd: 1,\n  borderBlockEndWidth: 1,\n  borderBlockStart: 1,\n  borderBlockStartWidth: 1,\n  borderBlockWidth: 1,\n  borderBottom: 1,\n  borderBottomLeftRadius: 1,\n  borderBottomRightRadius: 1,\n  borderBottomWidth: 1,\n  borderEndEndRadius: 1,\n  borderEndStartRadius: 1,\n  borderInlineEnd: 1,\n  borderInlineEndWidth: 1,\n  borderInlineStart: 1,\n  borderInlineStartWidth: 1,\n  borderInlineWidth: 1,\n  borderLeft: 1,\n  borderLeftWidth: 1,\n  borderRadius: 1,\n  borderRight: 1,\n  borderRightWidth: 1,\n  borderSpacing: 1,\n  borderStartEndRadius: 1,\n  borderStartStartRadius: 1,\n  borderTop: 1,\n  borderTopLeftRadius: 1,\n  borderTopRightRadius: 1,\n  borderTopWidth: 1,\n  borderWidth: 1,\n  bottom: 1,\n  columnGap: 1,\n  columnRule: 1,\n  columnRuleWidth: 1,\n  columnWidth: 1,\n  containIntrinsicSize: 1,\n  flexBasis: 1,\n  fontSize: 1,\n  gap: 1,\n  gridAutoColumns: 1,\n  gridAutoRows: 1,\n  gridTemplateColumns: 1,\n  gridTemplateRows: 1,\n  height: 1,\n  inlineSize: 1,\n  inset: 1,\n  insetBlock: 1,\n  insetBlockEnd: 1,\n  insetBlockStart: 1,\n  insetInline: 1,\n  insetInlineEnd: 1,\n  insetInlineStart: 1,\n  left: 1,\n  letterSpacing: 1,\n  margin: 1,\n  marginBlock: 1,\n  marginBlockEnd: 1,\n  marginBlockStart: 1,\n  marginBottom: 1,\n  marginInline: 1,\n  marginInlineEnd: 1,\n  marginInlineStart: 1,\n  marginLeft: 1,\n  marginRight: 1,\n  marginTop: 1,\n  maxBlockSize: 1,\n  maxHeight: 1,\n  maxInlineSize: 1,\n  maxWidth: 1,\n  minBlockSize: 1,\n  minHeight: 1,\n  minInlineSize: 1,\n  minWidth: 1,\n  offsetDistance: 1,\n  offsetRotate: 1,\n  outline: 1,\n  outlineOffset: 1,\n  outlineWidth: 1,\n  overflowClipMargin: 1,\n  padding: 1,\n  paddingBlock: 1,\n  paddingBlockEnd: 1,\n  paddingBlockStart: 1,\n  paddingBottom: 1,\n  paddingInline: 1,\n  paddingInlineEnd: 1,\n  paddingInlineStart: 1,\n  paddingLeft: 1,\n  paddingRight: 1,\n  paddingTop: 1,\n  perspective: 1,\n  right: 1,\n  rowGap: 1,\n  scrollMargin: 1,\n  scrollMarginBlock: 1,\n  scrollMarginBlockEnd: 1,\n  scrollMarginBlockStart: 1,\n  scrollMarginBottom: 1,\n  scrollMarginInline: 1,\n  scrollMarginInlineEnd: 1,\n  scrollMarginInlineStart: 1,\n  scrollMarginLeft: 1,\n  scrollMarginRight: 1,\n  scrollMarginTop: 1,\n  scrollPadding: 1,\n  scrollPaddingBlock: 1,\n  scrollPaddingBlockEnd: 1,\n  scrollPaddingBlockStart: 1,\n  scrollPaddingBottom: 1,\n  scrollPaddingInline: 1,\n  scrollPaddingInlineEnd: 1,\n  scrollPaddingInlineStart: 1,\n  scrollPaddingLeft: 1,\n  scrollPaddingRight: 1,\n  scrollPaddingTop: 1,\n  shapeMargin: 1,\n  textDecoration: 1,\n  textDecorationThickness: 1,\n  textIndent: 1,\n  textUnderlineOffset: 1,\n  top: 1,\n  transitionDelay: 1,\n  transitionDuration: 1,\n  verticalAlign: 1,\n  width: 1,\n  wordSpacing: 1\n};\nvar z = e => String.fromCharCode(e + (e > 25 ? 39 : 97));\nvar W = e => (e2 => {\n  let t2,\n    n2 = \"\";\n  for (t2 = Math.abs(e2); t2 > 52; t2 = t2 / 52 | 0) n2 = z(t2 % 52) + n2;\n  return z(t2 % 52) + n2;\n})(((e2, t2) => {\n  let n2 = t2.length;\n  for (; n2;) e2 = 33 * e2 ^ t2.charCodeAt(--n2);\n  return e2;\n})(5381, JSON.stringify(e)) >>> 0);\nvar j = [\"themed\", \"global\", \"styled\", \"onevar\", \"resonevar\", \"allvar\", \"inline\"];\nvar E = e => {\n  if (e.href && !e.href.startsWith(location.origin)) return false;\n  try {\n    return !!e.cssRules;\n  } catch (e2) {\n    return false;\n  }\n};\nvar T = e => {\n  let t2;\n  const n2 = () => {\n      const {\n        cssRules: e2\n      } = t2.sheet;\n      return [].map.call(e2, (n3, r4) => {\n        const {\n          cssText: i2\n        } = n3;\n        let o2 = \"\";\n        if (i2.startsWith(\"--sxs\")) return \"\";\n        if (e2[r4 - 1] && (o2 = e2[r4 - 1].cssText).startsWith(\"--sxs\")) {\n          if (!n3.cssRules.length) return \"\";\n          for (const e3 in t2.rules) if (t2.rules[e3].group === n3) return `--sxs{--sxs:${[...t2.rules[e3].cache].join(\" \")}}${i2}`;\n          return n3.cssRules.length ? `${o2}${i2}` : \"\";\n        }\n        return i2;\n      }).join(\"\");\n    },\n    r3 = () => {\n      if (t2) {\n        const {\n          rules: e2,\n          sheet: n3\n        } = t2;\n        if (!n3.deleteRule) {\n          for (; 3 === Object(Object(n3.cssRules)[0]).type;) n3.cssRules.splice(0, 1);\n          n3.cssRules = [];\n        }\n        for (const t3 in e2) delete e2[t3];\n      }\n      const i2 = Object(e).styleSheets || [];\n      for (const e21 of i2) if (E(e21)) {\n        for (let i3 = 0, o3 = e21.cssRules; o3[i3]; ++i3) {\n          const l3 = Object(o3[i3]);\n          if (1 !== l3.type) continue;\n          const s2 = Object(o3[i3 + 1]);\n          if (4 !== s2.type) continue;\n          ++i3;\n          const {\n            cssText: a2\n          } = l3;\n          if (!a2.startsWith(\"--sxs\")) continue;\n          const c2 = a2.slice(14, -3).trim().split(/\\s+/),\n            d2 = j[c2[0]];\n          d2 && (t2 || (t2 = {\n            sheet: e21,\n            reset: r3,\n            rules: {},\n            toString: n2\n          }), t2.rules[d2] = {\n            group: s2,\n            index: i3,\n            cache: new Set(c2)\n          });\n        }\n        if (t2) break;\n      }\n      if (!t2) {\n        const i31 = (e2, t3) => ({\n          type: t3,\n          cssRules: [],\n          insertRule(e3, t4) {\n            this.cssRules.splice(t4, 0, i31(e3, {\n              import: 3,\n              undefined: 1\n            }[(e3.toLowerCase().match(/^@([a-z]+)/) || [])[1]] || 4));\n          },\n          get cssText() {\n            return \"@media{}\" === e2 ? `@media{${[].map.call(this.cssRules, e3 => e3.cssText).join(\"\")}}` : e2;\n          }\n        });\n        t2 = {\n          sheet: e ? (e.head || e).appendChild(document.createElement(\"style\")).sheet : i31(\"\", \"text/css\"),\n          rules: {},\n          reset: r3,\n          toString: n2\n        };\n      }\n      const {\n        sheet: o2,\n        rules: l2\n      } = t2;\n      for (let e22 = j.length - 1; e22 >= 0; --e22) {\n        const t31 = j[e22];\n        if (!l2[t31]) {\n          const n31 = j[e22 + 1],\n            r4 = l2[n31] ? l2[n31].index : o2.cssRules.length;\n          o2.insertRule(\"@media{}\", r4), o2.insertRule(`--sxs{--sxs:${e22}}`, r4), l2[t31] = {\n            group: o2.cssRules[r4 + 1],\n            index: r4,\n            cache: /* @__PURE__ */new Set([e22])\n          };\n        }\n        v(l2[t31]);\n      }\n    };\n  return r3(), t2;\n};\nvar v = e => {\n  const t2 = e.group;\n  let n2 = t2.cssRules.length;\n  e.apply = e2 => {\n    try {\n      t2.insertRule(e2, n2), ++n2;\n    } catch (e3) {}\n  };\n};\nvar M = Symbol();\nvar w = l();\nvar C = (e, t2) => w(e, () => (...n2) => {\n  let r3 = {\n    type: null,\n    composers: /* @__PURE__ */new Set()\n  };\n  for (const t3 of n2) if (null != t3) if (t3[s]) {\n    null == r3.type && (r3.type = t3[s].type);\n    for (const e2 of t3[s].composers) r3.composers.add(e2);\n  } else t3.constructor !== Object || t3.$$typeof ? null == r3.type && (r3.type = t3) : r3.composers.add(P(t3, e));\n  return null == r3.type && (r3.type = \"span\"), r3.composers.size || r3.composers.add([\"PJLV\", {}, [], [], {}, []]), L(e, r3, t2);\n});\nvar P = ({\n  variants: e,\n  compoundVariants: t2,\n  defaultVariants: n2,\n  ...r3\n}, i2) => {\n  const o2 = `${k(i2.prefix)}c-${W(r3)}`,\n    l2 = [],\n    s2 = [],\n    a2 = /* @__PURE__ */Object.create(null),\n    g2 = [];\n  for (const e2 in n2) a2[e2] = String(n2[e2]);\n  if (\"object\" == typeof e && e) for (const t3 in e) {\n    p2 = a2, u2 = t3, d.call(p2, u2) || (a2[t3] = \"undefined\");\n    const n3 = e[t3];\n    for (const e21 in n3) {\n      const r4 = {\n        [t3]: String(e21)\n      };\n      \"undefined\" === String(e21) && g2.push(t3);\n      const i3 = n3[e21],\n        o3 = [r4, i3, !c(i3)];\n      l2.push(o3);\n    }\n  }\n  var p2, u2;\n  if (\"object\" == typeof t2 && t2) for (const e22 of t2) {\n    let {\n      css: t31,\n      ...n31\n    } = e22;\n    t31 = \"object\" == typeof t31 && t31 || {};\n    for (const e3 in n31) n31[e3] = String(n31[e3]);\n    const r41 = [n31, t31, !c(t31)];\n    s2.push(r41);\n  }\n  return [o2, r3, l2, s2, a2, g2];\n};\nvar L = (e, t2, n2) => {\n  const [r3, i2, o2, l2] = O(t2.composers),\n    c2 = \"function\" == typeof t2.type || t2.type.$$typeof ? (e2 => {\n      function t3() {\n        for (let n3 = 0; n3 < t3[M].length; n3++) {\n          const [r4, i3] = t3[M][n3];\n          e2.rules[r4].apply(i3);\n        }\n        return t3[M] = [], null;\n      }\n      return t3[M] = [], t3.rules = {}, j.forEach(e3 => t3.rules[e3] = {\n        apply: n3 => t3[M].push([e3, n3])\n      }), t3;\n    })(n2) : null,\n    d2 = (c2 || n2).rules,\n    g2 = `.${r3}${i2.length > 1 ? `:where(.${i2.slice(1).join(\".\")})` : \"\"}`,\n    p2 = s2 => {\n      s2 = \"object\" == typeof s2 && s2 || D;\n      const {\n          css: a2,\n          ...p3\n        } = s2,\n        u2 = {};\n      for (const e2 in o2) if (delete p3[e2], e2 in s2) {\n        let t3 = s2[e2];\n        \"object\" == typeof t3 && t3 ? u2[e2] = {\n          \"@initial\": o2[e2],\n          ...t3\n        } : (t3 = String(t3), u2[e2] = \"undefined\" !== t3 || l2.has(e2) ? t3 : o2[e2]);\n      } else u2[e2] = o2[e2];\n      const h2 = /* @__PURE__ */new Set([...i2]);\n      for (const [r4, i3, o3, l3] of t2.composers) {\n        n2.rules.styled.cache.has(r4) || (n2.rules.styled.cache.add(r4), x(i3, [`.${r4}`], [], e, e2 => {\n          d2.styled.apply(e2);\n        }));\n        const t31 = A(o3, u2, e.media),\n          s3 = A(l3, u2, e.media, true);\n        for (const i4 of t31) if (void 0 !== i4) for (const [t4, o4, l4] of i4) {\n          const i5 = `${r4}-${W(o4)}-${t4}`;\n          h2.add(i5);\n          const s4 = (l4 ? n2.rules.resonevar : n2.rules.onevar).cache,\n            a3 = l4 ? d2.resonevar : d2.onevar;\n          s4.has(i5) || (s4.add(i5), x(o4, [`.${i5}`], [], e, e2 => {\n            a3.apply(e2);\n          }));\n        }\n        for (const t41 of s3) if (void 0 !== t41) for (const [i41, o41] of t41) {\n          const t5 = `${r4}-${W(o41)}-${i41}`;\n          h2.add(t5), n2.rules.allvar.cache.has(t5) || (n2.rules.allvar.cache.add(t5), x(o41, [`.${t5}`], [], e, e2 => {\n            d2.allvar.apply(e2);\n          }));\n        }\n      }\n      if (\"object\" == typeof a2 && a2) {\n        const t32 = `${r3}-i${W(a2)}-css`;\n        h2.add(t32), n2.rules.inline.cache.has(t32) || (n2.rules.inline.cache.add(t32), x(a2, [`.${t32}`], [], e, e2 => {\n          d2.inline.apply(e2);\n        }));\n      }\n      for (const e21 of String(s2.className || \"\").trim().split(/\\s+/)) e21 && h2.add(e21);\n      const f2 = p3.className = [...h2].join(\" \");\n      return {\n        type: t2.type,\n        className: f2,\n        selector: g2,\n        props: p3,\n        toString: () => f2,\n        deferredInjector: c2\n      };\n    };\n  return a(p2, {\n    className: r3,\n    selector: g2,\n    [s]: t2,\n    toString: () => (n2.rules.styled.cache.has(r3) || p2(), r3)\n  });\n};\nvar O = e => {\n  let t2 = \"\";\n  const n2 = [],\n    r3 = {},\n    i2 = [];\n  for (const [o2,,,, l2, s2] of e) {\n    \"\" === t2 && (t2 = o2), n2.push(o2), i2.push(...s2);\n    for (const e2 in l2) {\n      const t3 = l2[e2];\n      (void 0 === r3[e2] || \"undefined\" !== t3 || s2.includes(t3)) && (r3[e2] = t3);\n    }\n  }\n  return [t2, n2, r3, new Set(i2)];\n};\nvar A = (e, t2, n2, r3) => {\n  const i2 = [];\n  e: for (let [o2, l2, s2] of e) {\n    if (s2) continue;\n    let e2,\n      a2 = 0,\n      c2 = false;\n    for (e2 in o2) {\n      const r4 = o2[e2];\n      let i3 = t2[e2];\n      if (i3 !== r4) {\n        if (\"object\" != typeof i3 || !i3) continue e;\n        {\n          let e3,\n            t3,\n            o3 = 0;\n          for (const l3 in i3) {\n            if (r4 === String(i3[l3])) {\n              if (\"@initial\" !== l3) {\n                const e4 = l3.slice(1);\n                (t3 = t3 || []).push(e4 in n2 ? n2[e4] : l3.replace(/^@media ?/, \"\")), c2 = true;\n              }\n              a2 += o3, e3 = true;\n            }\n            ++o3;\n          }\n          if (t3 && t3.length && (l2 = {\n            [\"@media \" + t3.join(\", \")]: l2\n          }), !e3) continue e;\n        }\n      }\n    }\n    (i2[a2] = i2[a2] || []).push([r3 ? \"cv\" : `${e2}-${o2[e2]}`, l2, c2]);\n  }\n  return i2;\n};\nvar D = {};\nvar H = l();\nvar N = (e, t2) => H(e, () => (...n2) => {\n  const r3 = () => {\n    for (let r4 of n2) {\n      r4 = \"object\" == typeof r4 && r4 || {};\n      let n3 = W(r4);\n      if (!t2.rules.global.cache.has(n3)) {\n        if (t2.rules.global.cache.add(n3), \"@import\" in r4) {\n          let e2 = [].indexOf.call(t2.sheet.cssRules, t2.rules.themed.group) - 1;\n          for (let n4 of [].concat(r4[\"@import\"])) n4 = n4.includes('\"') || n4.includes(\"'\") ? n4 : `\"${n4}\"`, t2.sheet.insertRule(`@import ${n4};`, e2++);\n          delete r4[\"@import\"];\n        }\n        x(r4, [], [], e, e2 => {\n          t2.rules.global.apply(e2);\n        });\n      }\n    }\n    return \"\";\n  };\n  return a(r3, {\n    toString: r3\n  });\n});\nvar V = l();\nvar G = (e, t2) => V(e, () => n2 => {\n  const r3 = `${k(e.prefix)}k-${W(n2)}`,\n    i2 = () => {\n      if (!t2.rules.global.cache.has(r3)) {\n        t2.rules.global.cache.add(r3);\n        const i3 = [];\n        x(n2, [], [], e, e2 => i3.push(e2));\n        const o2 = `@keyframes ${r3}{${i3.join(\"\")}}`;\n        t2.rules.global.apply(o2);\n      }\n      return r3;\n    };\n  return a(i2, {\n    get name() {\n      return i2();\n    },\n    toString: i2\n  });\n});\nvar F = class {\n  get computedValue() {\n    return \"var(\" + this.variable + \")\";\n  }\n  get variable() {\n    return \"--\" + k(this.prefix) + k(this.scale) + this.token;\n  }\n  toString() {\n    return this.computedValue;\n  }\n  constructor(e, t2, n2, r3) {\n    this.token = null == e ? \"\" : String(e), this.value = null == t2 ? \"\" : String(t2), this.scale = null == n2 ? \"\" : String(n2), this.prefix = null == r3 ? \"\" : String(r3);\n  }\n};\nvar J = l();\nvar U = (e, t2) => J(e, () => (n2, r3) => {\n  r3 = \"object\" == typeof n2 && n2 || Object(r3);\n  const i2 = `.${n2 = (n2 = \"string\" == typeof n2 ? n2 : \"\") || `${k(e.prefix)}t-${W(r3)}`}`,\n    o2 = {},\n    l2 = [];\n  for (const t3 in r3) {\n    o2[t3] = {};\n    for (const n3 in r3[t3]) {\n      const i3 = `--${k(e.prefix)}${t3}-${n3}`,\n        s3 = y(String(r3[t3][n3]), e.prefix, t3);\n      o2[t3][n3] = new F(n3, s3, t3, e.prefix), l2.push(`${i3}:${s3}`);\n    }\n  }\n  const s2 = () => {\n    if (l2.length && !t2.rules.themed.cache.has(n2)) {\n      t2.rules.themed.cache.add(n2);\n      const i3 = `${r3 === e.theme ? \":root,\" : \"\"}.${n2}{${l2.join(\";\")}}`;\n      t2.rules.themed.apply(i3);\n    }\n    return n2;\n  };\n  return {\n    ...o2,\n    get className() {\n      return s2();\n    },\n    selector: i2,\n    toString: s2\n  };\n});\nvar Z = l();\nvar X = e => {\n  let t2 = false;\n  const n2 = Z(e, e2 => {\n    t2 = true;\n    const n3 = \"prefix\" in (e2 = \"object\" == typeof e2 && e2 || {}) ? String(e2.prefix) : \"\",\n      r3 = \"object\" == typeof e2.media && e2.media || {},\n      o2 = \"object\" == typeof e2.root ? e2.root || null : globalThis.document || null,\n      l2 = \"object\" == typeof e2.theme && e2.theme || {},\n      s2 = {\n        prefix: n3,\n        media: r3,\n        theme: l2,\n        themeMap: \"object\" == typeof e2.themeMap && e2.themeMap || {\n          ...i\n        },\n        utils: \"object\" == typeof e2.utils && e2.utils || {}\n      },\n      a2 = T(o2),\n      c2 = {\n        css: C(s2, a2),\n        globalCss: N(s2, a2),\n        keyframes: G(s2, a2),\n        createTheme: U(s2, a2),\n        reset() {\n          a2.reset(), c2.theme.toString();\n        },\n        theme: {},\n        sheet: a2,\n        config: s2,\n        prefix: n3,\n        getCssText: a2.toString,\n        toString: a2.toString\n      };\n    return String(c2.theme = c2.createTheme(l2)), c2;\n  });\n  return t2 || n2.reset(), n2;\n}; // ../../node_modules/dequal/dist/index.mjs\nvar has = Object.prototype.hasOwnProperty;\nfunction find(iter, tar, key) {\n  for (key of iter.keys()) {\n    if (dequal(key, tar)) return key;\n  }\n}\nfunction dequal(foo, bar) {\n  var ctor, len, tmp;\n  if (foo === bar) return true;\n  if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n    if (ctor === Date) return foo.getTime() === bar.getTime();\n    if (ctor === RegExp) return foo.toString() === bar.toString();\n    if (ctor === Array) {\n      if ((len = foo.length) === bar.length) {\n        while (len-- && dequal(foo[len], bar[len]));\n      }\n      return len === -1;\n    }\n    if (ctor === Set) {\n      if (foo.size !== bar.size) {\n        return false;\n      }\n      for (len of foo) {\n        tmp = len;\n        if (tmp && typeof tmp === \"object\") {\n          tmp = find(bar, tmp);\n          if (!tmp) return false;\n        }\n        if (!bar.has(tmp)) return false;\n      }\n      return true;\n    }\n    if (ctor === Map) {\n      if (foo.size !== bar.size) {\n        return false;\n      }\n      for (len of foo) {\n        tmp = len[0];\n        if (tmp && typeof tmp === \"object\") {\n          tmp = find(bar, tmp);\n          if (!tmp) return false;\n        }\n        if (!dequal(len[1], bar.get(tmp))) {\n          return false;\n        }\n      }\n      return true;\n    }\n    if (ctor === ArrayBuffer) {\n      foo = new Uint8Array(foo);\n      bar = new Uint8Array(bar);\n    } else if (ctor === DataView) {\n      if ((len = foo.byteLength) === bar.byteLength) {\n        while (len-- && foo.getInt8(len) === bar.getInt8(len));\n      }\n      return len === -1;\n    }\n    if (ArrayBuffer.isView(foo)) {\n      if ((len = foo.byteLength) === bar.byteLength) {\n        while (len-- && foo[len] === bar[len]);\n      }\n      return len === -1;\n    }\n    if (!ctor || typeof foo === \"object\") {\n      len = 0;\n      for (ctor in foo) {\n        if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n        if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n      }\n      return Object.keys(bar).length === len;\n    }\n  }\n  return foo !== foo && bar !== bar;\n} // ../../node_modules/@codesandbox/sandpack-react/dist/index.mjs\nimport { normalizePath, addPackageJSONIfNeeded, loadSandpackClient, extractErrorDetails } from \"https://framerusercontent.com/modules/fn2r53K2SixLM3ktuGOw/eTuqjtAw0LFZDyNdTgHv/codesandbox_sandpack_client.js\";\nimport { closeBracketsKeymap, closeBrackets } from \"https://framerusercontent.com/modules/iHAg5NNDzB38uLRZmObL/AYYlaW5ad8TRAyLHn07o/codemirror_autocomplete.js\";\nimport { defaultKeymap, historyKeymap, history, indentMore, indentLess, deleteGroupBackward } from \"https://framerusercontent.com/modules/peSgSa05KnLqaA8FHu9n/D7eZPbfsEH95yDKH1UTM/codemirror_commands.js\";\nimport { HighlightStyle, syntaxHighlighting, bracketMatching } from \"https://framerusercontent.com/modules/aJsTBlWNkIaM900KNIXT/TeoF57xeGMuVMjiI2ooR/codemirror_language.js\";\nimport { EditorState, StateEffect, EditorSelection, Annotation } from \"https://framerusercontent.com/modules/wFkXxZqfKOPeEQtsYrsa/Xcw7qvncyogRPQtf9aNn/codemirror_state.js\";\nimport { EditorView, ViewPlugin, Decoration, keymap, highlightSpecialChars, highlightActiveLine, lineNumbers } from \"https://framerusercontent.com/modules/wKCR2JyUW8wZdYweJrou/EndxaPZLF2o4GndkIvF9/codemirror_view.js\";\n(function () {\n  \"use strict\";\n\n  if (typeof window !== \"object\") {\n    return;\n  }\n  if (\"IntersectionObserver\" in window && \"IntersectionObserverEntry\" in window && \"intersectionRatio\" in window.IntersectionObserverEntry.prototype) {\n    if (!(\"isIntersecting\" in window.IntersectionObserverEntry.prototype)) {\n      Object.defineProperty(window.IntersectionObserverEntry.prototype, \"isIntersecting\", {\n        get: function () {\n          return this.intersectionRatio > 0;\n        }\n      });\n    }\n    return;\n  }\n  var document2 = window.document;\n  var registry = [];\n  var crossOriginUpdater = null;\n  var crossOriginRect = null;\n  function IntersectionObserverEntry(entry) {\n    this.time = entry.time;\n    this.target = entry.target;\n    this.rootBounds = ensureDOMRect(entry.rootBounds);\n    this.boundingClientRect = ensureDOMRect(entry.boundingClientRect);\n    this.intersectionRect = ensureDOMRect(entry.intersectionRect || getEmptyRect());\n    this.isIntersecting = !!entry.intersectionRect;\n    var targetRect = this.boundingClientRect;\n    var targetArea = targetRect.width * targetRect.height;\n    var intersectionRect = this.intersectionRect;\n    var intersectionArea = intersectionRect.width * intersectionRect.height;\n    if (targetArea) {\n      this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n    } else {\n      this.intersectionRatio = this.isIntersecting ? 1 : 0;\n    }\n  }\n  function IntersectionObserver2(callback, opt_options) {\n    var options = opt_options || {};\n    if (typeof callback != \"function\") {\n      throw new Error(\"callback must be a function\");\n    }\n    if (options.root && options.root.nodeType != 1) {\n      throw new Error(\"root must be an Element\");\n    }\n    this._checkForIntersections = throttle(this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n    this._callback = callback;\n    this._observationTargets = [];\n    this._queuedEntries = [];\n    this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n    this.thresholds = this._initThresholds(options.threshold);\n    this.root = options.root || null;\n    this.rootMargin = this._rootMarginValues.map(function (margin) {\n      return margin.value + margin.unit;\n    }).join(\" \");\n    this._monitoringDocuments = [];\n    this._monitoringUnsubscribes = [];\n  }\n  IntersectionObserver2.prototype.THROTTLE_TIMEOUT = 100;\n  IntersectionObserver2.prototype.POLL_INTERVAL = null;\n  IntersectionObserver2.prototype.USE_MUTATION_OBSERVER = true;\n  IntersectionObserver2._setupCrossOriginUpdater = function () {\n    if (!crossOriginUpdater) {\n      crossOriginUpdater = function (boundingClientRect, intersectionRect) {\n        if (!boundingClientRect || !intersectionRect) {\n          crossOriginRect = getEmptyRect();\n        } else {\n          crossOriginRect = convertFromParentRect(boundingClientRect, intersectionRect);\n        }\n        registry.forEach(function (observer) {\n          observer._checkForIntersections();\n        });\n      };\n    }\n    return crossOriginUpdater;\n  };\n  IntersectionObserver2._resetCrossOriginUpdater = function () {\n    crossOriginUpdater = null;\n    crossOriginRect = null;\n  };\n  IntersectionObserver2.prototype.observe = function (target) {\n    var isTargetAlreadyObserved = this._observationTargets.some(function (item) {\n      return item.element == target;\n    });\n    if (isTargetAlreadyObserved) {\n      return;\n    }\n    if (!(target && target.nodeType == 1)) {\n      throw new Error(\"target must be an Element\");\n    }\n    this._registerInstance();\n    this._observationTargets.push({\n      element: target,\n      entry: null\n    });\n    this._monitorIntersections(target.ownerDocument);\n    this._checkForIntersections();\n  };\n  IntersectionObserver2.prototype.unobserve = function (target) {\n    this._observationTargets = this._observationTargets.filter(function (item) {\n      return item.element != target;\n    });\n    this._unmonitorIntersections(target.ownerDocument);\n    if (this._observationTargets.length == 0) {\n      this._unregisterInstance();\n    }\n  };\n  IntersectionObserver2.prototype.disconnect = function () {\n    this._observationTargets = [];\n    this._unmonitorAllIntersections();\n    this._unregisterInstance();\n  };\n  IntersectionObserver2.prototype.takeRecords = function () {\n    var records = this._queuedEntries.slice();\n    this._queuedEntries = [];\n    return records;\n  };\n  IntersectionObserver2.prototype._initThresholds = function (opt_threshold) {\n    var threshold = opt_threshold || [0];\n    if (!Array.isArray(threshold)) threshold = [threshold];\n    return threshold.sort().filter(function (t2, i2, a2) {\n      if (typeof t2 != \"number\" || isNaN(t2) || t2 < 0 || t2 > 1) {\n        throw new Error(\"threshold must be a number between 0 and 1 inclusively\");\n      }\n      return t2 !== a2[i2 - 1];\n    });\n  };\n  IntersectionObserver2.prototype._parseRootMargin = function (opt_rootMargin) {\n    var marginString = opt_rootMargin || \"0px\";\n    var margins = marginString.split(/\\s+/).map(function (margin) {\n      var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n      if (!parts) {\n        throw new Error(\"rootMargin must be specified in pixels or percent\");\n      }\n      return {\n        value: parseFloat(parts[1]),\n        unit: parts[2]\n      };\n    });\n    margins[1] = margins[1] || margins[0];\n    margins[2] = margins[2] || margins[0];\n    margins[3] = margins[3] || margins[1];\n    return margins;\n  };\n  IntersectionObserver2.prototype._monitorIntersections = function (doc) {\n    var win = doc.defaultView;\n    if (!win) {\n      return;\n    }\n    if (this._monitoringDocuments.indexOf(doc) != -1) {\n      return;\n    }\n    var callback = this._checkForIntersections;\n    var monitoringInterval = null;\n    var domObserver = null;\n    if (this.POLL_INTERVAL) {\n      monitoringInterval = win.setInterval(callback, this.POLL_INTERVAL);\n    } else {\n      addEvent(win, \"resize\", callback, true);\n      addEvent(doc, \"scroll\", callback, true);\n      if (this.USE_MUTATION_OBSERVER && \"MutationObserver\" in win) {\n        domObserver = new win.MutationObserver(callback);\n        domObserver.observe(doc, {\n          attributes: true,\n          childList: true,\n          characterData: true,\n          subtree: true\n        });\n      }\n    }\n    this._monitoringDocuments.push(doc);\n    this._monitoringUnsubscribes.push(function () {\n      var win2 = doc.defaultView;\n      if (win2) {\n        if (monitoringInterval) {\n          win2.clearInterval(monitoringInterval);\n        }\n        removeEvent(win2, \"resize\", callback, true);\n      }\n      removeEvent(doc, \"scroll\", callback, true);\n      if (domObserver) {\n        domObserver.disconnect();\n      }\n    });\n    if (doc != (this.root && this.root.ownerDocument || document2)) {\n      var frame = getFrameElement(doc);\n      if (frame) {\n        this._monitorIntersections(frame.ownerDocument);\n      }\n    }\n  };\n  IntersectionObserver2.prototype._unmonitorIntersections = function (doc) {\n    var index = this._monitoringDocuments.indexOf(doc);\n    if (index == -1) {\n      return;\n    }\n    var rootDoc = this.root && this.root.ownerDocument || document2;\n    var hasDependentTargets = this._observationTargets.some(function (item) {\n      var itemDoc = item.element.ownerDocument;\n      if (itemDoc == doc) {\n        return true;\n      }\n      while (itemDoc && itemDoc != rootDoc) {\n        var frame2 = getFrameElement(itemDoc);\n        itemDoc = frame2 && frame2.ownerDocument;\n        if (itemDoc == doc) {\n          return true;\n        }\n      }\n      return false;\n    });\n    if (hasDependentTargets) {\n      return;\n    }\n    var unsubscribe = this._monitoringUnsubscribes[index];\n    this._monitoringDocuments.splice(index, 1);\n    this._monitoringUnsubscribes.splice(index, 1);\n    unsubscribe();\n    if (doc != rootDoc) {\n      var frame = getFrameElement(doc);\n      if (frame) {\n        this._unmonitorIntersections(frame.ownerDocument);\n      }\n    }\n  };\n  IntersectionObserver2.prototype._unmonitorAllIntersections = function () {\n    var unsubscribes = this._monitoringUnsubscribes.slice(0);\n    this._monitoringDocuments.length = 0;\n    this._monitoringUnsubscribes.length = 0;\n    for (var i2 = 0; i2 < unsubscribes.length; i2++) {\n      unsubscribes[i2]();\n    }\n  };\n  IntersectionObserver2.prototype._checkForIntersections = function () {\n    if (!this.root && crossOriginUpdater && !crossOriginRect) {\n      return;\n    }\n    var rootIsInDom = this._rootIsInDom();\n    var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n    this._observationTargets.forEach(function (item) {\n      var target = item.element;\n      var targetRect = getBoundingClientRect(target);\n      var rootContainsTarget = this._rootContainsTarget(target);\n      var oldEntry = item.entry;\n      var intersectionRect = rootIsInDom && rootContainsTarget && this._computeTargetAndRootIntersection(target, targetRect, rootRect);\n      var newEntry = item.entry = new IntersectionObserverEntry({\n        time: now(),\n        target,\n        boundingClientRect: targetRect,\n        rootBounds: crossOriginUpdater && !this.root ? null : rootRect,\n        intersectionRect\n      });\n      if (!oldEntry) {\n        this._queuedEntries.push(newEntry);\n      } else if (rootIsInDom && rootContainsTarget) {\n        if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n          this._queuedEntries.push(newEntry);\n        }\n      } else {\n        if (oldEntry && oldEntry.isIntersecting) {\n          this._queuedEntries.push(newEntry);\n        }\n      }\n    }, this);\n    if (this._queuedEntries.length) {\n      this._callback(this.takeRecords(), this);\n    }\n  };\n  IntersectionObserver2.prototype._computeTargetAndRootIntersection = function (target, targetRect, rootRect) {\n    if (window.getComputedStyle(target).display == \"none\") return;\n    var intersectionRect = targetRect;\n    var parent = getParentNode(target);\n    var atRoot = false;\n    while (!atRoot && parent) {\n      var parentRect = null;\n      var parentComputedStyle = parent.nodeType == 1 ? window.getComputedStyle(parent) : {};\n      if (parentComputedStyle.display == \"none\") return null;\n      if (parent == this.root || parent.nodeType /* DOCUMENT */ == 9) {\n        atRoot = true;\n        if (parent == this.root || parent == document2) {\n          if (crossOriginUpdater && !this.root) {\n            if (!crossOriginRect || crossOriginRect.width == 0 && crossOriginRect.height == 0) {\n              parent = null;\n              parentRect = null;\n              intersectionRect = null;\n            } else {\n              parentRect = crossOriginRect;\n            }\n          } else {\n            parentRect = rootRect;\n          }\n        } else {\n          var frame = getParentNode(parent);\n          var frameRect = frame && getBoundingClientRect(frame);\n          var frameIntersect = frame && this._computeTargetAndRootIntersection(frame, frameRect, rootRect);\n          if (frameRect && frameIntersect) {\n            parent = frame;\n            parentRect = convertFromParentRect(frameRect, frameIntersect);\n          } else {\n            parent = null;\n            intersectionRect = null;\n          }\n        }\n      } else {\n        var doc = parent.ownerDocument;\n        if (parent != doc.body && parent != doc.documentElement && parentComputedStyle.overflow != \"visible\") {\n          parentRect = getBoundingClientRect(parent);\n        }\n      }\n      if (parentRect) {\n        intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n      }\n      if (!intersectionRect) break;\n      parent = parent && getParentNode(parent);\n    }\n    return intersectionRect;\n  };\n  IntersectionObserver2.prototype._getRootRect = function () {\n    var rootRect;\n    if (this.root) {\n      rootRect = getBoundingClientRect(this.root);\n    } else {\n      var html2 = document2.documentElement;\n      var body = document2.body;\n      rootRect = {\n        top: 0,\n        left: 0,\n        right: html2.clientWidth || body.clientWidth,\n        width: html2.clientWidth || body.clientWidth,\n        bottom: html2.clientHeight || body.clientHeight,\n        height: html2.clientHeight || body.clientHeight\n      };\n    }\n    return this._expandRectByRootMargin(rootRect);\n  };\n  IntersectionObserver2.prototype._expandRectByRootMargin = function (rect) {\n    var margins = this._rootMarginValues.map(function (margin, i2) {\n      return margin.unit == \"px\" ? margin.value : margin.value * (i2 % 2 ? rect.width : rect.height) / 100;\n    });\n    var newRect = {\n      top: rect.top - margins[0],\n      right: rect.right + margins[1],\n      bottom: rect.bottom + margins[2],\n      left: rect.left - margins[3]\n    };\n    newRect.width = newRect.right - newRect.left;\n    newRect.height = newRect.bottom - newRect.top;\n    return newRect;\n  };\n  IntersectionObserver2.prototype._hasCrossedThreshold = function (oldEntry, newEntry) {\n    var oldRatio = oldEntry && oldEntry.isIntersecting ? oldEntry.intersectionRatio || 0 : -1;\n    var newRatio = newEntry.isIntersecting ? newEntry.intersectionRatio || 0 : -1;\n    if (oldRatio === newRatio) return;\n    for (var i2 = 0; i2 < this.thresholds.length; i2++) {\n      var threshold = this.thresholds[i2];\n      if (threshold == oldRatio || threshold == newRatio || threshold < oldRatio !== threshold < newRatio) {\n        return true;\n      }\n    }\n  };\n  IntersectionObserver2.prototype._rootIsInDom = function () {\n    return !this.root || containsDeep(document2, this.root);\n  };\n  IntersectionObserver2.prototype._rootContainsTarget = function (target) {\n    return containsDeep(this.root || document2, target) && (!this.root || this.root.ownerDocument == target.ownerDocument);\n  };\n  IntersectionObserver2.prototype._registerInstance = function () {\n    if (registry.indexOf(this) < 0) {\n      registry.push(this);\n    }\n  };\n  IntersectionObserver2.prototype._unregisterInstance = function () {\n    var index = registry.indexOf(this);\n    if (index != -1) registry.splice(index, 1);\n  };\n  function now() {\n    return window.performance && performance.now && performance.now();\n  }\n  function throttle(fn, timeout) {\n    var timer = null;\n    return function () {\n      if (!timer) {\n        timer = setTimeout(function () {\n          fn();\n          timer = null;\n        }, timeout);\n      }\n    };\n  }\n  function addEvent(node, event, fn, opt_useCapture) {\n    if (typeof node.addEventListener == \"function\") {\n      node.addEventListener(event, fn, opt_useCapture || false);\n    } else if (typeof node.attachEvent == \"function\") {\n      node.attachEvent(\"on\" + event, fn);\n    }\n  }\n  function removeEvent(node, event, fn, opt_useCapture) {\n    if (typeof node.removeEventListener == \"function\") {\n      node.removeEventListener(event, fn, opt_useCapture || false);\n    } else if (typeof node.detatchEvent == \"function\") {\n      node.detatchEvent(\"on\" + event, fn);\n    }\n  }\n  function computeRectIntersection(rect1, rect2) {\n    var top = Math.max(rect1.top, rect2.top);\n    var bottom = Math.min(rect1.bottom, rect2.bottom);\n    var left = Math.max(rect1.left, rect2.left);\n    var right = Math.min(rect1.right, rect2.right);\n    var width = right - left;\n    var height = bottom - top;\n    return width >= 0 && height >= 0 && {\n      top,\n      bottom,\n      left,\n      right,\n      width,\n      height\n    } || null;\n  }\n  function getBoundingClientRect(el) {\n    var rect;\n    try {\n      rect = el.getBoundingClientRect();\n    } catch (err) {}\n    if (!rect) return getEmptyRect();\n    if (!(rect.width && rect.height)) {\n      rect = {\n        top: rect.top,\n        right: rect.right,\n        bottom: rect.bottom,\n        left: rect.left,\n        width: rect.right - rect.left,\n        height: rect.bottom - rect.top\n      };\n    }\n    return rect;\n  }\n  function getEmptyRect() {\n    return {\n      top: 0,\n      bottom: 0,\n      left: 0,\n      right: 0,\n      width: 0,\n      height: 0\n    };\n  }\n  function ensureDOMRect(rect) {\n    if (!rect || \"x\" in rect) {\n      return rect;\n    }\n    return {\n      top: rect.top,\n      y: rect.top,\n      bottom: rect.bottom,\n      left: rect.left,\n      x: rect.left,\n      right: rect.right,\n      width: rect.width,\n      height: rect.height\n    };\n  }\n  function convertFromParentRect(parentBoundingRect, parentIntersectionRect) {\n    var top = parentIntersectionRect.top - parentBoundingRect.top;\n    var left = parentIntersectionRect.left - parentBoundingRect.left;\n    return {\n      top,\n      left,\n      height: parentIntersectionRect.height,\n      width: parentIntersectionRect.width,\n      bottom: top + parentIntersectionRect.height,\n      right: left + parentIntersectionRect.width\n    };\n  }\n  function containsDeep(parent, child) {\n    var node = child;\n    while (node) {\n      if (node == parent) return true;\n      node = getParentNode(node);\n    }\n    return false;\n  }\n  function getParentNode(node) {\n    var parent = node.parentNode;\n    if (node.nodeType /* DOCUMENT */ == 9 && node != document2) {\n      return getFrameElement(node);\n    }\n    if (parent && parent.nodeType == 11 && parent.host) {\n      return parent.host;\n    }\n    if (parent && parent.assignedSlot) {\n      return parent.assignedSlot.parentNode;\n    }\n    return parent;\n  }\n  function getFrameElement(doc) {\n    try {\n      return doc.defaultView && doc.defaultView.frameElement || null;\n    } catch (e) {\n      return null;\n    }\n  }\n  window.IntersectionObserver = IntersectionObserver2;\n  window.IntersectionObserverEntry = IntersectionObserverEntry;\n})(); // ../../node_modules/@react-hook/intersection-observer/dist/module/index.js\nimport * as React2 from \"react\"; // ../../node_modules/@react-hook/passive-layout-effect/dist/module/index.js\nimport React from \"react\";\nvar usePassiveLayoutEffect = React[typeof document !== \"undefined\" && document.createElement !== void 0 ? \"useLayoutEffect\" : \"useEffect\"];\nvar module_default = usePassiveLayoutEffect; // ../../node_modules/@react-hook/intersection-observer/dist/module/index.js\nfunction useIntersectionObserver(target, options = {}) {\n  const {\n    root = null,\n    pollInterval = null,\n    useMutationObserver = false,\n    rootMargin = \"0px 0px 0px 0px\",\n    threshold = 0,\n    initialIsIntersecting = false\n  } = options;\n  const [entry, setEntry] = React2.useState(() => ({\n    boundingClientRect: null,\n    intersectionRatio: 0,\n    intersectionRect: null,\n    isIntersecting: initialIsIntersecting,\n    rootBounds: null,\n    target: null,\n    time: 0\n  }));\n  const [observer, setObserver] = React2.useState(() => getIntersectionObserver({\n    root,\n    pollInterval,\n    useMutationObserver,\n    rootMargin,\n    threshold\n  }));\n  React2.useEffect(() => {\n    const observer2 = getIntersectionObserver({\n      root,\n      pollInterval,\n      useMutationObserver,\n      rootMargin,\n      threshold\n    });\n    setObserver(observer2);\n  }, [root, rootMargin, pollInterval, useMutationObserver, JSON.stringify(threshold)]);\n  module_default(() => {\n    const targetEl = target && \"current\" in target ? target.current : target;\n    if (!observer || !targetEl) return;\n    let didUnsubscribe = false;\n    observer.observer.observe(targetEl);\n    const callback = entries => {\n      if (didUnsubscribe) return;\n      for (let i2 = 0; i2 < entries.length; i2++) {\n        const entry2 = entries[i2];\n        if (entry2.target === targetEl) {\n          setEntry(entry2);\n        }\n      }\n    };\n    observer.subscribe(callback);\n    return () => {\n      didUnsubscribe = true;\n      observer.observer.unobserve(targetEl);\n      observer.unsubscribe(callback);\n    };\n  }, [target, observer]);\n  return entry;\n}\nfunction createIntersectionObserver({\n  root = null,\n  pollInterval = null,\n  useMutationObserver = false,\n  rootMargin = \"0px 0px 0px 0px\",\n  threshold = 0\n}) {\n  const callbacks = /* @__PURE__ */new Set();\n  if (typeof IntersectionObserver === \"undefined\") return null;\n  const observer = new IntersectionObserver(entries => {\n    for (const callback of callbacks) callback(entries, observer);\n  }, {\n    root,\n    rootMargin,\n    threshold\n  });\n  observer.POLL_INTERVAL = pollInterval;\n  observer.USE_MUTATION_OBSERVER = useMutationObserver;\n  return {\n    observer,\n    getListeners() {\n      return callbacks;\n    },\n    subscribe: callback => callbacks.add(callback),\n    unsubscribe: callback => callbacks.delete(callback)\n  };\n}\nvar _intersectionObserver = /* @__PURE__ */new Map();\nfunction getIntersectionObserver(options) {\n  const {\n    root,\n    ...keys\n  } = options;\n  const key = JSON.stringify(keys);\n  let base = _intersectionObserver.get(root);\n  if (!base) {\n    base = {};\n    _intersectionObserver.set(root, base);\n  }\n  return !base[key] ? base[key] = createIntersectionObserver(options) : base[key];\n}\nvar module_default2 = useIntersectionObserver; // ../../node_modules/@codesandbox/sandpack-react/dist/index.mjs\nvar import_anser = __toESM(require_lib(), 1);\nvar import_escape_carriage = __toESM(require_escape_carriage(), 1);\nvar import_lz_string = __toESM(require_lz_string(), 1);\nimport { css as css$1 } from \"https://framerusercontent.com/modules/Gg5hLFaRxQ2EaXSWb101/kXQVFiwPVLfGsrUiA5zE/codemirror_lang_css.js\";\nimport { html } from \"https://framerusercontent.com/modules/ju8TqAduufCaScL3E39X/3zUBDnN91MxwGUPcS8Lv/codemirror_lang_html.js\";\nimport { javascript } from \"https://framerusercontent.com/modules/YrJiUSsP9WZPvnJAGTTV/qYWVNl0YKyBbL8cTq65j/codemirror_lang_javascript.js\";\nimport { tags, highlightTree } from \"https://framerusercontent.com/modules/rOWwbZHN39cczduPnzmw/OTf12FftmvJsuTNsZb3G/lezer_highlight.js\"; // ../../node_modules/clean-set/dist/clean-set.es.js\nfunction r2(r3) {\n  var t2 = r3 && r3.pop ? [] : {};\n  for (var n2 in r3) t2[n2] = r3[n2];\n  return t2;\n}\nfunction clean_set_es_default(t2, n2, l2) {\n  n2.split && (n2 = n2.split(\".\"));\n  for (var o2 = r2(t2), a2 = o2, e = 0, f2 = n2.length; e < f2; e++) a2 = a2[n2[e]] = e === f2 - 1 ? l2 && l2.call ? l2(a2[n2[e]]) : l2 : r2(a2[n2[e]]);\n  return o2;\n} // ../../node_modules/@codesandbox/sandpack-react/dist/index.mjs\nvar __assign = function () {\n  __assign = Object.assign || function __assign2(t2) {\n    for (var s2, i2 = 1, n2 = arguments.length; i2 < n2; i2++) {\n      s2 = arguments[i2];\n      for (var p2 in s2) if (Object.prototype.hasOwnProperty.call(s2, p2)) t2[p2] = s2[p2];\n    }\n    return t2;\n  };\n  return __assign.apply(this, arguments);\n};\nfunction __rest(s2, e) {\n  var t2 = {};\n  for (var p2 in s2) if (Object.prototype.hasOwnProperty.call(s2, p2) && e.indexOf(p2) < 0) t2[p2] = s2[p2];\n  if (s2 != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s2); i2 < p2.length; i2++) {\n    if (e.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p2[i2])) t2[p2[i2]] = s2[p2[i2]];\n  }\n  return t2;\n}\nfunction __awaiter(thisArg, _arguments, P2, generator) {\n  function adopt(value) {\n    return value instanceof P2 ? value : new P2(function (resolve) {\n      resolve(value);\n    });\n  }\n  return new (P2 || (P2 = Promise))(function (resolve, reject) {\n    function fulfilled(value) {\n      try {\n        step(generator.next(value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n    function rejected(value) {\n      try {\n        step(generator[\"throw\"](value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n    function step(result) {\n      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n    }\n    step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\nfunction __generator(thisArg, body) {\n  var _ = {\n      label: 0,\n      sent: function () {\n        if (t2[0] & 1) throw t2[1];\n        return t2[1];\n      },\n      trys: [],\n      ops: []\n    },\n    f2,\n    y2,\n    t2,\n    g2;\n  return g2 = {\n    next: verb(0),\n    throw: verb(1),\n    return: verb(2)\n  }, typeof Symbol === \"function\" && (g2[Symbol.iterator] = function () {\n    return this;\n  }), g2;\n  function verb(n2) {\n    return function (v2) {\n      return step([n2, v2]);\n    };\n  }\n  function step(op) {\n    if (f2) throw new TypeError(\"Generator is already executing.\");\n    while (_) try {\n      if (f2 = 1, y2 && (t2 = op[0] & 2 ? y2[\"return\"] : op[0] ? y2[\"throw\"] || ((t2 = y2[\"return\"]) && t2.call(y2), 0) : y2.next) && !(t2 = t2.call(y2, op[1])).done) return t2;\n      if (y2 = 0, t2) op = [op[0] & 2, t2.value];\n      switch (op[0]) {\n        case 0:\n        case 1:\n          t2 = op;\n          break;\n        case 4:\n          _.label++;\n          return {\n            value: op[1],\n            done: false\n          };\n        case 5:\n          _.label++;\n          y2 = op[1];\n          op = [0];\n          continue;\n        case 7:\n          op = _.ops.pop();\n          _.trys.pop();\n          continue;\n        default:\n          if (!(t2 = _.trys, t2 = t2.length > 0 && t2[t2.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n            _ = 0;\n            continue;\n          }\n          if (op[0] === 3 && (!t2 || op[1] > t2[0] && op[1] < t2[3])) {\n            _.label = op[1];\n            break;\n          }\n          if (op[0] === 6 && _.label < t2[1]) {\n            _.label = t2[1];\n            t2 = op;\n            break;\n          }\n          if (t2 && _.label < t2[2]) {\n            _.label = t2[2];\n            _.ops.push(op);\n            break;\n          }\n          if (t2[2]) _.ops.pop();\n          _.trys.pop();\n          continue;\n      }\n      op = body.call(thisArg, _);\n    } catch (e) {\n      op = [6, e];\n      y2 = 0;\n    } finally {\n      f2 = t2 = 0;\n    }\n    if (op[0] & 5) throw op[1];\n    return {\n      value: op[0] ? op[1] : void 0,\n      done: true\n    };\n  }\n}\nfunction __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i2 = 0, l2 = from.length, ar; i2 < l2; i2++) {\n    if (ar || !(i2 in from)) {\n      if (!ar) ar = Array.prototype.slice.call(from, 0, i2);\n      ar[i2] = from[i2];\n    }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\nvar SVG = function (props) {\n  return jsx(\"svg\", __assign({\n    fill: \"currentColor\",\n    height: \"16\",\n    viewBox: \"0 0 16 16\",\n    width: \"16\",\n    xmlns: \"http://www.w3.org/2000/svg\"\n  }, props), void 0);\n};\nvar SignInIcon = function () {\n  return jsxs(SVG, __assign({\n    viewBox: \"0 0 48 48\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Sign in\"\n    }, void 0), jsx(\"path\", {\n      d: \"M9 42q-1.2 0-2.1-.9Q6 40.2 6 39V9q0-1.2.9-2.1Q7.8 6 9 6h14.55v3H9v30h14.55v3Zm24.3-9.25-2.15-2.15 5.1-5.1h-17.5v-3h17.4l-5.1-5.1 2.15-2.15 8.8 8.8Z\"\n    }, void 0)]\n  }), void 0);\n};\nvar SignOutIcon = function () {\n  return jsxs(SVG, __assign({\n    viewBox: \"0 0 48 48\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Sign out\"\n    }, void 0), jsx(\"path\", {\n      d: \"M9 42q-1.2 0-2.1-.9Q6 40.2 6 39V9q0-1.2.9-2.1Q7.8 6 9 6h14.55v3H9v30h14.55v3Zm24.3-9.25-2.15-2.15 5.1-5.1h-17.5v-3h17.4l-5.1-5.1 2.15-2.15 8.8 8.8Z\"\n    }, void 0)]\n  }), void 0);\n};\nvar RestartIcon = function () {\n  return jsxs(SVG, __assign({\n    fill: \"none\",\n    stroke: \"currentColor\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Restart script\"\n    }, void 0), jsx(\"path\", {\n      d: \"M8 2C4.68629 2 2 4.68629 2 8C2 10.0946 3.07333 11.9385 4.7 13.0118\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M14.0005 7.9998C14.0005 5.82095 12.8391 3.91335 11.1016 2.8623\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M14.0003 2.3335H11.167C10.8908 2.3335 10.667 2.55735 10.667 2.8335V5.66683\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M1.99967 13.6665L4.83301 13.6665C5.10915 13.6665 5.33301 13.4426 5.33301 13.1665L5.33301 10.3332\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M10 10L12 12L10 14\",\n      strokeLinecap: \"round\",\n      strokeLinejoin: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M14.667 14L12.667 14\",\n      strokeLinecap: \"round\",\n      strokeLinejoin: \"round\"\n    }, void 0)]\n  }), void 0);\n};\nvar RunIcon = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Run sandbox\"\n    }, void 0), jsx(\"path\", {\n      d: \"M11.0792 8.1078C11.2793 8.25007 11.27 8.55012 11.0616 8.67981L6.02535 11.8135C5.79638 11.956 5.5 11.7913 5.5 11.5216L5.5 8.40703L5.5 4.80661C5.5 4.52735 5.81537 4.36463 6.04296 4.52647L11.0792 8.1078Z\"\n    }, void 0)]\n  }, void 0);\n};\nvar BackwardIcon = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Click to go back\"\n    }, void 0), jsx(\"path\", {\n      d: \"M9.64645 12.3536C9.84171 12.5488 10.1583 12.5488 10.3536 12.3536C10.5488 12.1583 10.5488 11.8417 10.3536 11.6464L9.64645 12.3536ZM10.3536 4.35355C10.5488 4.15829 10.5488 3.84171 10.3536 3.64644C10.1583 3.45118 9.84171 3.45118 9.64645 3.64644L10.3536 4.35355ZM6.07072 7.92929L5.71716 7.57573L6.07072 7.92929ZM10.3536 11.6464L6.42427 7.71716L5.71716 8.42426L9.64645 12.3536L10.3536 11.6464ZM6.42427 8.28284L10.3536 4.35355L9.64645 3.64644L5.71716 7.57573L6.42427 8.28284ZM6.42427 7.71716C6.58048 7.87337 6.58048 8.12663 6.42427 8.28284L5.71716 7.57573C5.48285 7.81005 5.48285 8.18995 5.71716 8.42426L6.42427 7.71716Z\"\n    }, void 0)]\n  }, void 0);\n};\nvar ForwardIcon = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Click to go forward\"\n    }, void 0), jsx(\"path\", {\n      d: \"M6.35355 3.64645C6.15829 3.45118 5.84171 3.45118 5.64645 3.64645C5.45118 3.84171 5.45118 4.15829 5.64645 4.35355L6.35355 3.64645ZM5.64645 11.6464C5.45118 11.8417 5.45118 12.1583 5.64645 12.3536C5.84171 12.5488 6.15829 12.5488 6.35355 12.3536L5.64645 11.6464ZM9.92929 8.07071L10.2828 8.42426L9.92929 8.07071ZM5.64645 4.35355L9.57574 8.28284L10.2828 7.57574L6.35355 3.64645L5.64645 4.35355ZM9.57574 7.71716L5.64645 11.6464L6.35355 12.3536L10.2828 8.42426L9.57574 7.71716ZM9.57574 8.28284C9.41952 8.12663 9.41953 7.87337 9.57574 7.71716L10.2828 8.42426C10.5172 8.18995 10.5172 7.81005 10.2828 7.57574L9.57574 8.28284Z\"\n    }, void 0)]\n  }, void 0);\n};\nvar RefreshIcon = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Refresh preview\"\n    }, void 0), jsx(\"path\", {\n      clipRule: \"evenodd\",\n      d: \"M3.83325 7.99992C3.83325 5.69867 5.69853 3.83325 7.99934 3.83325C9.81246 3.83325 11.3563 4.99195 11.9285 6.61097C11.9396 6.6425 11.9536 6.67221 11.97 6.69992H8.80005C8.52391 6.69992 8.30005 6.92378 8.30005 7.19992C8.30005 7.47606 8.52391 7.69992 8.80005 7.69992H12.5667C12.8981 7.69992 13.1667 7.43129 13.1667 7.09992V3.33325C13.1667 3.05711 12.9429 2.83325 12.6667 2.83325C12.3906 2.83325 12.1667 3.05711 12.1667 3.33325V4.94608C11.2268 3.66522 9.7106 2.83325 7.99934 2.83325C5.14613 2.83325 2.83325 5.14651 2.83325 7.99992C2.83325 10.8533 5.14613 13.1666 7.99934 13.1666C9.91218 13.1666 11.5815 12.1266 12.474 10.5836C12.6123 10.3446 12.5306 10.0387 12.2915 9.90044C12.0525 9.76218 11.7466 9.84387 11.6084 10.0829C10.8873 11.3296 9.54072 12.1666 7.99934 12.1666C5.69853 12.1666 3.83325 10.3012 3.83325 7.99992Z\",\n      fillRule: \"evenodd\"\n    }, void 0)]\n  }, void 0);\n};\nvar CleanIcon = function () {\n  return jsxs(SVG, __assign({\n    fill: \"none\",\n    stroke: \"currentColor\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Clean\"\n    }, void 0), jsx(\"circle\", {\n      cx: \"7.99998\",\n      cy: \"8.00004\",\n      r: \"4.66667\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M4.66669 4.66663L11.3334 11.3333\"\n    }, void 0)]\n  }), void 0);\n};\nvar ExportIcon = function () {\n  return jsxs(SVG, __assign({\n    fill: \"none\",\n    stroke: \"currentColor\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Open on CodeSandbox\"\n    }, void 0), jsx(\"path\", {\n      d: \"M6.66665 3.33337H4.33331C3.78103 3.33337 3.33331 3.78109 3.33331 4.33337V11.6667C3.33331 12.219 3.78103 12.6667 4.33331 12.6667H11.6666C12.2189 12.6667 12.6666 12.219 12.6666 11.6667V9.33337\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M10 3.33337H12.5667C12.6219 3.33337 12.6667 3.37815 12.6667 3.43337V6.00004\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M7.33331 8.66668L12.5333 3.46667\",\n      strokeLinecap: \"round\"\n    }, void 0)]\n  }), void 0);\n};\nvar DirectoryIconOpen = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Directory\"\n    }, void 0), jsx(\"path\", {\n      d: \"M12.5526 12.6667H3.66675C3.2922 12.6667 2.96575 12.4608 2.79442 12.156L3.81072 8.0908C3.92201 7.64563 4.32199 7.33333 4.78086 7.33333H13.386C14.0365 7.33333 14.5139 7.94472 14.3561 8.57587L13.5228 11.9092C13.4115 12.3544 13.0115 12.6667 12.5526 12.6667Z\",\n      fill: \"currentColor\"\n    }, void 0), jsx(\"path\", {\n      d: \"M13.3334 6.63333V6.33333C13.3334 5.78105 12.8857 5.33333 12.3334 5.33333H8.30286C8.10543 5.33333 7.91242 5.2749 7.74816 5.16538L6.25201 4.16795C6.08774 4.05844 5.89473 4 5.69731 4H3.66675C3.11446 4 2.66675 4.44772 2.66675 5L2.66675 11.6667C2.66675 12.219 3.11446 12.6667 3.66675 12.6667H12.5526C13.0115 12.6667 13.4115 12.3544 13.5228 11.9092L14.3561 8.57587C14.5139 7.94472 14.0365 7.33333 13.386 7.33333H4.78086C4.32199 7.33333 3.92201 7.64563 3.81072 8.0908L2.75008 12.3333\",\n      fill: \"none\",\n      stroke: \"currentColor\",\n      strokeLinecap: \"round\"\n    }, void 0)]\n  }, void 0);\n};\nvar DirectoryIconClosed = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Directory\"\n    }, void 0), jsx(\"path\", {\n      d: \"M12.3334 12.6667H3.66675C3.11446 12.6667 2.66675 12.219 2.66675 11.6667V5C2.66675 4.44772 3.11446 4 3.66675 4H5.69731C5.89473 4 6.08774 4.05844 6.25201 4.16795L7.74816 5.16538C7.91242 5.2749 8.10543 5.33333 8.30286 5.33333H12.3334C12.8857 5.33333 13.3334 5.78105 13.3334 6.33333V11.6667C13.3334 12.219 12.8857 12.6667 12.3334 12.6667Z\",\n      fill: \"currentColor\",\n      stroke: \"currentColor\",\n      strokeLinecap: \"round\"\n    }, void 0)]\n  }, void 0);\n};\nvar FileIcon = function () {\n  return jsxs(SVG, __assign({\n    fill: \"currentColor\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"File\"\n    }, void 0), jsx(\"path\", {\n      clipRule: \"evenodd\",\n      d: \"M4.5 4.33325C4.5 4.05711 4.72386 3.83325 5 3.83325H8.16675V6.56659C8.16675 6.89795 8.43538 7.16658 8.76675 7.16658H11.5V12.3333C11.5 12.6094 11.2761 12.8333 11 12.8333H5C4.72386 12.8333 4.5 12.6094 4.5 12.3333V4.33325ZM12.5 6.67568C12.5001 6.67265 12.5001 6.66962 12.5001 6.66658C12.5001 6.66355 12.5001 6.66052 12.5 6.65749V6.41413C12.5 6.01631 12.342 5.63478 12.0607 5.35347L9.97978 3.27259C9.69848 2.99129 9.31694 2.83325 8.91912 2.83325H8.66675H5C4.17157 2.83325 3.5 3.50483 3.5 4.33325V12.3333C3.5 13.1617 4.17157 13.8333 5 13.8333H11C11.8284 13.8333 12.5 13.1617 12.5 12.3333V6.67568ZM9.16675 3.89888C9.20518 3.92078 9.24085 3.94787 9.27267 3.9797L11.3536 6.06058C11.3854 6.09243 11.4125 6.12813 11.4344 6.16658H9.16675V3.89888Z\",\n      fillRule: \"evenodd\"\n    }, void 0)]\n  }), void 0);\n};\nvar CloseIcon = function () {\n  return jsxs(SVG, __assign({\n    stroke: \"currentColor\"\n  }, {\n    children: [jsx(\"title\", {\n      children: \"Close file\"\n    }, void 0), jsx(\"path\", {\n      d: \"M12 4L4 12\",\n      strokeLinecap: \"round\"\n    }, void 0), jsx(\"path\", {\n      d: \"M4 4L12 12\",\n      strokeLinecap: \"round\"\n    }, void 0)]\n  }), void 0);\n};\nvar ConsoleIcon = function () {\n  return jsxs(SVG, {\n    children: [jsx(\"title\", {\n      children: \"Open browser console\"\n    }, void 0), jsx(\"path\", {\n      d: \"M5.65871 3.62037C5.44905 3.44066 5.1334 3.46494 4.95368 3.6746C4.77397 3.88427 4.79825 4.19992 5.00792 4.37963L5.65871 3.62037ZM5.00792 11.6204C4.79825 11.8001 4.77397 12.1157 4.95368 12.3254C5.1334 12.5351 5.44905 12.5593 5.65871 12.3796L5.00792 11.6204ZM9.9114 7.92407L10.2368 7.54445L9.9114 7.92407ZM5.00792 4.37963L9.586 8.3037L10.2368 7.54445L5.65871 3.62037L5.00792 4.37963ZM9.586 7.6963L5.00792 11.6204L5.65871 12.3796L10.2368 8.45555L9.586 7.6963ZM9.586 8.3037C9.39976 8.14407 9.39976 7.85594 9.586 7.6963L10.2368 8.45555C10.5162 8.2161 10.5162 7.7839 10.2368 7.54445L9.586 8.3037Z\"\n    }, void 0), jsx(\"path\", {\n      d: \"M10 11.5C9.72386 11.5 9.5 11.7239 9.5 12C9.5 12.2761 9.72386 12.5 10 12.5V11.5ZM14.6667 12.5C14.9428 12.5 15.1667 12.2761 15.1667 12C15.1667 11.7239 14.9428 11.5 14.6667 11.5V12.5ZM10 12.5H14.6667V11.5H10V12.5Z\"\n    }, void 0)]\n  }, void 0);\n};\nvar _a$a;\nvar defaultLight = {\n  colors: {\n    surface1: \"#ffffff\",\n    surface2: \"#EFEFEF\",\n    surface3: \"#F3F3F3\",\n    disabled: \"#C5C5C5\",\n    base: \"#323232\",\n    clickable: \"#808080\",\n    hover: \"#4D4D4D\",\n    accent: \"#3973E0\",\n    error: \"#EA3323\",\n    errorSurface: \"#FCF1F0\",\n    warning: \"#6A4516\",\n    warningSurface: \"#FEF2C0\"\n  },\n  syntax: {\n    plain: \"#151515\",\n    comment: {\n      color: \"#999\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#7C5AE3\",\n    tag: \"#0971F1\",\n    punctuation: \"#3B3B3B\",\n    definition: \"#85A600\",\n    property: \"#3B3B3B\",\n    static: \"#3B3B3B\",\n    string: \"#2E6BD0\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar defaultDark = {\n  colors: {\n    surface1: \"#151515\",\n    surface2: \"#252525\",\n    surface3: \"#2F2F2F\",\n    disabled: \"#4D4D4D\",\n    base: \"#808080\",\n    clickable: \"#999999\",\n    hover: \"#C5C5C5\",\n    accent: \"#E5E5E5\",\n    error: \"#FFB4A6\",\n    errorSurface: \"#690000\",\n    warning: \"#E7C400\",\n    warningSurface: \"#3A3000\"\n  },\n  syntax: {\n    plain: \"#FFFFFF\",\n    comment: {\n      color: \"#757575\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#77B7D7\",\n    tag: \"#DFAB5C\",\n    punctuation: \"#ffffff\",\n    definition: \"#86D9CA\",\n    property: \"#77B7D7\",\n    static: \"#C64640\",\n    string: \"#977CDC\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar SANDPACK_THEMES = {\n  light: defaultLight,\n  dark: defaultDark,\n  auto: typeof window !== \"undefined\" ? ((_a$a = window === null || window === void 0 ? void 0 : window.matchMedia) === null || _a$a === void 0 ? void 0 : _a$a.call(window, \"(prefers-color-scheme: dark)\").matches) ? defaultDark : defaultLight : defaultLight\n};\nvar getFileName = function (filePath) {\n  var lastIndexOfSlash = filePath.lastIndexOf(\"/\");\n  return filePath.slice(lastIndexOfSlash + 1);\n};\nvar calculateNearestUniquePath = function (currentPath, otherPaths) {\n  var currentPathParts = (currentPath[0] === \"/\" ? currentPath.slice(1) : currentPath).split(\"/\");\n  var resultPathParts = [];\n  if (currentPathParts.length === 1) {\n    resultPathParts.unshift(currentPathParts[0]);\n  } else {\n    for (var fileIndex = 0; fileIndex < otherPaths.length; fileIndex++) {\n      var otherPathParts = otherPaths[fileIndex].split(\"/\");\n      for (var partsFromEnd = 1; partsFromEnd <= currentPathParts.length; partsFromEnd++) {\n        var currentPathPart = currentPathParts[currentPathParts.length - partsFromEnd];\n        var otherPathPart = otherPathParts[otherPathParts.length - partsFromEnd];\n        if (resultPathParts.length < partsFromEnd) {\n          resultPathParts.unshift(currentPathPart);\n        }\n        if (currentPathPart !== otherPathPart) {\n          break;\n        }\n      }\n    }\n  }\n  if (resultPathParts.length < currentPathParts.length) {\n    resultPathParts.unshift(\"..\");\n  }\n  return resultPathParts.join(\"/\");\n};\nvar isDarkColor = function (color2) {\n  var r3 = 0;\n  var g2 = 0;\n  var b2 = 0;\n  if (color2.startsWith(\"#\")) {\n    if (color2.length < 7) {\n      return true;\n    }\n    r3 = parseInt(color2.substr(1, 2), 16);\n    g2 = parseInt(color2.substr(3, 2), 16);\n    b2 = parseInt(color2.substr(5, 2), 16);\n  } else {\n    var rgbValues = color2.replace(\"rgb(\", \"\").replace(\"rgba(\", \"\").replace(\")\", \"\").split(\",\");\n    if (rgbValues.length < 3) {\n      return true;\n    }\n    r3 = parseInt(rgbValues[0], 10);\n    g2 = parseInt(rgbValues[1], 10);\n    b2 = parseInt(rgbValues[2], 10);\n  }\n  var yiq = (r3 * 299 + g2 * 587 + b2 * 114) / 1e3;\n  return yiq < 128;\n};\nvar lastCount = 0;\nvar generateRandomId = function () {\n  var random = +(Date.now().toString(10).substr(0, 4) + lastCount++);\n  return random.toString(16);\n};\nvar toString = function () {\n  return \"\";\n};\nvar defineProperty = Object.getOwnPropertyDescriptors({\n  toString\n});\nObject.defineProperties(toString, defineProperty);\nvar _a$9;\nvar THEME_PREFIX = \"sp\";\nvar createTheme = (_a$9 = X({\n  prefix: THEME_PREFIX\n}), _a$9.createTheme);\nvar css = _a$9.css;\nvar getCssText = _a$9.getCssText;\nvar keyframes = _a$9.keyframes;\nvar defaultVariables = {\n  space: new Array(11).fill(\" \").reduce(function (acc, _, index) {\n    var _a2;\n    return __assign(__assign({}, acc), (_a2 = {}, _a2[index + 1] = (index + 1) * 4 + \"px\", _a2));\n  }, {}),\n  border: {\n    radius: \"4px\"\n  },\n  layout: {\n    height: \"300px\",\n    headerHeight: \"40px\"\n  },\n  transitions: {\n    default: \"150ms ease\"\n  },\n  zIndices: {\n    base: \"1\",\n    overlay: \"2\",\n    top: \"3\"\n  }\n};\nvar standardizeStitchesTheme = function (theme) {\n  var syntaxEntries = Object.entries(theme.syntax);\n  var syntax = syntaxEntries.reduce(function (tokenAcc, _a2) {\n    var _b2;\n    var tokenName = _a2[0],\n      tokenValue = _a2[1];\n    var newValues = (_b2 = {}, _b2[\"color-\" + tokenName] = tokenValue, _b2);\n    if (typeof tokenValue === \"object\") {\n      newValues = Object.entries(tokenValue).reduce(function (valueAcc, _a3) {\n        var _b3;\n        var styleProp = _a3[0],\n          styleValue = _a3[1];\n        return __assign(__assign({}, valueAcc), (_b3 = {}, _b3[styleProp + \"-\" + tokenName] = styleValue, _b3));\n      }, {});\n    }\n    return __assign(__assign({}, tokenAcc), newValues);\n  }, {});\n  return __assign(__assign({}, defaultVariables), {\n    colors: theme.colors,\n    font: theme.font,\n    syntax\n  });\n};\nvar standardizeTheme = function (inputTheme) {\n  var _a2, _b2, _c2, _d, _e;\n  if (inputTheme === void 0) {\n    inputTheme = \"light\";\n  }\n  var defaultLightThemeKey = \"default\";\n  if (typeof inputTheme === \"string\") {\n    var predefinedTheme = SANDPACK_THEMES[inputTheme];\n    if (!predefinedTheme) {\n      throw new Error(\"[sandpack-react]: invalid theme '\" + inputTheme + \"' provided.\");\n    }\n    return {\n      theme: predefinedTheme,\n      id: inputTheme,\n      mode: isDarkColor(predefinedTheme.colors.surface1) ? \"dark\" : \"light\"\n    };\n  }\n  var mode = isDarkColor((_b2 = (_a2 = inputTheme === null || inputTheme === void 0 ? void 0 : inputTheme.colors) === null || _a2 === void 0 ? void 0 : _a2.surface1) !== null && _b2 !== void 0 ? _b2 : defaultLight.colors.surface1) ? \"dark\" : \"light\";\n  var baseTheme = mode === \"dark\" ? defaultDark : defaultLight;\n  var colorsByMode = __assign(__assign({}, baseTheme.colors), (_c2 = inputTheme === null || inputTheme === void 0 ? void 0 : inputTheme.colors) !== null && _c2 !== void 0 ? _c2 : {});\n  var syntaxByMode = __assign(__assign({}, baseTheme.syntax), (_d = inputTheme === null || inputTheme === void 0 ? void 0 : inputTheme.syntax) !== null && _d !== void 0 ? _d : {});\n  var fontByMode = __assign(__assign({}, baseTheme.font), (_e = inputTheme === null || inputTheme === void 0 ? void 0 : inputTheme.font) !== null && _e !== void 0 ? _e : {});\n  var theme = {\n    colors: colorsByMode,\n    syntax: syntaxByMode,\n    font: fontByMode\n  };\n  var id = inputTheme ? simpleHashFunction(JSON.stringify(theme)) : defaultLightThemeKey;\n  return {\n    theme,\n    id: \"sp-\" + id,\n    mode\n  };\n};\nvar simpleHashFunction = function (str) {\n  var hash = 0;\n  for (var i2 = 0; i2 < str.length; hash &= hash) {\n    hash = 31 * hash + str.charCodeAt(i2++);\n  }\n  return Math.abs(hash);\n};\nvar fakeCss = function () {\n  return \"\";\n};\nfakeCss.toString = fakeCss;\nvar ClassNamesContext = /*#__PURE__*/createContext2({});\nvar ClassNamesProvider = function (_a2) {\n  var children = _a2.children,\n    classes = _a2.classes;\n  return jsx(ClassNamesContext.Provider, __assign({\n    value: classes || {}\n  }, {\n    children\n  }), void 0);\n};\nvar useClassNames = function () {\n  var contextClassNames = useContext2(ClassNamesContext);\n  return function sandpackClassNames(customClassName, allClassNames) {\n    if (allClassNames === void 0) {\n      allClassNames = [];\n    }\n    var custom = THEME_PREFIX + \"-\" + customClassName;\n    return joinClassNames.apply(void 0, __spreadArray(__spreadArray([], allClassNames, false), [custom, contextClassNames[custom]], false));\n  };\n};\nvar joinClassNames = function () {\n  var args = [];\n  for (var _i = 0; _i < arguments.length; _i++) {\n    args[_i] = arguments[_i];\n  }\n  return args.filter(Boolean).join(\" \");\n};\nvar wrapperClassName$3 = css({\n  all: \"initial\",\n  fontSize: \"$font$size\",\n  fontFamily: \"$font$body\",\n  display: \"block\",\n  boxSizing: \"border-box\",\n  textRendering: \"optimizeLegibility\",\n  WebkitTapHighlightColor: \"transparent\",\n  WebkitFontSmoothing: \"subpixel-antialiased\",\n  variants: {\n    variant: {\n      dark: {\n        colorScheme: \"dark\"\n      },\n      light: {\n        colorScheme: \"light\"\n      }\n    }\n  },\n  \"@media screen and (min-resolution: 2dppx)\": {\n    WebkitFontSmoothing: \"antialiased\",\n    MozOsxFontSmoothing: \"grayscale\"\n  },\n  \"*\": {\n    boxSizing: \"border-box\"\n  },\n  \".sp-wrapper:focus\": {\n    outline: \"0\"\n  }\n});\nvar SandpackThemeContext = /*#__PURE__*/React3.createContext({\n  theme: defaultLight,\n  id: \"light\",\n  mode: \"light\"\n});\nvar SandpackThemeProvider = function (_a2) {\n  var themeFromProps = _a2.theme,\n    children = _a2.children,\n    className = _a2.className,\n    props = __rest(_a2, [\"theme\", \"children\", \"className\"]);\n  var _b2 = standardizeTheme(themeFromProps),\n    theme = _b2.theme,\n    id = _b2.id,\n    mode = _b2.mode;\n  var classNames = useClassNames();\n  var themeClassName = React3.useMemo(function () {\n    return createTheme(id, standardizeStitchesTheme(theme));\n  }, [theme, id]);\n  return jsx(SandpackThemeContext.Provider, __assign({\n    value: {\n      theme,\n      id,\n      mode\n    }\n  }, {\n    children: jsx(\"div\", __assign({\n      className: classNames(\"wrapper\", [themeClassName, wrapperClassName$3({\n        variant: mode\n      }), className])\n    }, props, {\n      children\n    }), void 0)\n  }), void 0);\n};\nvar SandpackThemeConsumer = SandpackThemeContext.Consumer;\nvar commonFiles = {\n  \"/styles.css\": {\n    code: \"body {\\n  font-family: sans-serif;\\n  -webkit-font-smoothing: auto;\\n  -moz-font-smoothing: auto;\\n  -moz-osx-font-smoothing: grayscale;\\n  font-smoothing: auto;\\n  text-rendering: optimizeLegibility;\\n  font-smooth: always;\\n  -webkit-tap-highlight-color: transparent;\\n  -webkit-touch-callout: none;\\n}\\n\\nh1 {\\n  font-size: 1.5rem;\\n}\"\n  }\n};\nvar ASTRO_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/pages/index.astro\": {\n      code: '---\\nimport \"../styles.css\";\\nconst data = \"world\";\\n---\\n\\n<h1>Hello {data}</h1>\\n\\n<style>\\n  h1 {\\n    font-size: 1.5rem;\\n  }\\n</style>'\n    },\n    \".env\": {\n      code: 'ASTRO_TELEMETRY_DISABLED=\"1\"'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          astro: \"^1.6.12\",\n          \"esbuild-wasm\": \"^0.15.16\"\n        },\n        scripts: {\n          dev: \"astro dev\",\n          start: \"astro dev\",\n          build: \"astro build\",\n          preview: \"astro preview\",\n          astro: \"astro\"\n        }\n      })\n    }\n  },\n  main: \"/src/pages/index.astro\",\n  environment: \"node\"\n};\nvar NEXTJS_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/pages/_app.js\": {\n      code: \"import '../styles.css'\\n\\nexport default function MyApp({ Component, pageProps }) {\\n  return <Component {...pageProps} />\\n}\"\n    },\n    \"/pages/index.js\": {\n      code: 'export default function Home({ data }) {\\n  return (\\n    <div>\\n      <h1>Hello {data}</h1>\\n    </div>\\n  );\\n}\\n  \\nexport function getServerSideProps() {\\n  return {\\n    props: { data: \"world\" },\\n  }\\n}\\n'\n    },\n    \"/next.config.js\": {\n      code: \"/** @type {import('next').NextConfig} */\\nconst nextConfig = {\\n  reactStrictMode: true,\\n  swcMinify: true,\\n}\\n\\nmodule.exports = nextConfig\\n\"\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        name: \"my-app\",\n        version: \"0.1.0\",\n        private: true,\n        scripts: {\n          dev: \"NEXT_TELEMETRY_DISABLED=1 next dev\",\n          build: \"next build\",\n          start: \"next start\",\n          lint: \"next lint\"\n        },\n        dependencies: {\n          next: \"12.1.6\",\n          react: \"18.2.0\",\n          \"react-dom\": \"18.2.0\",\n          \"@next/swc-wasm-nodejs\": \"12.1.6\"\n        }\n      })\n    }\n  }),\n  main: \"/pages/index.js\",\n  environment: \"node\"\n};\nvar NODE_TEMPLATE = {\n  files: {\n    \"/index.js\": {\n      code: \"const http = require('http');\\n\\nconst hostname = '127.0.0.1';\\nconst port = 3000;\\n\\nconst server = http.createServer((req, res) => {\\n  res.statusCode = 200;\\n  res.setHeader('Content-Type', 'text/html');\\n  res.end('Hello world');\\n});\\n\\nserver.listen(port, hostname, () => {\\n  console.log(`Server running at http://${hostname}:${port}/`);\\n});\"\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {},\n        scripts: {\n          start: \"node index.js\"\n        },\n        main: \"index.js\"\n      })\n    }\n  },\n  main: \"/index.js\",\n  environment: \"node\"\n};\nvar VITE_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/index.js\": {\n      code: 'import \"./styles.css\";\\n\\ndocument.getElementById(\"app\").innerHTML = `\\n<h1>Hello world</h1>\\n`;\\n'\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"app\"></div>\\n    <script type=\"module\" src=\"/index.js\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        scripts: {\n          dev: \"vite\",\n          build: \"vite build\",\n          preview: \"vite preview\"\n        },\n        devDependencies: {\n          vite: \"4.1.4\",\n          \"esbuild-wasm\": \"0.17.12\"\n        }\n      })\n    }\n  }),\n  main: \"/index.js\",\n  environment: \"node\"\n};\nvar VITE_REACT_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/App.jsx\": {\n      code: 'export default function App() {\\n  const data = \"world\"\\n\\n  return <h1>Hello {data}</h1>\\n}\\n'\n    },\n    \"/index.jsx\": {\n      code: 'import { StrictMode } from \"react\";\\nimport { createRoot } from \"react-dom/client\";\\nimport \"./styles.css\";\\n\\nimport App from \"./App\";\\n\\nconst root = createRoot(document.getElementById(\"root\"));\\nroot.render(\\n  <StrictMode>\\n    <App />\\n  </StrictMode>\\n);'\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"root\"></div>\\n    <script type=\"module\" src=\"/index.jsx\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        scripts: {\n          dev: \"vite\",\n          build: \"vite build\",\n          preview: \"vite preview\"\n        },\n        dependencies: {\n          react: \"^18.2.0\",\n          \"react-dom\": \"^18.2.0\"\n        },\n        devDependencies: {\n          \"@vitejs/plugin-react\": \"3.1.0\",\n          vite: \"4.1.4\",\n          \"esbuild-wasm\": \"0.17.12\"\n        }\n      })\n    },\n    \"/vite.config.js\": {\n      code: 'import { defineConfig } from \"vite\";\\nimport react from \"@vitejs/plugin-react\";\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [react()],\\n});\\n'\n    }\n  }),\n  main: \"/App.jsx\",\n  environment: \"node\"\n};\nvar VITE_REACT_TS_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/App.tsx\": {\n      code: 'export default function App() {\\n  const data: string = \"world\"\\n\\n  return <h1>Hello {data}</h1>\\n}\\n'\n    },\n    \"/index.tsx\": {\n      code: 'import { StrictMode } from \"react\";\\nimport { createRoot } from \"react-dom/client\";\\nimport \"./styles.css\";\\n\\nimport App from \"./App\";\\nimport React from \"react\";\\n\\nconst root = createRoot(document.getElementById(\"root\") as HTMLElement);\\nroot.render(\\n  <StrictMode>\\n    <App />\\n  </StrictMode>\\n);\\n'\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"root\"></div>\\n    <script type=\"module\" src=\"/index.tsx\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/tsconfig.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          target: \"ESNext\",\n          useDefineForClassFields: true,\n          lib: [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n          allowJs: false,\n          skipLibCheck: true,\n          esModuleInterop: false,\n          allowSyntheticDefaultImports: true,\n          strict: true,\n          forceConsistentCasingInFileNames: true,\n          module: \"ESNext\",\n          moduleResolution: \"Node\",\n          resolveJsonModule: true,\n          isolatedModules: true,\n          noEmit: true,\n          jsx: \"react-jsx\"\n        },\n        include: [\"src\"],\n        references: [{\n          path: \"./tsconfig.node.json\"\n        }]\n      }, null, 2)\n    },\n    \"/tsconfig.node.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          composite: true,\n          module: \"ESNext\",\n          moduleResolution: \"Node\",\n          allowSyntheticDefaultImports: true\n        },\n        include: [\"vite.config.ts\"]\n      }, null, 2)\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        scripts: {\n          dev: \"vite\",\n          build: \"tsc && vite build\",\n          preview: \"vite preview\"\n        },\n        dependencies: {\n          react: \"^18.2.0\",\n          \"react-dom\": \"^18.2.0\"\n        },\n        devDependencies: {\n          \"@types/react\": \"^18.0.28\",\n          \"@types/react-dom\": \"^18.0.11\",\n          \"@vitejs/plugin-react\": \"^3.1.0\",\n          typescript: \"^4.9.5\",\n          vite: \"4.1.4\",\n          \"esbuild-wasm\": \"^0.17.12\"\n        }\n      }, null, 2)\n    },\n    \"/vite-env.d.ts\": {\n      code: '/// <reference types=\"vite/client\" />'\n    },\n    \"/vite.config.ts\": {\n      code: \"import { defineConfig } from 'vite'\\nimport react from '@vitejs/plugin-react'\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [react()],\\n})\\n\"\n    }\n  }),\n  main: \"/App.tsx\",\n  environment: \"node\"\n};\nvar VITE_SVELTE_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.svelte\": {\n      code: '<script>\\nconst data = \"world\";\\n</script>\\n\\n<h1>Hello {data}</h1>\\n\\n<style>\\nh1 {\\n  font-size: 1.5rem;\\n}\\n</style>'\n    },\n    \"/src/main.js\": {\n      code: `import App from './App.svelte'\nimport \"./styles.css\"\n\nconst app = new App({\n  target: document.getElementById('app'),\n})\n\nexport default app`\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"app\"></div>\\n    <script type=\"module\" src=\"/src/main.js\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/vite.config.js\": {\n      code: \"import { defineConfig } from 'vite'\\nimport { svelte } from '@sveltejs/vite-plugin-svelte'\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [svelte()],\\n})\"\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        type: \"module\",\n        scripts: {\n          dev: \"vite\"\n        },\n        devDependencies: {\n          \"@sveltejs/vite-plugin-svelte\": \"^2.0.2\",\n          svelte: \"^3.55.1\",\n          vite: \"4.0.4\",\n          \"esbuild-wasm\": \"^0.17.12\"\n        }\n      })\n    }\n  },\n  main: \"/src/App.svelte\",\n  environment: \"node\"\n};\nvar VITE_SVELTE_TS_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.svelte\": {\n      code: '<script lang=\"ts\">\\nconst data: string = \"world\";\\n</script>\\n\\n<h1>Hello {data}</h1>\\n\\n<style>\\nh1 {\\n  font-size: 1.5rem;\\n}\\n</style>'\n    },\n    \"/src/main.ts\": {\n      code: `import App from './App.svelte'\nimport \"./styles.css\"\n\nconst app = new App({\n  target: document.getElementById('app'),\n})\n\nexport default app`\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"app\"></div>\\n    <script type=\"module\" src=\"/src/main.ts\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/vite-env.d.ts\": {\n      code: '/// <reference types=\"svelte\" />\\n/// <reference types=\"vite/client\" />'\n    },\n    \"svelte.config.js\": {\n      code: \"import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'\\n\\nexport default {\\n  // Consult https://svelte.dev/docs#compile-time-svelte-preprocess\\n  // for more information about preprocessors\\n  preprocess: vitePreprocess(),\\n}\\n\"\n    },\n    \"/vite.config.ts\": {\n      code: \"import { defineConfig } from 'vite'\\nimport { svelte } from '@sveltejs/vite-plugin-svelte'\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [svelte()],\\n})\"\n    },\n    \"tsconfig.json\": {\n      code: JSON.stringify({\n        extends: \"@tsconfig/svelte/tsconfig.json\",\n        compilerOptions: {\n          target: \"ESNext\",\n          useDefineForClassFields: true,\n          module: \"ESNext\",\n          resolveJsonModule: true,\n          allowJs: true,\n          checkJs: true,\n          isolatedModules: true\n        },\n        include: [\"src/**/*.d.ts\", \"src/**/*.ts\", \"src/**/*.js\", \"src/**/*.svelte\"],\n        references: [{\n          path: \"./tsconfig.node.json\"\n        }]\n      }, null, 2)\n    },\n    \"tsconfig.node.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          composite: true,\n          module: \"ESNext\",\n          moduleResolution: \"Node\"\n        },\n        include: [\"vite.config.ts\"]\n      }, null, 2)\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        type: \"module\",\n        scripts: {\n          dev: \"vite\"\n        },\n        devDependencies: {\n          \"@sveltejs/vite-plugin-svelte\": \"^2.0.2\",\n          \"@tsconfig/svelte\": \"^3.0.0\",\n          svelte: \"^3.55.1\",\n          \"svelte-check\": \"^2.10.3\",\n          tslib: \"^2.5.0\",\n          vite: \"4.1.4\",\n          \"esbuild-wasm\": \"^0.17.12\"\n        }\n      }, null, 2)\n    }\n  },\n  main: \"/src/App.svelte\",\n  environment: \"node\"\n};\nvar VITE_VUE_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.vue\": {\n      code: '<script setup>\\nimport { ref } from \"vue\";\\n\\nconst data = ref(\"world\");\\n</script>\\n\\n<template>\\n  <h1>Hello {{ data }}</h1>\\n</template>\\n\\n<style>\\nh1 {\\n  font-size: 1.5rem;\\n}\\n</style>'\n    },\n    \"/src/main.js\": {\n      code: `import { createApp } from 'vue'\nimport App from './App.vue'\nimport \"./styles.css\"\n            \ncreateApp(App).mount('#app')            \n`\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"app\"></div>\\n    <script type=\"module\" src=\"/src/main.js\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/vite.config.js\": {\n      code: \"import { defineConfig } from 'vite'\\nimport vue from '@vitejs/plugin-vue'\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [vue()]\\n})\\n\"\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        scripts: {\n          dev: \"vite\",\n          build: \"vite build\",\n          preview: \"vite preview\"\n        },\n        dependencies: {\n          vue: \"^3.2.45\"\n        },\n        devDependencies: {\n          \"@vitejs/plugin-vue\": \"3.2.0\",\n          vite: \"4.1.4\",\n          \"esbuild-wasm\": \"0.17.12\"\n        }\n      })\n    }\n  },\n  main: \"/src/App.vue\",\n  environment: \"node\"\n};\nvar VITE_VUE_TS_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.vue\": {\n      code: '<script setup lang=\"ts\">\\nimport { ref } from \"vue\";\\n\\nconst data = ref<string>(\"world\");\\n</script>\\n\\n<template>\\n  <h1>Hello {{ data }}</h1>\\n</template>\\n\\n<style>\\nh1 {\\n  font-size: 1.5rem;\\n}\\n</style>'\n    },\n    \"/src/main.ts\": {\n      code: `import { createApp } from 'vue'\nimport App from './App.vue'\nimport \"./styles.css\"\n\ncreateApp(App).mount('#app')\n`\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\" />\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n    <title>Vite App</title>\\n  </head>\\n  <body>\\n    <div id=\"app\"></div>\\n    <script type=\"module\" src=\"/src/main.ts\"></script>\\n  </body>\\n</html>\\n'\n    },\n    \"/vite-env.d.ts\": {\n      code: '/// <reference types=\"vite/client\" />'\n    },\n    \"/vite.config.ts\": {\n      code: \"import { defineConfig } from 'vite'\\nimport vue from '@vitejs/plugin-vue'\\n\\n// https://vitejs.dev/config/\\nexport default defineConfig({\\n  plugins: [vue()]\\n})\\n\"\n    },\n    \"tsconfig.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          target: \"ESNext\",\n          useDefineForClassFields: true,\n          module: \"ESNext\",\n          moduleResolution: \"Node\",\n          strict: true,\n          jsx: \"preserve\",\n          resolveJsonModule: true,\n          isolatedModules: true,\n          esModuleInterop: true,\n          lib: [\"ESNext\", \"DOM\"],\n          skipLibCheck: true,\n          noEmit: true\n        },\n        include: [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n        references: [{\n          path: \"./tsconfig.node.json\"\n        }]\n      }, null, 2)\n    },\n    \"tsconfig.node.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          composite: true,\n          module: \"ESNext\",\n          moduleResolution: \"Node\",\n          allowSyntheticDefaultImports: true\n        },\n        include: [\"vite.config.ts\"]\n      }, null, 2)\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        scripts: {\n          dev: \"vite\",\n          build: \"tsc && vite build\",\n          preview: \"vite preview\"\n        },\n        dependencies: {\n          vue: \"^3.2.47\"\n        },\n        devDependencies: {\n          \"@vitejs/plugin-vue\": \"^4.0.0\",\n          vite: \"4.1.4\",\n          \"vue-tsc\": \"^1.2.0\",\n          typescript: \"^4.9.5\",\n          \"esbuild-wasm\": \"^0.17.12\"\n        }\n      }, null, 2)\n    }\n  },\n  main: \"/src/App.vue\",\n  environment: \"node\"\n};\nvar ANGULAR_TEMPLATE = {\n  files: {\n    \"/src/app/app.component.css\": commonFiles[\"/styles.css\"],\n    \"/src/app/app.component.html\": {\n      code: \"<div>\\n<h1>{{ helloWorld }}</h1>\\n</div>     \\n\"\n    },\n    \"/src/app/app.component.ts\": {\n      code: 'import { Component } from \"@angular/core\";\\n\\n@Component({\\n  selector: \"app-root\",\\n  templateUrl: \"./app.component.html\",\\n  styleUrls: [\"./app.component.css\"]\\n})\\nexport class AppComponent {\\n  helloWorld = \"Hello world\";\\n}           \\n'\n    },\n    \"/src/app/app.module.ts\": {\n      code: 'import { BrowserModule } from \"@angular/platform-browser\";\\nimport { NgModule } from \"@angular/core\";\\n      \\nimport { AppComponent } from \"./app.component\";\\n      \\n@NgModule({\\n  declarations: [AppComponent],\\n  imports: [BrowserModule],\\n  providers: [],\\n  bootstrap: [AppComponent]\\n})\\nexport class AppModule {}       \\n'\n    },\n    \"/src/index.html\": {\n      code: '<!doctype html>\\n<html lang=\"en\">\\n      \\n<head>\\n  <meta charset=\"utf-8\">\\n  <title>Angular</title>\\n  <base href=\"/\">\\n      \\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\\n  <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\">\\n</head>\\n      \\n<body>\\n   <app-root></app-root>\\n</body>\\n      \\n</html>\\n'\n    },\n    \"/src/main.ts\": {\n      code: 'import { enableProdMode } from \"@angular/core\";\\nimport { platformBrowserDynamic } from \"@angular/platform-browser-dynamic\";\\n      \\nimport { AppModule } from \"./app/app.module\";      \\n\\nplatformBrowserDynamic()\\n  .bootstrapModule(AppModule)\\n  .catch(err => console.log(err));\\n      \\n'\n    },\n    \"/src/polyfills.ts\": {\n      code: 'import \"core-js/proposals/reflect-metadata\";   \\n      import \"zone.js/dist/zone\";\\n'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          \"@angular/core\": \"^11.2.0\",\n          \"@angular/platform-browser\": \"^11.2.0\",\n          \"@angular/platform-browser-dynamic\": \"^11.2.0\",\n          \"@angular/common\": \"^11.2.0\",\n          \"@angular/compiler\": \"^11.2.0\",\n          \"zone.js\": \"0.11.3\",\n          \"core-js\": \"3.8.3\",\n          rxjs: \"6.6.3\"\n        },\n        main: \"/src/main.ts\"\n      })\n    }\n  },\n  main: \"/src/app/app.component.ts\",\n  environment: \"angular-cli\"\n};\nvar REACT_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/App.js\": {\n      code: \"export default function App() {\\n  return <h1>Hello world</h1>\\n}\\n\"\n    },\n    \"/index.js\": {\n      code: 'import React, { StrictMode } from \"react\";\\nimport { createRoot } from \"react-dom/client\";\\nimport \"./styles.css\";\\n\\nimport App from \"./App\";\\n\\nconst root = createRoot(document.getElementById(\"root\"));\\nroot.render(\\n  <StrictMode>\\n    <App />\\n  </StrictMode>\\n);'\n    },\n    \"/public/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\">\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n    <title>Document</title>\\n  </head>\\n  <body>\\n    <div id=\"root\"></div>\\n  </body>\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          react: \"^18.0.0\",\n          \"react-dom\": \"^18.0.0\",\n          \"react-scripts\": \"^5.0.0\"\n        },\n        main: \"/index.js\"\n      })\n    }\n  }),\n  main: \"/App.js\",\n  environment: \"create-react-app\"\n};\nvar REACT_TYPESCRIPT_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"tsconfig.json\": {\n      code: '{\\n  \"include\": [\\n    \"./**/*\"\\n  ],\\n  \"compilerOptions\": {\\n    \"strict\": true,\\n    \"esModuleInterop\": true,\\n    \"lib\": [ \"dom\", \"es2015\" ],\\n    \"jsx\": \"react-jsx\"\\n  }\\n}'\n    },\n    \"/App.tsx\": {\n      code: \"export default function App(): JSX.Element {\\n  return <h1>Hello world</h1>\\n}\\n\"\n    },\n    \"/index.tsx\": {\n      code: 'import React, { StrictMode } from \"react\";\\nimport { createRoot } from \"react-dom/client\";\\nimport \"./styles.css\";\\n\\nimport App from \"./App\";\\n\\nconst root = createRoot(document.getElementById(\"root\"));\\nroot.render(\\n  <StrictMode>\\n    <App />\\n  </StrictMode>\\n);'\n    },\n    \"/public/index.html\": {\n      code: '<!DOCTYPE html>\\n<html lang=\"en\">\\n  <head>\\n    <meta charset=\"UTF-8\">\\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n    <title>Document</title>\\n  </head>\\n  <body>\\n    <div id=\"root\"></div>\\n  </body>\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          react: \"^18.0.0\",\n          \"react-dom\": \"^18.0.0\",\n          \"react-scripts\": \"^4.0.0\"\n        },\n        devDependencies: {\n          \"@types/react\": \"^18.0.0\",\n          \"@types/react-dom\": \"^18.0.0\",\n          typescript: \"^4.0.0\"\n        },\n        main: \"/index.tsx\"\n      })\n    }\n  }),\n  main: \"/App.tsx\",\n  environment: \"create-react-app\"\n};\nvar SOLID_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/App.tsx\": {\n      code: 'import { Component } from \"solid-js\";\\n\\nconst App: Component = () => {\\n  return <h1>Hello world</h1>\\n};\\n\\nexport default App;'\n    },\n    \"/index.tsx\": {\n      code: 'import { render } from \"solid-js/web\";\\nimport App from \"./App\";\\n\\nimport \"./styles.css\";\\n\\nrender(() => <App />, document.getElementById(\"app\"));'\n    },\n    \"/index.html\": {\n      code: '<html>\\n<head>\\n  <title>Parcel Sandbox</title>\\n  <meta charset=\"UTF-8\" />\\n</head>\\n<body>\\n  <div id=\"app\"></div>\\n  <script src=\"src/index.tsx\"></script>\\n</body>\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          \"solid-js\": \"1.3.15\"\n        },\n        main: \"/index.tsx\"\n      })\n    }\n  }),\n  main: \"/App.tsx\",\n  environment: \"solid\"\n};\nvar SVELTE_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/App.svelte\": {\n      code: \"<style>\\n  h1 {\\n    font-size: 1.5rem;\\n  }\\n</style>\\n\\n<script>\\n  let name = 'world';\\n</script>\\n\\n<main>\\n  <h1>Hello {name}</h1>\\n</main>\"\n    },\n    \"/index.js\": {\n      code: 'import App from \"./App.svelte\";\\nimport \"./styles.css\";\\n\\nconst app = new App({\\n  target: document.body\\n});\\n\\nexport default app;\\n      '\n    },\n    \"/public/index.html\": {\n      code: '<!DOCTYPE html>\\n<html>\\n  <head>\\n    <meta charset=\"utf8\" />\\n    <meta name=\"viewport\" content=\"width=device-width\" />\\n\\n    <title>Svelte app</title>\\n\\n    <link rel=\"stylesheet\" href=\"public/bundle.css\" />\\n  </head>\\n\\n  <body>\\n    <script src=\"bundle.js\"></script>\\n  </body>\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {\n          svelte: \"^3.0.0\"\n        },\n        main: \"/index.js\"\n      })\n    }\n  }),\n  main: \"/App.svelte\",\n  environment: \"svelte\"\n};\nvar TEST_TYPESCRIPT_TEMPLATE = {\n  files: {\n    \"tsconfig.json\": {\n      code: '{\\n  \"include\": [\\n    \"./**/*\"\\n  ],\\n  \"compilerOptions\": {\\n    \"strict\": true,\\n    \"esModuleInterop\": true,\\n    \"lib\": [ \"dom\", \"es2015\" ],\\n    \"jsx\": \"react-jsx\"\\n  }\\n}'\n    },\n    \"/add.ts\": {\n      code: \"export const add = (a: number, b: number): number => a + b;\"\n    },\n    \"/add.test.ts\": {\n      code: \"import { add } from './add';\\n\\ndescribe('add', () => {\\n  test('Commutative Law of Addition', () => {\\n    expect(add(1, 2)).toBe(add(2, 1));\\n  });\\n});\"\n    },\n    \"package.json\": {\n      code: JSON.stringify({\n        dependencies: {},\n        devDependencies: {\n          typescript: \"^4.0.0\"\n        },\n        main: \"/add.ts\"\n      })\n    }\n  },\n  main: \"/add.test.ts\",\n  environment: \"parcel\",\n  mode: \"tests\"\n};\nvar VANILLA_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/index.js\": {\n      code: 'import \"./styles.css\";\\n\\ndocument.getElementById(\"app\").innerHTML = `\\n<h1>Hello world</h1>\\n`;\\n'\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html>\\n\\n<head>\\n  <title>Parcel Sandbox</title>\\n  <meta charset=\"UTF-8\" />\\n</head>\\n\\n<body>\\n  <div id=\"app\"></div>\\n\\n  <script src=\"index.js\">\\n  </script>\\n</body>\\n\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {},\n        main: \"/index.js\"\n      })\n    }\n  }),\n  main: \"/index.js\",\n  environment: \"parcel\"\n};\nvar VANILLA_TYPESCRIPT_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"tsconfig.json\": {\n      code: '{\\n  \"compilerOptions\": {\\n    \"strict\": true,\\n    \"module\": \"commonjs\",\\n    \"jsx\": \"preserve\",\\n    \"esModuleInterop\": true,\\n    \"sourceMap\": true,\\n    \"allowJs\": true,\\n    \"lib\": [\\n      \"es6\",\\n      \"dom\"\\n    ],\\n    \"rootDir\": \"src\",\\n    \"moduleResolution\": \"node\"\\n  }\\n}'\n    },\n    \"/index.ts\": {\n      code: 'import \"./styles.css\";\\n\\ndocument.getElementById(\"app\").innerHTML = `\\n<h1>Hello world</h1>\\n`;\\n'\n    },\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html>\\n\\n<head>\\n  <title>Parcel Sandbox</title>\\n  <meta charset=\"UTF-8\" />\\n</head>\\n\\n<body>\\n  <div id=\"app\"></div>\\n\\n  <script src=\"index.ts\">\\n  </script>\\n</body>\\n\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {},\n        devDependencies: {\n          typescript: \"^4.0.0\"\n        },\n        main: \"/index.ts\"\n      })\n    }\n  }),\n  main: \"/index.ts\",\n  environment: \"parcel\"\n};\nvar VUE_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.vue\": {\n      code: \"<template>\\n  <h1>Hello {{ msg }}</h1>\\n</template>\\n\\n<script setup>\\nimport { ref } from 'vue';\\nconst msg = ref('world');\\n</script>\"\n    },\n    \"/src/main.js\": {\n      code: `import { createApp } from 'vue'\nimport App from './App.vue'\nimport \"./styles.css\";\n\ncreateApp(App).mount('#app')\n`\n    },\n    \"/public/index.html\": {\n      code: `<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\" />\n    <title>codesandbox</title>\n  </head>\n  <body>\n    <noscript>\n      <strong\n        >We're sorry but codesandbox doesn't work properly without JavaScript\n        enabled. Please enable it to continue.</strong\n      >\n    </noscript>\n    <div id=\"app\"></div>\n    <!-- built files will be auto injected -->\n  </body>\n</html>\n`\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        name: \"vue3\",\n        version: \"0.1.0\",\n        private: true,\n        main: \"/src/main.js\",\n        scripts: {\n          serve: \"vue-cli-service serve\",\n          build: \"vue-cli-service build\"\n        },\n        dependencies: {\n          \"core-js\": \"^3.26.1\",\n          vue: \"^3.2.45\"\n        },\n        devDependencies: {\n          \"@vue/cli-plugin-babel\": \"^5.0.8\",\n          \"@vue/cli-service\": \"^5.0.8\"\n        }\n      })\n    }\n  },\n  main: \"/src/App.vue\",\n  environment: \"vue-cli\"\n};\nvar VUE_TS_TEMPLATE = {\n  files: {\n    \"/src/styles.css\": commonFiles[\"/styles.css\"],\n    \"/src/App.vue\": {\n      code: `<template>\n  <h1>Hello {{ msg }}</h1>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nconst msg = ref<string>('world');\n</script>`\n    },\n    \"/src/main.ts\": {\n      code: `import { createApp } from 'vue'\nimport App from './App.vue'\nimport \"./styles.css\";\n\ncreateApp(App).mount('#app')\n`\n    },\n    \"/src/shims-vue.d.ts\": '/* eslint-disable */\\ndeclare module \"*.vue\" {\\n  import type { DefineComponent } from \"vue\";\\n  const component: DefineComponent<{}, {}, any>;\\n  export default component;\\n}',\n    \"/public/index.html\": {\n      code: `<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\" />\n    <title>codesandbox</title>\n  </head>\n  <body>\n    <noscript>\n      <strong\n        >We're sorry but codesandbox doesn't work properly without JavaScript\n        enabled. Please enable it to continue.</strong\n      >\n    </noscript>\n    <div id=\"app\"></div>\n    <!-- built files will be auto injected -->\n  </body>\n</html>\n`\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        name: \"vue3-ts\",\n        version: \"0.1.0\",\n        private: true,\n        main: \"/src/main.ts\",\n        scripts: {\n          serve: \"vue-cli-service serve\",\n          build: \"vue-cli-service build\"\n        },\n        dependencies: {\n          \"core-js\": \"^3.26.1\",\n          vue: \"^3.2.45\"\n        },\n        devDependencies: {\n          \"@vue/cli-plugin-babel\": \"^5.0.8\",\n          \"@vue/cli-plugin-typescript\": \"^5.0.8\",\n          \"@vue/cli-service\": \"^5.0.8\",\n          typescript: \"^4.9.3\"\n        }\n      })\n    },\n    \"/tsconfig.json\": {\n      code: JSON.stringify({\n        compilerOptions: {\n          target: \"esnext\",\n          module: \"esnext\",\n          strict: true,\n          jsx: \"preserve\",\n          moduleResolution: \"node\",\n          experimentalDecorators: true,\n          skipLibCheck: true,\n          esModuleInterop: true,\n          allowSyntheticDefaultImports: true,\n          forceConsistentCasingInFileNames: true,\n          useDefineForClassFields: true,\n          sourceMap: false,\n          baseUrl: \".\",\n          types: [\"webpack-env\"],\n          paths: {\n            \"@/*\": [\"src/*\"]\n          },\n          lib: [\"esnext\", \"dom\", \"dom.iterable\", \"scripthost\"]\n        },\n        include: [\"src/**/*.ts\", \"src/**/*.tsx\", \"src/**/*.vue\", \"tests/**/*.ts\", \"tests/**/*.tsx\"],\n        exclude: [\"node_modules\"]\n      })\n    }\n  },\n  main: \"/src/App.vue\",\n  environment: \"vue-cli\"\n};\nvar STATIC_TEMPLATE = {\n  files: __assign(__assign({}, commonFiles), {\n    \"/index.html\": {\n      code: '<!DOCTYPE html>\\n<html>\\n\\n<head>\\n  <title>Parcel Sandbox</title>\\n  <meta charset=\"UTF-8\" />\\n  <link rel=\"stylesheet\" href=\"/styles.css\" />\\n</head>\\n\\n<body>\\n  <h1>Hello world</h1>\\n</body>\\n\\n</html>'\n    },\n    \"/package.json\": {\n      code: JSON.stringify({\n        dependencies: {},\n        main: \"/index.html\"\n      })\n    }\n  }),\n  main: \"/index.html\",\n  environment: \"static\"\n};\nvar SANDBOX_TEMPLATES = {\n  static: STATIC_TEMPLATE,\n  angular: ANGULAR_TEMPLATE,\n  react: REACT_TEMPLATE,\n  \"react-ts\": REACT_TYPESCRIPT_TEMPLATE,\n  solid: SOLID_TEMPLATE,\n  svelte: SVELTE_TEMPLATE,\n  \"test-ts\": TEST_TYPESCRIPT_TEMPLATE,\n  \"vanilla-ts\": VANILLA_TYPESCRIPT_TEMPLATE,\n  vanilla: VANILLA_TEMPLATE,\n  vue: VUE_TEMPLATE,\n  \"vue-ts\": VUE_TS_TEMPLATE,\n  node: NODE_TEMPLATE,\n  nextjs: NEXTJS_TEMPLATE,\n  vite: VITE_TEMPLATE,\n  \"vite-react\": VITE_REACT_TEMPLATE,\n  \"vite-react-ts\": VITE_REACT_TS_TEMPLATE,\n  \"vite-vue\": VITE_VUE_TEMPLATE,\n  \"vite-vue-ts\": VITE_VUE_TS_TEMPLATE,\n  \"vite-svelte\": VITE_SVELTE_TEMPLATE,\n  \"vite-svelte-ts\": VITE_SVELTE_TS_TEMPLATE,\n  astro: ASTRO_TEMPLATE\n};\nvar getSandpackStateFromProps = function (props) {\n  var _a2, _b2, _c2, _d, _e, _f;\n  var normalizedFilesPath = normalizePath(props.files);\n  var projectSetup = combineTemplateFilesToSetup({\n    template: props.template,\n    customSetup: props.customSetup,\n    files: normalizedFilesPath\n  });\n  var visibleFiles = normalizePath((_b2 = (_a2 = props.options) === null || _a2 === void 0 ? void 0 : _a2.visibleFiles) !== null && _b2 !== void 0 ? _b2 : []);\n  var activeFile = ((_c2 = props.options) === null || _c2 === void 0 ? void 0 : _c2.activeFile) ? resolveFile((_d = props.options) === null || _d === void 0 ? void 0 : _d.activeFile, projectSetup.files) : void 0;\n  if (visibleFiles.length === 0 && normalizedFilesPath) {\n    Object.keys(normalizedFilesPath).forEach(function (filePath) {\n      var file = normalizedFilesPath[filePath];\n      if (typeof file === \"string\") {\n        visibleFiles.push(filePath);\n        return;\n      }\n      if (!activeFile && file.active) {\n        activeFile = filePath;\n        if (file.hidden === true) {\n          visibleFiles.push(filePath);\n        }\n      }\n      if (!file.hidden) {\n        visibleFiles.push(filePath);\n      }\n    });\n  }\n  if (visibleFiles.length === 0) {\n    visibleFiles = [projectSetup.main];\n  }\n  if (projectSetup.entry && !projectSetup.files[projectSetup.entry]) {\n    projectSetup.entry = resolveFile(projectSetup.entry, projectSetup.files);\n  }\n  if (!activeFile && projectSetup.main) {\n    activeFile = projectSetup.main;\n  }\n  if (!activeFile || !projectSetup.files[activeFile]) {\n    activeFile = visibleFiles[0];\n  }\n  if (!visibleFiles.includes(activeFile)) {\n    visibleFiles.push(activeFile);\n  }\n  var files = addPackageJSONIfNeeded(projectSetup.files, (_e = projectSetup.dependencies) !== null && _e !== void 0 ? _e : {}, (_f = projectSetup.devDependencies) !== null && _f !== void 0 ? _f : {}, projectSetup.entry);\n  var existOpenPath = visibleFiles.filter(function (path) {\n    return files[path];\n  });\n  return {\n    visibleFiles: existOpenPath,\n    /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */activeFile,\n    files,\n    environment: projectSetup.environment,\n    shouldUpdatePreview: true\n  };\n};\nvar resolveFile = function (path, files) {\n  var normalizedFilesPath = normalizePath(files);\n  var normalizedPath = normalizePath(path);\n  if (normalizedPath in normalizedFilesPath) {\n    return normalizedPath;\n  }\n  if (!path) {\n    return null;\n  }\n  var resolvedPath = null;\n  var index = 0;\n  var strategies = [\".js\", \".jsx\", \".ts\", \".tsx\"];\n  while (!resolvedPath && index < strategies.length) {\n    var removeExtension = normalizedPath.split(\".\")[0];\n    var attemptPath = \"\" + removeExtension + strategies[index];\n    if (normalizedFilesPath[attemptPath] !== void 0) {\n      resolvedPath = attemptPath;\n    }\n    index++;\n  }\n  return resolvedPath;\n};\nvar combineTemplateFilesToSetup = function (_a2) {\n  var files = _a2.files,\n    template = _a2.template,\n    customSetup = _a2.customSetup;\n  if (!template) {\n    if (!customSetup) {\n      var defaultTemplate = SANDBOX_TEMPLATES.vanilla;\n      return __assign(__assign({}, defaultTemplate), {\n        files: __assign(__assign({}, defaultTemplate.files), convertedFilesToBundlerFiles(files))\n      });\n    }\n    if (!files || Object.keys(files).length === 0) {\n      throw new Error(\"[sandpack-react]: without a template, you must pass at least one file\");\n    }\n    return __assign(__assign({}, customSetup), {\n      files: convertedFilesToBundlerFiles(files)\n    });\n  }\n  var baseTemplate = SANDBOX_TEMPLATES[template];\n  if (!baseTemplate) {\n    throw new Error('[sandpack-react]: invalid template \"' + template + '\" provided');\n  }\n  if (!customSetup && !files) {\n    return baseTemplate;\n  }\n  return {\n    /**\n    * The input setup might have files in the simple form Record<string, string>\n    * so we convert them to the sandbox template format\n    */\n    files: convertedFilesToBundlerFiles(__assign(__assign({}, baseTemplate.files), files)),\n    /**\n    * Merge template dependencies and user custom dependencies.\n    * As a rule, the custom dependencies must overwrite the template ones.\n    */\n    dependencies: __assign(__assign({}, baseTemplate.dependencies), customSetup === null || customSetup === void 0 ? void 0 : customSetup.dependencies),\n    devDependencies: __assign(__assign({}, baseTemplate.devDependencies), customSetup === null || customSetup === void 0 ? void 0 : customSetup.devDependencies),\n    entry: normalizePath(customSetup === null || customSetup === void 0 ? void 0 : customSetup.entry),\n    main: baseTemplate.main,\n    environment: (customSetup === null || customSetup === void 0 ? void 0 : customSetup.environment) || baseTemplate.environment\n  };\n};\nvar convertedFilesToBundlerFiles = function (files) {\n  if (!files) return {};\n  return Object.keys(files).reduce(function (acc, key) {\n    if (typeof files[key] === \"string\") {\n      acc[key] = {\n        code: files[key]\n      };\n    } else {\n      acc[key] = files[key];\n    }\n    return acc;\n  }, {});\n};\nvar useAppState = function (props, files) {\n  var _a2 = useState3({\n      editorState: \"pristine\",\n      teamId: props.teamId\n    }),\n    state = _a2[0],\n    setState = _a2[1];\n  var originalStateFromProps = getSandpackStateFromProps(props);\n  var editorState = dequal(originalStateFromProps.files, files) ? \"pristine\" : \"dirty\";\n  if (editorState !== state.editorState) {\n    setState(function (prev) {\n      return __assign(__assign({}, prev), {\n        editorState\n      });\n    });\n  }\n  return state;\n};\nvar BUNDLER_TIMEOUT = 4e4;\nvar useClient = function (_a2, filesState) {\n  var _b2, _c2, _d;\n  var options = _a2.options,\n    customSetup = _a2.customSetup,\n    teamId = _a2.teamId;\n  options !== null && options !== void 0 ? options : options = {};\n  customSetup !== null && customSetup !== void 0 ? customSetup : customSetup = {};\n  var initModeFromProps = (options === null || options === void 0 ? void 0 : options.initMode) || \"lazy\";\n  var _e = useState3({\n      startRoute: options === null || options === void 0 ? void 0 : options.startRoute,\n      bundlerState: void 0,\n      error: null,\n      initMode: initModeFromProps,\n      reactDevTools: void 0,\n      status: ((_b2 = options === null || options === void 0 ? void 0 : options.autorun) !== null && _b2 !== void 0 ? _b2 : true) ? \"initial\" : \"idle\"\n    }),\n    state = _e[0],\n    setState = _e[1];\n  var intersectionObserver = useRef2(null);\n  var lazyAnchorRef = useRef2(null);\n  var registeredIframes = useRef2({});\n  var clients = useRef2({});\n  var timeoutHook = useRef2(null);\n  var unsubscribeClientListeners = useRef2({});\n  var unsubscribe = useRef2();\n  var queuedListeners = useRef2({\n    global: {}\n  });\n  var debounceHook = useRef2();\n  var prevEnvironment = useRef2(filesState.environment);\n  var createClient = useCallback2(function (iframe, clientId, clientPropsOverride) {\n    return __awaiter(void 0, void 0, void 0, function () {\n      var timeOut, shouldSetTimeout, client, globalListeners;\n      var _a3, _b3, _c3;\n      return __generator(this, function (_d2) {\n        switch (_d2.label) {\n          case 0:\n            if (clients.current[clientId]) {\n              clients.current[clientId].destroy();\n            }\n            options !== null && options !== void 0 ? options : options = {};\n            customSetup !== null && customSetup !== void 0 ? customSetup : customSetup = {};\n            timeOut = (_a3 = options === null || options === void 0 ? void 0 : options.bundlerTimeOut) !== null && _a3 !== void 0 ? _a3 : BUNDLER_TIMEOUT;\n            if (timeoutHook.current) {\n              clearTimeout(timeoutHook.current);\n            }\n            shouldSetTimeout = typeof unsubscribe.current !== \"function\";\n            if (shouldSetTimeout) {\n              timeoutHook.current = setTimeout(function () {\n                unregisterAllClients();\n                setState(function (prev) {\n                  return __assign(__assign({}, prev), {\n                    status: \"timeout\"\n                  });\n                });\n              }, timeOut);\n            }\n            return [4, loadSandpackClient(iframe, {\n              files: filesState.files,\n              template: filesState.environment\n            }, {\n              externalResources: options.externalResources,\n              bundlerURL: options.bundlerURL,\n              startRoute: (_b3 = clientPropsOverride === null || clientPropsOverride === void 0 ? void 0 : clientPropsOverride.startRoute) !== null && _b3 !== void 0 ? _b3 : options.startRoute,\n              fileResolver: options.fileResolver,\n              skipEval: (_c3 = options.skipEval) !== null && _c3 !== void 0 ? _c3 : false,\n              logLevel: options.logLevel,\n              showOpenInCodeSandbox: false,\n              showErrorScreen: true,\n              showLoadingScreen: false,\n              reactDevTools: state.reactDevTools,\n              customNpmRegistries: customSetup === null || customSetup === void 0 ? void 0 : customSetup.npmRegistries,\n              teamId\n            })];\n          case 1:\n            client = _d2.sent();\n            if (typeof unsubscribe.current !== \"function\") {\n              unsubscribe.current = client.listen(handleMessage);\n            }\n            unsubscribeClientListeners.current[clientId] = unsubscribeClientListeners.current[clientId] || {};\n            if (queuedListeners.current[clientId]) {\n              Object.keys(queuedListeners.current[clientId]).forEach(function (listenerId) {\n                var listener = queuedListeners.current[clientId][listenerId];\n                var unsubscribe2 = client.listen(listener);\n                unsubscribeClientListeners.current[clientId][listenerId] = unsubscribe2;\n              });\n              queuedListeners.current[clientId] = {};\n            }\n            globalListeners = Object.entries(queuedListeners.current.global);\n            globalListeners.forEach(function (_a4) {\n              var listenerId = _a4[0],\n                listener = _a4[1];\n              var unsubscribe2 = client.listen(listener);\n              unsubscribeClientListeners.current[clientId][listenerId] = unsubscribe2;\n            });\n            clients.current[clientId] = client;\n            return [2];\n        }\n      });\n    });\n  }, [filesState.environment, filesState.files, state.reactDevTools]);\n  var unregisterAllClients = useCallback2(function () {\n    Object.keys(clients.current).map(unregisterBundler);\n    if (typeof unsubscribe.current === \"function\") {\n      unsubscribe.current();\n      unsubscribe.current = void 0;\n    }\n  }, []);\n  var runSandpack = useCallback2(function () {\n    return __awaiter(void 0, void 0, void 0, function () {\n      return __generator(this, function (_a3) {\n        switch (_a3.label) {\n          case 0:\n            return [4, Promise.all(Object.entries(registeredIframes.current).map(function (_a4) {\n              var clientId = _a4[0],\n                _b3 = _a4[1],\n                iframe = _b3.iframe,\n                _c3 = _b3.clientPropsOverride,\n                clientPropsOverride = _c3 === void 0 ? {} : _c3;\n              return __awaiter(void 0, void 0, void 0, function () {\n                return __generator(this, function (_d2) {\n                  switch (_d2.label) {\n                    case 0:\n                      return [4, createClient(iframe, clientId, clientPropsOverride)];\n                    case 1:\n                      _d2.sent();\n                      return [2];\n                  }\n                });\n              });\n            }))];\n          case 1:\n            _a3.sent();\n            setState(function (prev) {\n              return __assign(__assign({}, prev), {\n                error: null,\n                status: \"running\"\n              });\n            });\n            return [2];\n        }\n      });\n    });\n  }, [createClient]);\n  var initializeSandpackIframe = useCallback2(function () {\n    var _a3, _b3, _c3;\n    var autorun = (_a3 = options === null || options === void 0 ? void 0 : options.autorun) !== null && _a3 !== void 0 ? _a3 : true;\n    if (!autorun) {\n      return;\n    }\n    var observerOptions = (_b3 = options === null || options === void 0 ? void 0 : options.initModeObserverOptions) !== null && _b3 !== void 0 ? _b3 : {\n      rootMargin: \"1000px 0px\"\n    };\n    if (intersectionObserver.current && lazyAnchorRef.current) {\n      (_c3 = intersectionObserver.current) === null || _c3 === void 0 ? void 0 : _c3.unobserve(lazyAnchorRef.current);\n    }\n    if (lazyAnchorRef.current && state.initMode === \"lazy\") {\n      intersectionObserver.current = new IntersectionObserver(function (entries) {\n        var _a4;\n        if (entries.some(function (entry) {\n          return entry.isIntersecting;\n        })) {\n          runSandpack();\n          if (lazyAnchorRef.current) {\n            (_a4 = intersectionObserver.current) === null || _a4 === void 0 ? void 0 : _a4.unobserve(lazyAnchorRef.current);\n          }\n        }\n      }, observerOptions);\n      intersectionObserver.current.observe(lazyAnchorRef.current);\n    } else if (lazyAnchorRef.current && state.initMode === \"user-visible\") {\n      intersectionObserver.current = new IntersectionObserver(function (entries) {\n        if (entries.some(function (entry) {\n          return entry.isIntersecting;\n        })) {\n          runSandpack();\n        } else {\n          Object.keys(clients.current).map(unregisterBundler);\n          unregisterAllClients();\n        }\n      }, observerOptions);\n      intersectionObserver.current.observe(lazyAnchorRef.current);\n    } else {\n      runSandpack();\n    }\n  }, [options === null || options === void 0 ? void 0 : options.autorun, options === null || options === void 0 ? void 0 : options.initModeObserverOptions, runSandpack, state.initMode, unregisterAllClients]);\n  var registerBundler = useCallback2(function (iframe, clientId, clientPropsOverride) {\n    return __awaiter(void 0, void 0, void 0, function () {\n      return __generator(this, function (_a3) {\n        switch (_a3.label) {\n          case 0:\n            registeredIframes.current[clientId] = {\n              iframe,\n              clientPropsOverride\n            };\n            if (!(state.status === \"running\")) return [3, 2];\n            return [4, createClient(iframe, clientId, clientPropsOverride)];\n          case 1:\n            _a3.sent();\n            _a3.label = 2;\n          case 2:\n            return [2];\n        }\n      });\n    });\n  }, [createClient, state.status]);\n  var unregisterBundler = function (clientId) {\n    var _a3, _b3;\n    var client = clients.current[clientId];\n    if (client) {\n      client.destroy();\n      (_a3 = client.iframe.contentWindow) === null || _a3 === void 0 ? void 0 : _a3.location.replace(\"about:blank\");\n      client.iframe.removeAttribute(\"src\");\n      delete clients.current[clientId];\n    }\n    delete registeredIframes.current[clientId];\n    if (timeoutHook.current) {\n      clearTimeout(timeoutHook.current);\n    }\n    var unsubscribeQueuedClients = Object.values((_b3 = unsubscribeClientListeners.current[clientId]) !== null && _b3 !== void 0 ? _b3 : {});\n    unsubscribeQueuedClients.forEach(function (listenerOfClient) {\n      var listenerFunctions = Object.values(listenerOfClient);\n      listenerFunctions.forEach(function (unsubscribe2) {\n        return unsubscribe2();\n      });\n    });\n    var status = Object.keys(clients.current).length > 0 ? \"running\" : \"idle\";\n    setState(function (prev) {\n      return __assign(__assign({}, prev), {\n        status\n      });\n    });\n  };\n  var handleMessage = function (msg) {\n    if (msg.type === \"start\") {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          error: null\n        });\n      });\n    } else if (msg.type === \"state\") {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          bundlerState: msg.state\n        });\n      });\n    } else if (msg.type === \"done\" && !msg.compilatonError || msg.type === \"connected\") {\n      if (timeoutHook.current) {\n        clearTimeout(timeoutHook.current);\n      }\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          error: null\n        });\n      });\n    } else if (msg.type === \"action\" && msg.action === \"show-error\") {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          error: extractErrorDetails(msg)\n        });\n      });\n    } else if (msg.type === \"action\" && msg.action === \"notification\" && msg.notificationType === \"error\") {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          error: {\n            message: msg.title\n          }\n        });\n      });\n    }\n  };\n  var registerReactDevTools = function (value) {\n    setState(function (prev) {\n      return __assign(__assign({}, prev), {\n        reactDevTools: value\n      });\n    });\n  };\n  var recompileMode = (_c2 = options === null || options === void 0 ? void 0 : options.recompileMode) !== null && _c2 !== void 0 ? _c2 : \"delayed\";\n  var recompileDelay = (_d = options === null || options === void 0 ? void 0 : options.recompileDelay) !== null && _d !== void 0 ? _d : 500;\n  var dispatchMessage = function (message, clientId) {\n    if (state.status !== \"running\") {\n      console.warn(\"[sandpack-react]: dispatch cannot be called while in idle mode\");\n      return;\n    }\n    if (clientId) {\n      clients.current[clientId].dispatch(message);\n    } else {\n      Object.values(clients.current).forEach(function (client) {\n        client.dispatch(message);\n      });\n    }\n  };\n  var addListener = function (listener, clientId) {\n    if (clientId) {\n      if (clients.current[clientId]) {\n        var unsubscribeListener = clients.current[clientId].listen(listener);\n        return unsubscribeListener;\n      } else {\n        var listenerId_1 = generateRandomId();\n        queuedListeners.current[clientId] = queuedListeners.current[clientId] || {};\n        unsubscribeClientListeners.current[clientId] = unsubscribeClientListeners.current[clientId] || {};\n        queuedListeners.current[clientId][listenerId_1] = listener;\n        var unsubscribeListener = function () {\n          if (queuedListeners.current[clientId][listenerId_1]) {\n            delete queuedListeners.current[clientId][listenerId_1];\n          } else if (unsubscribeClientListeners.current[clientId][listenerId_1]) {\n            unsubscribeClientListeners.current[clientId][listenerId_1]();\n            delete unsubscribeClientListeners.current[clientId][listenerId_1];\n          }\n        };\n        return unsubscribeListener;\n      }\n    } else {\n      var listenerId_2 = generateRandomId();\n      queuedListeners.current.global[listenerId_2] = listener;\n      var clientsList = Object.values(clients.current);\n      var currentClientUnsubscribeListeners_1 = clientsList.map(function (client) {\n        return client.listen(listener);\n      });\n      var unsubscribeListener = function () {\n        currentClientUnsubscribeListeners_1.forEach(function (unsubscribe2) {\n          return unsubscribe2();\n        });\n        delete queuedListeners.current.global[listenerId_2];\n        Object.values(unsubscribeClientListeners.current).forEach(function (client) {\n          var _a3;\n          (_a3 = client === null || client === void 0 ? void 0 : client[listenerId_2]) === null || _a3 === void 0 ? void 0 : _a3.call(client);\n        });\n      };\n      return unsubscribeListener;\n    }\n  };\n  useEffect3(function watchFileChanges() {\n    if (state.status !== \"running\" || !filesState.shouldUpdatePreview) {\n      return;\n    }\n    if (prevEnvironment.current !== filesState.environment) {\n      prevEnvironment.current = filesState.environment;\n      Object.entries(clients.current).forEach(function (_a3) {\n        var key = _a3[0],\n          client = _a3[1];\n        registerBundler(client.iframe, key);\n      });\n    }\n    if (recompileMode === \"immediate\") {\n      Object.values(clients.current).forEach(function (client) {\n        if (client.status === \"done\") {\n          client.updateSandbox({\n            files: filesState.files,\n            template: filesState.environment\n          });\n        }\n      });\n    }\n    if (recompileMode === \"delayed\") {\n      if (typeof window === \"undefined\") return;\n      window.clearTimeout(debounceHook.current);\n      debounceHook.current = window.setTimeout(function () {\n        Object.values(clients.current).forEach(function (client) {\n          if (client.status === \"done\") {\n            client.updateSandbox({\n              files: filesState.files,\n              template: filesState.environment\n            });\n          }\n        });\n      }, recompileDelay);\n    }\n    return function () {\n      window.clearTimeout(debounceHook.current);\n    };\n  }, [filesState.files, filesState.environment, filesState.shouldUpdatePreview, recompileDelay, recompileMode, registerBundler, state.status]);\n  useEffect3(function watchInitMode() {\n    if (initModeFromProps !== state.initMode) {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          initMode: initModeFromProps\n        });\n      });\n      initializeSandpackIframe();\n    }\n  }, [initModeFromProps, initializeSandpackIframe, state.initMode]);\n  useEffect3(function () {\n    return function unmountClient() {\n      if (typeof unsubscribe.current === \"function\") {\n        unsubscribe.current();\n      }\n      if (timeoutHook.current) {\n        clearTimeout(timeoutHook.current);\n      }\n      if (debounceHook.current) {\n        clearTimeout(debounceHook.current);\n      }\n      if (intersectionObserver.current) {\n        intersectionObserver.current.disconnect();\n      }\n    };\n  }, []);\n  return [state, {\n    clients: clients.current,\n    initializeSandpackIframe,\n    runSandpack,\n    registerBundler,\n    unregisterBundler,\n    registerReactDevTools,\n    addListener,\n    dispatchMessage,\n    lazyAnchorRef,\n    unsubscribeClientListenersRef: unsubscribeClientListeners,\n    queuedListenersRef: queuedListeners\n  }];\n};\nvar useFiles = function (props) {\n  var originalStateFromProps = getSandpackStateFromProps(props);\n  var _a2 = useState3(originalStateFromProps),\n    state = _a2[0],\n    setState = _a2[1];\n  var isMountedRef = useRef2(false);\n  useEffect3(function () {\n    if (isMountedRef.current) {\n      setState(getSandpackStateFromProps(props));\n    } else {\n      isMountedRef.current = true;\n    }\n  }, [props.files, props.customSetup, props.template]);\n  var updateFile = function (pathOrFiles, code, shouldUpdatePreview) {\n    if (shouldUpdatePreview === void 0) {\n      shouldUpdatePreview = true;\n    }\n    setState(function (prev) {\n      var _a3;\n      var files = prev.files;\n      if (typeof pathOrFiles === \"string\" && typeof code === \"string\") {\n        files = __assign(__assign({}, files), (_a3 = {}, _a3[pathOrFiles] = {\n          code\n        }, _a3));\n      } else if (typeof pathOrFiles === \"object\") {\n        files = __assign(__assign({}, files), convertedFilesToBundlerFiles(pathOrFiles));\n      }\n      return __assign(__assign({}, prev), {\n        files: normalizePath(files),\n        shouldUpdatePreview\n      });\n    });\n  };\n  var operations = {\n    openFile: function (path) {\n      setState(function (_a3) {\n        var visibleFiles = _a3.visibleFiles,\n          rest = __rest(_a3, [\"visibleFiles\"]);\n        var newPaths = visibleFiles.includes(path) ? visibleFiles : __spreadArray(__spreadArray([], visibleFiles, true), [path], false);\n        return __assign(__assign({}, rest), {\n          activeFile: path,\n          visibleFiles: newPaths\n        });\n      });\n    },\n    resetFile: function (path) {\n      setState(function (prevState) {\n        var _a3;\n        return __assign(__assign({}, prevState), {\n          files: __assign(__assign({}, prevState.files), (_a3 = {}, _a3[path] = originalStateFromProps.files[path], _a3))\n        });\n      });\n    },\n    resetAllFiles: function () {\n      setState(function (prev) {\n        return __assign(__assign({}, prev), {\n          files: originalStateFromProps.files\n        });\n      });\n    },\n    setActiveFile: function (activeFile) {\n      if (state.files[activeFile]) {\n        setState(function (prev) {\n          return __assign(__assign({}, prev), {\n            activeFile\n          });\n        });\n      }\n    },\n    updateCurrentFile: function (code, shouldUpdatePreview) {\n      if (shouldUpdatePreview === void 0) {\n        shouldUpdatePreview = true;\n      }\n      updateFile(state.activeFile, code, shouldUpdatePreview);\n    },\n    updateFile,\n    addFile: updateFile,\n    closeFile: function (path) {\n      if (state.visibleFiles.length === 1) {\n        return;\n      }\n      setState(function (_a3) {\n        var visibleFiles = _a3.visibleFiles,\n          activeFile = _a3.activeFile,\n          prev = __rest(_a3, [\"visibleFiles\", \"activeFile\"]);\n        var indexOfRemovedPath = visibleFiles.indexOf(path);\n        var newPaths = visibleFiles.filter(function (openPath) {\n          return openPath !== path;\n        });\n        return __assign(__assign({}, prev), {\n          activeFile: path === activeFile ? indexOfRemovedPath === 0 ? visibleFiles[1] : visibleFiles[indexOfRemovedPath - 1] : activeFile,\n          visibleFiles: newPaths\n        });\n      });\n    },\n    deleteFile: function (path, shouldUpdatePreview) {\n      if (shouldUpdatePreview === void 0) {\n        shouldUpdatePreview = true;\n      }\n      setState(function (_a3) {\n        var visibleFiles = _a3.visibleFiles,\n          files = _a3.files,\n          activeFile = _a3.activeFile,\n          rest = __rest(_a3, [\"visibleFiles\", \"files\", \"activeFile\"]);\n        var newFiles = __assign({}, files);\n        delete newFiles[path];\n        var remainingVisibleFiles = visibleFiles.filter(function (openPath) {\n          return openPath !== path;\n        });\n        var deletedLastVisibleFile = remainingVisibleFiles.length === 0;\n        if (deletedLastVisibleFile) {\n          var nextFile = Object.keys(files)[Object.keys(files).length - 1];\n          return __assign(__assign({}, rest), {\n            visibleFiles: [nextFile],\n            activeFile: nextFile,\n            files: newFiles,\n            shouldUpdatePreview\n          });\n        }\n        return __assign(__assign({}, rest), {\n          visibleFiles: remainingVisibleFiles,\n          activeFile: path === activeFile ? remainingVisibleFiles[remainingVisibleFiles.length - 1] : activeFile,\n          files: newFiles,\n          shouldUpdatePreview\n        });\n      });\n    }\n  };\n  return [__assign(__assign({}, state), {\n    visibleFilesFromProps: originalStateFromProps.visibleFiles\n  }), operations];\n};\nvar Sandpack$1 = /*#__PURE__*/React3.createContext(null);\nvar SandpackProvider = function (props) {\n  var _a2, _b2;\n  var children = props.children,\n    options = props.options,\n    style = props.style,\n    className = props.className,\n    theme = props.theme;\n  var _c2 = useFiles(props),\n    fileState = _c2[0],\n    fileOperations = _c2[1];\n  var _d = useClient(props, fileState),\n    clientState = _d[0],\n    _e = _d[1],\n    dispatchMessage = _e.dispatchMessage,\n    addListener = _e.addListener,\n    clientOperations = __rest(_e, [\"dispatchMessage\", \"addListener\"]);\n  var appState = useAppState(props, fileState.files);\n  React3.useEffect(function () {\n    clientOperations.initializeSandpackIframe();\n  }, []);\n  return jsx(Sandpack$1.Provider, __assign({\n    value: __assign(__assign(__assign(__assign(__assign(__assign({}, fileState), clientState), appState), fileOperations), clientOperations), {\n      autoReload: (_b2 = (_a2 = props.options) === null || _a2 === void 0 ? void 0 : _a2.autoReload) !== null && _b2 !== void 0 ? _b2 : true,\n      listen: addListener,\n      dispatch: dispatchMessage\n    })\n  }, {\n    children: jsx(ClassNamesProvider, __assign({\n      classes: options === null || options === void 0 ? void 0 : options.classes\n    }, {\n      children: jsx(SandpackThemeProvider, __assign({\n        className,\n        style,\n        theme\n      }, {\n        children\n      }), void 0)\n    }), void 0)\n  }), void 0);\n};\nvar SandpackConsumer = Sandpack$1.Consumer;\nfunction useSandpack() {\n  var sandpack = React3.useContext(Sandpack$1);\n  if (sandpack === null) {\n    throw new Error('[sandpack-react]: \"useSandpack\" must be wrapped by a \"SandpackProvider\"');\n  }\n  var dispatch = sandpack.dispatch,\n    listen = sandpack.listen,\n    rest = __rest(sandpack, [\"dispatch\", \"listen\"]);\n  return {\n    sandpack: __assign({}, rest),\n    dispatch,\n    listen\n  };\n}\nvar useActiveCode = function () {\n  var _a2, _b2, _c2;\n  var sandpack = useSandpack().sandpack;\n  return {\n    code: (_a2 = sandpack.files[sandpack.activeFile]) === null || _a2 === void 0 ? void 0 : _a2.code,\n    readOnly: (_c2 = (_b2 = sandpack.files[sandpack.activeFile]) === null || _b2 === void 0 ? void 0 : _b2.readOnly) !== null && _c2 !== void 0 ? _c2 : false,\n    updateCode: sandpack.updateCurrentFile\n  };\n};\nvar _a$8;\nvar _b$2;\nvar _c;\nvar iconStandaloneClassName = css({\n  svg: {\n    margin: \"auto\"\n  }\n});\nvar buttonClassName = css((_a$8 = {\n  appearance: \"none\",\n  outline: \"none\",\n  display: \"flex\",\n  alignItems: \"center\",\n  fontSize: \"inherit\",\n  fontFamily: \"inherit\",\n  backgroundColor: \"transparent\",\n  transition: \"color $default, background $default\",\n  cursor: \"pointer\",\n  color: \"$colors$clickable\",\n  border: 0,\n  textDecoration: \"none\",\n  \"&:disabled\": {\n    color: \"$colors$disabled\"\n  },\n  \"&:hover:not(:disabled,[data-active='true'])\": {\n    color: \"$colors$hover\"\n  },\n  '&[data-active=\"true\"]': {\n    color: \"$colors$accent\"\n  },\n  svg: {\n    minWidth: \"$space$4\",\n    width: \"$space$4\",\n    height: \"$space$4\"\n  }\n}, _a$8[\"&.\" + iconStandaloneClassName] = {\n  padding: \"$space$1\",\n  height: \"$space$7\",\n  display: \"flex\"\n}, _a$8[\"&.\" + iconStandaloneClassName + \"&:not(:has(span))\"] = {\n  width: \"$space$7\"\n}, _a$8[\"&.\" + iconStandaloneClassName + \"&:has(svg + span)\"] = {\n  paddingRight: \"$space$3\",\n  paddingLeft: \"$space$2\",\n  gap: \"$space$1\"\n}, _a$8));\nvar roundedButtonClassName = css({\n  backgroundColor: \"$colors$surface2\",\n  borderRadius: \"99999px\",\n  border: \"1px solid $colors$surface3\",\n  '&[data-active=\"true\"]': {\n    color: \"$colors$surface1\",\n    background: \"$colors$accent\"\n  },\n  \"&:hover:not(:disabled,[data-active='true'])\": {\n    backgroundColor: \"$colors$surface3\"\n  }\n});\nvar iconClassName = css({\n  padding: 0\n});\nvar fadeIn = keyframes({\n  \"0%\": {\n    opacity: 0\n  },\n  \"100%\": {\n    opacity: 1\n  }\n});\nvar absoluteClassName = css({\n  position: \"absolute\",\n  bottom: \"0\",\n  left: \"0\",\n  right: \"0\",\n  top: \"0\",\n  margin: \"0\",\n  overflow: \"auto\",\n  height: \"100%\",\n  zIndex: \"$top\"\n});\nvar errorClassName = css((_b$2 = {\n  whiteSpace: \"pre-wrap\",\n  padding: \"$space$10\",\n  backgroundColor: \"$colors$surface1\",\n  display: \"flex\",\n  gap: \"$space$2\",\n  flexDirection: \"column\"\n}, _b$2[\".\" + buttonClassName] = {\n  width: \"auto\",\n  gap: \"$space$2\",\n  padding: \"0 $space$3 0 $space$2\",\n  marginTop: \"$space$1\"\n}, _b$2.variants = {\n  solidBg: {\n    true: {\n      backgroundColor: \"$colors$errorSurface\"\n    }\n  }\n}, _b$2));\nvar errorBundlerClassName = css((_c = {\n  padding: \"$space$10\",\n  backgroundColor: \"$colors$surface1\"\n}, _c[\".\" + buttonClassName] = {\n  marginTop: \"$space$6\",\n  width: \"auto\",\n  gap: \"$space$2\",\n  padding: \"0 $space$3 0 $space$2\"\n}, _c));\nvar errorMessageClassName = css({\n  animation: fadeIn + \" 150ms ease\",\n  color: \"$colors$error\",\n  display: \"flex\",\n  flexDirection: \"column\",\n  gap: \"$space$3\",\n  variants: {\n    errorCode: {\n      true: {\n        fontFamily: \"$font$mono\"\n      }\n    }\n  },\n  a: {\n    color: \"inherit\"\n  },\n  p: {\n    margin: 0\n  }\n});\nvar _a$7;\nvar tabsClassName = css({\n  borderBottom: \"1px solid $colors$surface2\",\n  background: \"$colors$surface1\"\n});\nvar tabsScrollableClassName = css({\n  padding: \"0 $space$2\",\n  overflow: \"auto\",\n  display: \"flex\",\n  flexWrap: \"nowrap\",\n  alignItems: \"stretch\",\n  minHeight: \"40px\",\n  marginBottom: \"-1px\"\n});\nvar closeButtonClassName = css({\n  padding: \"0 $space$1 0 $space$1\",\n  borderRadius: \"$border$radius\",\n  marginLeft: \"$space$1\",\n  width: \"$space$5\",\n  visibility: \"hidden\",\n  svg: {\n    width: \"$space$3\",\n    height: \"$space$3\",\n    display: \"block\",\n    position: \"relative\",\n    top: 1\n  }\n});\nvar tabButton = css((_a$7 = {\n  padding: \"0 $space$2\",\n  height: \"$layout$headerHeight\",\n  whiteSpace: \"nowrap\",\n  \"&:focus\": {\n    outline: \"none\"\n  }\n}, _a$7[\"&:hover > .\" + closeButtonClassName] = {\n  visibility: \"unset\"\n}, _a$7));\nvar FileTabs = function (_a2) {\n  var closableTabs = _a2.closableTabs,\n    className = _a2.className,\n    props = __rest(_a2, [\"closableTabs\", \"className\"]);\n  var sandpack = useSandpack().sandpack;\n  var classNames = useClassNames();\n  var activeFile = sandpack.activeFile,\n    visibleFiles = sandpack.visibleFiles,\n    setActiveFile = sandpack.setActiveFile;\n  var handleCloseFile = function (ev) {\n    ev.stopPropagation();\n    var tabElm = ev.target.closest(\"[data-active]\");\n    var pathToClose = tabElm === null || tabElm === void 0 ? void 0 : tabElm.getAttribute(\"title\");\n    if (!pathToClose) {\n      return;\n    }\n    sandpack.closeFile(pathToClose);\n  };\n  var getTriggerText = function (currentPath) {\n    var documentFileName = getFileName(currentPath);\n    var pathsWithDuplicateFileNames = visibleFiles.reduce(function (prev, curr) {\n      if (curr === currentPath) {\n        return prev;\n      }\n      var fileName = getFileName(curr);\n      if (fileName === documentFileName) {\n        prev.push(curr);\n        return prev;\n      }\n      return prev;\n    }, []);\n    if (pathsWithDuplicateFileNames.length === 0) {\n      return documentFileName;\n    } else {\n      return calculateNearestUniquePath(currentPath, pathsWithDuplicateFileNames);\n    }\n  };\n  return jsx(\"div\", __assign({\n    className: classNames(\"tabs\", [tabsClassName, className]),\n    translate: \"no\"\n  }, props, {\n    children: jsx(\"div\", __assign({\n      \"aria-label\": \"Select active file\",\n      className: classNames(\"tabs-scrollable-container\", [tabsScrollableClassName]),\n      role: \"tablist\"\n    }, {\n      children: visibleFiles.map(function (filePath) {\n        return jsxs(\"button\", __assign({\n          \"aria-selected\": filePath === activeFile,\n          className: classNames(\"tab-button\", [buttonClassName, tabButton]),\n          \"data-active\": filePath === activeFile,\n          onClick: function () {\n            return setActiveFile(filePath);\n          },\n          role: \"tab\",\n          title: filePath,\n          type: \"button\"\n        }, {\n          children: [getTriggerText(filePath), closableTabs && visibleFiles.length > 1 && jsx(\"span\", __assign({\n            className: classNames(\"close-button\", [closeButtonClassName]),\n            onClick: handleCloseFile\n          }, {\n            children: jsx(CloseIcon, {}, void 0)\n          }), void 0)]\n        }), filePath);\n      })\n    }), void 0)\n  }), void 0);\n};\nvar RoundedButton = function (_a2) {\n  var onClick = _a2.onClick,\n    className = _a2.className,\n    children = _a2.children;\n  var classNames = useClassNames();\n  return jsx(\"button\", __assign({\n    className: classNames(\"button\", [classNames(\"icon-standalone\"), buttonClassName, iconStandaloneClassName, roundedButtonClassName, className]),\n    onClick,\n    type: \"button\"\n  }, {\n    children\n  }), void 0);\n};\nvar runButtonClassName = css({\n  position: \"absolute\",\n  bottom: \"$space$2\",\n  right: \"$space$2\",\n  paddingRight: \"$space$3\"\n});\nvar RunButton$1 = function (_a2) {\n  _a2.className;\n  var onClick = _a2.onClick,\n    props = __rest(_a2, [\"className\", \"onClick\"]);\n  var sandpack = useSandpack().sandpack;\n  return jsxs(RoundedButton, __assign({\n    className: runButtonClassName.toString(),\n    onClick: function (event) {\n      sandpack.runSandpack();\n      onClick === null || onClick === void 0 ? void 0 : onClick(event);\n    }\n  }, props, {\n    children: [jsx(RunIcon, {}, void 0), jsx(\"span\", {\n      children: \"Run\"\n    }, void 0)]\n  }), void 0);\n};\nvar _a$6;\nvar stackClassName = css((_a$6 = {\n  display: \"flex\",\n  flexDirection: \"column\",\n  width: \"100%\",\n  position: \"relative\",\n  backgroundColor: \"$colors$surface1\",\n  gap: 1\n}, _a$6[\"&:has(.\" + THEME_PREFIX + \"-stack)\"] = {\n  backgroundColor: \"$colors$surface2\"\n}, _a$6));\nvar SandpackStack = function (_a2) {\n  var className = _a2.className,\n    props = __rest(_a2, [\"className\"]);\n  var classNames = useClassNames();\n  return jsx(\"div\", __assign({\n    className: classNames(\"stack\", [stackClassName, className])\n  }, props), void 0);\n};\nvar useSandpackTheme = function () {\n  var _a2 = React3.useContext(SandpackThemeContext),\n    theme = _a2.theme,\n    id = _a2.id,\n    mode = _a2.mode;\n  return {\n    theme,\n    themeId: id,\n    themeMode: mode\n  };\n};\nvar shallowEqual = function (a2, b2) {\n  if (a2.length !== b2.length) return false;\n  var result = true;\n  for (var index = 0; index < a2.length; index++) {\n    if (a2[index] !== b2[index]) {\n      result = false;\n      break;\n    }\n  }\n  return result;\n};\nvar getCodeMirrorPosition = function (doc, _a2) {\n  var line = _a2.line,\n    column = _a2.column;\n  return doc.line(line).from + (column !== null && column !== void 0 ? column : 0) - 1;\n};\nvar getEditorTheme = function () {\n  return EditorView.theme({\n    \"&\": {\n      backgroundColor: \"var(--\" + THEME_PREFIX + \"-colors-surface1)\",\n      color: \"var(--\" + THEME_PREFIX + \"-syntax-color-plain)\",\n      height: \"100%\"\n    },\n    \".cm-matchingBracket, .cm-nonmatchingBracket, &.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket\": {\n      color: \"inherit\",\n      backgroundColor: \"rgba(128,128,128,.25)\",\n      backgroundBlendMode: \"difference\"\n    },\n    \"&.cm-editor.cm-focused\": {\n      outline: \"none\"\n    },\n    \".cm-activeLine\": {\n      backgroundColor: \"var(--\" + THEME_PREFIX + \"-colors-surface3)\",\n      borderRadius: \"var(--\" + THEME_PREFIX + \"-border-radius)\"\n    },\n    \".cm-errorLine\": {\n      backgroundColor: \"var(--\" + THEME_PREFIX + \"-colors-errorSurface)\",\n      borderRadius: \"var(--\" + THEME_PREFIX + \"-border-radius)\"\n    },\n    \".cm-content\": {\n      caretColor: \"var(--\" + THEME_PREFIX + \"-colors-accent)\",\n      padding: \"0 var(--\" + THEME_PREFIX + \"-space-4)\"\n    },\n    \".cm-scroller\": {\n      fontFamily: \"var(--\" + THEME_PREFIX + \"-font-mono)\",\n      lineHeight: \"var(--\" + THEME_PREFIX + \"-font-lineHeight)\"\n    },\n    \".cm-gutters\": {\n      backgroundColor: \"var(--\" + THEME_PREFIX + \"-colors-surface1)\",\n      color: \"var(--\" + THEME_PREFIX + \"-colors-disabled)\",\n      border: \"none\",\n      paddingLeft: \"var(--\" + THEME_PREFIX + \"-space-1)\"\n    },\n    \".cm-gutter.cm-lineNumbers\": {\n      fontSize: \".6em\"\n    },\n    \".cm-lineNumbers .cm-gutterElement\": {\n      lineHeight: \"var(--\" + THEME_PREFIX + \"-font-lineHeight)\",\n      minWidth: \"var(--\" + THEME_PREFIX + \"-space-5)\"\n    },\n    \".cm-content .cm-line\": {\n      paddingLeft: \"var(--\" + THEME_PREFIX + \"-space-1)\"\n    },\n    \".cm-content.cm-readonly .cm-line\": {\n      paddingLeft: 0\n    }\n  });\n};\nvar classNameToken = function (name) {\n  return THEME_PREFIX + \"-syntax-\" + name;\n};\nvar styleTokens = function () {\n  var syntaxHighLightTokens = [\"string\", \"plain\", \"comment\", \"keyword\", \"definition\", \"punctuation\", \"property\", \"tag\", \"static\"];\n  return syntaxHighLightTokens.reduce(function (acc, token) {\n    var _a2;\n    return __assign(__assign({}, acc), (_a2 = {}, _a2[\".\" + classNameToken(token)] = {\n      color: \"$syntax$color$\" + token,\n      fontStyle: \"$syntax$fontStyle$\" + token\n    }, _a2));\n  }, {});\n};\nvar getSyntaxHighlight = function (theme) {\n  return HighlightStyle.define([{\n    tag: tags.link,\n    textDecoration: \"underline\"\n  }, {\n    tag: tags.emphasis,\n    fontStyle: \"italic\"\n  }, {\n    tag: tags.strong,\n    fontWeight: \"bold\"\n  }, {\n    tag: tags.keyword,\n    class: classNameToken(\"keyword\")\n  }, {\n    tag: [tags.atom, tags.number, tags.bool],\n    class: classNameToken(\"static\")\n  }, {\n    tag: tags.variableName,\n    class: classNameToken(\"plain\")\n  }, {\n    // Standard tags, e.g <h1 />\n    tag: tags.standard(tags.tagName),\n    class: classNameToken(\"tag\")\n  }, {\n    tag: [\n    // Highlight function call\n    tags[\"function\"](tags.variableName),\n    // Highlight function definition differently (eg: functional component def in React)\n    tags.definition(tags[\"function\"](tags.variableName)),\n    // \"Custom tags\", meaning React component\n    tags.tagName],\n    class: classNameToken(\"definition\")\n  }, {\n    tag: tags.propertyName,\n    class: classNameToken(\"property\")\n  }, {\n    tag: [tags.literal, tags.inserted],\n    class: classNameToken(theme.syntax.string ? \"string\" : \"static\")\n  }, {\n    tag: tags.punctuation,\n    class: classNameToken(\"punctuation\")\n  }, {\n    tag: [tags.comment, tags.quote],\n    class: classNameToken(\"comment\")\n  }]);\n};\nvar getLanguageFromFile = function (filePath, fileType, additionalLanguages) {\n  if (!filePath && !fileType) return \"javascript\";\n  var extension = fileType;\n  if (!extension && filePath) {\n    var extensionDotIndex = filePath.lastIndexOf(\".\");\n    extension = filePath.slice(extensionDotIndex + 1);\n  }\n  for (var _i = 0, additionalLanguages_1 = additionalLanguages; _i < additionalLanguages_1.length; _i++) {\n    var additionalLanguage = additionalLanguages_1[_i];\n    if (extension === additionalLanguage.name || additionalLanguage.extensions.includes(extension || \"\")) {\n      return additionalLanguage.name;\n    }\n  }\n  switch (extension) {\n    case \"ts\":\n    case \"tsx\":\n      return \"typescript\";\n    case \"html\":\n    case \"svelte\":\n    case \"vue\":\n    case \"astro\":\n      return \"html\";\n    case \"css\":\n    case \"less\":\n    case \"scss\":\n      return \"css\";\n    case \"js\":\n    case \"jsx\":\n    case \"json\":\n    default:\n      return \"javascript\";\n  }\n};\nvar getCodeMirrorLanguage = function (extension, additionalLanguages) {\n  var options = {\n    javascript: javascript({\n      jsx: true,\n      typescript: false\n    }),\n    typescript: javascript({\n      jsx: true,\n      typescript: true\n    }),\n    html: html(),\n    css: css$1()\n  };\n  for (var _i = 0, additionalLanguages_2 = additionalLanguages; _i < additionalLanguages_2.length; _i++) {\n    var additionalLanguage = additionalLanguages_2[_i];\n    if (extension === additionalLanguage.name) {\n      return additionalLanguage.language;\n    }\n  }\n  return options[extension];\n};\nvar useCombinedRefs = function () {\n  var refs = [];\n  for (var _i = 0; _i < arguments.length; _i++) {\n    refs[_i] = arguments[_i];\n  }\n  return React3.useCallback(function (element) {\n    return refs.forEach(function (ref) {\n      if (!ref) {\n        return;\n      }\n      if (typeof ref === \"function\") {\n        return ref(element);\n      }\n      ref.current = element;\n    });\n  },\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  refs);\n};\nfunction highlightDecorators(positions) {\n  return ViewPlugin.fromClass( /** @class */function () {\n    function class_1(view) {\n      this.decorations = this.getDecoration(view);\n    }\n    class_1.prototype.update = function (update) {\n      return;\n    };\n    class_1.prototype.getDecoration = function (view) {\n      if (!positions) return Decoration.none;\n      var rangesDecorators = positions.map(function (item) {\n        var _a2, _b2, _c2;\n        var lineDeco2 = Decoration.line({\n          attributes: {\n            class: (_a2 = item.className) !== null && _a2 !== void 0 ? _a2 : \"\"\n          }\n        });\n        var markDeco = Decoration.mark({\n          class: (_b2 = item.className) !== null && _b2 !== void 0 ? _b2 : \"\",\n          attributes: (_c2 = item.elementAttributes) !== null && _c2 !== void 0 ? _c2 : void 0\n        });\n        var positionLineStart = getCodeMirrorPosition(view.state.doc, {\n          line: item.line,\n          column: item.startColumn\n        }) + 1;\n        if (item.startColumn && item.endColumn) {\n          var positionLineEnd = getCodeMirrorPosition(view.state.doc, {\n            line: item.line,\n            column: item.endColumn\n          }) + 1;\n          return markDeco.range(positionLineStart, positionLineEnd);\n        }\n        return lineDeco2.range(positionLineStart);\n      });\n      return Decoration.set(rangesDecorators);\n    };\n    return class_1;\n  }(), {\n    decorations: function (v2) {\n      return v2.decorations;\n    }\n  });\n}\nfunction highlightInlineError() {\n  return activeLineHighlighter;\n}\nvar lineDeco = Decoration.line({\n  attributes: {\n    class: \"cm-errorLine\"\n  }\n});\nvar activeLineHighlighter = ViewPlugin.fromClass( /** @class */function () {\n  function class_1() {\n    this.decorations = Decoration.none;\n  }\n  class_1.prototype.update = function (update) {\n    var _this = this;\n    update.transactions.forEach(function (trans) {\n      var errorValue = trans.annotation(\"show-error\");\n      if (errorValue !== void 0) {\n        var position = getCodeMirrorPosition(update.view.state.doc, {\n          line: errorValue\n        }) + 1;\n        _this.decorations = Decoration.set([lineDeco.range(position)]);\n      } else if (trans.annotation(\"remove-errors\")) {\n        _this.decorations = Decoration.none;\n      }\n    });\n  };\n  return class_1;\n}(), {\n  decorations: function (v2) {\n    return v2.decorations;\n  }\n});\nvar _a$5;\nvar _b$1;\nvar placeholderClassName = css({\n  margin: \"0\",\n  display: \"block\",\n  fontFamily: \"$font$mono\",\n  fontSize: \"$font$size\",\n  color: \"$syntax$color$plain\",\n  lineHeight: \"$font$lineHeight\"\n});\nvar tokensClassName = css(styleTokens());\nvar editorClassName = css((_a$5 = {\n  flex: 1,\n  position: \"relative\",\n  overflow: \"auto\",\n  background: \"$colors$surface1\",\n  \".cm-scroller\": {\n    padding: \"$space$4 0\"\n  }\n}, _a$5[\".\" + placeholderClassName] = {\n  padding: \"$space$4 0\"\n},\n/**\n* For iOS: prevent browser zoom when clicking on sandbox.\n* Does NOT apply to code blocks.\n*/\n_a$5[\"@media screen and (max-width: 768px)\"] = {\n  \"@supports (-webkit-overflow-scrolling: touch)\": {\n    \".cm-content\": {\n      fontSize: \"16px\"\n    }\n  }\n}, _a$5));\nvar cmClassName = css({\n  margin: \"0\",\n  outline: \"none\",\n  height: \"100%\"\n});\nvar readOnlyClassName = css((_b$1 = {\n  fontFamily: \"$font$mono\",\n  fontSize: \"0.8em\",\n  position: \"absolute\",\n  right: \"$space$2\",\n  bottom: \"$space$2\",\n  zIndex: \"$top\",\n  color: \"$colors$clickable\",\n  backgroundColor: \"$colors$surface2\",\n  borderRadius: \"99999px\",\n  padding: \"calc($space$1 / 2) $space$2\"\n}, _b$1[\"& + .\" + buttonClassName] = {\n  right: \"calc($space$11 * 2)\"\n}, _b$1));\nvar useSyntaxHighlight = function (_a2) {\n  var langSupport = _a2.langSupport,\n    highlightTheme = _a2.highlightTheme,\n    _b2 = _a2.code,\n    code = _b2 === void 0 ? \"\" : _b2;\n  var tree = langSupport.language.parser.parse(code);\n  var offSet = 0;\n  var codeElementsRender = [];\n  var addElement = function (to, className) {\n    if (to > offSet) {\n      var children = code.slice(offSet, to);\n      codeElementsRender.push(className ? /*#__PURE__*/createElement2(\"span\", {\n        children,\n        className,\n        key: \"\" + to + offSet\n      }) : children);\n      offSet = to;\n    }\n  };\n  highlightTree(tree, highlightTheme, function (from, to, className) {\n    addElement(from, \"\");\n    addElement(to, className);\n  });\n  if (offSet < code.length && (code === null || code === void 0 ? void 0 : code.includes(\"\\n\"))) {\n    codeElementsRender.push(\"\\n\\n\");\n  }\n  return codeElementsRender;\n};\nvar CodeMirror = /*#__PURE__*/React3.forwardRef(function (_a2, ref) {\n  var _b2 = _a2.code,\n    code = _b2 === void 0 ? \"\" : _b2,\n    filePath = _a2.filePath,\n    fileType = _a2.fileType,\n    onCodeUpdate = _a2.onCodeUpdate,\n    _c2 = _a2.showLineNumbers,\n    showLineNumbers = _c2 === void 0 ? false : _c2,\n    _d = _a2.showInlineErrors,\n    showInlineErrors = _d === void 0 ? false : _d,\n    _e = _a2.wrapContent,\n    wrapContent = _e === void 0 ? false : _e,\n    _f = _a2.editorState,\n    editorState = _f === void 0 ? \"pristine\" : _f,\n    _g = _a2.readOnly,\n    readOnly = _g === void 0 ? false : _g,\n    _h = _a2.showReadOnly,\n    showReadOnly = _h === void 0 ? true : _h,\n    decorators = _a2.decorators,\n    _j = _a2.initMode,\n    initMode = _j === void 0 ? \"lazy\" : _j,\n    _k = _a2.extensions,\n    extensions = _k === void 0 ? [] : _k,\n    _l = _a2.extensionsKeymap,\n    extensionsKeymap = _l === void 0 ? [] : _l,\n    _m = _a2.additionalLanguages,\n    additionalLanguages = _m === void 0 ? [] : _m;\n  var wrapper = React3.useRef(null);\n  var combinedRef = useCombinedRefs(wrapper, ref);\n  var cmView = React3.useRef();\n  var _o = useSandpackTheme(),\n    theme = _o.theme,\n    themeId = _o.themeId;\n  var _p = React3.useState(code),\n    internalCode = _p[0],\n    setInternalCode = _p[1];\n  var _q = React3.useState(initMode === \"immediate\"),\n    shouldInitEditor = _q[0],\n    setShouldInitEditor = _q[1];\n  var classNames = useClassNames();\n  var listen = useSandpack().listen;\n  var prevExtension = React3.useRef([]);\n  var prevExtensionKeymap = React3.useRef([]);\n  var isIntersecting = module_default2(wrapper, {\n    rootMargin: \"600px 0px\",\n    threshold: .2\n  }).isIntersecting;\n  React3.useImperativeHandle(ref, function () {\n    return {\n      getCodemirror: function () {\n        return cmView.current;\n      }\n    };\n  });\n  React3.useEffect(function () {\n    var mode = initMode === \"lazy\" || initMode === \"user-visible\";\n    if (mode && isIntersecting) {\n      setShouldInitEditor(true);\n    }\n  }, [initMode, isIntersecting]);\n  var languageExtension = getLanguageFromFile(filePath, fileType, additionalLanguages);\n  var langSupport = getCodeMirrorLanguage(languageExtension, additionalLanguages);\n  var highlightTheme = getSyntaxHighlight(theme);\n  var syntaxHighlightRender = useSyntaxHighlight({\n    langSupport,\n    highlightTheme,\n    code\n  });\n  var sortedDecorators = React3.useMemo(function () {\n    return decorators ? decorators.sort(function (d1, d2) {\n      return d1.line - d2.line;\n    }) : decorators;\n  }, [decorators]);\n  React3.useEffect(function () {\n    if (!wrapper.current || !shouldInitEditor) return;\n    var customCommandsKeymap = [{\n      key: \"Tab\",\n      run: function (view2) {\n        var _a3, _b3;\n        indentMore(view2);\n        var customKey = extensionsKeymap.find(function (_a4) {\n          var key = _a4.key;\n          return key === \"Tab\";\n        });\n        return (_b3 = (_a3 = customKey === null || customKey === void 0 ? void 0 : customKey.run) === null || _a3 === void 0 ? void 0 : _a3.call(customKey, view2)) !== null && _b3 !== void 0 ? _b3 : true;\n      }\n    }, {\n      key: \"Shift-Tab\",\n      run: function (_a3) {\n        var _b3, _c3;\n        var state = _a3.state,\n          dispatch = _a3.dispatch;\n        indentLess({\n          state,\n          dispatch\n        });\n        var customKey = extensionsKeymap.find(function (_a4) {\n          var key = _a4.key;\n          return key === \"Shift-Tab\";\n        });\n        return (_c3 = (_b3 = customKey === null || customKey === void 0 ? void 0 : customKey.run) === null || _b3 === void 0 ? void 0 : _b3.call(customKey, view)) !== null && _c3 !== void 0 ? _c3 : true;\n      }\n    }, {\n      key: \"Escape\",\n      run: function () {\n        if (readOnly) return true;\n        if (wrapper.current) {\n          wrapper.current.focus();\n        }\n        return true;\n      }\n    }, {\n      key: \"mod-Backspace\",\n      run: deleteGroupBackward\n    }];\n    var extensionList = __spreadArray(__spreadArray([highlightSpecialChars(), history(), closeBrackets()], extensions, true), [keymap.of(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], closeBracketsKeymap, true), defaultKeymap, true), historyKeymap, true), customCommandsKeymap, true), extensionsKeymap, true)), langSupport, getEditorTheme(), syntaxHighlighting(highlightTheme)], false);\n    if (readOnly) {\n      extensionList.push(EditorState.readOnly.of(true));\n      extensionList.push(EditorView.editable.of(false));\n    } else {\n      extensionList.push(bracketMatching());\n      extensionList.push(highlightActiveLine());\n    }\n    if (sortedDecorators) {\n      extensionList.push(highlightDecorators(sortedDecorators));\n    }\n    if (wrapContent) {\n      extensionList.push(EditorView.lineWrapping);\n    }\n    if (showLineNumbers) {\n      extensionList.push(lineNumbers());\n    }\n    if (showInlineErrors) {\n      extensionList.push(highlightInlineError());\n    }\n    var parentDiv = wrapper.current;\n    var existingPlaceholder = parentDiv.querySelector(\".sp-pre-placeholder\");\n    if (existingPlaceholder) {\n      parentDiv.removeChild(existingPlaceholder);\n    }\n    var view = new EditorView({\n      doc: code,\n      extensions: extensionList,\n      parent: parentDiv,\n      dispatch: function (tr) {\n        view.update([tr]);\n        if (tr.docChanged) {\n          var newCode = tr.newDoc.sliceString(0, tr.newDoc.length);\n          setInternalCode(newCode);\n          onCodeUpdate === null || onCodeUpdate === void 0 ? void 0 : onCodeUpdate(newCode);\n        }\n      }\n    });\n    view.contentDOM.setAttribute(\"data-gramm\", \"false\");\n    view.contentDOM.setAttribute(\"data-lt-active\", \"false\");\n    view.contentDOM.setAttribute(\"aria-label\", filePath ? \"Code Editor for \" + getFileName(filePath) : \"Code Editor\");\n    if (readOnly) {\n      view.contentDOM.classList.add(\"cm-readonly\");\n    } else {\n      view.contentDOM.setAttribute(\"tabIndex\", \"-1\");\n    }\n    cmView.current = view;\n    return function () {\n      var _a3;\n      (_a3 = cmView.current) === null || _a3 === void 0 ? void 0 : _a3.destroy();\n    };\n  }, [shouldInitEditor, showLineNumbers, wrapContent, themeId, sortedDecorators, readOnly]);\n  React3.useEffect(function applyExtensions() {\n    var view = cmView.current;\n    var dependenciesAreDiff = !shallowEqual(extensions, prevExtension.current) || !shallowEqual(extensionsKeymap, prevExtensionKeymap.current);\n    if (view && dependenciesAreDiff) {\n      view.dispatch({\n        effects: StateEffect.appendConfig.of(extensions)\n      });\n      view.dispatch({\n        effects: StateEffect.appendConfig.of(keymap.of(__spreadArray([], extensionsKeymap, true)))\n      });\n      prevExtension.current = extensions;\n      prevExtensionKeymap.current = extensionsKeymap;\n    }\n  }, [extensions, extensionsKeymap]);\n  React3.useEffect(function () {\n    if (cmView.current && editorState === \"dirty\" && window.matchMedia(\"(min-width: 768px)\").matches) {\n      cmView.current.contentDOM.focus();\n    }\n  }, []);\n  React3.useEffect(function () {\n    if (cmView.current && typeof code === \"string\" && code !== internalCode) {\n      var view = cmView.current;\n      var selection = view.state.selection.ranges.some(function (_a3) {\n        var to = _a3.to,\n          from = _a3.from;\n        return to > code.length || from > code.length;\n      }) ? EditorSelection.cursor(code.length) : view.state.selection;\n      var changes = {\n        from: 0,\n        to: view.state.doc.length,\n        insert: code\n      };\n      view.dispatch({\n        changes,\n        selection\n      });\n    }\n  }, [code]);\n  React3.useEffect(function messageToInlineError() {\n    if (!showInlineErrors) return;\n    var unsubscribe = listen(function (message) {\n      var view = cmView.current;\n      if (message.type === \"success\") {\n        view === null || view === void 0 ? void 0 : view.dispatch({\n          // @ts-ignore\n          annotations: [new Annotation(\"remove-errors\", true)]\n        });\n      } else if (message.type === \"action\" && message.action === \"show-error\" && message.path === filePath && message.line) {\n        view === null || view === void 0 ? void 0 : view.dispatch({\n          // @ts-ignore\n          annotations: [new Annotation(\"show-error\", message.line)]\n        });\n      }\n    });\n    return function () {\n      return unsubscribe();\n    };\n  }, [listen, showInlineErrors]);\n  var handleContainerKeyDown = function (evt) {\n    if (evt.key === \"Enter\" && cmView.current) {\n      evt.preventDefault();\n      cmView.current.contentDOM.focus();\n    }\n  };\n  var gutterLineOffset = function () {\n    var offset = 4;\n    if (showLineNumbers) {\n      offset += 6;\n    }\n    if (!readOnly) {\n      offset += 1;\n    }\n    return \"var(--\" + THEME_PREFIX + \"-space-\" + offset + \")\";\n  };\n  if (readOnly) {\n    return jsxs(Fragment, {\n      children: [jsx(\"pre\", __assign({\n        ref: combinedRef,\n        className: classNames(\"cm\", [classNames(editorState), classNames(languageExtension), cmClassName, tokensClassName]),\n        translate: \"no\"\n      }, {\n        children: jsx(\"code\", __assign({\n          className: classNames(\"pre-placeholder\", [placeholderClassName]),\n          style: {\n            marginLeft: gutterLineOffset()\n          }\n        }, {\n          children: syntaxHighlightRender\n        }), void 0)\n      }), void 0), readOnly && showReadOnly && jsx(\"span\", __assign({\n        className: classNames(\"read-only\", [readOnlyClassName])\n      }, {}, {\n        children: \"Read-only\"\n      }), void 0)]\n    }, void 0);\n  }\n  return jsx(\"div\", __assign({\n    ref: combinedRef,\n    \"aria-autocomplete\": \"list\",\n    \"aria-label\": filePath ? \"Code Editor for \" + getFileName(filePath) : \"Code Editor\",\n    \"aria-multiline\": \"true\",\n    className: classNames(\"cm\", [classNames(editorState), classNames(languageExtension), cmClassName, tokensClassName]),\n    onKeyDown: handleContainerKeyDown,\n    role: \"textbox\",\n    tabIndex: 0,\n    translate: \"no\",\n    suppressHydrationWarning: true\n  }, {\n    children: jsx(\"pre\", __assign({\n      className: classNames(\"pre-placeholder\", [placeholderClassName]),\n      style: {\n        marginLeft: gutterLineOffset()\n      }\n    }, {\n      children: syntaxHighlightRender\n    }), void 0)\n  }), void 0);\n});\nvar SandpackCodeEditor = /*#__PURE__*/forwardRef2(function (_a2, ref) {\n  var showTabs = _a2.showTabs,\n    _b2 = _a2.showLineNumbers,\n    showLineNumbers = _b2 === void 0 ? false : _b2,\n    _c2 = _a2.showInlineErrors,\n    showInlineErrors = _c2 === void 0 ? false : _c2,\n    _d = _a2.showRunButton,\n    showRunButton = _d === void 0 ? true : _d,\n    _e = _a2.wrapContent,\n    wrapContent = _e === void 0 ? false : _e,\n    _f = _a2.closableTabs,\n    closableTabs = _f === void 0 ? false : _f,\n    initMode = _a2.initMode,\n    extensions = _a2.extensions,\n    extensionsKeymap = _a2.extensionsKeymap,\n    readOnly = _a2.readOnly,\n    showReadOnly = _a2.showReadOnly,\n    additionalLanguages = _a2.additionalLanguages,\n    className = _a2.className,\n    props = __rest(_a2, [\"showTabs\", \"showLineNumbers\", \"showInlineErrors\", \"showRunButton\", \"wrapContent\", \"closableTabs\", \"initMode\", \"extensions\", \"extensionsKeymap\", \"readOnly\", \"showReadOnly\", \"additionalLanguages\", \"className\"]);\n  var sandpack = useSandpack().sandpack;\n  var _g = useActiveCode(),\n    code = _g.code,\n    updateCode = _g.updateCode,\n    readOnlyFile = _g.readOnly;\n  var activeFile = sandpack.activeFile,\n    status = sandpack.status,\n    editorState = sandpack.editorState;\n  var shouldShowTabs = showTabs !== null && showTabs !== void 0 ? showTabs : sandpack.visibleFiles.length > 1;\n  var classNames = useClassNames();\n  var handleCodeUpdate = function (newCode, shouldUpdatePreview) {\n    if (shouldUpdatePreview === void 0) {\n      shouldUpdatePreview = true;\n    }\n    updateCode(newCode, shouldUpdatePreview);\n  };\n  return jsxs(SandpackStack, __assign({\n    className: classNames(\"editor\", [className])\n  }, props, {\n    children: [shouldShowTabs && jsx(FileTabs, {\n      closableTabs\n    }, void 0), jsxs(\"div\", __assign({\n      className: classNames(\"code-editor\", [editorClassName])\n    }, {\n      children: [jsx(CodeMirror, {\n        ref,\n        additionalLanguages,\n        code,\n        editorState,\n        extensions,\n        extensionsKeymap,\n        filePath: activeFile,\n        initMode: initMode || sandpack.initMode,\n        onCodeUpdate: function (newCode) {\n          var _a3;\n          return handleCodeUpdate(newCode, (_a3 = sandpack.autoReload) !== null && _a3 !== void 0 ? _a3 : true);\n        },\n        readOnly: readOnly || readOnlyFile,\n        showInlineErrors,\n        showLineNumbers,\n        showReadOnly,\n        wrapContent\n      }, activeFile), showRunButton && (!sandpack.autoReload || status === \"idle\") ? jsx(RunButton$1, {}, void 0) : null]\n    }), void 0)]\n  }), void 0);\n});\nvar SandpackCodeViewer = /*#__PURE__*/React3.forwardRef(function (_a2, ref) {\n  var showTabs = _a2.showTabs,\n    showLineNumbers = _a2.showLineNumbers,\n    decorators = _a2.decorators,\n    propCode = _a2.code,\n    initMode = _a2.initMode,\n    wrapContent = _a2.wrapContent,\n    additionalLanguages = _a2.additionalLanguages,\n    props = __rest(_a2, [\"showTabs\", \"showLineNumbers\", \"decorators\", \"code\", \"initMode\", \"wrapContent\", \"additionalLanguages\"]);\n  var sandpack = useSandpack().sandpack;\n  var code = useActiveCode().code;\n  var classNames = useClassNames();\n  var shouldShowTabs = showTabs !== null && showTabs !== void 0 ? showTabs : sandpack.visibleFiles.length > 1;\n  return jsxs(SandpackStack, __assign({\n    className: classNames(\"editor-viewer\")\n  }, props, {\n    children: [shouldShowTabs ? jsx(FileTabs, {}, void 0) : null, jsx(\"div\", __assign({\n      className: classNames(\"code-editor\", [editorClassName])\n    }, {\n      children: jsx(CodeMirror, {\n        ref,\n        additionalLanguages,\n        code: propCode !== null && propCode !== void 0 ? propCode : code,\n        decorators,\n        filePath: sandpack.activeFile,\n        initMode: initMode || sandpack.initMode,\n        showLineNumbers,\n        showReadOnly: false,\n        wrapContent,\n        readOnly: true\n      }, void 0)\n    }), void 0), sandpack.status === \"idle\" ? jsx(RunButton$1, {}, void 0) : null]\n  }), void 0);\n});\nvar _a$4;\nvar _b;\nvar layoutClassName = css((_a$4 = {\n  border: \"1px solid $colors$surface2\",\n  display: \"flex\",\n  flexWrap: \"wrap\",\n  alignItems: \"stretch\",\n  borderRadius: \"$border$radius\",\n  overflow: \"hidden\",\n  position: \"relative\",\n  backgroundColor: \"$colors$surface2\",\n  gap: 1\n}, _a$4[\"> .\" + stackClassName] = {\n  flexGrow: 1,\n  flexShrink: 1,\n  flexBasis: \"0\",\n  height: \"$layout$height\",\n  overflow: \"hidden\",\n  \"@media print\": {\n    height: \"auto\",\n    display: \"block\"\n  },\n  \"@media screen and (max-width: 768px)\": (_b = {}, _b[\"&:not(.\" + THEME_PREFIX + \"-preview, .\" + THEME_PREFIX + \"-editor, .\" + THEME_PREFIX + \"-preset-column)\"] = {\n    height: \"calc($layout$height / 2)\"\n  }, _b.minWidth = \"100%;\", _b)\n}, _a$4[\"> .\" + THEME_PREFIX + \"-file-explorer\"] = {\n  flex: .2,\n  minWidth: 200,\n  \"@media screen and (max-width: 768px)\": {\n    flex: 1\n  }\n}, _a$4));\nvar SandpackLayout = /*#__PURE__*/React3.forwardRef(function (_a2, ref) {\n  var children = _a2.children,\n    className = _a2.className,\n    props = __rest(_a2, [\"children\", \"className\"]);\n  var sandpack = useSandpack().sandpack;\n  var classNames = useClassNames();\n  var combinedRef = useCombinedRefs(sandpack.lazyAnchorRef, ref);\n  return jsx(\"div\", __assign({\n    ref: combinedRef,\n    className: classNames(\"layout\", [layoutClassName, className])\n  }, props, {\n    children\n  }), void 0);\n});\nvar useErrorMessage = function () {\n  var _a2;\n  var sandpack = useSandpack().sandpack;\n  var error = sandpack.error;\n  return (_a2 = error === null || error === void 0 ? void 0 : error.message) !== null && _a2 !== void 0 ? _a2 : null;\n};\nvar FADE_ANIMATION_DURATION = 200;\nvar useLoadingOverlayState = function (clientId, externalLoading) {\n  var _a2 = useSandpack(),\n    sandpack = _a2.sandpack,\n    listen = _a2.listen;\n  var _b2 = React3.useState(\"LOADING\"),\n    state = _b2[0],\n    setState = _b2[1];\n  React3.useEffect(function () {\n    var unsubscribe = listen(function (message) {\n      if (message.type === \"start\" && message.firstLoad === true) {\n        setState(\"LOADING\");\n      }\n      if (message.type === \"done\") {\n        setState(function (prev) {\n          return prev === \"LOADING\" ? \"PRE_FADING\" : \"HIDDEN\";\n        });\n      }\n    }, clientId);\n    return function () {\n      unsubscribe();\n    };\n  }, [clientId, sandpack.status === \"idle\"]);\n  React3.useEffect(function () {\n    var fadeTimeout;\n    if (state === \"PRE_FADING\" && !externalLoading) {\n      setState(\"FADING\");\n    } else if (state === \"FADING\") {\n      fadeTimeout = setTimeout(function () {\n        return setState(\"HIDDEN\");\n      }, FADE_ANIMATION_DURATION);\n    }\n    return function () {\n      clearTimeout(fadeTimeout);\n    };\n  }, [state, externalLoading]);\n  if (sandpack.status === \"timeout\") {\n    return \"TIMEOUT\";\n  }\n  if (sandpack.status !== \"running\") {\n    return \"HIDDEN\";\n  }\n  return state;\n};\nvar useSandpackNavigation = function (clientId) {\n  var dispatch = useSandpack().dispatch;\n  return {\n    refresh: function () {\n      return dispatch({\n        type: \"refresh\"\n      }, clientId);\n    },\n    back: function () {\n      return dispatch({\n        type: \"urlback\"\n      }, clientId);\n    },\n    forward: function () {\n      return dispatch({\n        type: \"urlforward\"\n      }, clientId);\n    }\n  };\n};\nfunction getTranspiledCode(sandpack) {\n  var _a2, _b2;\n  var activeFile = sandpack.activeFile,\n    bundlerState = sandpack.bundlerState;\n  if (bundlerState == null) {\n    return null;\n  }\n  var tModule = bundlerState.transpiledModules[activeFile + \":\"];\n  return (_b2 = (_a2 = tModule === null || tModule === void 0 ? void 0 : tModule.source) === null || _a2 === void 0 ? void 0 : _a2.compiledCode) !== null && _b2 !== void 0 ? _b2 : null;\n}\nvar useTranspiledCode = function () {\n  var sandpack = useSandpack().sandpack;\n  if (sandpack.status !== \"running\") {\n    return null;\n  }\n  return getTranspiledCode(sandpack);\n};\nvar useSandpackClient = function (clientPropsOverride) {\n  var _a2 = useSandpack(),\n    sandpack = _a2.sandpack,\n    listen = _a2.listen,\n    dispatch = _a2.dispatch;\n  var iframeRef = React3.useRef(null);\n  var clientId = React3.useRef(generateRandomId());\n  React3.useEffect(function () {\n    var iframeElement = iframeRef.current;\n    var clientIdValue = clientId.current;\n    if (iframeElement !== null) {\n      sandpack.registerBundler(iframeElement, clientIdValue, clientPropsOverride);\n    }\n    return function () {\n      return sandpack.unregisterBundler(clientIdValue);\n    };\n  }, []);\n  var getClient = function () {\n    return sandpack.clients[clientId.current] || null;\n  };\n  return {\n    sandpack,\n    getClient,\n    clientId: clientId.current,\n    iframe: iframeRef,\n    listen: function (listener) {\n      return listen(listener, clientId.current);\n    },\n    dispatch: function (message) {\n      return dispatch(message, clientId.current);\n    }\n  };\n};\nvar useSandpackShell = function (clientId) {\n  var dispatch = useSandpack().dispatch;\n  return {\n    restart: function () {\n      return dispatch({\n        type: \"shell/restart\"\n      }, clientId);\n    },\n    openPreview: function () {\n      return dispatch({\n        type: \"shell/openPreview\"\n      }, clientId);\n    }\n  };\n};\nvar mapProgressMessage = function (originalMessage, firstTotalPending) {\n  var _a2;\n  switch (originalMessage.state) {\n    case \"downloading_manifest\":\n      return \"[1/3] Downloading manifest\";\n    case \"downloaded_module\":\n      return \"[2/3] Downloaded \" + originalMessage.name + \" (\" + (firstTotalPending - originalMessage.totalPending) + \"/\" + firstTotalPending + \")\";\n    case \"starting_command\":\n      return \"[3/3] Starting command\";\n    case \"command_running\":\n      return '[3/3] Running \"' + ((_a2 = originalMessage.command) === null || _a2 === void 0 ? void 0 : _a2.trim()) + '\"';\n  }\n};\nvar useSandpackPreviewProgress = function (props) {\n  var _a2 = React3.useState(false),\n    isReady = _a2[0],\n    setIsReady = _a2[1];\n  var _b2 = React3.useState(),\n    totalDependencies = _b2[0],\n    setTotalDependencies = _b2[1];\n  var _c2 = React3.useState(null),\n    loadingMessage = _c2[0],\n    setLoadingMessage = _c2[1];\n  var timeout = props === null || props === void 0 ? void 0 : props.timeout;\n  var clientId = props === null || props === void 0 ? void 0 : props.clientId;\n  var listen = useSandpack().listen;\n  React3.useEffect(function () {\n    var timer;\n    var unsubscribe = listen(function (message) {\n      if (message.type === \"start\" && message.firstLoad) {\n        setIsReady(false);\n      }\n      if (timeout) {\n        timer = setTimeout(function () {\n          setLoadingMessage(null);\n        }, timeout);\n      }\n      if (message.type === \"shell/progress\" && !isReady) {\n        if (!totalDependencies && message.data.state === \"downloaded_module\") {\n          setTotalDependencies(message.data.totalPending);\n        }\n        if (totalDependencies !== void 0) {\n          setLoadingMessage(mapProgressMessage(message.data, totalDependencies));\n        }\n      }\n      if (message.type === \"done\" && message.compilatonError === false) {\n        setLoadingMessage(null);\n        setIsReady(true);\n        clearTimeout(timer);\n      }\n    }, clientId);\n    return function () {\n      if (timer) {\n        clearTimeout(timer);\n      }\n      unsubscribe();\n    };\n  }, [clientId, isReady, totalDependencies, timeout]);\n  return loadingMessage;\n};\nvar MAX_MESSAGE_COUNT$1 = 400 * 2;\nvar useSandpackShellStdout = function (_a2) {\n  var clientId = _a2.clientId,\n    _b2 = _a2.maxMessageCount,\n    maxMessageCount = _b2 === void 0 ? MAX_MESSAGE_COUNT$1 : _b2;\n  _a2.resetOnPreviewRestart;\n  var _d = React3.useState([]),\n    logs = _d[0],\n    setLogs = _d[1];\n  var listen = useSandpack().listen;\n  React3.useEffect(function () {\n    var unsubscribe = listen(function (message) {\n      if (message.type === \"start\") {\n        setLogs([]);\n      } else if (message.type === \"stdout\" && message.payload.data && Boolean(message.payload.data.trim())) {\n        setLogs(function (prev) {\n          var messages = __spreadArray(__spreadArray([], prev, true), [{\n            data: message.payload.data,\n            id: generateRandomId()\n          }], false);\n          while (messages.length > maxMessageCount) {\n            messages.shift();\n          }\n          return messages;\n        });\n      }\n    }, clientId);\n    return unsubscribe;\n  }, [maxMessageCount, clientId]);\n  return {\n    logs,\n    reset: function () {\n      return setLogs([]);\n    }\n  };\n};\nvar mapBundlerErrors = function (originalMessage) {\n  var errorMessage = originalMessage.replace(\"[sandpack-client]: \", \"\");\n  if (/process.exit/.test(errorMessage)) {\n    var exitCode = errorMessage.match(/process.exit\\((\\d+)\\)/);\n    if (!exitCode) return errorMessage;\n    if (Number(exitCode[1]) === 0) {\n      return \"Server is not running, would you like to start it again?\";\n    }\n    return \"Server has crashed with status code \" + exitCode[1] + \", would you like to restart the server?\";\n  }\n  return errorMessage;\n};\nvar ErrorOverlay = function (props) {\n  var children = props.children,\n    className = props.className,\n    otherProps = __rest(props, [\"children\", \"className\"]);\n  var errorMessage = useErrorMessage();\n  var restart = useSandpackShell().restart;\n  var classNames = useClassNames();\n  var _a2 = useSandpack().sandpack,\n    runSandpack = _a2.runSandpack,\n    teamId = _a2.teamId;\n  var dispatch = useSandpack().dispatch;\n  if (!errorMessage && !children) {\n    return null;\n  }\n  var isSandpackBundlerError = errorMessage === null || errorMessage === void 0 ? void 0 : errorMessage.startsWith(\"[sandpack-client]\");\n  var privateDependencyError = errorMessage === null || errorMessage === void 0 ? void 0 : errorMessage.includes(\"NPM_REGISTRY_UNAUTHENTICATED_REQUEST\");\n  var onSignIn = function () {\n    if (teamId) {\n      dispatch({\n        type: \"sign-in\",\n        teamId\n      });\n    }\n  };\n  if (privateDependencyError) {\n    return jsxs(\"div\", __assign({\n      className: classNames(\"overlay\", [classNames(\"error\"), absoluteClassName, errorBundlerClassName, className])\n    }, props, {\n      children: [jsx(\"p\", __assign({\n        className: classNames(\"error-message\", [errorMessageClassName])\n      }, {\n        children: jsx(\"strong\", {\n          children: \"Unable to fetch required dependency.\"\n        }, void 0)\n      }), void 0), jsx(\"div\", __assign({\n        className: classNames(\"error-message\", [errorMessageClassName])\n      }, {\n        children: jsxs(\"p\", {\n          children: [\"Authentication required. Please sign in to your account (make sure to allow pop-ups to this page) and try again. If the issue persists, contact\", \" \", jsx(\"a\", __assign({\n            href: \"mailto:hello@codesandbox.io?subject=Sandpack Timeout Error\"\n          }, {\n            children: \"support\"\n          }), void 0), \" \", \"for further assistance.\"]\n        }, void 0)\n      }), void 0), jsx(\"div\", {\n        children: jsxs(\"button\", __assign({\n          className: classNames(\"button\", [buttonClassName, iconStandaloneClassName, roundedButtonClassName]),\n          onClick: onSignIn\n        }, {\n          children: [jsx(SignInIcon, {}, void 0), jsx(\"span\", {\n            children: \"Sign in\"\n          }, void 0)]\n        }), void 0)\n      }, void 0)]\n    }), void 0);\n  }\n  if (isSandpackBundlerError && errorMessage) {\n    return jsx(\"div\", __assign({\n      className: classNames(\"overlay\", [classNames(\"error\"), absoluteClassName, errorBundlerClassName, className])\n    }, otherProps, {\n      children: jsxs(\"div\", __assign({\n        className: classNames(\"error-message\", [errorMessageClassName])\n      }, {\n        children: [jsx(\"p\", __assign({\n          className: classNames(\"error-title\", [css({\n            fontWeight: \"bold\"\n          })])\n        }, {\n          children: \"Couldn't connect to server\"\n        }), void 0), jsx(\"p\", {\n          children: mapBundlerErrors(errorMessage)\n        }, void 0), jsx(\"div\", {\n          children: jsxs(\"button\", __assign({\n            className: classNames(\"button\", [classNames(\"icon-standalone\"), buttonClassName, iconStandaloneClassName, roundedButtonClassName]),\n            onClick: function () {\n              restart();\n              runSandpack();\n            },\n            title: \"Restart script\",\n            type: \"button\"\n          }, {\n            children: [jsx(RestartIcon, {}, void 0), \" \", jsx(\"span\", {\n              children: \"Restart\"\n            }, void 0)]\n          }), void 0)\n        }, void 0)]\n      }), void 0)\n    }), void 0);\n  }\n  return jsxs(\"div\", __assign({\n    className: classNames(\"overlay\", [classNames(\"error\"), absoluteClassName, errorClassName({\n      solidBg: true\n    }), className]),\n    translate: \"no\"\n  }, otherProps, {\n    children: [jsx(\"p\", __assign({\n      className: classNames(\"error-message\", [errorMessageClassName])\n    }, {\n      children: jsx(\"strong\", {\n        children: \"Something went wrong\"\n      }, void 0)\n    }), void 0), jsx(\"p\", __assign({\n      className: classNames(\"error-message\", [errorMessageClassName({\n        errorCode: true\n      })])\n    }, {\n      children: errorMessage || children\n    }), void 0)]\n  }), void 0);\n};\nfunction ansiToJSON(input, use_classes) {\n  if (use_classes === void 0) {\n    use_classes = false;\n  }\n  input = (0, import_escape_carriage.escapeCarriageReturn)(fixBackspace(input));\n  return import_anser.default.ansiToJson(input, {\n    json: true,\n    remove_empty: true,\n    use_classes\n  });\n}\nfunction createClass(bundle) {\n  var classNames = \"\";\n  if (bundle.bg) {\n    classNames += bundle.bg + \"-bg \";\n  }\n  if (bundle.fg) {\n    classNames += bundle.fg + \"-fg \";\n  }\n  if (bundle.decoration) {\n    classNames += \"ansi-\" + bundle.decoration + \" \";\n  }\n  if (classNames === \"\") {\n    return null;\n  }\n  classNames = classNames.substring(0, classNames.length - 1);\n  return classNames;\n}\nfunction createStyle(bundle) {\n  var style = {};\n  if (bundle.bg) {\n    style.backgroundColor = \"rgb(\" + bundle.bg + \")\";\n  }\n  if (bundle.fg) {\n    style.color = \"rgb(\" + bundle.fg + \")\";\n  }\n  switch (bundle.decoration) {\n    case \"bold\":\n      style.fontWeight = \"bold\";\n      break;\n    case \"dim\":\n      style.opacity = \"0.5\";\n      break;\n    case \"italic\":\n      style.fontStyle = \"italic\";\n      break;\n    case \"hidden\":\n      style.visibility = \"hidden\";\n      break;\n    case \"strikethrough\":\n      style.textDecoration = \"line-through\";\n      break;\n    case \"underline\":\n      style.textDecoration = \"underline\";\n      break;\n    case \"blink\":\n      style.textDecoration = \"blink\";\n      break;\n  }\n  return style;\n}\nfunction convertBundleIntoReact(linkify, useClasses, bundle, key) {\n  var style = useClasses ? null : createStyle(bundle);\n  var className = useClasses ? createClass(bundle) : null;\n  if (!linkify) {\n    return /*#__PURE__*/React3.createElement(\"span\", {\n      style,\n      key,\n      className\n    }, bundle.content);\n  }\n  var content = [];\n  var linkRegex = /(\\s|^)(https?:\\/\\/(?:www\\.|(?!www))[^\\s.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,})/g;\n  var index = 0;\n  var match;\n  while ((match = linkRegex.exec(bundle.content)) !== null) {\n    var pre = match[1],\n      url = match[2];\n    var startIndex = match.index + pre.length;\n    if (startIndex > index) {\n      content.push(bundle.content.substring(index, startIndex));\n    }\n    var href = url.startsWith(\"www.\") ? \"http://\" + url : url;\n    content.push( /*#__PURE__*/React3.createElement(\"a\", {\n      key: index,\n      href,\n      target: \"_blank\"\n    }, \"\" + url));\n    index = linkRegex.lastIndex;\n  }\n  if (index < bundle.content.length) {\n    content.push(bundle.content.substring(index));\n  }\n  return /*#__PURE__*/React3.createElement(\"span\", {\n    style,\n    key,\n    className\n  }, content);\n}\nfunction Ansi(props) {\n  var className = props.className,\n    useClasses = props.useClasses,\n    children = props.children,\n    linkify = props.linkify;\n  return /*#__PURE__*/React3.createElement(\"code\", {\n    className\n  }, ansiToJSON(children !== null && children !== void 0 ? children : \"\", useClasses !== null && useClasses !== void 0 ? useClasses : false).map(convertBundleIntoReact.bind(null, linkify !== null && linkify !== void 0 ? linkify : false, useClasses !== null && useClasses !== void 0 ? useClasses : false)));\n}\nfunction fixBackspace(txt) {\n  var tmp = txt;\n  do {\n    txt = tmp;\n    tmp = txt.replace(/[^\\n]\\x08/gm, \"\");\n  } while (tmp.length < txt.length);\n  return txt;\n}\nvar StdoutList = function (_a2) {\n  var data = _a2.data;\n  var classNames = useClassNames();\n  return jsx(Fragment, {\n    children: data.map(function (_a3) {\n      var data2 = _a3.data,\n        id = _a3.id;\n      return jsx(\"div\", __assign({\n        className: classNames(\"console-item\", [consoleItemClassName$1])\n      }, {\n        children: jsx(Ansi, {\n          children: data2\n        }, void 0)\n      }), id);\n    })\n  }, void 0);\n};\nvar consoleItemClassName$1 = css({\n  width: \"100%\",\n  padding: \"$space$3 $space$2\",\n  fontSize: \".85em\",\n  position: \"relative\",\n  whiteSpace: \"pre\",\n  \"&:not(:first-child):after\": {\n    content: \"\",\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    background: \"$colors$surface3\"\n  }\n});\nvar getParameters = function (parameters) {\n  return import_lz_string.default.compressToBase64(JSON.stringify(parameters)).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n};\nvar CSB_URL = \"https://codesandbox.io/api/v1/sandboxes/define\";\nvar getFileParameters = function (files, environment) {\n  var normalizedFiles = Object.keys(files).reduce(function (prev, next) {\n    var _a2;\n    var fileName = next.replace(\"/\", \"\");\n    var value = {\n      content: files[next].code,\n      isBinary: false\n    };\n    return __assign(__assign({}, prev), (_a2 = {}, _a2[fileName] = value, _a2));\n  }, {});\n  return getParameters(__assign({\n    files: normalizedFiles\n  }, environment ? {\n    template: environment\n  } : null));\n};\nvar UnstyledOpenInCodeSandboxButton = function (_a2) {\n  var _b2, _c2, _d;\n  var children = _a2.children,\n    props = __rest(_a2, [\"children\"]);\n  var sandpack = useSandpack().sandpack;\n  var formRef = React3.useRef(null);\n  var _e = React3.useState(),\n    paramsValues = _e[0],\n    setParamsValues = _e[1];\n  React3.useEffect(function debounce() {\n    var timer = setTimeout(function () {\n      var params = getFileParameters(sandpack.files, sandpack.environment);\n      var searchParams = new URLSearchParams({\n        parameters: params,\n        query: new URLSearchParams({\n          file: sandpack.activeFile,\n          utm_medium: \"sandpack\"\n        }).toString()\n      });\n      setParamsValues(searchParams);\n    }, 600);\n    return function () {\n      clearTimeout(timer);\n    };\n  }, [sandpack.activeFile, sandpack.environment, sandpack.files]);\n  if (((_d = (_c2 = (_b2 = paramsValues === null || paramsValues === void 0 ? void 0 : paramsValues.get) === null || _b2 === void 0 ? void 0 : _b2.call(paramsValues, \"parameters\")) === null || _c2 === void 0 ? void 0 : _c2.length) !== null && _d !== void 0 ? _d : 0) > 1500) {\n    return jsxs(\"button\", __assign({\n      onClick: function () {\n        var _a3;\n        return (_a3 = formRef.current) === null || _a3 === void 0 ? void 0 : _a3.submit();\n      },\n      title: \"Open in CodeSandbox\",\n      type: \"button\"\n    }, props, {\n      children: [jsxs(\"form\", __assign({\n        ref: formRef,\n        action: CSB_URL,\n        method: \"POST\",\n        style: {\n          visibility: \"hidden\"\n        },\n        target: \"_blank\"\n      }, {\n        children: [jsx(\"input\", {\n          name: \"environment\",\n          type: \"hidden\",\n          value: sandpack.environment === \"node\" ? \"server\" : sandpack.environment\n        }, void 0), Array.from(paramsValues, function (_a3) {\n          var key = _a3[0],\n            value = _a3[1];\n          return jsx(\"input\", {\n            name: key,\n            type: \"hidden\",\n            value\n          }, key);\n        })]\n      }), void 0), children]\n    }), void 0);\n  }\n  return jsx(\"a\", __assign({\n    href: CSB_URL + \"?\" + (paramsValues === null || paramsValues === void 0 ? void 0 : paramsValues.toString()) + \"&environment=\" + (sandpack.environment === \"node\" ? \"server\" : sandpack.environment),\n    rel: \"noreferrer noopener\",\n    target: \"_blank\",\n    title: \"Open in CodeSandbox\"\n  }, props, {\n    children\n  }), void 0);\n};\nvar OpenInCodeSandboxButton = function () {\n  var classNames = useClassNames();\n  return jsxs(UnstyledOpenInCodeSandboxButton, __assign({\n    className: classNames(\"button\", [classNames(\"icon-standalone\"), buttonClassName, iconStandaloneClassName, roundedButtonClassName])\n  }, {\n    children: [jsx(ExportIcon, {}, void 0), jsx(\"span\", {\n      children: \"Open Sandbox\"\n    }, void 0)]\n  }), void 0);\n};\nvar _a$3;\nvar cubeClassName = css({\n  transform: \"translate(-4px, 9px) scale(0.13, 0.13)\",\n  \"*\": {\n    position: \"absolute\",\n    width: \"96px\",\n    height: \"96px\"\n  }\n});\nvar wrapperClassName$2 = css((_a$3 = {\n  position: \"absolute\",\n  right: \"$space$2\",\n  bottom: \"$space$2\",\n  zIndex: \"$top\",\n  width: \"32px\",\n  height: \"32px\",\n  borderRadius: \"$border$radius\"\n}, _a$3[\".\" + cubeClassName] = {\n  display: \"flex\"\n}, _a$3[\".sp-button.\" + buttonClassName] = {\n  display: \"none\"\n}, _a$3[\"&:hover .sp-button.\" + buttonClassName] = {\n  display: \"flex\"\n}, _a$3[\"&:hover .sp-button.\" + buttonClassName + \" > span\"] = {\n  display: \"none\"\n}, _a$3[\"&:hover .\" + cubeClassName] = {\n  display: \"none\"\n}, _a$3));\nvar cubeRotate = keyframes({\n  \"0%\": {\n    transform: \"rotateX(-25.5deg) rotateY(45deg)\"\n  },\n  \"100%\": {\n    transform: \"rotateX(-25.5deg) rotateY(405deg)\"\n  }\n});\nvar sidesClassNames = css({\n  animation: cubeRotate + \" 1s linear infinite\",\n  animationFillMode: \"forwards\",\n  transformStyle: \"preserve-3d\",\n  transform: \"rotateX(-25.5deg) rotateY(45deg)\",\n  \"*\": {\n    border: \"10px solid $colors$clickable\",\n    borderRadius: \"8px\",\n    background: \"$colors$surface1\"\n  },\n  \".top\": {\n    transform: \"rotateX(90deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  },\n  \".bottom\": {\n    transform: \"rotateX(-90deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  },\n  \".front\": {\n    transform: \"rotateY(0deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  },\n  \".back\": {\n    transform: \"rotateY(-180deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  },\n  \".left\": {\n    transform: \"rotateY(-90deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  },\n  \".right\": {\n    transform: \"rotateY(90deg) translateZ(44px)\",\n    transformOrigin: \"50% 50%\"\n  }\n});\nvar Loading = function (_a2) {\n  var className = _a2.className,\n    showOpenInCodeSandbox = _a2.showOpenInCodeSandbox,\n    props = __rest(_a2, [\"className\", \"showOpenInCodeSandbox\"]);\n  var classNames = useClassNames();\n  return jsxs(\"div\", __assign({\n    className: classNames(\"cube-wrapper\", [wrapperClassName$2, className]),\n    title: \"Open in CodeSandbox\"\n  }, props, {\n    children: [showOpenInCodeSandbox && jsx(OpenInCodeSandboxButton, {}, void 0), jsx(\"div\", __assign({\n      className: classNames(\"cube\", [cubeClassName])\n    }, {\n      children: jsxs(\"div\", __assign({\n        className: classNames(\"sides\", [sidesClassNames])\n      }, {\n        children: [jsx(\"div\", {\n          className: \"top\"\n        }, void 0), jsx(\"div\", {\n          className: \"right\"\n        }, void 0), jsx(\"div\", {\n          className: \"bottom\"\n        }, void 0), jsx(\"div\", {\n          className: \"left\"\n        }, void 0), jsx(\"div\", {\n          className: \"front\"\n        }, void 0), jsx(\"div\", {\n          className: \"back\"\n        }, void 0)]\n      }), void 0)\n    }), void 0)]\n  }), void 0);\n};\nvar loadingClassName = css({\n  backgroundColor: \"$colors$surface1\"\n});\nvar LoadingOverlay = function (_a2) {\n  var clientId = _a2.clientId,\n    loading = _a2.loading,\n    className = _a2.className,\n    style = _a2.style,\n    showOpenInCodeSandbox = _a2.showOpenInCodeSandbox,\n    props = __rest(_a2, [\"clientId\", \"loading\", \"className\", \"style\", \"showOpenInCodeSandbox\"]);\n  var classNames = useClassNames();\n  var _b2 = useSandpack().sandpack,\n    runSandpack = _b2.runSandpack,\n    environment = _b2.environment;\n  var _c2 = React3.useState(false),\n    shouldShowStdout = _c2[0],\n    setShouldShowStdout = _c2[1];\n  var loadingOverlayState = useLoadingOverlayState(clientId, loading);\n  var progressMessage = useSandpackPreviewProgress({\n    clientId\n  });\n  var stdoutData = useSandpackShellStdout({\n    clientId\n  }).logs;\n  React3.useEffect(function () {\n    var timer;\n    if (progressMessage === null || progressMessage === void 0 ? void 0 : progressMessage.includes(\"Running\")) {\n      timer = setTimeout(function () {\n        setShouldShowStdout(true);\n      }, 3e3);\n    }\n    return function () {\n      if (timer) {\n        clearTimeout(timer);\n      }\n    };\n  }, [progressMessage]);\n  if (loadingOverlayState === \"HIDDEN\") {\n    return null;\n  }\n  if (loadingOverlayState === \"TIMEOUT\") {\n    return jsx(\"div\", __assign({\n      className: classNames(\"overlay\", [classNames(\"error\"), absoluteClassName, errorClassName, errorBundlerClassName, className])\n    }, props, {\n      children: jsxs(\"div\", __assign({\n        className: classNames(\"error-message\", [errorMessageClassName])\n      }, {\n        children: [jsx(\"p\", __assign({\n          className: classNames(\"error-title\", [css({\n            fontWeight: \"bold\"\n          })])\n        }, {\n          children: \"Couldn't connect to server\"\n        }), void 0), jsx(\"div\", __assign({\n          className: classNames(\"error-message\", [errorMessageClassName])\n        }, {\n          children: jsxs(\"p\", {\n            children: [\"This means sandpack cannot connect to the runtime or your network is having some issues. Please check the network tab in your browser and try again. If the problem persists, report it via\", \" \", jsx(\"a\", __assign({\n              href: \"mailto:hello@codesandbox.io?subject=Sandpack Timeout Error\"\n            }, {\n              children: \"email\"\n            }), void 0), \" \", \"or submit an issue on\", \" \", jsx(\"a\", __assign({\n              href: \"https://github.com/codesandbox/sandpack/issues\",\n              rel: \"noreferrer noopener\",\n              target: \"_blank\"\n            }, {\n              children: \"GitHub.\"\n            }), void 0)]\n          }, void 0)\n        }), void 0), jsxs(\"p\", __assign({\n          className: classNames(\"error-message\", [errorMessageClassName({\n            errorCode: true\n          })])\n        }, {\n          children: [\"ENV: \", environment, jsx(\"br\", {}, void 0), \"ERROR: TIME_OUT\"]\n        }), void 0), jsx(\"div\", {\n          children: jsxs(\"button\", __assign({\n            className: classNames(\"button\", [classNames(\"icon-standalone\"), buttonClassName, iconStandaloneClassName, roundedButtonClassName]),\n            onClick: runSandpack,\n            title: \"Restart script\",\n            type: \"button\"\n          }, {\n            children: [jsx(RestartIcon, {}, void 0), \" \", jsx(\"span\", {\n              children: \"Try again\"\n            }, void 0)]\n          }), void 0)\n        }, void 0)]\n      }), void 0)\n    }), void 0);\n  }\n  var stillLoading = loadingOverlayState === \"LOADING\" || loadingOverlayState === \"PRE_FADING\";\n  return jsxs(Fragment, {\n    children: [jsxs(\"div\", __assign({\n      className: classNames(\"overlay\", [classNames(\"loading\"), absoluteClassName, loadingClassName, className]),\n      style: __assign(__assign({}, style), {\n        opacity: stillLoading ? 1 : 0,\n        transition: \"opacity \" + FADE_ANIMATION_DURATION + \"ms ease-out\"\n      })\n    }, props, {\n      children: [shouldShowStdout && jsx(\"div\", __assign({\n        className: stdoutPreview.toString()\n      }, {\n        children: jsx(StdoutList, {\n          data: stdoutData\n        }, void 0)\n      }), void 0), jsx(Loading, {\n        showOpenInCodeSandbox\n      }, void 0)]\n    }), void 0), progressMessage && jsx(\"div\", __assign({\n      className: progressClassName$1.toString()\n    }, {\n      children: jsx(\"p\", {\n        children: progressMessage\n      }, void 0)\n    }), void 0)]\n  }, void 0);\n};\nvar stdoutPreview = css({\n  position: \"absolute\",\n  left: 0,\n  right: 0,\n  bottom: \"$space$8\",\n  overflow: \"auto\",\n  opacity: .5,\n  overflowX: \"hidden\"\n});\nvar progressClassName$1 = css({\n  position: \"absolute\",\n  left: \"$space$5\",\n  bottom: \"$space$4\",\n  zIndex: \"$top\",\n  color: \"$colors$clickable\",\n  animation: fadeIn + \" 150ms ease\",\n  fontFamily: \"$font$mono\",\n  fontSize: \".8em\",\n  width: \"75%\",\n  p: {\n    whiteSpace: \"nowrap\",\n    margin: 0,\n    textOverflow: \"ellipsis\",\n    overflow: \"hidden\"\n  }\n});\nvar DependenciesProgress = function (_a2) {\n  var clientId = _a2.clientId;\n  var progressMessage = useSandpackPreviewProgress({\n    timeout: 3e3,\n    clientId\n  });\n  if (!progressMessage) {\n    return null;\n  }\n  return jsx(\"div\", __assign({\n    className: progressClassName.toString()\n  }, {\n    children: jsx(\"p\", {\n      children: progressMessage\n    }, void 0)\n  }), void 0);\n};\nvar progressClassName = css({\n  position: \"absolute\",\n  left: \"$space$5\",\n  bottom: \"$space$4\",\n  zIndex: \"$top\",\n  color: \"$colors$clickable\",\n  animation: fadeIn + \" 150ms ease\",\n  fontFamily: \"$font$mono\",\n  fontSize: \".8em\",\n  width: \"75%\",\n  p: {\n    whiteSpace: \"nowrap\",\n    margin: 0,\n    textOverflow: \"ellipsis\",\n    overflow: \"hidden\"\n  }\n});\nvar explorerClassName = css({\n  borderRadius: \"0\",\n  width: \"100%\",\n  padding: 0,\n  marginBottom: \"$space$2\",\n  span: {\n    textOverflow: \"ellipsis\",\n    whiteSpace: \"nowrap\",\n    overflow: \"hidden\"\n  },\n  svg: {\n    marginRight: \"$space$1\"\n  }\n});\nvar File = function (_a2) {\n  var selectFile = _a2.selectFile,\n    path = _a2.path,\n    active = _a2.active,\n    onClick = _a2.onClick,\n    depth = _a2.depth,\n    isDirOpen = _a2.isDirOpen;\n  var classNames = useClassNames();\n  var onClickButton = function (event) {\n    if (selectFile) {\n      selectFile(path);\n    }\n    onClick === null || onClick === void 0 ? void 0 : onClick(event);\n  };\n  var fileName = path.split(\"/\").filter(Boolean).pop();\n  var getIcon = function () {\n    if (selectFile) return jsx(FileIcon, {}, void 0);\n    return isDirOpen ? jsx(DirectoryIconOpen, {}, void 0) : jsx(DirectoryIconClosed, {}, void 0);\n  };\n  return jsxs(\"button\", __assign({\n    className: classNames(\"button\", [classNames(\"explorer\"), buttonClassName, explorerClassName]),\n    \"data-active\": active,\n    onClick: onClickButton,\n    style: {\n      paddingLeft: 18 * depth + \"px\"\n    },\n    title: fileName,\n    type: \"button\"\n  }, {\n    children: [getIcon(), jsx(\"span\", {\n      children: fileName\n    }, void 0)]\n  }), void 0);\n};\nvar Directory = function (_a2) {\n  var prefixedPath = _a2.prefixedPath,\n    files = _a2.files,\n    selectFile = _a2.selectFile,\n    activeFile = _a2.activeFile,\n    depth = _a2.depth,\n    autoHiddenFiles = _a2.autoHiddenFiles,\n    visibleFiles = _a2.visibleFiles,\n    initialCollapsedFolder = _a2.initialCollapsedFolder;\n  var _b2 = React3.useState(!(initialCollapsedFolder === null || initialCollapsedFolder === void 0 ? void 0 : initialCollapsedFolder.includes(prefixedPath))),\n    open = _b2[0],\n    setOpen = _b2[1];\n  var toggle = function () {\n    return setOpen(function (prev) {\n      return !prev;\n    });\n  };\n  return jsxs(\"div\", {\n    children: [jsx(File, {\n      depth,\n      isDirOpen: open,\n      onClick: toggle,\n      path: prefixedPath + \"/\"\n    }, void 0), open && jsx(ModuleList, {\n      activeFile,\n      autoHiddenFiles,\n      depth: depth + 1,\n      files,\n      initialCollapsedFolder,\n      prefixedPath,\n      selectFile,\n      visibleFiles\n    }, void 0)]\n  }, prefixedPath);\n};\nvar fromPropsToModules = function (_a2) {\n  var autoHiddenFiles = _a2.autoHiddenFiles,\n    visibleFiles = _a2.visibleFiles,\n    files = _a2.files,\n    prefixedPath = _a2.prefixedPath;\n  var hasVisibleFilesOption = visibleFiles.length > 0;\n  var filterByHiddenProperty = autoHiddenFiles && !hasVisibleFilesOption;\n  var filterByVisibleFilesOption = autoHiddenFiles && !!hasVisibleFilesOption;\n  var fileListWithoutPrefix = Object.keys(files).filter(function (filePath) {\n    var _a3;\n    var isValidatedPath = filePath.startsWith(prefixedPath);\n    if (filterByVisibleFilesOption) {\n      return isValidatedPath && visibleFiles.includes(filePath);\n    }\n    if (filterByHiddenProperty) {\n      return isValidatedPath && !((_a3 = files[filePath]) === null || _a3 === void 0 ? void 0 : _a3.hidden);\n    }\n    return isValidatedPath;\n  }).map(function (file) {\n    return file.substring(prefixedPath.length);\n  });\n  var directories = new Set(fileListWithoutPrefix.filter(function (file) {\n    return file.includes(\"/\");\n  }).map(function (file) {\n    return \"\" + prefixedPath + file.split(\"/\")[0] + \"/\";\n  }));\n  var modules = fileListWithoutPrefix.filter(function (file) {\n    return !file.includes(\"/\");\n  }).map(function (file) {\n    return \"\" + prefixedPath + file;\n  });\n  return {\n    directories: Array.from(directories),\n    modules\n  };\n};\nvar ModuleList = function (_a2) {\n  var _b2 = _a2.depth,\n    depth = _b2 === void 0 ? 0 : _b2,\n    activeFile = _a2.activeFile,\n    selectFile = _a2.selectFile,\n    prefixedPath = _a2.prefixedPath,\n    files = _a2.files,\n    autoHiddenFiles = _a2.autoHiddenFiles,\n    visibleFiles = _a2.visibleFiles,\n    initialCollapsedFolder = _a2.initialCollapsedFolder;\n  var _c2 = fromPropsToModules({\n      visibleFiles,\n      autoHiddenFiles,\n      prefixedPath,\n      files\n    }),\n    directories = _c2.directories,\n    modules = _c2.modules;\n  return jsxs(\"div\", {\n    children: [directories.map(function (dir) {\n      return jsx(Directory, {\n        activeFile,\n        autoHiddenFiles,\n        depth,\n        files,\n        initialCollapsedFolder,\n        prefixedPath: dir,\n        selectFile,\n        visibleFiles\n      }, dir);\n    }), modules.map(function (file) {\n      return jsx(File, {\n        active: activeFile === file,\n        depth,\n        path: file,\n        selectFile\n      }, file);\n    })]\n  }, void 0);\n};\nvar fileExplorerClassName = css({\n  padding: \"$space$3\",\n  overflow: \"auto\",\n  height: \"100%\"\n});\nvar SandpackFileExplorer = function (_a2) {\n  var className = _a2.className,\n    _b2 = _a2.autoHiddenFiles,\n    autoHiddenFiles = _b2 === void 0 ? false : _b2,\n    _c2 = _a2.initialCollapsedFolder,\n    initialCollapsedFolder = _c2 === void 0 ? [] : _c2,\n    props = __rest(_a2, [\"className\", \"autoHiddenFiles\", \"initialCollapsedFolder\"]);\n  var _d = useSandpack(),\n    _e = _d.sandpack,\n    status = _e.status,\n    updateFile = _e.updateFile,\n    deleteFile = _e.deleteFile,\n    activeFile = _e.activeFile,\n    files = _e.files,\n    openFile = _e.openFile,\n    visibleFilesFromProps = _e.visibleFilesFromProps,\n    listen = _d.listen;\n  var classNames = useClassNames();\n  React3.useEffect(function watchFSFilesChanges() {\n    if (status !== \"running\") return;\n    var unsubscribe = listen(function (message) {\n      if (message.type === \"fs/change\") {\n        updateFile(message.path, message.content, false);\n      }\n      if (message.type === \"fs/remove\") {\n        deleteFile(message.path, false);\n      }\n    });\n    return unsubscribe;\n  }, [status]);\n  var orderedFiles = Object.keys(files).sort().reduce(function (obj, key) {\n    obj[key] = files[key];\n    return obj;\n  }, {});\n  return jsx(\"div\", __assign({\n    className: classNames(\"file-explorer\", [stackClassName, className])\n  }, props, {\n    children: jsx(\"div\", __assign({\n      className: classNames(\"file-explorer-list\", [fileExplorerClassName])\n    }, {\n      children: jsx(ModuleList, {\n        activeFile,\n        autoHiddenFiles,\n        files: orderedFiles,\n        initialCollapsedFolder,\n        prefixedPath: \"/\",\n        selectFile: openFile,\n        visibleFiles: visibleFilesFromProps\n      }, void 0)\n    }), void 0)\n  }), void 0);\n};\nvar splitUrl = function (url) {\n  var match = url.match(/(https?:\\/\\/.*?)\\//);\n  if (match && match[1]) {\n    return [match[1], url.replace(match[1], \"\")];\n  }\n  return [url, \"/\"];\n};\nvar navigatorClassName = css({\n  display: \"flex\",\n  alignItems: \"center\",\n  height: \"$layout$headerHeight\",\n  borderBottom: \"1px solid $colors$surface2\",\n  padding: \"$space$3 $space$2\",\n  background: \"$colors$surface1\"\n});\nvar inputClassName = css({\n  backgroundColor: \"$colors$surface2\",\n  color: \"$colors$clickable\",\n  padding: \"$space$1 $space$3\",\n  borderRadius: \"99999px\",\n  border: \"1px solid $colors$surface2\",\n  height: \"24px\",\n  lineHeight: \"24px\",\n  fontSize: \"inherit\",\n  outline: \"none\",\n  flex: 1,\n  marginLeft: \"$space$4\",\n  width: \"0\",\n  transition: \"background $transitions$default\",\n  \"&:hover\": {\n    backgroundColor: \"$colors$surface3\"\n  },\n  \"&:focus\": {\n    backgroundColor: \"$surface1\",\n    border: \"1px solid $colors$accent\",\n    color: \"$colors$base\"\n  }\n});\nvar Navigator = function (_a2) {\n  var _b2;\n  var clientId = _a2.clientId,\n    onURLChange = _a2.onURLChange,\n    className = _a2.className,\n    startRoute = _a2.startRoute,\n    props = __rest(_a2, [\"clientId\", \"onURLChange\", \"className\", \"startRoute\"]);\n  var _c2 = React3.useState(\"\"),\n    baseUrl = _c2[0],\n    setBaseUrl = _c2[1];\n  var _d = useSandpack(),\n    sandpack = _d.sandpack,\n    dispatch = _d.dispatch,\n    listen = _d.listen;\n  var _e = React3.useState((_b2 = startRoute !== null && startRoute !== void 0 ? startRoute : sandpack.startRoute) !== null && _b2 !== void 0 ? _b2 : \"/\"),\n    relativeUrl = _e[0],\n    setRelativeUrl = _e[1];\n  var _f = React3.useState(false),\n    backEnabled = _f[0],\n    setBackEnabled = _f[1];\n  var _g = React3.useState(false),\n    forwardEnabled = _g[0],\n    setForwardEnabled = _g[1];\n  var classNames = useClassNames();\n  React3.useEffect(function () {\n    var unsub = listen(function (message) {\n      if (message.type === \"urlchange\") {\n        var url = message.url,\n          back = message.back,\n          forward = message.forward;\n        var _a3 = splitUrl(url),\n          newBaseUrl = _a3[0],\n          newRelativeUrl = _a3[1];\n        setBaseUrl(newBaseUrl);\n        setRelativeUrl(newRelativeUrl);\n        setBackEnabled(back);\n        setForwardEnabled(forward);\n      }\n    }, clientId);\n    return function () {\n      return unsub();\n    };\n  }, []);\n  var handleInputChange = function (e) {\n    var path = e.target.value.startsWith(\"/\") ? e.target.value : \"/\" + e.target.value;\n    setRelativeUrl(path);\n  };\n  var handleKeyDown = function (e) {\n    if (e.code === \"Enter\") {\n      e.preventDefault();\n      e.stopPropagation();\n      if (typeof onURLChange === \"function\") {\n        onURLChange(baseUrl + e.currentTarget.value);\n      }\n    }\n  };\n  var handleRefresh = function () {\n    dispatch({\n      type: \"refresh\"\n    });\n  };\n  var handleBack = function () {\n    dispatch({\n      type: \"urlback\"\n    });\n  };\n  var handleForward = function () {\n    dispatch({\n      type: \"urlforward\"\n    });\n  };\n  var buttonsClassNames = classNames(\"button\", [classNames(\"icon\"), buttonClassName, iconClassName, css({\n    minWidth: \"$space$6\",\n    justifyContent: \"center\"\n  })]);\n  return jsxs(\"div\", __assign({\n    className: classNames(\"navigator\", [navigatorClassName, className])\n  }, props, {\n    children: [jsx(\"button\", __assign({\n      \"aria-label\": \"Go back one page\",\n      className: buttonsClassNames,\n      disabled: !backEnabled,\n      onClick: handleBack,\n      type: \"button\"\n    }, {\n      children: jsx(BackwardIcon, {}, void 0)\n    }), void 0), jsx(\"button\", __assign({\n      \"aria-label\": \"Go forward one page\",\n      className: buttonsClassNames,\n      disabled: !forwardEnabled,\n      onClick: handleForward,\n      type: \"button\"\n    }, {\n      children: jsx(ForwardIcon, {}, void 0)\n    }), void 0), jsx(\"button\", __assign({\n      \"aria-label\": \"Refresh page\",\n      className: buttonsClassNames,\n      onClick: handleRefresh,\n      type: \"button\"\n    }, {\n      children: jsx(RefreshIcon, {}, void 0)\n    }), void 0), jsx(\"input\", {\n      \"aria-label\": \"Current Sandpack URL\",\n      className: classNames(\"input\", [inputClassName]),\n      name: \"Current Sandpack URL\",\n      onChange: handleInputChange,\n      onKeyDown: handleKeyDown,\n      type: \"text\",\n      value: relativeUrl\n    }, void 0)]\n  }), void 0);\n};\nvar _a$2;\nvar previewClassName = css((_a$2 = {\n  flex: 1,\n  display: \"flex\",\n  flexDirection: \"column\",\n  background: \"white\",\n  overflow: \"auto\",\n  position: \"relative\"\n}, _a$2[\".\" + THEME_PREFIX + \"-bridge-frame\"] = {\n  border: 0,\n  position: \"absolute\",\n  left: \"$space$2\",\n  bottom: \"$space$2\",\n  zIndex: \"$top\",\n  height: 12,\n  width: \"30%\",\n  mixBlendMode: \"multiply\",\n  pointerEvents: \"none\"\n}, _a$2));\nvar previewIframe = css({\n  border: \"0\",\n  outline: \"0\",\n  width: \"100%\",\n  height: \"100%\",\n  minHeight: \"160px\",\n  maxHeight: \"2000px\",\n  flex: 1\n});\nvar previewActionsClassName$1 = css({\n  display: \"flex\",\n  position: \"absolute\",\n  bottom: \"$space$2\",\n  right: \"$space$2\",\n  zIndex: \"$overlay\",\n  gap: \"$space$2\"\n});\nvar SandpackPreview = /*#__PURE__*/React3.forwardRef(function (_a2, ref) {\n  var _b2 = _a2.showNavigator,\n    showNavigator = _b2 === void 0 ? false : _b2,\n    _c2 = _a2.showRefreshButton,\n    showRefreshButton = _c2 === void 0 ? true : _c2,\n    _d = _a2.showOpenInCodeSandbox,\n    showOpenInCodeSandbox = _d === void 0 ? true : _d,\n    _e = _a2.showSandpackErrorOverlay,\n    showSandpackErrorOverlay = _e === void 0 ? true : _e;\n  _a2.showOpenNewtab;\n  var _g = _a2.showRestartButton,\n    showRestartButton = _g === void 0 ? true : _g,\n    _h = _a2.actionsChildren,\n    actionsChildren = _h === void 0 ? jsx(Fragment, {}, void 0) : _h,\n    children = _a2.children,\n    className = _a2.className,\n    _j = _a2.startRoute,\n    startRoute = _j === void 0 ? \"/\" : _j,\n    props = __rest(_a2, [\"showNavigator\", \"showRefreshButton\", \"showOpenInCodeSandbox\", \"showSandpackErrorOverlay\", \"showOpenNewtab\", \"showRestartButton\", \"actionsChildren\", \"children\", \"className\", \"startRoute\"]);\n  var _k = useSandpackClient({\n      startRoute\n    }),\n    sandpack = _k.sandpack,\n    listen = _k.listen,\n    iframe = _k.iframe,\n    getClient = _k.getClient,\n    clientId = _k.clientId,\n    dispatch = _k.dispatch;\n  var _l = React3.useState(null),\n    iframeComputedHeight = _l[0],\n    setComputedAutoHeight = _l[1];\n  var status = sandpack.status;\n  var refresh = useSandpackNavigation(clientId).refresh;\n  var restart = useSandpackShell(clientId).restart;\n  var classNames = useClassNames();\n  React3.useEffect(function () {\n    var unsubscribe = listen(function (message) {\n      if (message.type === \"resize\") {\n        setComputedAutoHeight(message.height);\n      }\n    });\n    return unsubscribe;\n  }, []);\n  React3.useImperativeHandle(ref, function () {\n    return {\n      clientId,\n      getClient\n    };\n  }, [getClient, clientId]);\n  var handleNewURL = function (newUrl) {\n    if (!iframe.current) {\n      return;\n    }\n    iframe.current.src = newUrl;\n  };\n  return jsxs(SandpackStack, __assign({\n    className: classNames(\"preview\", [className])\n  }, props, {\n    children: [showNavigator && jsx(Navigator, {\n      clientId,\n      onURLChange: handleNewURL,\n      startRoute\n    }, void 0), jsxs(\"div\", __assign({\n      className: classNames(\"preview-container\", [previewClassName])\n    }, {\n      children: [jsx(\"iframe\", {\n        ref: iframe,\n        className: classNames(\"preview-iframe\", [previewIframe]),\n        style: {\n          // set height based on the content only in auto mode\n          // and when the computed height was returned by the bundler\n          height: iframeComputedHeight ? iframeComputedHeight : void 0\n        },\n        title: \"Sandpack Preview\"\n      }, void 0), jsxs(\"div\", __assign({\n        className: classNames(\"preview-actions\", [previewActionsClassName$1])\n      }, {\n        children: [actionsChildren, showRestartButton && sandpack.environment === \"node\" && jsx(RoundedButton, __assign({\n          onClick: restart\n        }, {\n          children: jsx(RestartIcon, {}, void 0)\n        }), void 0), !showNavigator && showRefreshButton && status === \"running\" && jsx(RoundedButton, __assign({\n          onClick: refresh\n        }, {\n          children: jsx(RefreshIcon, {}, void 0)\n        }), void 0), sandpack.teamId && jsx(\"button\", __assign({\n          className: classNames(\"button\", [classNames(\"icon-standalone\"), buttonClassName, iconStandaloneClassName, roundedButtonClassName]),\n          onClick: function () {\n            return dispatch({\n              type: \"sign-out\"\n            });\n          },\n          title: \"Sign out\",\n          type: \"button\"\n        }, {\n          children: jsx(SignOutIcon, {}, void 0)\n        }), void 0), showOpenInCodeSandbox && jsx(OpenInCodeSandboxButton, {}, void 0)]\n      }), void 0), jsx(LoadingOverlay, {\n        clientId,\n        showOpenInCodeSandbox\n      }, void 0), showSandpackErrorOverlay && jsx(ErrorOverlay, {}, void 0), children]\n    }), void 0)]\n  }), void 0);\n});\nvar _a$1;\nvar transpiledCodeClassName = css((_a$1 = {\n  display: \"flex\",\n  flexDirection: \"column\",\n  width: \"100%\",\n  position: \"relative\",\n  overflow: \"auto\",\n  minHeight: \"160px\",\n  flex: 1\n}, _a$1[\".\" + THEME_PREFIX + \"-stack\"] = {\n  height: \"100%\"\n}, _a$1));\nvar SandpackTranspiledCode = function (_a2) {\n  var className = _a2.className,\n    props = __rest(_a2, [\"className\"]);\n  var sandpack = useSandpack().sandpack;\n  var transpiledCode = useTranspiledCode();\n  var classNames = useClassNames();\n  var hiddenIframeRef = React3.useRef(null);\n  React3.useEffect(function () {\n    var hiddenIframe = hiddenIframeRef.current;\n    if (hiddenIframe) {\n      sandpack.registerBundler(hiddenIframe, \"hidden\");\n    }\n    return function () {\n      sandpack.unregisterBundler(\"hidden\");\n    };\n  }, []);\n  return jsxs(\"div\", __assign({\n    className: classNames(\"transpiled-code\", [stackClassName, transpiledCodeClassName, className])\n  }, props, {\n    children: [jsx(SandpackCodeViewer, __assign({\n      code: transpiledCode !== null && transpiledCode !== void 0 ? transpiledCode : \"\",\n      initMode: sandpack.initMode\n    }, props), void 0), jsx(\"iframe\", {\n      ref: hiddenIframeRef,\n      style: {\n        display: \"none\"\n      },\n      title: \"transpiled sandpack code\"\n    }, void 0), jsx(ErrorOverlay, {}, void 0), jsx(LoadingOverlay, {\n      clientId: \"hidden\",\n      showOpenInCodeSandbox: false\n    }, void 0)]\n  }), void 0);\n};\nvar wrapperClassName$1 = css({\n  justifyContent: \"space-between\",\n  borderBottom: \"1px solid $colors$surface2\",\n  padding: \"0 $space$2\",\n  fontFamily: \"$font$mono\",\n  height: \"$layout$headerHeight\",\n  minHeight: \"$layout$headerHeight\",\n  overflowX: \"auto\",\n  whiteSpace: \"nowrap\"\n});\nvar flexClassName$1 = css({\n  display: \"flex\",\n  flexDirection: \"row\",\n  alignItems: \"center\",\n  gap: \"$space$2\"\n});\nvar Header$1 = function (_a2) {\n  var status = _a2.status,\n    suiteOnly = _a2.suiteOnly,\n    setSuiteOnly = _a2.setSuiteOnly,\n    setVerbose = _a2.setVerbose,\n    verbose = _a2.verbose,\n    watchMode = _a2.watchMode,\n    setWatchMode = _a2.setWatchMode,\n    showSuitesOnly = _a2.showSuitesOnly,\n    showWatchButton = _a2.showWatchButton,\n    showVerboseButton = _a2.showVerboseButton,\n    hideTestsAndSupressLogs = _a2.hideTestsAndSupressLogs;\n  var classNames = useClassNames();\n  var buttonsClassName = classNames(\"test-header-button\", [buttonClassName, roundedButtonClassName, css({\n    padding: \"$space$1 $space$3\"\n  })]);\n  return jsxs(\"div\", __assign({\n    className: classNames(\"test-header\", [wrapperClassName$1, flexClassName$1])\n  }, {\n    children: [jsx(\"div\", __assign({\n      className: classNames(\"test-header-wrapper\", [flexClassName$1])\n    }, {\n      children: jsxs(\"p\", __assign({\n        className: classNames(\"test-header-title\", [css({\n          lineHeight: 1,\n          margin: 0,\n          color: \"$colors$base\",\n          fontSize: \"$font$size\",\n          display: \"flex\",\n          alignItems: \"center\",\n          gap: \"$space$2\"\n        })])\n      }, {\n        children: [jsx(ConsoleIcon, {}, void 0), \"Tests\"]\n      }), void 0)\n    }), void 0), jsxs(\"div\", __assign({\n      className: classNames(\"test-header-actions\", [flexClassName$1])\n    }, {\n      children: [showSuitesOnly && jsx(\"button\", __assign({\n        className: buttonsClassName,\n        \"data-active\": suiteOnly,\n        disabled: status === \"initialising\",\n        onClick: setSuiteOnly,\n        type: \"button\"\n      }, {\n        children: \"Suite only\"\n      }), void 0), showVerboseButton && jsx(\"button\", __assign({\n        className: buttonsClassName,\n        \"data-active\": verbose,\n        disabled: status === \"initialising\" || hideTestsAndSupressLogs,\n        onClick: setVerbose,\n        type: \"button\"\n      }, {\n        children: \"Verbose\"\n      }), void 0), showWatchButton && jsx(\"button\", __assign({\n        className: buttonsClassName,\n        \"data-active\": watchMode,\n        disabled: status === \"initialising\",\n        onClick: setWatchMode,\n        type: \"button\"\n      }, {\n        children: \"Watch\"\n      }), void 0)]\n    }), void 0)]\n  }), void 0);\n};\nvar RunButton = function (_a2) {\n  var onClick = _a2.onClick;\n  return jsx(RoundedButton, __assign({\n    onClick,\n    title: \"Run tests\"\n  }, {\n    children: jsx(RunIcon, {}, void 0)\n  }), void 0);\n};\nvar setTestTheme = function (isDark) {\n  return {\n    \"--test-pass\": isDark ? \"#18df16\" : \"#15c213\",\n    \"--test-fail\": isDark ? \"#df162b\" : \"#c21325\",\n    \"--test-skip\": isDark ? \"#eace2b\" : \"#c2a813\",\n    \"--test-run\": isDark ? \"#eace2b\" : \"#c2a813\",\n    \"--test-title\": isDark ? \"#3fbabe\" : \"#256c6f\"\n  };\n};\nvar color = css({\n  variants: {\n    status: {\n      pass: {\n        color: \"var(--test-pass)\"\n      },\n      fail: {\n        color: \"var(--test-fail)\"\n      },\n      skip: {\n        color: \"var(--test-skip)\"\n      },\n      title: {\n        color: \"var(--test-title)\"\n      }\n    }\n  }\n});\nvar passTextClassName = color({\n  status: \"pass\"\n});\nvar failTextClassName = color({\n  status: \"fail\"\n});\nvar skipTextClassName = color({\n  status: \"skip\"\n});\nvar titleTextClassName = color({\n  status: \"title\"\n});\nvar background = css({\n  variants: {\n    status: {\n      pass: {\n        background: \"var(--test-pass)\",\n        color: \"$colors$surface1\"\n      },\n      fail: {\n        background: \"var(--test-fail)\",\n        color: \"$colors$surface1\"\n      },\n      run: {\n        background: \"var(--test-run)\",\n        color: \"$colors$surface1\"\n      }\n    }\n  }\n});\nvar runBackgroundClassName = background({\n  status: \"run\"\n});\nvar passBackgroundClassName = background({\n  status: \"pass\"\n});\nvar failBackgroundClassName = background({\n  status: \"fail\"\n});\nvar testContainerClassName = css({\n  marginLeft: \"$space$4\"\n});\nvar containerClassName$4 = css({\n  marginBottom: \"$space$2\",\n  color: \"$colors$clickable\"\n});\nvar testClassName = css({\n  marginBottom: \"$space$2\",\n  color: \"$colors$hover\"\n});\nvar durationClassName = css({\n  marginLeft: \"$space$2\"\n});\nvar gapRightClassName = css({\n  marginRight: \"$space$2\"\n});\nvar Tests = function (_a2) {\n  var tests = _a2.tests;\n  _a2.style;\n  var classNames = useClassNames();\n  return jsx(\"div\", __assign({\n    className: classNames(\"test\", [testContainerClassName])\n  }, {\n    children: tests.map(function (test) {\n      return jsxs(\"div\", __assign({\n        className: classNames(\"test-result\", [containerClassName$4])\n      }, {\n        children: [test.status === \"pass\" && jsx(\"span\", __assign({\n          className: classNames(\"test-pass-text\", [passTextClassName, gapRightClassName])\n        }, {\n          children: \"\u2713\"\n        }), void 0), test.status === \"fail\" && jsx(\"span\", __assign({\n          className: classNames(\"test-fail-text\", [failTextClassName, gapRightClassName])\n        }, {\n          children: \"\u2715\"\n        }), void 0), test.status === \"idle\" && jsx(\"span\", __assign({\n          className: classNames(\"test-idle-text\", [skipTextClassName, gapRightClassName])\n        }, {\n          children: \"\u25CB\"\n        }), void 0), jsx(\"span\", __assign({\n          className: classNames(\"test-name-text\", [testClassName])\n        }, {\n          children: test.name\n        }), void 0), test.duration !== void 0 && jsxs(\"span\", __assign({\n          className: classNames(\"test-duration-text\", [durationClassName])\n        }, {\n          children: [\"(\", test.duration, \" ms)\"]\n        }), void 0)]\n      }), test.name);\n    })\n  }), void 0);\n};\nvar getTests = function (block) {\n  var _a2;\n  var _b2, _c2;\n  return (_a2 = Object.values((_b2 = block.tests) !== null && _b2 !== void 0 ? _b2 : {})).concat.apply(_a2, Object.values((_c2 = block.describes) !== null && _c2 !== void 0 ? _c2 : {}).map(getTests));\n};\nvar getFailingTests = function (block) {\n  return getTests(block).filter(function (t2) {\n    return t2.status === \"fail\";\n  });\n};\nvar getAllTestResults = function (specs) {\n  return specs.map(getSpecTestResults).reduce(function (acc, stats) {\n    return {\n      pass: acc.pass + stats.pass,\n      fail: acc.fail + stats.fail,\n      skip: acc.skip + stats.skip,\n      total: acc.total + stats.total\n    };\n  }, {\n    pass: 0,\n    skip: 0,\n    fail: 0,\n    total: 0\n  });\n};\nvar getSpecTestResults = function (spec) {\n  return getTests(spec).reduce(function (acc, test) {\n    return {\n      pass: test.status === \"pass\" ? acc.pass + 1 : acc.pass,\n      fail: test.status === \"fail\" ? acc.fail + 1 : acc.fail,\n      skip: test.status === \"idle\" || test.status === \"running\" ? acc.skip + 1 : acc.skip,\n      total: acc.total + 1\n    };\n  }, {\n    pass: 0,\n    fail: 0,\n    skip: 0,\n    total: 0\n  });\n};\nvar getAllSuiteResults = function (specs) {\n  return specs.filter(function (spec) {\n    var _a2, _b2;\n    return Object.values((_a2 = spec.describes) !== null && _a2 !== void 0 ? _a2 : {}).length > 0 || Object.values((_b2 = spec.tests) !== null && _b2 !== void 0 ? _b2 : {}).length > 0;\n  }).map(getSpecTestResults).reduce(function (acc, stats) {\n    return {\n      pass: acc.pass + (stats.fail === 0 ? 1 : 0),\n      fail: acc.fail + (stats.fail > 0 ? 1 : 0),\n      total: acc.total + 1\n    };\n  }, {\n    pass: 0,\n    fail: 0,\n    total: 0\n  });\n};\nvar getDuration = function (specs) {\n  return flatMap(specs, getTests).reduce(function (acc, test) {\n    return acc + (test.duration || 0);\n  }, 0);\n};\nvar isEmpty = function (block) {\n  var _a2, _b2;\n  return Object.values((_a2 = block.describes) !== null && _a2 !== void 0 ? _a2 : {}).length === 0 && Object.values((_b2 = block.tests) !== null && _b2 !== void 0 ? _b2 : {}).length === 0;\n};\nvar splitTail = function (as) {\n  var lastIndex = as.length - 1;\n  var head = as.slice(0, lastIndex);\n  var tail = as[lastIndex];\n  return [head, tail];\n};\nvar flatMap = function (as, f2) {\n  return as.map(f2).reduce(function (acc, next) {\n    return acc.concat(next);\n  }, []);\n};\nvar set = function (path, value) {\n  return function (object) {\n    return clean_set_es_default(object, path, value);\n  };\n};\nvar nameClassName = css({\n  color: \"$colors$hover\",\n  marginBottom: \"$space$2\"\n});\nvar containerClassName$3 = css({\n  marginLeft: \"$space$4\"\n});\nvar Describes = function (_a2) {\n  var describes = _a2.describes;\n  var classNames = useClassNames();\n  return jsx(Fragment, {\n    children: describes.map(function (describe) {\n      var _a3, _b2;\n      if (isEmpty(describe)) {\n        return null;\n      }\n      var tests = Object.values((_a3 = describe.tests) !== null && _a3 !== void 0 ? _a3 : {});\n      var describes2 = Object.values((_b2 = describe.describes) !== null && _b2 !== void 0 ? _b2 : {});\n      return jsxs(\"div\", __assign({\n        className: classNames(\"test-describe\", [containerClassName$3])\n      }, {\n        children: [jsx(\"div\", __assign({\n          className: classNames(\"test-name\", [nameClassName])\n        }, {\n          children: describe.name\n        }), void 0), jsx(Tests, {\n          tests\n        }, void 0), jsx(Describes, {\n          describes: describes2\n        }, void 0)]\n      }), describe.name);\n    })\n  }, void 0);\n};\nvar containerClassName$2 = css({\n  color: \"$colors$hover\",\n  fontSize: \"$font$size\",\n  padding: \"$space$2\",\n  whiteSpace: \"pre-wrap\"\n});\nvar FormattedError = function (_a2) {\n  var error = _a2.error,\n    path = _a2.path;\n  var classNames = useClassNames();\n  return jsx(\"div\", {\n    className: classNames(\"test-error\", [containerClassName$2]),\n    dangerouslySetInnerHTML: {\n      __html: formatDiffMessage(error, path)\n    }\n  }, void 0);\n};\nvar escapeHtml = function (unsafe) {\n  return unsafe.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#039;\");\n};\nvar formatDiffMessage = function (error, path) {\n  var finalMessage = \"\";\n  if (error.matcherResult) {\n    finalMessage = \"<span>\" + escapeHtml(error.message).replace(/(expected)/m, '<span class=\"' + passTextClassName + '\">$1</span>').replace(/(received)/m, '<span class=\"' + failTextClassName + '\">$1</span>').replace(/(Difference:)/m, \"<span>$1</span>\").replace(/(Expected:)(.*)/m, '<span>$1</span><span class=\"' + passTextClassName + '\">$2</span>').replace(/(Received:)(.*)/m, '<span>$1</span><span class=\"' + failTextClassName + '\">$2</span>').replace(/^(-.*)/gm, '<span class=\"' + failTextClassName + '\">$1</span>').replace(/^(\\+.*)/gm, '<span class=\"' + passTextClassName + '\">$1</span>') + \"</span>\";\n  } else {\n    finalMessage = escapeHtml(error.message);\n  }\n  if (error.mappedErrors && error.mappedErrors[0] && error.mappedErrors[0].fileName.endsWith(path) && error.mappedErrors[0]._originalScriptCode) {\n    var mappedError = error.mappedErrors[0];\n    var _originalScriptCode = mappedError._originalScriptCode || [];\n    var widestNumber_1 = Math.max.apply(Math, _originalScriptCode.map(function (code) {\n      return (code.lineNumber + \"\").length;\n    })) + 2;\n    var margin_1 = Array.from({\n      length: widestNumber_1\n    }).map(function () {\n      return \" \";\n    });\n    finalMessage += \"<br />\";\n    finalMessage += \"<br />\";\n    finalMessage += \"<div>\";\n    _originalScriptCode.filter(function (s2) {\n      return s2.content.trim();\n    }).forEach(function (code) {\n      var currentLineMargin = (code.lineNumber + \"\").length;\n      var newMargin = __spreadArray([], margin_1, true);\n      newMargin.length -= currentLineMargin;\n      if (code.highlight) {\n        newMargin.length -= 2;\n      }\n      var toBeIndex = code.content.indexOf(\".to\");\n      var toBeMargin = Array.from({\n        length: margin_1.length + toBeIndex - (widestNumber_1 - 1)\n      }, function () {\n        return \" \";\n      });\n      var content = escapeHtml(code.content).replace(/(describe|test|it)(\\()(&#039;|&quot;|`)(.*)(&#039;|&quot;|`)/m, '<span>$1$2$3</span><span class=\"' + titleTextClassName + '\">$4</span><span>$5</span>').replace(/(expect\\()(.*)(\\)\\..*)(to[\\w\\d]*)(\\()(.*)(\\))/m, '<span>$1</span><span class=\"' + failTextClassName + '\">$2</span><span>$3</span><span style=\"text-decoration: underline; font-weight: 900\">$4</span><span>$5</span><span class=\"' + passTextClassName + '\">$6</span><span>$7</span>');\n      finalMessage += \"<div \" + (code.highlight ? 'style=\"font-weight:200;\"' : \"\") + \">\" + (code.highlight ? '<span class=\"' + failTextClassName + '\">></span> ' : \"\") + newMargin.join(\"\") + escapeHtml(\"\" + code.lineNumber) + \" | \" + content + \"</div>\" + (code.highlight ? \"<div>\" + margin_1.join(\"\") + \" | \" + toBeMargin.join(\"\") + ('<span class=\"' + failTextClassName + '\">^</span>') + \"</div>\" : \"\");\n    });\n    finalMessage += \"</div>\";\n  }\n  return finalMessage.replace(/(?:\\r\\n|\\r|\\n)/g, \"<br />\");\n};\nvar fileContainer = css({\n  display: \"flex\",\n  flexDirection: \"row\",\n  alignItems: \"center\",\n  marginBottom: \"$space$2\"\n});\nvar gapBottomClassName$1 = css({\n  marginBottom: \"$space$2\"\n});\nvar failTestClassName = css({\n  fontWeight: \"bold\"\n});\nvar labelClassName$1 = css({\n  borderRadius: \"calc($border$radius / 2)\"\n});\nvar specLabelClassName = css({\n  padding: \"$space$1 $space$2\",\n  fontFamily: \"$font$mono\",\n  textTransform: \"uppercase\",\n  marginRight: \"$space$2\"\n});\nvar filePathButtonClassName = css({\n  fontFamily: \"$font$mono\",\n  cursor: \"pointer\",\n  display: \"inline-block\"\n});\nvar filePathClassName = css({\n  color: \"$colors$clickable\",\n  textDecorationStyle: \"dotted\",\n  textDecorationLine: \"underline\"\n});\nvar fileNameClassName = css({\n  color: \"$colors$hover\",\n  fontWeight: \"bold\",\n  textDecorationStyle: \"dotted\",\n  textDecorationLine: \"underline\"\n});\nvar Specs = function (_a2) {\n  var specs = _a2.specs,\n    openSpec = _a2.openSpec,\n    status = _a2.status,\n    verbose = _a2.verbose,\n    hideTestsAndSupressLogs = _a2.hideTestsAndSupressLogs;\n  var classNames = useClassNames();\n  return jsx(Fragment, {\n    children: specs.map(function (spec) {\n      if (spec.error) {\n        return jsxs(\"div\", __assign({\n          className: classNames(\"test-spec\", [gapBottomClassName$1])\n        }, {\n          children: [jsx(SpecLabel, __assign({\n            className: classNames(\"test-spec-error\", [labelClassName$1, failBackgroundClassName])\n          }, {\n            children: \"Error\"\n          }), void 0), jsx(FilePath, {\n            onClick: function () {\n              return openSpec(spec.name);\n            },\n            path: spec.name\n          }, void 0), jsx(FormattedError, {\n            error: spec.error,\n            path: spec.name\n          }, void 0)]\n        }), spec.name);\n      }\n      if (isEmpty(spec)) {\n        return null;\n      }\n      var tests = Object.values(spec.tests);\n      var describes = Object.values(spec.describes);\n      var stats = getSpecTestResults(spec);\n      return jsxs(\"div\", __assign({\n        className: classNames(\"test-spec-name\", [gapBottomClassName$1])\n      }, {\n        children: [jsxs(\"div\", __assign({\n          className: classNames(\"test-spec-name-container\", [fileContainer])\n        }, {\n          children: [status === \"complete\" ? stats.fail > 0 ? jsx(SpecLabel, __assign({\n            className: classNames(\"test-spec-complete\", [labelClassName$1, failBackgroundClassName])\n          }, {\n            children: \"Fail\"\n          }), void 0) : jsx(SpecLabel, __assign({\n            className: classNames(\"test-spec-pass\", [labelClassName$1, passBackgroundClassName])\n          }, {\n            children: \"Pass\"\n          }), void 0) : jsx(SpecLabel, __assign({\n            className: classNames(\"test-spec-run\", [labelClassName$1, runBackgroundClassName])\n          }, {\n            children: \"Run\"\n          }), void 0), jsx(FilePath, {\n            onClick: function () {\n              if (!hideTestsAndSupressLogs) {\n                openSpec(spec.name);\n              }\n            },\n            path: spec.name\n          }, void 0)]\n        }), void 0), verbose && !hideTestsAndSupressLogs && jsx(Tests, {\n          tests\n        }, void 0), verbose && !hideTestsAndSupressLogs && jsx(Describes, {\n          describes\n        }, void 0), !hideTestsAndSupressLogs && getFailingTests(spec).map(function (test) {\n          return jsxs(\"div\", __assign({\n            className: classNames(\"test-spec-error\", [gapBottomClassName$1])\n          }, {\n            children: [jsxs(\"div\", __assign({\n              className: classNames(\"test-spec-error-text\", [failTestClassName, failTextClassName])\n            }, {\n              children: [\"\u25CF \", test.blocks.join(\" \u203A \"), \" \u203A \", test.name]\n            }), void 0), test.errors.map(function (e) {\n              return jsx(FormattedError, {\n                error: e,\n                path: test.path\n              }, \"failing-\" + test.name + \"-error\");\n            })]\n          }), \"failing-\" + test.name);\n        })]\n      }), spec.name);\n    })\n  }, void 0);\n};\nvar SpecLabel = function (_a2) {\n  var children = _a2.children,\n    className = _a2.className;\n  var classNames = useClassNames();\n  return jsx(\"span\", __assign({\n    className: classNames(\"test-spec-label\", [specLabelClassName, className])\n  }, {\n    children\n  }), void 0);\n};\nvar FilePath = function (_a2) {\n  var onClick = _a2.onClick,\n    path = _a2.path;\n  var parts = path.split(\"/\");\n  var basePath = parts.slice(0, parts.length - 1).join(\"/\") + \"/\";\n  var fileName = parts[parts.length - 1];\n  var classNames = useClassNames();\n  return jsxs(\"button\", __assign({\n    className: classNames(\"test-filename\", [buttonClassName, filePathButtonClassName]),\n    onClick,\n    type: \"button\"\n  }, {\n    children: [jsx(\"span\", __assign({\n      className: classNames(\"test-filename-base\", [filePathClassName])\n    }, {\n      children: basePath\n    }), void 0), jsx(\"span\", __assign({\n      className: classNames(\"test-filename-file\", [fileNameClassName])\n    }, {\n      children: fileName\n    }), void 0)]\n  }), void 0);\n};\nvar gapBottomClassName = css({\n  marginBottom: \"$space$2\"\n});\nvar labelClassName = css({\n  fontWeight: \"bold\",\n  color: \"$colors$hover\",\n  whiteSpace: \"pre-wrap\"\n});\nvar containerClassName$1 = css({\n  fontWeight: \"bold\",\n  color: \"$colors$clickable\"\n});\nvar Summary = function (_a2) {\n  var suites = _a2.suites,\n    tests = _a2.tests,\n    duration = _a2.duration;\n  var widestLabel = \"Test suites: \";\n  var withMargin = function (label) {\n    var difference = widestLabel.length - label.length;\n    var margin = Array.from({\n      length: difference\n    }, function () {\n      return \" \";\n    }).join(\"\");\n    return label + margin;\n  };\n  var classNames = useClassNames();\n  return jsxs(\"div\", __assign({\n    className: classNames(\"test-summary\", [containerClassName$1])\n  }, {\n    children: [jsxs(\"div\", __assign({\n      className: classNames(\"test-summary\", [gapBottomClassName])\n    }, {\n      children: [jsx(\"span\", __assign({\n        className: classNames(\"test-summary-suites-label\", [labelClassName])\n      }, {\n        children: widestLabel\n      }), void 0), suites.fail > 0 && jsxs(\"span\", __assign({\n        className: classNames(\"test-summary-suites-fail\", [failTextClassName])\n      }, {\n        children: [suites.fail, \" failed,\", \" \"]\n      }), void 0), suites.pass > 0 && jsxs(\"span\", __assign({\n        className: classNames(\"test-summary-suites-pass\", [passTextClassName])\n      }, {\n        children: [suites.pass, \" passed,\", \" \"]\n      }), void 0), jsxs(\"span\", {\n        children: [suites.total, \" total\"]\n      }, void 0)]\n    }), void 0), jsxs(\"div\", __assign({\n      className: classNames(\"test-summary\", [gapBottomClassName])\n    }, {\n      children: [jsx(\"span\", __assign({\n        className: classNames(\"test-summary-label\", [labelClassName])\n      }, {\n        children: withMargin(\"Tests:\")\n      }), void 0), tests.fail > 0 && jsxs(\"span\", __assign({\n        className: classNames(\"test-summary-fail\", [failTextClassName])\n      }, {\n        children: [tests.fail, \" failed,\", \" \"]\n      }), void 0), tests.skip > 0 && jsxs(\"span\", __assign({\n        className: classNames(\"test-summary-skip\", [skipTextClassName])\n      }, {\n        children: [tests.skip, \" skipped,\", \" \"]\n      }), void 0), tests.pass > 0 && jsxs(\"span\", __assign({\n        className: classNames(\"test-summary-pass\", [passTextClassName])\n      }, {\n        children: [tests.pass, \" passed,\", \" \"]\n      }), void 0), jsxs(\"span\", {\n        children: [tests.total, \" total\"]\n      }, void 0)]\n    }), void 0), jsxs(\"div\", __assign({\n      className: classNames(\"test-summary-curation\", [labelClassName])\n    }, {\n      children: [withMargin(\"Time:\"), duration / 1e3, \"s\"]\n    }), void 0)]\n  }), void 0);\n};\nvar previewActionsClassName = css({\n  display: \"flex\",\n  position: \"absolute\",\n  bottom: \"$space$2\",\n  right: \"$space$2\",\n  zIndex: \"$overlay\",\n  \"> *\": {\n    marginLeft: \"$space$2\"\n  }\n});\nvar INITIAL_STATE = {\n  specs: {},\n  status: \"initialising\",\n  verbose: false,\n  watchMode: true,\n  suiteOnly: false,\n  specsCount: 0\n};\nvar SandpackTests = function (_a2) {\n  var _b2 = _a2.verbose,\n    verbose = _b2 === void 0 ? false : _b2,\n    _c2 = _a2.watchMode,\n    watchMode = _c2 === void 0 ? true : _c2,\n    style = _a2.style,\n    className = _a2.className,\n    onComplete = _a2.onComplete,\n    actionsChildren = _a2.actionsChildren,\n    _d = _a2.showVerboseButton,\n    showVerboseButton = _d === void 0 ? true : _d,\n    _e = _a2.showWatchButton,\n    showWatchButton = _e === void 0 ? true : _e,\n    _f = _a2.hideTestsAndSupressLogs,\n    hideTestsAndSupressLogs = _f === void 0 ? false : _f,\n    props = __rest(_a2, [\"verbose\", \"watchMode\", \"style\", \"className\", \"onComplete\", \"actionsChildren\", \"showVerboseButton\", \"showWatchButton\", \"hideTestsAndSupressLogs\"]);\n  var theme = useSandpackTheme();\n  var _g = useSandpackClient(),\n    getClient = _g.getClient,\n    iframe = _g.iframe,\n    listen = _g.listen,\n    sandpack = _g.sandpack;\n  var _h = React3.useState(__assign(__assign({}, INITIAL_STATE), {\n      verbose,\n      watchMode\n    })),\n    state = _h[0],\n    setState = _h[1];\n  var runAllTests = React3.useCallback(function () {\n    setState(function (oldState) {\n      return __assign(__assign({}, oldState), {\n        status: \"running\",\n        specs: {}\n      });\n    });\n    var client = getClient();\n    if (client) {\n      client.dispatch({\n        type: \"run-all-tests\"\n      });\n    }\n  }, [getClient]);\n  var runSpec = React3.useCallback(function () {\n    setState(function (oldState) {\n      return __assign(__assign({}, oldState), {\n        status: \"running\",\n        specs: {}\n      });\n    });\n    var client = getClient();\n    if (client) {\n      client.dispatch({\n        type: \"run-tests\",\n        path: sandpack.activeFile\n      });\n    }\n  }, [getClient, sandpack.activeFile]);\n  var testFileRegex = /.*\\.(test|spec)\\.[tj]sx?$/;\n  var isSpecOpen = sandpack.activeFile.match(testFileRegex) !== null;\n  React3.useEffect(function () {\n    var currentDescribeBlocks = [];\n    var currentSpec = \"\";\n    var unsubscribe = listen(function (data) {\n      if (state.suiteOnly && (\"path\" in data && data.path !== sandpack.activeFile || \"test\" in data && \"path\" in data.test && data.test.path !== sandpack.activeFile)) {\n        return;\n      }\n      if (data.type === \"action\" && data.action === \"clear-errors\" && data.source === \"jest\") {\n        currentSpec = data.path;\n        return;\n      }\n      if (data.type === \"test\") {\n        if (data.event === \"initialize_tests\") {\n          currentDescribeBlocks = [];\n          currentSpec = \"\";\n          if (state.watchMode) {\n            return runAllTests();\n          } else {\n            return setState(function (oldState) {\n              return __assign(__assign({}, oldState), {\n                status: \"idle\",\n                specs: {}\n              });\n            });\n          }\n        }\n        if (data.event === \"test_count\") {\n          return setState(function (oldState) {\n            return __assign(__assign({}, oldState), {\n              specsCount: data.count\n            });\n          });\n        }\n        if (data.event === \"total_test_start\") {\n          currentDescribeBlocks = [];\n          return setState(function (oldState) {\n            return __assign(__assign({}, oldState), {\n              status: \"running\"\n            });\n          });\n        }\n        if (data.event === \"total_test_end\") {\n          return setState(function (oldState) {\n            if (onComplete !== void 0) {\n              onComplete(oldState.specs);\n            }\n            return __assign(__assign({}, oldState), {\n              status: \"complete\"\n            });\n          });\n        }\n        if (data.event === \"add_file\") {\n          return setState(set([\"specs\", data.path], {\n            describes: {},\n            tests: {},\n            name: data.path\n          }));\n        }\n        if (data.event === \"remove_file\") {\n          return setState(function (oldState) {\n            var specs2 = Object.entries(oldState.specs).reduce(function (acc, _a4) {\n              var _b4;\n              var key = _a4[0],\n                value = _a4[1];\n              if (key === data.path) {\n                return acc;\n              } else {\n                return __assign(__assign({}, acc), (_b4 = {}, _b4[key] = value, _b4));\n              }\n            }, {});\n            return __assign(__assign({}, oldState), {\n              specs: specs2\n            });\n          });\n        }\n        if (data.event === \"file_error\") {\n          return setState(set([\"specs\", data.path, \"error\"], data.error));\n        }\n        if (data.event === \"describe_start\") {\n          currentDescribeBlocks.push(data.blockName);\n          var _a3 = splitTail(currentDescribeBlocks),\n            describePath = _a3[0],\n            currentDescribe = _a3[1];\n          var spec = currentSpec;\n          if (currentDescribe === void 0) {\n            return;\n          }\n          return setState(set(__spreadArray(__spreadArray([\"specs\", spec, \"describes\"], flatMap(describePath, function (name) {\n            return [name, \"describes\"];\n          }), true), [currentDescribe], false), {\n            name: data.blockName,\n            tests: {},\n            describes: {}\n          }));\n        }\n        if (data.event === \"describe_end\") {\n          currentDescribeBlocks.pop();\n          return;\n        }\n        if (data.event === \"add_test\") {\n          var _b3 = splitTail(currentDescribeBlocks),\n            describePath = _b3[0],\n            currentDescribe = _b3[1];\n          var test_1 = {\n            status: \"idle\",\n            errors: [],\n            name: data.testName,\n            blocks: __spreadArray([], currentDescribeBlocks, true),\n            path: data.path\n          };\n          if (currentDescribe === void 0) {\n            return setState(set([\"specs\", data.path, \"tests\", data.testName], test_1));\n          } else {\n            return setState(set(__spreadArray(__spreadArray([\"specs\", data.path, \"describes\"], flatMap(describePath, function (name) {\n              return [name, \"describes\"];\n            }), true), [currentDescribe, \"tests\", data.testName], false), test_1));\n          }\n        }\n        if (data.event === \"test_start\") {\n          var test_2 = data.test;\n          var _c3 = splitTail(test_2.blocks),\n            describePath = _c3[0],\n            currentDescribe = _c3[1];\n          var startedTest = {\n            status: \"running\",\n            name: test_2.name,\n            blocks: test_2.blocks,\n            path: test_2.path,\n            errors: []\n          };\n          if (currentDescribe === void 0) {\n            return setState(set([\"specs\", test_2.path, \"tests\", test_2.name], startedTest));\n          } else {\n            return setState(set(__spreadArray(__spreadArray([\"specs\", test_2.path, \"describes\"], flatMap(describePath, function (name) {\n              return [name, \"describes\"];\n            }), true), [currentDescribe, \"tests\", test_2.name], false), startedTest));\n          }\n        }\n        if (data.event === \"test_end\") {\n          var test_3 = data.test;\n          var _d2 = splitTail(test_3.blocks),\n            describePath = _d2[0],\n            currentDescribe = _d2[1];\n          var endedTest = {\n            status: test_3.status,\n            errors: test_3.errors,\n            duration: test_3.duration,\n            name: test_3.name,\n            blocks: test_3.blocks,\n            path: test_3.path\n          };\n          if (currentDescribe === void 0) {\n            return setState(set([\"specs\", test_3.path, \"tests\", test_3.name], endedTest));\n          } else {\n            return setState(set(__spreadArray(__spreadArray([\"specs\", test_3.path, \"describes\"], flatMap(describePath, function (name) {\n              return [name, \"describes\"];\n            }), true), [currentDescribe, \"tests\", test_3.name], false), endedTest));\n          }\n        }\n      }\n    });\n    return unsubscribe;\n  }, [state.suiteOnly, state.watchMode, sandpack.activeFile]);\n  React3.useEffect(function watchMode2() {\n    var unsunscribe = listen(function (_a3) {\n      var type = _a3.type;\n      if (type === \"done\" && state.watchMode) {\n        if (isSpecOpen) {\n          runSpec();\n        } else {\n          runAllTests();\n        }\n      }\n    });\n    return unsunscribe;\n  }, [runSpec, runAllTests, state.watchMode, isSpecOpen]);\n  var openSpec = function (file) {\n    sandpack.setActiveFile(file);\n  };\n  var specs = Object.values(state.specs);\n  var duration = getDuration(specs);\n  var testResults = getAllTestResults(specs);\n  var suiteResults = getAllSuiteResults(specs);\n  var classNames = useClassNames();\n  return jsxs(SandpackStack, __assign({\n    className: classNames(\"tests\", [className]),\n    style: __assign(__assign({}, setTestTheme(theme.themeMode === \"dark\")), style)\n  }, props, {\n    children: [jsx(\"iframe\", {\n      ref: iframe,\n      style: {\n        display: \"none\"\n      },\n      title: \"Sandpack Tests\"\n    }, void 0), jsx(Header$1, {\n      hideTestsAndSupressLogs,\n      setSuiteOnly: function () {\n        return setState(function (s2) {\n          return __assign(__assign({}, s2), {\n            suiteOnly: !s2.suiteOnly\n          });\n        });\n      },\n      setVerbose: function () {\n        return setState(function (s2) {\n          return __assign(__assign({}, s2), {\n            verbose: !s2.verbose\n          });\n        });\n      },\n      setWatchMode: function () {\n        setState(function (s2) {\n          return __assign(__assign({}, s2), {\n            watchMode: !s2.watchMode\n          });\n        });\n      },\n      showSuitesOnly: state.specsCount > 1,\n      showVerboseButton,\n      showWatchButton,\n      status: state.status,\n      suiteOnly: state.suiteOnly,\n      verbose: state.verbose,\n      watchMode: state.watchMode\n    }, void 0), state.status === \"running\" || state.status === \"initialising\" ? jsx(Loading, {\n      showOpenInCodeSandbox: false\n    }, void 0) : jsxs(\"div\", __assign({\n      className: previewActionsClassName.toString()\n    }, {\n      children: [actionsChildren, jsx(RunButton, {\n        onClick: state.suiteOnly ? runSpec : runAllTests\n      }, void 0)]\n    }), void 0), jsx(\"div\", __assign({\n      className: containerClassName.toString()\n    }, {\n      children: specs.length === 0 && state.status === \"complete\" ? jsxs(\"div\", __assign({\n        className: fileErrorContainerClassName.toString()\n      }, {\n        children: [jsx(\"p\", {\n          children: \"No test files found.\"\n        }, void 0), jsxs(\"p\", {\n          children: [\"Test match:\", \" \", jsx(\"span\", __assign({\n            className: failTextClassName.toString()\n          }, {\n            children: testFileRegex.toString()\n          }), void 0)]\n        }, void 0)]\n      }), void 0) : jsxs(Fragment, {\n        children: [jsx(Specs, {\n          hideTestsAndSupressLogs,\n          openSpec,\n          specs,\n          status: state.status,\n          verbose: state.verbose\n        }, void 0), state.status === \"complete\" && testResults.total > 0 && jsx(Summary, {\n          duration,\n          suites: suiteResults,\n          tests: testResults\n        }, void 0)]\n      }, void 0)\n    }), void 0)]\n  }), void 0);\n};\nvar containerClassName = css({\n  padding: \"$space$4\",\n  height: \"100%\",\n  overflow: \"auto\",\n  display: \"flex\",\n  flexDirection: \"column\",\n  position: \"relative\",\n  fontFamily: \"$font$mono\"\n});\nvar fileErrorContainerClassName = css({\n  fontWeight: \"bold\",\n  color: \"$colors$base\"\n});\nvar SYNTAX_ERROR_PATTERN = [\"SyntaxError: \", \"Error in sandbox:\"];\nvar CLEAR_LOG = {\n  id: \"random\",\n  method: \"clear\",\n  data: [\"Console was cleared\"]\n};\nvar TRANSFORMED_TYPE_KEY = \"@t\";\nvar CIRCULAR_REF_KEY = \"@r\";\nvar MAX_LENGTH_STRING = 1e4;\nvar MAX_NEST_LEVEL = 2;\nvar MAX_KEYS = 400;\nvar MAX_MESSAGE_COUNT = MAX_KEYS * 2;\nvar GLOBAL = function getGlobal() {\n  var savedEval = eval;\n  return savedEval(\"this\");\n}();\nvar ARRAY_BUFFER_SUPPORTED = typeof ArrayBuffer === \"function\";\nvar MAP_SUPPORTED = typeof Map === \"function\";\nvar SET_SUPPORTED = typeof Set === \"function\";\nvar Arithmetic;\n(function (Arithmetic2) {\n  Arithmetic2[Arithmetic2[\"infinity\"] = 0] = \"infinity\";\n  Arithmetic2[Arithmetic2[\"minusInfinity\"] = 1] = \"minusInfinity\";\n  Arithmetic2[Arithmetic2[\"minusZero\"] = 2] = \"minusZero\";\n})(Arithmetic || (Arithmetic = {}));\nvar transformers = {\n  Arithmetic: function (data) {\n    if (data === Arithmetic.infinity) return Infinity;\n    if (data === Arithmetic.minusInfinity) return -Infinity;\n    if (data === Arithmetic.minusZero) return -0;\n    return data;\n  },\n  HTMLElement: function (data) {\n    var sandbox = document.implementation.createHTMLDocument(\"sandbox\");\n    try {\n      var element = sandbox.createElement(data.tagName);\n      element.innerHTML = data.innerHTML;\n      for (var _i = 0, _a2 = Object.keys(data.attributes); _i < _a2.length; _i++) {\n        var attribute = _a2[_i];\n        try {\n          element.setAttribute(attribute, data.attributes[attribute]);\n        } catch (_b2) {}\n      }\n      return element;\n    } catch (e) {\n      return data;\n    }\n  },\n  Function: function (data) {\n    var tempFun = function () {};\n    Object.defineProperty(tempFun, \"toString\", {\n      value: function () {\n        return \"function \" + data.name + \"() {\" + data.body + \"}\";\n      }\n    });\n    return tempFun;\n  },\n  \"[[NaN]]\": function () {\n    return NaN;\n  },\n  \"[[undefined]]\": function () {\n    return void 0;\n  },\n  \"[[Date]]\": function (val) {\n    var date = /* @__PURE__ */new Date();\n    date.setTime(val);\n    return date;\n  },\n  \"[[RegExp]]\": function (val) {\n    return new RegExp(val.src, val.flags);\n  },\n  \"[[Error]]\": function (val) {\n    var Ctor = GLOBAL[val.name] || Error;\n    var err = new Ctor(val.message);\n    err.stack = val.stack;\n    return err;\n  },\n  \"[[ArrayBuffer]]\": function (val) {\n    if (ARRAY_BUFFER_SUPPORTED) {\n      var buffer = new ArrayBuffer(val.length);\n      var view = new Int8Array(buffer);\n      view.set(val);\n      return buffer;\n    }\n    return val;\n  },\n  \"[[TypedArray]]\": function (val) {\n    return typeof GLOBAL[val.ctorName] === \"function\" ? new GLOBAL[val.ctorName](val.arr) : val.arr;\n  },\n  \"[[Map]]\": function (val) {\n    if (MAP_SUPPORTED) {\n      var map = /* @__PURE__ */new Map();\n      for (var i2 = 0; i2 < val.length; i2 += 2) map.set(val[i2], val[i2 + 1]);\n      return map;\n    }\n    var kvArr = [];\n    for (var j2 = 0; j2 < val.length; j2 += 2) kvArr.push([val[i2], val[i2 + 1]]);\n    return kvArr;\n  },\n  \"[[Set]]\": function (val) {\n    if (SET_SUPPORTED) {\n      var set2 = /* @__PURE__ */new Set();\n      for (var i2 = 0; i2 < val.length; i2++) set2.add(val[i2]);\n      return set2;\n    }\n    return val;\n  }\n};\nvar formatSymbols = function (message) {\n  if (typeof message === \"string\" || typeof message === \"number\" || message === null) {\n    return message;\n  } else if (Array.isArray(message)) {\n    return message.map(formatSymbols);\n  } else if (typeof message == \"object\" && TRANSFORMED_TYPE_KEY in message) {\n    var type = message[TRANSFORMED_TYPE_KEY];\n    var transform = transformers[type];\n    return transform(message.data);\n  }\n  return message;\n};\nvar arrayToString = function (output, references, level) {\n  var mergeArray = output.reduce(function (acc, curr, index) {\n    return \"\" + acc + (index ? \", \" : \"\") + fromConsoleToString(curr, references, level);\n  }, \"\");\n  return \"[\" + mergeArray + \"]\";\n};\nvar objectToString = function (output, references, level) {\n  var constructorName = output.constructor.name !== \"Object\" ? output.constructor.name + \" \" : \"\";\n  if (level > MAX_NEST_LEVEL) {\n    return constructorName;\n  }\n  var entries = Object.entries(output);\n  var formattedObject = Object.entries(output).reduce(function (acc, _a2, index) {\n    var key = _a2[0],\n      value = _a2[1];\n    var comma = index === 0 ? \"\" : \", \";\n    var breakLine = entries.length > 10 ? \"\\n  \" : \"\";\n    var formatted = fromConsoleToString(value, references, level);\n    if (index === MAX_KEYS) {\n      return acc + breakLine + \"...\";\n    } else if (index > MAX_KEYS) {\n      return acc;\n    }\n    return acc + (\"\" + comma + breakLine + key + \": \") + formatted;\n  }, \"\");\n  return constructorName + \"{ \" + formattedObject + (entries.length > 10 ? \"\\n\" : \" \") + \"}\";\n};\nvar fromConsoleToString = function (message, references, level) {\n  if (level === void 0) {\n    level = 0;\n  }\n  try {\n    var output = formatSymbols(message);\n    if (Array.isArray(output)) {\n      return arrayToString(output, references, level + 1);\n    }\n    switch (typeof output) {\n      case \"string\":\n        return ('\"' + output + '\"').slice(0, MAX_LENGTH_STRING);\n      case \"number\":\n      case \"function\":\n      case \"symbol\":\n        return output.toString();\n      case \"boolean\":\n        return String(output);\n      case \"undefined\":\n        return \"undefined\";\n      case \"object\":\n      default:\n        if (output instanceof RegExp || output instanceof Error || output instanceof Date) {\n          return output.toString();\n        }\n        if (output === null) {\n          return String(null);\n        }\n        if (output instanceof HTMLElement) {\n          return output.outerHTML.slice(0, MAX_LENGTH_STRING);\n        }\n        if (Object.entries(output).length === 0) {\n          return \"{}\";\n        }\n        if (CIRCULAR_REF_KEY in output) {\n          if (level > MAX_NEST_LEVEL) {\n            return \"Unable to print information\";\n          }\n          var newMessage = references[output[CIRCULAR_REF_KEY]];\n          return fromConsoleToString(newMessage, references, level + 1);\n        }\n        return objectToString(output, references, level + 1);\n    }\n  } catch (_a2) {\n    return \"Unable to print information\";\n  }\n};\nvar getType = function (message) {\n  switch (message) {\n    case \"warn\":\n      return \"warning\";\n    case \"clear\":\n      return \"clear\";\n    case \"error\":\n      return \"error\";\n    case \"log\":\n    case \"info\":\n    default:\n      return \"info\";\n  }\n};\nvar _a;\nvar ConsoleList = function (_a2) {\n  var data = _a2.data;\n  var classNames = useClassNames();\n  return jsx(Fragment, {\n    children: data.map(function (_a3, logIndex, references) {\n      var data2 = _a3.data,\n        id = _a3.id,\n        method = _a3.method;\n      if (!data2) return null;\n      if (Array.isArray(data2)) {\n        return jsx(React3.Fragment, {\n          children: data2.map(function (msg, msgIndex) {\n            var fixReferences = references.slice(logIndex, references.length);\n            return jsx(\"div\", __assign({\n              className: classNames(\"console-item\", [consoleItemClassName({\n                variant: getType(method)\n              })])\n            }, {\n              children: jsx(CodeMirror, {\n                code: method === \"clear\" ? msg : fromConsoleToString(msg, fixReferences),\n                fileType: \"js\",\n                initMode: \"user-visible\",\n                showReadOnly: false,\n                readOnly: true,\n                wrapContent: true\n              }, void 0)\n            }), id + \"-\" + msgIndex);\n          })\n        }, id);\n      }\n      return null;\n    })\n  }, void 0);\n};\nvar consoleItemClassName = css((_a = {\n  width: \"100%\",\n  padding: \"$space$3 $space$2\",\n  fontSize: \".8em\",\n  position: \"relative\",\n  \"&:not(:first-child):after\": {\n    content: \"\",\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    background: \"$colors$surface3\"\n  },\n  /**\n  * Editor reset\n  */\n  \".sp-cm\": {\n    padding: 0\n  },\n  \".cm-editor\": {\n    background: \"none\"\n  },\n  \".cm-content\": {\n    padding: 0\n  }\n}, _a[\".\" + THEME_PREFIX + \"-pre-placeholder\"] = {\n  margin: \"0 !important\",\n  fontSize: \"1em\"\n}, _a.variants = {\n  variant: {\n    error: {\n      color: \"$colors$error\",\n      background: \"$colors$errorSurface\",\n      \"&:not(:first-child):after\": {\n        background: \"$colors$error\",\n        opacity: .07\n      }\n    },\n    warning: {\n      color: \"$colors$warning\",\n      background: \"$colors$warningSurface\",\n      \"&:not(:first-child):after\": {\n        background: \"$colors$warning\",\n        opacity: .07\n      }\n    },\n    clear: {\n      fontStyle: \"italic\"\n    },\n    info: {}\n  }\n}, _a));\nvar wrapperClassName = css({\n  justifyContent: \"space-between\",\n  borderBottom: \"1px solid $colors$surface2\",\n  padding: \"0 $space$2\",\n  fontFamily: \"$font$mono\",\n  height: \"$layout$headerHeight\",\n  minHeight: \"$layout$headerHeight\",\n  overflowX: \"auto\",\n  whiteSpace: \"nowrap\"\n});\nvar flexClassName = css({\n  display: \"flex\",\n  flexDirection: \"row\",\n  alignItems: \"center\",\n  gap: \"$space$2\"\n});\nvar Header = function (_a2) {\n  var currentTab = _a2.currentTab,\n    setCurrentTab = _a2.setCurrentTab,\n    node = _a2.node;\n  var classNames = useClassNames();\n  var buttonsClassName = classNames(\"console-header-button\", [buttonClassName, roundedButtonClassName, css({\n    padding: \"$space$1 $space$3\"\n  })]);\n  return jsxs(\"div\", __assign({\n    className: classNames(\"console-header\", [wrapperClassName, flexClassName])\n  }, {\n    children: [jsxs(\"p\", __assign({\n      className: classNames(\"console-header-title\", [css({\n        lineHeight: 1,\n        margin: 0,\n        color: \"$colors$base\",\n        fontSize: \"$font$size\",\n        display: \"flex\",\n        alignItems: \"center\",\n        gap: \"$space$2\"\n      })])\n    }, {\n      children: [jsx(ConsoleIcon, {}, void 0), jsx(\"span\", {\n        children: \"Terminal\"\n      }, void 0)]\n    }), void 0), node && jsxs(\"div\", __assign({\n      className: classNames(\"console-header-actions\", [flexClassName])\n    }, {\n      children: [jsx(\"button\", __assign({\n        className: buttonsClassName,\n        \"data-active\": currentTab === \"server\",\n        onClick: function () {\n          return setCurrentTab(\"server\");\n        },\n        type: \"button\"\n      }, {\n        children: \"Server\"\n      }), void 0), jsx(\"button\", __assign({\n        className: buttonsClassName,\n        \"data-active\": currentTab === \"client\",\n        onClick: function () {\n          return setCurrentTab(\"client\");\n        },\n        type: \"button\"\n      }, {\n        children: \"Client\"\n      }), void 0)]\n    }), void 0)]\n  }), void 0);\n};\nvar useSandpackConsole = function (_a2) {\n  var clientId = _a2.clientId,\n    _b2 = _a2.maxMessageCount,\n    maxMessageCount = _b2 === void 0 ? MAX_MESSAGE_COUNT : _b2,\n    _c2 = _a2.showSyntaxError,\n    showSyntaxError = _c2 === void 0 ? false : _c2,\n    _d = _a2.resetOnPreviewRestart,\n    resetOnPreviewRestart = _d === void 0 ? false : _d;\n  var _e = React3.useState([]),\n    logs = _e[0],\n    setLogs = _e[1];\n  var listen = useSandpack().listen;\n  React3.useEffect(function () {\n    var unsubscribe = listen(function (message) {\n      if (resetOnPreviewRestart && message.type === \"start\") {\n        setLogs([]);\n      } else if (message.type === \"console\" && message.codesandbox) {\n        var payloadLog = Array.isArray(message.log) ? message.log : [message.log];\n        if (payloadLog.find(function (_a3) {\n          var method = _a3.method;\n          return method === \"clear\";\n        })) {\n          return setLogs([CLEAR_LOG]);\n        }\n        var logsMessages_1 = showSyntaxError ? payloadLog : payloadLog.filter(function (messageItem) {\n          var _a3, _b3, _c3;\n          var messagesWithoutSyntaxErrors = (_c3 = (_b3 = (_a3 = messageItem === null || messageItem === void 0 ? void 0 : messageItem.data) === null || _a3 === void 0 ? void 0 : _a3.filter) === null || _b3 === void 0 ? void 0 : _b3.call(_a3, function (dataItem) {\n            if (typeof dataItem !== \"string\") return true;\n            var matches = SYNTAX_ERROR_PATTERN.filter(function (lookFor) {\n              return dataItem.startsWith(lookFor);\n            });\n            return matches.length === 0;\n          })) !== null && _c3 !== void 0 ? _c3 : [];\n          return messagesWithoutSyntaxErrors.length > 0;\n        });\n        if (!logsMessages_1) return;\n        setLogs(function (prev) {\n          var messages = __spreadArray(__spreadArray([], prev, true), logsMessages_1, true).filter(function (value, index, self) {\n            return index === self.findIndex(function (s2) {\n              return s2.id === value.id;\n            });\n          });\n          while (messages.length > maxMessageCount) {\n            messages.shift();\n          }\n          return messages;\n        });\n      }\n    }, clientId);\n    return unsubscribe;\n  }, [showSyntaxError, maxMessageCount, clientId, resetOnPreviewRestart]);\n  return {\n    logs,\n    reset: function () {\n      return setLogs([]);\n    }\n  };\n};\nvar SandpackConsole = /*#__PURE__*/React3.forwardRef(function (_a2, ref) {\n  var _b2;\n  var _c2 = _a2.showHeader,\n    showHeader = _c2 === void 0 ? true : _c2,\n    _d = _a2.showSyntaxError,\n    showSyntaxError = _d === void 0 ? false : _d,\n    maxMessageCount = _a2.maxMessageCount,\n    onLogsChange = _a2.onLogsChange,\n    className = _a2.className;\n  _a2.showSetupProgress;\n  var _f = _a2.resetOnPreviewRestart,\n    resetOnPreviewRestart = _f === void 0 ? false : _f,\n    _g = _a2.actionsChildren,\n    actionsChildren = _g === void 0 ? jsx(Fragment, {}, void 0) : _g,\n    _h = _a2.standalone,\n    standalone = _h === void 0 ? false : _h,\n    props = __rest(_a2, [\"showHeader\", \"showSyntaxError\", \"maxMessageCount\", \"onLogsChange\", \"className\", \"showSetupProgress\", \"resetOnPreviewRestart\", \"actionsChildren\", \"standalone\"]);\n  var environment = useSandpack().sandpack.environment;\n  var _j = useSandpackClient(),\n    iframe = _j.iframe,\n    internalClientId = _j.clientId;\n  var restart = useSandpackShell().restart;\n  var _k = React3.useState(environment === \"node\" ? \"server\" : \"client\"),\n    currentTab = _k[0],\n    setCurrentTab = _k[1];\n  var clientId = standalone ? internalClientId : void 0;\n  var _l = useSandpackConsole({\n      maxMessageCount,\n      showSyntaxError,\n      resetOnPreviewRestart,\n      clientId\n    }),\n    consoleData = _l.logs,\n    resetConsole = _l.reset;\n  var _m = useSandpackShellStdout({\n      maxMessageCount,\n      resetOnPreviewRestart,\n      clientId\n    }),\n    stdoutData = _m.logs,\n    resetStdout = _m.reset;\n  var wrapperRef = React3.useRef(null);\n  React3.useEffect(function () {\n    onLogsChange === null || onLogsChange === void 0 ? void 0 : onLogsChange(consoleData);\n    if (wrapperRef.current) {\n      wrapperRef.current.scrollTop = wrapperRef.current.scrollHeight;\n    }\n  }, [onLogsChange, consoleData, stdoutData, currentTab]);\n  var isServerTab = currentTab === \"server\";\n  var isNodeEnvironment = environment === \"node\";\n  React3.useImperativeHandle(ref, function () {\n    return {\n      reset: function () {\n        resetConsole();\n        resetStdout();\n      }\n    };\n  });\n  var classNames = useClassNames();\n  return jsxs(SandpackStack, __assign({\n    className: classNames(\"console\", [css((_b2 = {\n      height: \"100%\",\n      background: \"$surface1\",\n      iframe: {\n        display: \"none\"\n      }\n    }, _b2[\".\" + THEME_PREFIX + \"-bridge-frame\"] = {\n      display: \"block\",\n      border: 0,\n      position: \"absolute\",\n      left: \"$space$2\",\n      bottom: \"$space$2\",\n      zIndex: \"$top\",\n      height: 12,\n      width: \"30%\",\n      mixBlendMode: \"multiply\",\n      pointerEvents: \"none\"\n    }, _b2)), className])\n  }, props, {\n    children: [showHeader && isNodeEnvironment && jsx(Header, {\n      currentTab,\n      node: isNodeEnvironment,\n      setCurrentTab\n    }, void 0), jsx(\"div\", __assign({\n      ref: wrapperRef,\n      className: classNames(\"console-list\", [css({\n        overflow: \"auto\",\n        scrollBehavior: \"smooth\"\n      })])\n    }, {\n      children: isServerTab ? jsx(StdoutList, {\n        data: stdoutData\n      }, void 0) : jsx(ConsoleList, {\n        data: consoleData\n      }, void 0)\n    }), void 0), jsxs(\"div\", __assign({\n      className: classNames(\"console-actions\", [css({\n        position: \"absolute\",\n        bottom: \"$space$2\",\n        right: \"$space$2\",\n        display: \"flex\",\n        gap: \"$space$2\"\n      })])\n    }, {\n      children: [actionsChildren, isServerTab && jsx(RoundedButton, __assign({\n        onClick: function () {\n          restart();\n          resetConsole();\n          resetStdout();\n        }\n      }, {\n        children: jsx(RestartIcon, {}, void 0)\n      }), void 0), jsx(RoundedButton, __assign({\n        onClick: function () {\n          if (currentTab === \"client\") {\n            resetConsole();\n          } else {\n            resetStdout();\n          }\n        }\n      }, {\n        children: jsx(CleanIcon, {}, void 0)\n      }), void 0)]\n    }), void 0), standalone && jsxs(Fragment, {\n      children: [jsx(DependenciesProgress, {\n        clientId\n      }, void 0), jsx(\"iframe\", {\n        ref: iframe\n      }, void 0)]\n    }, void 0)]\n  }), void 0);\n});\nvar Sandpack = function (_a2) {\n  var _b2, _c2, _d, _e, _f, _g, _h, _j;\n  var options = _a2.options,\n    template = _a2.template,\n    customSetup = _a2.customSetup,\n    files = _a2.files,\n    theme = _a2.theme,\n    props = __rest(_a2, [\"options\", \"template\", \"customSetup\", \"files\", \"theme\"]);\n  options !== null && options !== void 0 ? options : options = {};\n  (_b2 = options.resizablePanels) !== null && _b2 !== void 0 ? _b2 : options.resizablePanels = true;\n  (_c2 = options.editorWidthPercentage) !== null && _c2 !== void 0 ? _c2 : options.editorWidthPercentage = 50;\n  (_d = options.showConsole) !== null && _d !== void 0 ? _d : options.showConsole = false;\n  var rtlLayout = (_e = options === null || options === void 0 ? void 0 : options.rtl) !== null && _e !== void 0 ? _e : false;\n  var codeEditorOptions = {\n    showTabs: options.showTabs,\n    showLineNumbers: options.showLineNumbers,\n    showInlineErrors: options.showInlineErrors,\n    wrapContent: options.wrapContent,\n    closableTabs: options.closableTabs,\n    initMode: options.initMode,\n    extensions: (_f = options.codeEditor) === null || _f === void 0 ? void 0 : _f.extensions,\n    extensionsKeymap: (_g = options.codeEditor) === null || _g === void 0 ? void 0 : _g.extensionsKeymap,\n    readOnly: options.readOnly,\n    showReadOnly: options.showReadOnly,\n    additionalLanguages: (_h = options.codeEditor) === null || _h === void 0 ? void 0 : _h.additionalLanguages\n  };\n  var providerOptions = {\n    /**\n    * TS-why: Type 'string | number | symbol' is not assignable to type 'string'\n    */\n    activeFile: options.activeFile,\n    visibleFiles: options.visibleFiles,\n    recompileMode: options.recompileMode,\n    recompileDelay: options.recompileDelay,\n    autorun: options.autorun,\n    autoReload: options.autoReload,\n    bundlerURL: options.bundlerURL,\n    startRoute: options.startRoute,\n    skipEval: options.skipEval,\n    fileResolver: options.fileResolver,\n    initMode: options.initMode,\n    initModeObserverOptions: options.initModeObserverOptions,\n    externalResources: options.externalResources,\n    logLevel: options.logLevel,\n    classes: options.classes\n  };\n  var _k = React3.useState(options.showConsole),\n    consoleVisibility = _k[0],\n    setConsoleVisibility = _k[1];\n  var _l = React3.useState(0),\n    counter = _l[0],\n    setCounter = _l[1];\n  var hasRightColumn = options.showConsole || options.showConsoleButton;\n  var templateFiles = (_j = SANDBOX_TEMPLATES[template]) !== null && _j !== void 0 ? _j : {};\n  var mode = (options === null || options === void 0 ? void 0 : options.layout) ? options === null || options === void 0 ? void 0 : options.layout : \"mode\" in templateFiles ? templateFiles.mode : \"preview\";\n  var actionsChildren = options.showConsoleButton ? jsx(ConsoleCounterButton, {\n    counter,\n    onClick: function () {\n      return setConsoleVisibility(function (prev) {\n        return !prev;\n      });\n    }\n  }, void 0) : void 0;\n  var dragEventTargetRef = React3.useRef(null);\n  var _m = React3.useState(options.editorWidthPercentage),\n    horizontalSize = _m[0],\n    setHorizontalSize = _m[1];\n  var _o = React3.useState(70),\n    verticalSize = _o[0],\n    setVerticalSize = _o[1];\n  var RightColumn = hasRightColumn ? SandpackStack : React3.Fragment;\n  var rightColumnStyle = {\n    flexGrow: 100 - horizontalSize,\n    flexShrink: 100 - horizontalSize,\n    flexBasis: 0,\n    width: 100 - horizontalSize + \"%\",\n    gap: consoleVisibility ? 1 : 0,\n    height: options.editorHeight\n  };\n  var topRowStyle = hasRightColumn ? {\n    flexGrow: verticalSize,\n    flexShrink: verticalSize,\n    flexBasis: 0,\n    overflow: \"hidden\"\n  } : rightColumnStyle;\n  var onDragMove = function (event) {\n    if (!dragEventTargetRef.current) return;\n    var container = dragEventTargetRef.current.parentElement;\n    if (!container) return;\n    var direction = dragEventTargetRef.current.dataset.direction;\n    var isHorizontal = direction === \"horizontal\";\n    var _a3 = container.getBoundingClientRect(),\n      left = _a3.left,\n      top = _a3.top,\n      height = _a3.height,\n      width = _a3.width;\n    var offset = isHorizontal ? (event.clientX - left) / width * 100 : (event.clientY - top) / height * 100;\n    var boundaries = Math.min(Math.max(offset, 25), 75);\n    if (isHorizontal) {\n      setHorizontalSize(rtlLayout ? 100 - boundaries : boundaries);\n    } else {\n      setVerticalSize(boundaries);\n    }\n    container.querySelectorAll(\".\" + THEME_PREFIX + \"-stack\").forEach(function (item) {\n      item.style.pointerEvents = \"none\";\n    });\n  };\n  var stopDragging = function () {\n    var _a3;\n    var container = (_a3 = dragEventTargetRef.current) === null || _a3 === void 0 ? void 0 : _a3.parentElement;\n    if (!container) return;\n    container.querySelectorAll(\".\" + THEME_PREFIX + \"-stack\").forEach(function (item) {\n      item.style.pointerEvents = \"\";\n    });\n    dragEventTargetRef.current = null;\n  };\n  React3.useEffect(function () {\n    if (!(options === null || options === void 0 ? void 0 : options.resizablePanels)) return;\n    document.body.addEventListener(\"mousemove\", onDragMove);\n    document.body.addEventListener(\"mouseup\", stopDragging);\n    return function () {\n      document.body.removeEventListener(\"mousemove\", onDragMove);\n      document.body.removeEventListener(\"mouseup\", stopDragging);\n    };\n  }, [options]);\n  React3.useEffect(function () {\n    var _a3;\n    setConsoleVisibility((_a3 = options === null || options === void 0 ? void 0 : options.showConsole) !== null && _a3 !== void 0 ? _a3 : false);\n  }, [options.showConsole]);\n  var rightColumnProps = hasRightColumn ? {\n    className: THEME_PREFIX + \"-preset-column\",\n    style: rightColumnStyle\n  } : {};\n  var classNames = useClassNames();\n  return jsx(SandpackProvider, __assign({\n    customSetup,\n    files,\n    options: providerOptions,\n    template,\n    theme\n  }, props, {\n    children: jsxs(SandpackLayout, __assign({\n      className: rtlLayout ? classNames(\"rtl-layout\", [rtlLayoutClassName]) : \"\"\n    }, {\n      children: [jsx(SandpackCodeEditor, __assign({}, codeEditorOptions, {\n        style: {\n          height: options.editorHeight,\n          flexGrow: horizontalSize,\n          flexShrink: horizontalSize,\n          flexBasis: 0,\n          overflow: \"hidden\"\n        }\n      }), void 0), options.resizablePanels && jsx(\"div\", {\n        className: classNames(\"resize-handler\", [dragHandler({\n          direction: \"horizontal\"\n        })]),\n        \"data-direction\": \"horizontal\",\n        onMouseDown: function (event) {\n          dragEventTargetRef.current = event.target;\n        },\n        style: {\n          left: \"calc(\" + (rtlLayout ? 100 - horizontalSize : horizontalSize) + \"% - 5px)\"\n        }\n      }, void 0), jsxs(RightColumn, __assign({}, rightColumnProps, {\n        children: [mode === \"preview\" && jsx(SandpackPreview, {\n          actionsChildren,\n          showNavigator: options.showNavigator,\n          showRefreshButton: options.showRefreshButton,\n          style: topRowStyle\n        }, void 0), mode === \"tests\" && jsx(SandpackTests, {\n          actionsChildren,\n          style: topRowStyle\n        }, void 0), mode === \"console\" && jsx(SandpackConsole, {\n          actionsChildren,\n          style: topRowStyle,\n          standalone: true\n        }, void 0), (options.showConsoleButton || consoleVisibility) && jsxs(Fragment, {\n          children: [options.resizablePanels && consoleVisibility && jsx(\"div\", {\n            className: classNames(\"resize-handler\", [dragHandler({\n              direction: \"vertical\"\n            })]),\n            \"data-direction\": \"vertical\",\n            onMouseDown: function (event) {\n              dragEventTargetRef.current = event.target;\n            },\n            style: {\n              top: \"calc(\" + verticalSize + \"% - 5px)\"\n            }\n          }, void 0), jsx(\"div\", __assign({\n            className: classNames(\"console-wrapper\", [consoleWrapper]),\n            style: {\n              flexGrow: consoleVisibility ? 100 - verticalSize : 0,\n              flexShrink: consoleVisibility ? 100 - verticalSize : 0,\n              flexBasis: 0\n            }\n          }, {\n            children: jsx(SandpackConsole, {\n              onLogsChange: function (logs) {\n                return setCounter(logs.length);\n              },\n              showHeader: false\n            }, void 0)\n          }), void 0)]\n        }, void 0)]\n      }), void 0)]\n    }), void 0)\n  }), template);\n};\nvar dragHandler = css({\n  position: \"absolute\",\n  zIndex: \"$top\",\n  variants: {\n    direction: {\n      vertical: {\n        right: 0,\n        left: 0,\n        height: 10,\n        cursor: \"ns-resize\"\n      },\n      horizontal: {\n        top: 0,\n        bottom: 0,\n        width: 10,\n        cursor: \"ew-resize\"\n      }\n    }\n  },\n  \"@media screen and (max-width: 768px)\": {\n    display: \"none\"\n  }\n});\nvar ConsoleCounterButton = function (_a2) {\n  var onClick = _a2.onClick,\n    counter = _a2.counter;\n  return jsxs(RoundedButton, __assign({\n    className: buttonCounter.toString(),\n    onClick\n  }, {\n    children: [jsx(ConsoleIcon, {}, void 0), counter > 0 && jsx(\"strong\", {\n      children: counter\n    }, void 0)]\n  }), void 0);\n};\nvar buttonCounter = css({\n  position: \"relative\",\n  strong: {\n    background: \"$colors$clickable\",\n    color: \"$colors$surface1\",\n    minWidth: 12,\n    height: 12,\n    padding: \"0 2px\",\n    borderRadius: 12,\n    fontSize: 8,\n    lineHeight: \"12px\",\n    position: \"absolute\",\n    top: 0,\n    right: 0,\n    fontWeight: \"normal\"\n  }\n});\nvar consoleWrapper = css({\n  width: \"100%\",\n  overflow: \"hidden\"\n});\nvar rtlLayoutClassName = css({\n  flexDirection: \"row-reverse\",\n  \"@media screen and (max-width: 768px)\": {\n    flexFlow: \"wrap-reverse !important\",\n    flexDirection: \"initial\"\n  }\n});\nexport { ANGULAR_TEMPLATE, ASTRO_TEMPLATE, BackwardIcon, CleanIcon, CloseIcon, CodeMirror as CodeEditor, ConsoleIcon, DependenciesProgress, DirectoryIconClosed, DirectoryIconOpen, ErrorOverlay, ExportIcon, FADE_ANIMATION_DURATION, FileIcon, FileTabs, ForwardIcon, LoadingOverlay, Navigator, OpenInCodeSandboxButton, REACT_TEMPLATE, REACT_TYPESCRIPT_TEMPLATE, RefreshIcon, RestartIcon, RoundedButton, RunButton$1 as RunButton, RunIcon, SANDBOX_TEMPLATES, SANDPACK_THEMES, SOLID_TEMPLATE, SVELTE_TEMPLATE, Sandpack, SandpackCodeEditor, SandpackCodeViewer, SandpackConsole, SandpackConsumer, SandpackFileExplorer, SandpackLayout, SandpackPreview, SandpackProvider, Sandpack$1 as SandpackReactContext, SandpackStack, SandpackTests, SandpackThemeConsumer, SandpackThemeContext, SandpackThemeProvider, SandpackTranspiledCode, SignInIcon, SignOutIcon, TEST_TYPESCRIPT_TEMPLATE, UnstyledOpenInCodeSandboxButton, VANILLA_TEMPLATE, VANILLA_TYPESCRIPT_TEMPLATE, VUE_TEMPLATE, defaultDark, defaultLight, getCssText as getSandpackCssText, layoutClassName, stackClassName, tabButton, useActiveCode, useClassNames, useErrorMessage, useLoadingOverlayState, useSandpack, useSandpackClient, useSandpackConsole, useSandpackNavigation, useSandpackPreviewProgress, useSandpackShell, useSandpackShellStdout, useSandpackTheme, useTranspiledCode };\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"TEST_TYPESCRIPT_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ANGULAR_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackLayout\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackConsole\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"getSandpackCssText\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"CleanIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"VANILLA_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SignOutIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"UnstyledOpenInCodeSandboxButton\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpack\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"stackClassName\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackThemeConsumer\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useActiveCode\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"LoadingOverlay\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SOLID_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"VANILLA_TYPESCRIPT_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"CodeEditor\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"defaultDark\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackShellStdout\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackClient\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SANDBOX_TEMPLATES\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackStack\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ExportIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"layoutClassName\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useTranspiledCode\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackPreviewProgress\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackShell\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackReactContext\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"defaultLight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackConsumer\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"Sandpack\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"FileTabs\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"RoundedButton\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"Navigator\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"FileIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SANDPACK_THEMES\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackThemeContext\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"RunIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackTranspiledCode\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackTheme\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useClassNames\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"VUE_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"RefreshIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useErrorMessage\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ForwardIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackFileExplorer\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SVELTE_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"CloseIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"tabButton\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"BackwardIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackConsole\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"REACT_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackTests\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"DirectoryIconOpen\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useLoadingOverlayState\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackCodeViewer\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackProvider\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackPreview\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useSandpackNavigation\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"DirectoryIconClosed\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"OpenInCodeSandboxButton\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"REACT_TYPESCRIPT_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ErrorOverlay\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ASTRO_TEMPLATE\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"FADE_ANIMATION_DURATION\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"RunButton\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"DependenciesProgress\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackThemeProvider\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ConsoleIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SandpackCodeEditor\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"RestartIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SignInIcon\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./codesandbox_sandpack_react.map", "export var Browser;\n(function (Browser) {\n  var isBrowser = Browser.isBrowser = () => typeof window === \"object\";\n  var isTouch = Browser.isTouch = () => \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n  var isChrome = Browser.isChrome = () => navigator.userAgent.toLowerCase().includes(\"chrome/\");\n  var isWebKit = Browser.isWebKit = () => navigator.userAgent.toLowerCase().includes(\"applewebkit/\");\n  var isSafari = Browser.isSafari = () => isWebKit() && !isChrome();\n  var isSafariDesktop = Browser.isSafariDesktop = () => isSafari() && !isTouch();\n  var isWindows = Browser.isWindows = () => /Win/.test(navigator.platform);\n  var isMacOS = Browser.isMacOS = () => /Mac/.test(navigator.platform);\n})(Browser || (Browser = {}));\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./browser.map", "export const sandpackDefaultLanguages = [\"JavaScript\", \"JSX\", \"TypeScript\", \"TSX\", \"CSS\", \"SCSS\", \"Less\", \"HTML\"];\nexport const supportedLanguages = [\"Angular\", \"C\", \"C#\", \"C++\", \"CSS\", \"Go\", \"Haskell\", \"HTML\", \"Java\", \"JavaScript\", \"JSX\", \"Julia\", \"Kotlin\", \"Less\", \"Lua\", \"Markdown\", \"MATLAB\", \"Nginx\", \"Objective-C\", \"Perl\", \"PHP\", \"Python\", \"Ruby\", \"Rust\", \"Scala\", \"SCSS\", \"Shell\", \"SQL\", \"Swift\", \"TSX\", \"TypeScript\", \"Vue\", \"YAML\"];\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"PaddingProperties\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"BorderRadiusProperties\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"sandpackDefaultLanguages\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"SupportedLanguages\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"FontProperties\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"supportedLanguages\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"BorderProperties\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./types.map", "export class SuspenseValue {\n  read() {\n    const status = this.status; // The component did rerender and we already set the status below.\n    if (status) {\n      switch (status.type) {\n        // If the promise is still pending we need to suspend again.\n        case \"pending\":\n          throw status.promise;\n        // If the promise is fulfilled we can return the value\n        // synchronously.\n        case \"fulfilled\":\n          return status.value;\n        // If the promise was rejected we can throw the error so we can\n        // catch it with an ErrorBoundary in an ancestor.\n        case \"rejected\":\n          throw status.reason;\n      }\n    } // Attach a callback to the promise to store the resolved value or the error\n    // on the promise so we can synchronously read it later.\n    const promise = this.resolver().then(value => {\n      this.status = {\n        type: \"fulfilled\",\n        value\n      };\n    }, reason => {\n      this.status = {\n        type: \"rejected\",\n        reason\n      };\n    }); // This is the first time the promise is passed into the function. We set\n    // the status field so we can early return above.\n    this.status = {\n      type: \"pending\",\n      promise\n    }; // We throw the promise to suspend rendering. React will wait until the\n    // promise is settled and rerender the component afterwards. When React\n    // rerenders the component we can return the value in the code above.\n    throw promise;\n  }\n  constructor(resolver) {\n    this.resolver = resolver;\n  }\n}\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"SuspenseValue\": {\n      \"type\": \"class\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./SuspenseValue.map", "import { RenderTarget } from \"framer\";\nimport { useState, useMemo } from \"react\";\nexport function getFileExtensions(language) {\n  switch (language) {\n    case \"JavaScript\":\n      return [\"js\"];\n    case \"JSX\":\n      return [\"jsx\"];\n    case \"TypeScript\":\n      return [\"ts\"];\n    case \"TSX\":\n      return [\"tsx\"];\n    case \"CSS\":\n      return [\"css\"];\n    case \"SCSS\":\n      return [\"scss\"];\n    case \"Less\":\n      return [\"less\"];\n    case \"HTML\":\n      return [\"html\", \"htm\"];\n    case \"Angular\":\n      return [\"ts\"];\n    case \"C\":\n      return [\"c\"];\n    case \"C#\":\n      return [\"cs\"];\n    case \"C++\":\n      return [\"cpp\", \"cxx\", \"cc\", \"h\", \"hpp\"];\n    case \"Go\":\n      return [\"go\"];\n    case \"Haskell\":\n      return [\"hs\"];\n    case \"Java\":\n      return [\"java\"];\n    case \"Julia\":\n      return [\"jl\"];\n    case \"Kotlin\":\n      return [\"kt\", \"kts\"];\n    case \"Lua\":\n      return [\"lua\"];\n    case \"Markdown\":\n      return [\"md\"];\n    case \"MATLAB\":\n      return [\"m\"];\n    case \"Nginx\":\n      return [\"conf\"];\n    case \"Objective-C\":\n      return [\"m\", \"mm\"];\n    case \"Perl\":\n      return [\"pl\"];\n    case \"PHP\":\n      return [\"php\", \"php4\", \"php5\", \"phtml\"];\n    case \"Python\":\n      return [\"py\"];\n    case \"Ruby\":\n      return [\"rb\"];\n    case \"Rust\":\n      return [\"rs\"];\n    case \"Scala\":\n      return [\"scala\"];\n    case \"Shell\":\n      return [\"sh\"];\n    case \"SQL\":\n      return [\"sql\"];\n    case \"Swift\":\n      return [\"swift\"];\n    case \"Vue\":\n      return [\"vue\"];\n    case \"YAML\":\n      return [\"yaml\", \"yml\"];\n    default:\n      return [];\n  }\n}\nexport function useBorder(props, collapseEqualBorders = true) {\n  const style = {};\n  const {\n    borderWidth = 0,\n    borderColor = \"unset\",\n    borderStyle = \"none\",\n    isMixedBorderWidth,\n    borderWidthBottom = 0,\n    borderWidthLeft = 0,\n    borderWidthRight = 0,\n    borderWidthTop = 0\n  } = props;\n  let borderTop;\n  let borderBottom;\n  let borderLeft;\n  let borderRight;\n  if (!isMixedBorderWidth) {\n    borderTop = borderBottom = borderLeft = borderRight = borderWidth;\n  } else {\n    borderTop = borderWidthTop;\n    borderRight = borderWidthRight;\n    borderBottom = borderWidthBottom;\n    borderLeft = borderWidthLeft;\n  }\n  if (collapseEqualBorders && borderTop === borderBottom && borderTop === borderLeft && borderTop === borderRight) {\n    style.border = `${borderTop}px ${borderStyle} ${borderColor}`;\n  } else {\n    style.borderStyle = borderStyle;\n    style.borderColor = borderColor;\n    style.borderTopWidth = `${borderTop}px`;\n    style.borderBottomWidth = `${borderBottom}px`;\n    style.borderLeftWidth = `${borderLeft}px`;\n    style.borderRightWidth = `${borderRight}px`;\n  }\n  return style;\n} // Chunks a string into meaningful groups of characters (words, acronyms or numbers)\nconst groupsRegex = /[A-Z]{2,}|[A-Z][a-z]+|[a-z]+|[A-Z]|\\d+/gu;\nfunction capitalizeFirstLetter(value) {\n  return value.charAt(0).toUpperCase() + value.slice(1);\n}\nexport function titleCase(value) {\n  const groups = value.match(groupsRegex) || [];\n  return groups.map(capitalizeFirstLetter).join(\" \");\n}\nexport function useRadius(props) {\n  const {\n    borderRadius,\n    isMixedBorderRadius,\n    topLeftRadius,\n    topRightRadius,\n    bottomRightRadius,\n    bottomLeftRadius\n  } = props;\n  const radiusValue = useMemo(() => isMixedBorderRadius ? `${topLeftRadius}px ${topRightRadius}px ${bottomRightRadius}px ${bottomLeftRadius}px` : `${borderRadius}px`, [borderRadius, isMixedBorderRadius, topLeftRadius, topRightRadius, bottomRightRadius, bottomLeftRadius]);\n  return radiusValue;\n}\nexport function usePadding(props) {\n  const {\n    padding,\n    paddingBottom,\n    paddingLeft,\n    paddingPerSide,\n    paddingRight,\n    paddingTop\n  } = props;\n  const paddingValue = useMemo(() => paddingPerSide ? `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px` : `${padding}px`, [padding, paddingBottom, paddingLeft, paddingPerSide, paddingRight, paddingTop]);\n  return paddingValue;\n}\nexport function useIsOnCanvas() {\n  const [onCanvas] = useState(() => RenderTarget.current() === RenderTarget.canvas);\n  return onCanvas;\n}\nexport function isObject(value) {\n  return value !== null && typeof value === \"object\";\n} // From https://github.com/codesandbox/sandpack/blob/36560cb4f0fc8f5f8b18f5a3d3952799690eba77/sandpack-react/src/utils/stringUtils.ts#L81\nexport function isDarkColor(color) {\n  let r = 0;\n  let g = 0;\n  let b = 0;\n  if (color.startsWith(\"#\")) {\n    if (color.length < 7) {\n      return true;\n    }\n    r = parseInt(color.substr(1, 2), 16);\n    g = parseInt(color.substr(3, 2), 16);\n    b = parseInt(color.substr(5, 2), 16);\n  } else {\n    const rgbValues = color.replace(\"rgb(\", \"\").replace(\"rgba(\", \"\").replace(\")\", \"\").split(\",\");\n    if (rgbValues.length < 3) {\n      return true;\n    }\n    r = parseInt(rgbValues[0], 10);\n    g = parseInt(rgbValues[1], 10);\n    b = parseInt(rgbValues[2], 10);\n  }\n  const yiq = (r * 299 + g * 587 + b * 114) / 1e3;\n  return yiq < 128;\n}\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"useRadius\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"usePadding\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useIsOnCanvas\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"isObject\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"titleCase\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"isDarkColor\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"getFileExtensions\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"useBorder\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./utils.map", "import { SuspenseValue } from \"https://framerusercontent.com/modules/HpmklHRFex5a5HMDftQo/5VVfjnRHGJM1T33zb1N5/SuspenseValue.js\";\nimport { getFileExtensions } from \"https://framerusercontent.com/modules/IdMJ4CymCWCh4cOBkZlb/RXSqswLIbuViBOVW1keE/utils.js\";\nimport { LanguageSupport, StreamLanguage } from \"https://framerusercontent.com/modules/aJsTBlWNkIaM900KNIXT/TeoF57xeGMuVMjiI2ooR/codemirror_language.js\";\nconst angular = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/EjHwngjQOz6g9296RZMV/ZwhROYAZtNtuFNcAlekE/codemirror_lang_angular.js\");\n  return language.angular();\n});\nconst cpp = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/BmbosINQMuOqhkQ16mGN/aCQLnkkoRKr1dakaf9ci/codemirror_lang_cpp.js\");\n  return language.cpp();\n});\nconst java = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/gKhuDW5jnY59NdDGV8D8/xP36aHuTsvUU4Wi5UoVw/codemirror_lang_java.js\");\n  return language.java();\n});\nconst markdown = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/ew2kgXFUVzaNY5ZWXtC5/G0go5tjEUs1iWpGXELvD/codemirror_lang_markdown.js\");\n  return language.markdown();\n});\nconst php = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/oZkhtejNW32Gkw1jb5tm/EgGL6KPr2VABA0JaSWSs/codemirror_lang_php.js\");\n  return language.php();\n});\nconst python = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/NlaGw745MKw3pDtavCDw/bJdmzV5wKmaoaOZ34lWV/codemirror_lang_python.js\");\n  return language.python();\n});\nconst rust = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/ToHwV7PbhPbIOp4qfWxL/yUpS78MJ5G2NAMZdDmZU/codemirror_lang_rust.js\");\n  return language.rust();\n});\nconst sql = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/ErpiHuOpMsJgQursm47q/uyWXpN0RN41fZeXKclFO/codemirror_lang_sql.js\");\n  return language.sql();\n});\nconst vue = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/zxOuMCcDOAkYkK9doUT1/6kqevs4DXgJyXyFc94KJ/codemirror_lang_vue.js\");\n  return language.vue();\n});\nconst scala = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/mVgptLxlny3aCNt13jWX/UBsF1xq4TdJtf65SHBJZ/codemirror_legacy_modes_mode_clike.js\");\n  return new LanguageSupport(StreamLanguage.define(language.scala));\n});\nconst c = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/mVgptLxlny3aCNt13jWX/UBsF1xq4TdJtf65SHBJZ/codemirror_legacy_modes_mode_clike.js\");\n  return new LanguageSupport(StreamLanguage.define(language.c));\n});\nconst csharp = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/mVgptLxlny3aCNt13jWX/UBsF1xq4TdJtf65SHBJZ/codemirror_legacy_modes_mode_clike.js\");\n  return new LanguageSupport(StreamLanguage.define(language.csharp));\n});\nconst kotlin = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/mVgptLxlny3aCNt13jWX/UBsF1xq4TdJtf65SHBJZ/codemirror_legacy_modes_mode_clike.js\");\n  return new LanguageSupport(StreamLanguage.define(language.kotlin));\n});\nconst objectiveC = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/mVgptLxlny3aCNt13jWX/UBsF1xq4TdJtf65SHBJZ/codemirror_legacy_modes_mode_clike.js\");\n  return new LanguageSupport(StreamLanguage.define(language.objectiveC));\n});\nconst go = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/y3YRN1y6zNRmexh3PcEl/zN53cccFHXcjwLmc9vJl/codemirror_legacy_modes_mode_go.js\");\n  return new LanguageSupport(StreamLanguage.define(language.go));\n});\nconst haskell = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/1BelllWa9nL0PC5ISobo/XJm3JYCfTLyG5h6NGU7o/codemirror_legacy_modes_mode_haskell.js\");\n  return new LanguageSupport(StreamLanguage.define(language.haskell));\n});\nconst julia = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/DDnoTDvZCXOaJOFVfFFi/KOuVfpSFKjYje6OF3kMC/codemirror_legacy_modes_mode_julia.js\");\n  return new LanguageSupport(StreamLanguage.define(language.julia));\n});\nconst lua = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/NVeCwUV1KXDrrAYWeKhB/Z4WZ3aIbRCPlevgl3i6W/codemirror_legacy_modes_mode_lua.js\");\n  return new LanguageSupport(StreamLanguage.define(language.lua));\n});\nconst nginx = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/9UW4h57ce20E1oUtlyTx/lupIQZcWqQ6fcU1q4rnT/codemirror_legacy_modes_mode_nginx.js\");\n  return new LanguageSupport(StreamLanguage.define(language.nginx));\n});\nconst octave = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/Z9MPy0NcAcvCrfQ6GdLk/mTdjuyFPRLBs2CftgxdU/codemirror_legacy_modes_mode_octave.js\");\n  return new LanguageSupport(StreamLanguage.define(language.octave));\n});\nconst perl = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/l6yIFqJiKpzgjIjYLDe8/RiUbeIOTACkJXyxf1sof/codemirror_legacy_modes_mode_perl.js\");\n  return new LanguageSupport(StreamLanguage.define(language.perl));\n});\nconst ruby = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/d2aTgp8BCfENcg4lzz2o/8OKauOTqnlpG0hQSheQZ/codemirror_legacy_modes_mode_ruby.js\");\n  return new LanguageSupport(StreamLanguage.define(language.ruby));\n});\nconst shell = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/5zoYeQMBj7mQSJHBwKwK/MOEKdidQOTSu9WoSLOvt/codemirror_legacy_modes_mode_shell.js\");\n  return new LanguageSupport(StreamLanguage.define(language.shell));\n});\nconst swift = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/U1yN0J68cl89oK5n38AY/nNkcgGLa2JSAO9aE88Ts/codemirror_legacy_modes_mode_swift.js\");\n  return new LanguageSupport(StreamLanguage.define(language.swift));\n});\nconst yaml = new SuspenseValue(async () => {\n  const language = await import(\"https://framerusercontent.com/modules/iCfs5CDON3pnZuWWFlKm/WvFxfUbTKcGBzC0BmpkU/codemirror_legacy_modes_mode_yaml.js\");\n  return new LanguageSupport(StreamLanguage.define(language.yaml));\n});\nexport function useLanguageAsync(name) {\n  switch (name) {\n    case \"Angular\":\n      return {\n        name: \"angular\",\n        extensions: getFileExtensions(name),\n        language: angular.read()\n      };\n    case \"C++\":\n      return {\n        name: \"cpp\",\n        extensions: getFileExtensions(name),\n        language: cpp.read()\n      };\n    case \"Java\":\n      return {\n        name: \"java\",\n        extensions: getFileExtensions(name),\n        language: java.read()\n      };\n    case \"Markdown\":\n      return {\n        name: \"markdown\",\n        extensions: getFileExtensions(name),\n        language: markdown.read()\n      };\n    case \"PHP\":\n      return {\n        name: \"php\",\n        extensions: getFileExtensions(name),\n        language: php.read()\n      };\n    case \"Python\":\n      return {\n        name: \"python\",\n        extensions: getFileExtensions(name),\n        language: python.read()\n      };\n    case \"Rust\":\n      return {\n        name: \"rust\",\n        extensions: getFileExtensions(name),\n        language: rust.read()\n      };\n    case \"SQL\":\n      return {\n        name: \"sql\",\n        extensions: getFileExtensions(name),\n        language: sql.read()\n      };\n    case \"Vue\":\n      return {\n        name: \"vue\",\n        extensions: getFileExtensions(name),\n        language: vue.read()\n      };\n    case \"C\":\n      return {\n        name: \"c\",\n        extensions: getFileExtensions(name),\n        language: c.read()\n      };\n    case \"C#\":\n      return {\n        name: \"csharp\",\n        extensions: getFileExtensions(name),\n        language: csharp.read()\n      };\n    case \"Objective-C\":\n      return {\n        name: \"objectiveC\",\n        extensions: getFileExtensions(name),\n        language: objectiveC.read()\n      };\n    case \"Kotlin\":\n      return {\n        name: \"kotlin\",\n        extensions: getFileExtensions(name),\n        language: kotlin.read()\n      };\n    case \"Scala\":\n      return {\n        name: \"scala\",\n        extensions: getFileExtensions(name),\n        language: scala.read()\n      };\n    case \"Go\":\n      return {\n        name: \"go\",\n        extensions: getFileExtensions(name),\n        language: go.read()\n      };\n    case \"Haskell\":\n      return {\n        name: \"haskell\",\n        extensions: getFileExtensions(name),\n        language: haskell.read()\n      };\n    case \"Julia\":\n      return {\n        name: \"julia\",\n        extensions: getFileExtensions(name),\n        language: julia.read()\n      };\n    case \"Lua\":\n      return {\n        name: \"lua\",\n        extensions: getFileExtensions(name),\n        language: lua.read()\n      };\n    case \"Nginx\":\n      return {\n        name: \"nginx\",\n        extensions: getFileExtensions(name),\n        language: nginx.read()\n      };\n    case \"MATLAB\":\n      return {\n        name: \"octave\",\n        extensions: getFileExtensions(name),\n        language: octave.read()\n      };\n    case \"Perl\":\n      return {\n        name: \"perl\",\n        extensions: getFileExtensions(name),\n        language: perl.read()\n      };\n    case \"Ruby\":\n      return {\n        name: \"ruby\",\n        extensions: getFileExtensions(name),\n        language: ruby.read()\n      };\n    case \"Shell\":\n      return {\n        name: \"shell\",\n        extensions: getFileExtensions(name),\n        language: shell.read()\n      };\n    case \"Swift\":\n      return {\n        name: \"swift\",\n        extensions: getFileExtensions(name),\n        language: swift.read()\n      };\n    case \"YAML\":\n      return {\n        name: \"yaml\",\n        extensions: getFileExtensions(name),\n        language: yaml.read()\n      };\n  }\n}\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"useLanguageAsync\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};", "// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */ // ../../node_modules/@codesandbox/sandpack-themes/dist/esm/index.js\nvar amethyst = {\n  colors: {\n    surface1: \"#000000\",\n    surface2: \"#0a0a23\",\n    surface3: \"#3b3b4f\",\n    clickable: \"#dfdfe2\",\n    base: \"#ffffff\",\n    disabled: \"#858591\",\n    hover: \"#ffffff\",\n    accent: \"#a26cd6\",\n    error: \"#ffffff\",\n    errorSurface: \"#3b3b4f\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#858591\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#a26cdd\",\n    tag: \"#f07178\",\n    punctuation: \"#99c9ff\",\n    definition: \"#ffffff\",\n    property: \"#99c9ff\",\n    static: \"#f78c6c\",\n    string: \"#57d1b7\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"12px\",\n    lineHeight: \"18px\"\n  }\n};\nvar aquaBlue = {\n  colors: {\n    surface1: \"#f8f9fb\",\n    surface2: \"#EBEDF0\",\n    surface3: \"#e4e7eb\",\n    clickable: \"#737373\",\n    base: \"#323232\",\n    disabled: \"#C5C5C5\",\n    hover: \"#1f2933\",\n    accent: \"#2e7692\"\n  },\n  syntax: {\n    plain: \"#1F2933\",\n    comment: {\n      color: \"#A7B6C2\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#1A56DB\",\n    tag: \"#1A56DB\",\n    punctuation: \"#394b59\",\n    definition: \"#A23DAD\",\n    property: \"#2e7692\",\n    static: \"#1A56DB\",\n    string: \"#1992D4\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar atomDark = {\n  colors: {\n    surface1: \"#282c34\",\n    surface2: \"#21252b\",\n    surface3: \"#2c313c\",\n    clickable: \"#a8b1c2\",\n    base: \"#a8b1c2\",\n    disabled: \"#4d4d4d\",\n    hover: \"#e8effc\",\n    accent: \"#c678dd\",\n    error: \"#e06c75\",\n    errorSurface: \"#ffeceb\"\n  },\n  syntax: {\n    plain: \"#a8b1c2\",\n    comment: {\n      color: \"#757575\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#c678dd\",\n    tag: \"#e06c75\",\n    punctuation: \"#a8b1c2\",\n    definition: \"#62aeef\",\n    property: \"#d19a66\",\n    static: \"#a8b1c2\",\n    string: \"#98c379\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar cobalt2 = {\n  colors: {\n    surface1: \"#193549\",\n    surface2: \"#0d3a58\",\n    surface3: \"#1f4662\",\n    clickable: \"#aaaaaa\",\n    base: \"#ffffff\",\n    disabled: \"#C5C5C5\",\n    hover: \"#ffffff\",\n    accent: \"#ffc600\",\n    error: \"#a22929\",\n    errorSurface: \"#0d3a58\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#0088ff\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#ff9d00\",\n    tag: \"#9effff\",\n    punctuation: \"#e1efff\",\n    definition: \"#ffc600\",\n    property: \"#ffc600\",\n    static: \"#ffee80\",\n    string: \"#a5ff90\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Operator Mono\", \"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar cyberpunk = {\n  colors: {\n    surface1: \"#051c30\",\n    surface2: \"#042f40\",\n    surface3: \"#042f40\",\n    clickable: \"#aaaaaa\",\n    base: \"#ffffff\",\n    disabled: \"#C5C5C5\",\n    hover: \"#ffffff\",\n    accent: \"#fdf500\",\n    error: \"#ff003c\",\n    errorSurface: \"#051c30\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#1ac5b0\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#fdf500\",\n    tag: \"#ffc600\",\n    punctuation: \"#afd7fa\",\n    definition: \"#ffc600\",\n    property: \"#fdf500\",\n    static: \"#e455ae\",\n    string: \"#37ebf3\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar dracula = {\n  colors: {\n    surface1: \"#282a36\",\n    surface2: \"#44475a\",\n    surface3: \"#44475a\",\n    clickable: \"#6272a4\",\n    base: \"#f8f8f2\",\n    disabled: \"#6272a4\",\n    hover: \"#f8f8f2\",\n    accent: \"#bd93f9\",\n    error: \"#f8f8f2\",\n    errorSurface: \"#44475a\"\n  },\n  syntax: {\n    plain: \"#f8f8f2\",\n    comment: {\n      color: \"#6272a4\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#ff79c6\",\n    tag: \"#ff79c6\",\n    punctuation: \"#ff79c6\",\n    definition: \"#f8f8f2\",\n    property: \"#50fa7b\",\n    static: \"#bd93f9\",\n    string: \"#f1fa8c\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar ecoLight = {\n  colors: {\n    surface1: \"#eae8e8\",\n    surface2: \"#00997761\",\n    surface3: \"#ffffff5e\",\n    clickable: \"#421010\",\n    base: \"#421010\",\n    disabled: \"#C5C5C5\",\n    hover: \"#4D4D4D\",\n    accent: \"#009977\",\n    error: \"#ff453a\",\n    errorSurface: \"#e8cac6\"\n  },\n  syntax: {\n    plain: \"#151515\",\n    comment: {\n      color: \"#a9a7a7\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#0971F1\",\n    tag: \"#097104\",\n    punctuation: \"#3B3B3B\",\n    definition: \"#042d60\",\n    property: \"#9013fe\",\n    static: \"#FF453A\",\n    string: \"#f5a623\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar freeCodeCampDark = {\n  colors: {\n    surface1: \"#2a2a40\",\n    surface2: \"#0a0a23\",\n    surface3: \"#3b3b4f\",\n    clickable: \"#dfdfe2\",\n    base: \"#ffffff\",\n    disabled: \"#858591\",\n    hover: \"#ffffff\",\n    accent: \"#dbb8ff\",\n    error: \"#ffffff\",\n    errorSurface: \"#3b3b4f\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#858591\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#dbb8ff\",\n    tag: \"#f07178\",\n    punctuation: \"#99c9ff\",\n    definition: \"#ffffff\",\n    property: \"#99c9ff\",\n    static: \"#f78c6c\",\n    string: \"#acd157\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar githubLight = {\n  colors: {\n    surface1: \"#ffffff\",\n    surface2: \"#F3F3F3\",\n    surface3: \"#f5f5f5\",\n    clickable: \"#959da5\",\n    base: \"#24292e\",\n    disabled: \"#d1d4d8\",\n    hover: \"#24292e\",\n    accent: \"#24292e\"\n  },\n  syntax: {\n    keyword: \"#d73a49\",\n    property: \"#005cc5\",\n    plain: \"#24292e\",\n    static: \"#032f62\",\n    string: \"#032f62\",\n    definition: \"#6f42c1\",\n    punctuation: \"#24292e\",\n    tag: \"#22863a\",\n    comment: {\n      color: \"#6a737d\",\n      fontStyle: \"normal\"\n    }\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar gruvboxDark = {\n  colors: {\n    surface1: \"#282828\",\n    surface2: \"#3c3836\",\n    surface3: \"#3c3836\",\n    clickable: \"#ebdbb2\",\n    base: \"#ebdbb2\",\n    disabled: \"#928374\",\n    hover: \"#fe8019\",\n    accent: \"#d65d0e\",\n    error: \"#ff453a\",\n    errorSurface: \"#3c3836\"\n  },\n  syntax: {\n    plain: \"#ebdbb2\",\n    comment: {\n      color: \"#928374\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#ff453a\",\n    tag: \"#83a598\",\n    punctuation: \"#ebdbb2\",\n    definition: \"#83a598\",\n    property: \"#fabd2f\",\n    static: \"#ebdbb2\",\n    string: \"#b8bb26\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar gruvboxLight = {\n  colors: {\n    surface1: \"#fbf1c7\",\n    surface2: \"#ebdbb2\",\n    surface3: \"#ebdbb2\",\n    clickable: \"#808080\",\n    base: \"#3c3836\",\n    disabled: \"#928374\",\n    hover: \"#af3a03\",\n    accent: \"#d65d0e\",\n    error: \"#9d0006\",\n    errorSurface: \"#ebdbb2\"\n  },\n  syntax: {\n    plain: \"#3c3836\",\n    comment: {\n      color: \"#928374\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#9d0006\",\n    tag: \"#076678\",\n    punctuation: \"#3c3836\",\n    definition: \"#076678\",\n    property: \"#b57614\",\n    static: \"#3c3836\",\n    string: \"#79740e\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar levelUp = {\n  colors: {\n    surface1: \"#191324\",\n    surface2: \"#261e33\",\n    surface3: \"#524763\",\n    clickable: \"#aaaaaa\",\n    base: \"#ffffff\",\n    disabled: \"#aaaaaa\",\n    hover: \"#ffffff\",\n    accent: \"#82d8d8\",\n    error: \"#e54b4b\",\n    errorSurface: \"#191324\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#82d8d8\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#e54b4b\",\n    tag: \"#ff26be\",\n    punctuation: \"#9588aa\",\n    definition: \"#82d8d8\",\n    property: \"#82d8d8\",\n    static: \"#82d8d8\",\n    string: \"#a8fe39\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"MonoLisa\", \"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar monokaiPro = {\n  colors: {\n    surface1: \"#2D2A2E\",\n    surface2: \"#444344\",\n    surface3: \"#484747\",\n    clickable: \"#939293\",\n    base: \"#C1C0C1\",\n    disabled: \"#444344\",\n    hover: \"#FCFCFA\",\n    accent: \"#FFD866\",\n    error: \"#ffcdca\",\n    errorSurface: \"#c24038\"\n  },\n  syntax: {\n    plain: \"rgb(252, 252, 250)\",\n    comment: {\n      color: \"#757575\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"rgb(255, 97, 136)\",\n    tag: \"rgb(120, 220, 232)\",\n    punctuation: \"rgb(147, 146, 147)\",\n    definition: \"rgb(169, 220, 118)\",\n    property: {\n      color: \"rgb(120, 220, 232)\",\n      fontStyle: \"italic\"\n    },\n    static: \"rgb(171, 157, 242)\",\n    string: \"rgb(255, 216, 102)\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar neoCyan = {\n  colors: {\n    surface1: \"#2b3935\",\n    surface2: \"#191324\",\n    surface3: \"#524763\",\n    clickable: \"#aaaaaa\",\n    base: \"#ffffff\",\n    disabled: \"#aaaaaa\",\n    hover: \"#ffffff\",\n    accent: \"#82d8d8\",\n    error: \"#e54b4b\",\n    errorSurface: \"#191324\"\n  },\n  syntax: {\n    plain: \"#ffffff\",\n    comment: {\n      color: \"#82d8d8\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#e54b4b\",\n    tag: \"#ff26be\",\n    punctuation: \"#9588aa\",\n    definition: \"#82d8d8\",\n    property: \"#82d8d8\",\n    static: \"#82d8d8\",\n    string: \"#a8fe39\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"MonoLisa\", \"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"12px\",\n    lineHeight: \"18px\"\n  }\n};\nvar nightOwl = {\n  colors: {\n    surface1: \"#011627\",\n    surface2: \"#243b4c\",\n    surface3: \"#112331\",\n    clickable: \"#6988a1\",\n    base: \"#808080\",\n    disabled: \"#4D4D4D\",\n    hover: \"#c5e4fd\",\n    accent: \"#c5e4fd\",\n    error: \"#ffcdca\",\n    errorSurface: \"#811e18\"\n  },\n  syntax: {\n    plain: \"#d6deeb\",\n    comment: {\n      color: \"#999999\",\n      fontStyle: \"italic\"\n    },\n    keyword: {\n      color: \"#c792ea\",\n      fontStyle: \"italic\"\n    },\n    tag: \"#7fdbca\",\n    punctuation: \"#7fdbca\",\n    definition: \"#82aaff\",\n    property: {\n      color: \"#addb67\",\n      fontStyle: \"italic\"\n    },\n    static: \"#f78c6c\",\n    string: \"#ecc48d\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nvar sandpackDark = {\n  colors: {\n    surface1: \"#151515\",\n    surface2: \"#252525\",\n    surface3: \"#2F2F2F\",\n    clickable: \"#999999\",\n    base: \"#808080\",\n    disabled: \"#4D4D4D\",\n    hover: \"#C5C5C5\",\n    accent: \"#90e86f\",\n    error: \"#E1CFF8\",\n    errorSurface: \"#b08df8\"\n  },\n  syntax: {\n    plain: \"#f0fdaf\",\n    comment: {\n      color: \"#757575\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#e5fd78\",\n    tag: \"#f0fdaf\",\n    punctuation: \"#ffffff\",\n    definition: \"#eeeeee\",\n    property: \"#90e86f\",\n    static: \"#ffffff\",\n    string: \"#dafecf\"\n  },\n  font: {\n    body: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    mono: '\"Fira Mono\", \"DejaVu Sans Mono\", Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace',\n    size: \"13px\",\n    lineHeight: \"20px\"\n  }\n};\nexport { amethyst, aquaBlue, atomDark, cobalt2, cyberpunk, dracula, ecoLight, freeCodeCampDark, githubLight, gruvboxDark, gruvboxLight, levelUp, monokaiPro, neoCyan, nightOwl, sandpackDark };\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"neoCyan\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"atomDark\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"sandpackDark\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ecoLight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cobalt2\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"dracula\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"gruvboxLight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"levelUp\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"aquaBlue\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"nightOwl\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"gruvboxDark\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"cyberpunk\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"githubLight\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"freeCodeCampDark\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"monokaiPro\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"amethyst\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./codesandbox_sandpack_themes.map", "import { amethyst, aquaBlue, atomDark, cobalt2, cyberpunk, dracula, freeCodeCampDark, githubLight, levelUp, monokaiPro, neoCyan, nightOwl, sandpackDark } from \"https://framerusercontent.com/modules/c4BjG1nmVImY1EzTuV13/OqRStXQUJv4l4u3XtQrx/codesandbox_sandpack_themes.js\";\nimport { isObject, isDarkColor } from \"https://framerusercontent.com/modules/IdMJ4CymCWCh4cOBkZlb/RXSqswLIbuViBOVW1keE/utils.js\";\nconst magic = {\n  colors: {\n    surface1: \"#f6f6f8\",\n    surface2: \"#f6f6f8\",\n    surface3: \"#f6f6f8\",\n    clickable: \"#808080\",\n    base: \"#323232\",\n    disabled: \"#C5C5C5\",\n    hover: \"#4D4D4D\",\n    accent: \"#ffa600\",\n    error: \"#ff453a\",\n    errorSurface: \"#ffeceb\"\n  },\n  syntax: {\n    plain: \"#151515\",\n    comment: {\n      color: \"#cacacd\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#ffa600\",\n    tag: \"#ff9a4d\",\n    punctuation: \"#ffb3b3\",\n    definition: \"#ff6f00\",\n    property: \"#9900ff\",\n    static: \"#FF453A\",\n    string: \"#f53524\"\n  },\n  font: {\n    body: '\"Roboto Mono\", monospace',\n    mono: '\"Roboto Mono\", monospace',\n    size: \"14px\",\n    lineHeight: \"24px\"\n  }\n};\nconst atomLight = {\n  colors: {\n    surface1: \"#fafafa\"\n  },\n  syntax: {\n    plain: \"#383a42\",\n    comment: {\n      color: \"#a0a1a7\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#a626a4\",\n    tag: \"#e45649\",\n    punctuation: \"#383a42\",\n    definition: \"#c18401\",\n    property: \"#4078f2\",\n    static: \"#986801\",\n    string: \"#50a14f\"\n  }\n};\nconst framerLight = {\n  colors: {\n    surface1: \"#fafafa\",\n    surface2: \"#eeeeee\",\n    surface3: \"#f3f3f3\",\n    clickable: \"#808080\",\n    base: \"#323232\",\n    disabled: \"#c5c5c5\",\n    hover: \"#4d4d4d\",\n    accent: \"#0099ff\",\n    error: \"#ff3366\",\n    errorSurface: \"#ffe0e8\"\n  },\n  syntax: {\n    plain: \"#666666\",\n    comment: {\n      color: \"#bbbbbb\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#0099ff\",\n    tag: \"#0099ff\",\n    punctuation: \"#bbbbbb\",\n    definition: \"#FFAA00\",\n    property: \"#33cccc\",\n    static: \"#ff8866\",\n    string: \"#8855ff\"\n  }\n};\nconst framerDark = {\n  colors: {\n    surface1: \"#161820\",\n    surface2: \"#252525\",\n    surface3: \"#2f2f2f\",\n    clickable: \"#999999\",\n    base: \"#d92121\",\n    disabled: \"#4d4d4d\",\n    hover: \"#c5c5c5\",\n    accent: \"#0099ff\",\n    error: \"#ff3366\",\n    errorSurface: \"#ffe0e8\"\n  },\n  syntax: {\n    plain: \"#eeeeee\",\n    comment: {\n      color: \"#666666\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#00BBFF\",\n    tag: \"#00BBFF\",\n    punctuation: \"#999999\",\n    definition: \"#ffcc66\",\n    property: \"#77dddd\",\n    static: \"#ff8866\",\n    string: \"#bb88ff\"\n  }\n};\nconst ayuLight = {\n  colors: {\n    surface1: \"#fafafa\"\n  },\n  syntax: {\n    comment: {\n      color: \"aaaeb1\",\n      fontStyle: \"italic\"\n    },\n    definition: \"#3b9ee6\",\n    keyword: \"#fa8e3e\",\n    plain: \"#5c6166\",\n    property: \"#f2ae49\",\n    punctuation: \"#5c6167\",\n    static: \"#a37acc\",\n    string: \"#87b300\",\n    tag: \"#56b4d5\"\n  }\n};\nconst ayuDark = {\n  colors: {\n    surface1: \"#0c1017\"\n  },\n  syntax: {\n    comment: {\n      color: \"#646a72\",\n      fontStyle: \"italic\"\n    },\n    definition: \"#5ac2ff\",\n    keyword: \"#ff9040\",\n    plain: \"#bfbdb6\",\n    property: \"#ffb454\",\n    punctuation: \"#bfbdb6\",\n    static: \"#d2a6ff\",\n    string: \"#80d962\",\n    tag: \"#3bbae7\"\n  }\n};\nconst sandpackLight = {\n  colors: {\n    surface1: \"#ffffff\",\n    surface2: \"#EFEFEF\",\n    surface3: \"#F3F3F3\",\n    disabled: \"#C5C5C5\",\n    base: \"#323232\",\n    clickable: \"#808080\",\n    hover: \"#4D4D4D\",\n    accent: \"#3973E0\",\n    error: \"#EA3323\",\n    errorSurface: \"#FCF1F0\",\n    warning: \"#6A4516\",\n    warningSurface: \"#FEF2C0\"\n  },\n  syntax: {\n    plain: \"#151515\",\n    comment: {\n      color: \"#999\",\n      fontStyle: \"italic\"\n    },\n    keyword: \"#7C5AE3\",\n    tag: \"#0971F1\",\n    punctuation: \"#3B3B3B\",\n    definition: \"#85A600\",\n    property: \"#3B3B3B\",\n    static: \"#3B3B3B\",\n    string: \"#2E6BD0\"\n  }\n};\nconst githubDark = {\n  colors: {\n    ...framerDark.colors,\n    surface1: \"#0d1117\"\n  },\n  syntax: {\n    comment: {\n      color: \"#8b949e\",\n      fontStyle: \"italic\"\n    },\n    definition: \"#d2a8ff\",\n    keyword: \"#ff7b72\",\n    plain: \"#e6edf3\",\n    property: \"#79c0ff\",\n    punctuation: \"#e6edf3\",\n    static: \"#7ee787\",\n    string: \"#a5d6ff\",\n    tag: \"#7ee787\"\n  }\n}; // A bit verbose but helps keep our themes in check\nexport const themeKeys = [\"amethyst\", \"aquaBlue\", \"atomDark\", \"atomLight\", \"ayuDark\", \"ayuLight\", \"cobalt2\", \"cyberpunk\", \"dracula\", \"framerDark\", \"framerLight\", \"freeCodeCamp\", \"githubDark\", \"githubLight\", \"levelUp\", \"monokaiPro\", \"magic\", \"neoCyan\", \"nightOwl\", \"sandpackDark\", \"sandpackLight\"];\nexport const themes = {\n  amethyst,\n  aquaBlue,\n  atomDark,\n  atomLight,\n  ayuDark,\n  ayuLight,\n  cobalt2,\n  cyberpunk,\n  dracula,\n  framerDark,\n  framerLight,\n  freeCodeCamp: freeCodeCampDark,\n  githubDark,\n  githubLight,\n  levelUp,\n  monokaiPro,\n  magic,\n  neoCyan,\n  nightOwl,\n  sandpackDark,\n  sandpackLight\n};\nexport const lightThemeVariables = `\n/* Colors */\n--cb-colors-surface1: var(--cb-colors-surface1-light);\n--cb-colors-surface2: var(--cb-colors-surface2-light);\n--cb-colors-surface3: var(--cb-colors-surface3-light);\n--cb-colors-disabled: var(--cb-colors-disabled-light);\n--cb-colors-base: var(--cb-colors-base-light);\n--cb-colors-clickable: var(--cb-colors-clickable-light);\n--cb-colors-hover: var(--cb-colors-hover-light);\n--cb-colors-accent: var(--cb-colors-accent-light);\n--cb-colors-error: var(--cb-colors-error-light);\n--cb-colors-errorSurface: var(--cb-colors-errorSurface-light);\n--cb-colors-warning: var(--cb-colors-warning-light);\n--cb-colors-warningSurface: var(--cb-colors-warningSurface-light);\n\n/* Syntax */\n--cb-syntax-color-plain: var(--cb-syntax-color-plain-light);\n--cb-syntax-color-comment: var(--cb-syntax-color-comment-light);\n--cb-syntax-color-keyword: var(--cb-syntax-color-keyword-light);\n--cb-syntax-color-definition: var(--cb-syntax-color-definition-light);\n--cb-syntax-color-punctuation: var(--cb-syntax-color-punctuation-light);\n--cb-syntax-color-property: var(--cb-syntax-color-property-light);\n--cb-syntax-color-tag: var(--cb-syntax-color-tag-light);\n--cb-syntax-color-static: var(--cb-syntax-color-static-light);\n--cb-syntax-color-string: var(--cb-syntax-color-string-light);\n--cb-syntax-fontStyle-plain: var(--cb-syntax-fontStyle-plain-light);\n--cb-syntax-fontStyle-comment: var(--cb-syntax-fontStyle-comment-light);\n--cb-syntax-fontStyle-keyword: var(--cb-syntax-fontStyle-keyword-light);\n--cb-syntax-fontStyle-definition: var(--cb-syntax-fontStyle-definition-light);\n--cb-syntax-fontStyle-punctuation: var(--cb-syntax-fontStyle-punctuation-light);\n--cb-syntax-fontStyle-property: var(--cb-syntax-fontStyle-property-light);\n--cb-syntax-fontStyle-tag: var(--cb-syntax-fontStyle-tag-light);\n--cb-syntax-fontStyle-static: var(--cb-syntax-fontStyle-static-light);\n--cb-syntax-fontStyle-string: var(--cb-syntax-fontStyle-string-light);\n\n/* Other */\n--cb-color-scheme: var(--cb-color-scheme-light);\n`;\nexport const darkThemeVariables = `\n/* Colors */\n--cb-colors-surface1: var(--cb-colors-surface1-dark);\n--cb-colors-surface2: var(--cb-colors-surface2-dark);\n--cb-colors-surface3: var(--cb-colors-surface3-dark);\n--cb-colors-disabled: var(--cb-colors-disabled-dark);\n--cb-colors-base: var(--cb-colors-base-dark);\n--cb-colors-clickable: var(--cb-colors-clickable-dark);\n--cb-colors-hover: var(--cb-colors-hover-dark);\n--cb-colors-accent: var(--cb-colors-accent-dark);\n--cb-colors-error: var(--cb-colors-error-dark);\n--cb-colors-errorSurface: var(--cb-colors-errorSurface-dark);\n--cb-colors-warning: var(--cb-colors-warning-dark);\n--cb-colors-warningSurface: var(--cb-colors-warningSurface-dark);\n\n/* Syntax */\n--cb-syntax-color-plain: var(--cb-syntax-color-plain-dark);\n--cb-syntax-color-comment: var(--cb-syntax-color-comment-dark);\n--cb-syntax-color-keyword: var(--cb-syntax-color-keyword-dark);\n--cb-syntax-color-definition: var(--cb-syntax-color-definition-dark);\n--cb-syntax-color-punctuation: var(--cb-syntax-color-punctuation-dark);\n--cb-syntax-color-property: var(--cb-syntax-color-property-dark);\n--cb-syntax-color-tag: var(--cb-syntax-color-tag-dark);\n--cb-syntax-color-static: var(--cb-syntax-color-static-dark);\n--cb-syntax-color-string: var(--cb-syntax-color-string-dark);\n--cb-syntax-fontStyle-plain: var(--cb-syntax-fontStyle-plain-dark);\n--cb-syntax-fontStyle-comment: var(--cb-syntax-fontStyle-comment-dark);\n--cb-syntax-fontStyle-keyword: var(--cb-syntax-fontStyle-keyword-dark);\n--cb-syntax-fontStyle-definition: var(--cb-syntax-fontStyle-definition-dark);\n--cb-syntax-fontStyle-punctuation: var(--cb-syntax-fontStyle-punctuation-dark);\n--cb-syntax-fontStyle-property: var(--cb-syntax-fontStyle-property-dark);\n--cb-syntax-fontStyle-tag: var(--cb-syntax-fontStyle-tag-dark);\n--cb-syntax-fontStyle-static: var(--cb-syntax-fontStyle-static-dark);\n--cb-syntax-fontStyle-string: var(--cb-syntax-fontStyle-string-dark);\n\n/* Other */\n--cb-color-scheme: var(--cb-color-scheme-dark);\n`;\nexport function getVariableTheme(font) {\n  var _fontFamily;\n  return {\n    colors: {\n      surface1: \"var(--cb-colors-surface1)\",\n      surface2: \"var(--cb-colors-surface2)\",\n      surface3: \"var(--cb-colors-surface3)\",\n      disabled: \"var(--cb-colors-disabled)\",\n      base: \"var(--cb-colors-base)\",\n      clickable: \"var(--cb-colors-clickable)\",\n      hover: \"var(--cb-colors-hover)\",\n      accent: \"var(--cb-colors-accent)\",\n      error: \"var(--cb-colors-error)\",\n      errorSurface: \"var(--cb-colors-errorSurface)\",\n      warning: \"var(--cb-colors-warning)\",\n      warningSurface: \"var(--cb-colors-warningSurface)\"\n    },\n    syntax: {\n      plain: {\n        color: \"var(--cb-syntax-color-plain)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-plain)\",\n        fontWeight: font.fontWeight\n      },\n      comment: {\n        color: \"var(--cb-syntax-color-comment)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-comment)\",\n        fontWeight: font.fontWeight\n      },\n      keyword: {\n        color: \"var(--cb-syntax-color-keyword)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-keyword)\",\n        fontWeight: font.fontWeight\n      },\n      definition: {\n        color: \"var(--cb-syntax-color-definition)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-definition)\",\n        fontWeight: font.fontWeight\n      },\n      punctuation: {\n        color: \"var(--cb-syntax-color-punctuation)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-punctuation)\",\n        fontWeight: font.fontWeight\n      },\n      property: {\n        color: \"var(--cb-syntax-color-property)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-property)\",\n        fontWeight: font.fontWeight\n      },\n      tag: {\n        color: \"var(--cb-syntax-color-tag)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-tag)\",\n        fontWeight: font.fontWeight\n      },\n      static: {\n        color: \"var(--cb-syntax-color-static)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-static)\",\n        fontWeight: font.fontWeight\n      },\n      string: {\n        color: \"var(--cb-syntax-color-string)\",\n        fontStyle: \"var(--cb-syntax-fontStyle-string)\",\n        fontWeight: font.fontWeight\n      }\n    },\n    font: {\n      body: \"sans-serif\",\n      mono: (_fontFamily = font.fontFamily) !== null && _fontFamily !== void 0 ? _fontFamily : \"monospace\",\n      size: font.fontSize,\n      lineHeight: font.lineHeight\n    }\n  };\n}\nexport function getVariablesForTheme(theme, background, mode) {\n  const result = {};\n  const {\n    colors,\n    syntax\n  } = themes[theme] || {}; // Collect all colors and turn them into CSS variables.\n  if (isObject(colors)) {\n    for (const name in colors) {\n      const value = colors[name];\n      result[`--cb-colors-${name}-${mode}`] = value;\n    }\n  } // Collect all syntax colors and turn them into CSS variables.\n  if (isObject(syntax)) {\n    for (const name1 in syntax) {\n      const value1 = syntax[name1];\n      if (isObject(value1)) {\n        for (const style in value1) {\n          result[`--cb-syntax-${style}-${name1}-${mode}`] = value1[style];\n        }\n      } else {\n        result[`--cb-syntax-color-${name1}-${mode}`] = value1;\n      }\n    }\n  } // Override the background color.\n  if (background) {\n    result[`--cb-colors-surface1-${mode}`] = background;\n  } else {\n    background = result[`--cb-colors-surface1-${mode}`];\n  } // This is important to show scrollbars and selections with the correct color.\n  result[`--cb-color-scheme-${mode}`] = isDarkColor(background) ? \"dark\" : \"light\";\n  return result;\n}\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"getVariablesForTheme\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"themeKeys\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"getVariableTheme\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"lightThemeVariables\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"themes\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ThemeKeys\": {\n      \"type\": \"tsType\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"darkThemeVariables\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};\n//# sourceMappingURL=./theming.map", "import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { motion } from \"framer-motion\";\nimport { getSandpackCssText, SandpackCodeEditor, SandpackLayout, SandpackProvider } from \"https://framerusercontent.com/modules/SWAtenub3goqbKHfvwGg/SGdoMClxnsCb2h0GRQ48/codesandbox_sandpack_react.js\";\nimport { addPropertyControls, ControlType, withCSS } from \"framer\";\nimport { Browser } from \"https://framerusercontent.com/modules/wOI0XDWuPNeaYuatKp4b/ezOdeUpHBrE7fwL9evTL/browser.js\";\nimport { supportedLanguages } from \"https://framerusercontent.com/modules/19BkzxjVBT3VP0Ykl3DY/Ca7pJ6oGfAIcZSScMdTx/types.js\";\nimport { useLanguageAsync } from \"https://framerusercontent.com/modules/DyzTKdNCsRH8nvz08sNT/dJhQ3yTSKg9tQmEoIrL8/useLanguageAsync.js\";\nimport { getFileExtensions, titleCase, useBorder, useIsOnCanvas, usePadding, useRadius } from \"https://framerusercontent.com/modules/IdMJ4CymCWCh4cOBkZlb/RXSqswLIbuViBOVW1keE/utils.js\";\nimport { darkThemeVariables, getVariablesForTheme, getVariableTheme, lightThemeVariables, themeKeys } from \"https://framerusercontent.com/modules/HdJmYu90NFzknVhsFw9C/MDI6YFyMfuxuxcY2EeV6/theming.js\";\nconst DEFAULT_CODE = `// Paste a code snippet\nimport { motion } from \"framer-motion\";\n\nfunction Component() {\n    return (\n        <motion.div\n            transition={{ ease: \"linear\" }}\n            animate={{ rotate: 360, scale: 2 }}\n        />\n    );\n}`;\nconst wrapperClassName = \"framer-cb\";\nconst css = [`\n.${wrapperClassName} .sp-pre-placeholder {\n    padding: var(--cb-padding) !important;\n    margin: 0 !important;\n    width: max-content;\n}\n    `, `\n.${wrapperClassName} .cm-scroller {\n    display: unset !important;\n    padding: 0 !important;\n}\n    `, `\n.${wrapperClassName} .cm-content {\n    padding: var(--cb-padding) !important;\n    width: max-content;\n}\n    `, `\n.${wrapperClassName} .sp-wrapper {\n    color-scheme: var(--cb-color-scheme, inherit);\n}\n    `,\n// This override rules to fix font-size on mobile safari.\n// .cm-content.cm-readonly is rendered with js enabled\n// .sp-pre-placeholder is rendered in no-js mode (SSG output)\n`\n@media screen and (max-width: 768px) {\n    @supports (-webkit-overflow-scrolling: touch) {\n        .cb-code-editor .cm-content.cm-readonly,\n        .cb-code-editor .sp-pre-placeholder {\n            font-size: var(--sp-font-size, inherit);\n            -webkit-text-size-adjust: 100%;\n        }\n    }\n}\n`,\n// Override the 50% height on small screens\n`\n@media screen and (max-width: 768px) {\n    .${wrapperClassName} .sp-editor-viewer.sp-stack {\n        height: 100%;\n    }\n}\n`,\n// Light mode\n`\n.${wrapperClassName} {\n    ${lightThemeVariables}\n}\n    `, `\nbody[data-framer-theme=\"dark\"] .${wrapperClassName} {\n    ${darkThemeVariables}\n}\n    `, `\n@media (prefers-color-scheme: dark) {\n    body:not([data-framer-theme]) .${wrapperClassName} {\n        ${darkThemeVariables}\n    }\n}\n    `].map(rule => rule.trim()); /**\n                                 * Code Block\n                                 *\n                                 * @framerSupportedLayoutWidth fixed\n                                 * @framerSupportedLayoutHeight any\n                                 *\n                                 * @framerDisableUnlink\n                                 *\n                                 * @framerIntrinsicWidth 500\n                                 * @framerIntrinsicHeight 200\n                                 *\n                                 * @framerComponentPresetProps borderRadius, border, font, themeMode, theme, lightTheme, darkTheme, background, padding\n                                 */\nconst CodeBlock = withCSS(function CodeBlock(props) {\n  const {\n    code,\n    themeMode,\n    theme,\n    lightTheme,\n    darkTheme,\n    style,\n    language,\n    font,\n    border,\n    background\n  } = props;\n  const variableTheme = getVariableTheme(font);\n  const lightThemeVariables = getVariablesForTheme(themeMode === \"Dynamic\" ? lightTheme : theme, background, \"light\");\n  const darkThemeVariables = getVariablesForTheme(themeMode === \"Dynamic\" ? darkTheme : theme, background, \"dark\"); // async version\n  const additionalLanguage = useLanguageAsync(language); // sync version\n  // const additionalLanguage = getLanguage(language)\n  const extension = getFileExtensions(language)[0];\n  const onCanvas = useIsOnCanvas();\n  const borderStyles = useBorder(border || {}, false);\n  const borderRadius = useRadius(props);\n  const hasBorderRadius = borderRadius !== \"0px 0px 0px 0px\" && borderRadius !== \"0px\";\n  const fileName = `example.${extension}`;\n  const padding = usePadding(props);\n  return /*#__PURE__*/_jsxs(motion.div, {\n    className: wrapperClassName,\n    whileHover: \"visible\",\n    style: {\n      ...lightThemeVariables,\n      ...darkThemeVariables,\n      position: \"relative\",\n      width: \"100%\",\n      height: \"100%\"\n    },\n    children: [/*#__PURE__*/_jsx(SandpackProvider, {\n      options: {\n        classes: {\n          \"sp-code-editor\": \"cb-code-editor\"\n        }\n      },\n      theme: variableTheme,\n      files: {\n        [fileName]: code\n      },\n      customSetup: {\n        entry: fileName\n      },\n      style: {\n        height: \"100%\"\n      },\n      children: /*#__PURE__*/_jsx(SandpackLayout, {\n        style: {\n          height: \"100%\",\n          // make sure the codeblock doesnt grow beyond\n          // the height of its contents\n          \"--sp-layout-height\": \"100%\",\n          // set the variables for padding we use in the overrides\n          \"--cb-padding\": `${padding}`,\n          ...borderStyles,\n          borderRadius,\n          transform:\n          // Safari sometimes struggles to render border-radius:\n          // - on the canvas when changing from 0 to any other value\n          // - or when rendering an iframe\n          hasBorderRadius && onCanvas ? \"translateZ(0.000001px)\" : \"unset\",\n          overflow: \"hidden\"\n        },\n        children: /*#__PURE__*/_jsx(SandpackCodeEditor, {\n          style: {\n            letterSpacing: font.letterSpacing\n          },\n          readOnly: true,\n          showReadOnly: false,\n          additionalLanguages: additionalLanguage ? [additionalLanguage] : undefined\n        })\n      })\n    }), /*#__PURE__*/_jsx(SandpackStyles, {})]\n  });\n}, css);\nexport default CodeBlock;\nfunction SandpackStyles() {\n  return /*#__PURE__*/_jsx(_Fragment, {\n    children: !Browser.isBrowser() && /*#__PURE__*/_jsx(\"style\", {\n      \"data-framer-css-ssr\": true,\n      dangerouslySetInnerHTML: {\n        __html: getSandpackCssText()\n      }\n    })\n  });\n}\nconst themeNames = themeKeys.map(titleCase);\naddPropertyControls(CodeBlock, {\n  code: {\n    type: ControlType.String,\n    title: \"Code\",\n    displayTextArea: true,\n    defaultValue: DEFAULT_CODE\n  },\n  themeMode: {\n    type: ControlType.Enum,\n    title: \"Theme\",\n    displaySegmentedControl: true,\n    options: [\"Static\", \"Dynamic\"],\n    defaultValue: \"Static\"\n  },\n  theme: {\n    type: ControlType.Enum,\n    title: \" \",\n    options: [...themeKeys],\n    optionTitles: themeNames,\n    defaultValue: \"framerDark\",\n    hidden: ({\n      themeMode\n    }) => themeMode !== \"Static\"\n  },\n  lightTheme: {\n    type: ControlType.Enum,\n    title: \"Light\",\n    options: [...themeKeys],\n    optionTitles: themeNames,\n    defaultValue: \"framerLight\",\n    hidden: ({\n      themeMode\n    }) => themeMode !== \"Dynamic\"\n  },\n  darkTheme: {\n    type: ControlType.Enum,\n    title: \"Dark\",\n    options: [...themeKeys],\n    optionTitles: themeNames,\n    defaultValue: \"framerDark\",\n    hidden: ({\n      themeMode\n    }) => themeMode !== \"Dynamic\"\n  },\n  language: {\n    type: ControlType.Enum,\n    title: \"Language\",\n    options: [...supportedLanguages],\n    defaultValue: \"JSX\"\n  },\n  font: {\n    // @ts-ignore: Internal API\n    type: ControlType.Font,\n    controls: \"extended\",\n    displayFontSize: true,\n    displayTextAlignment: false,\n    defaultFontType: \"monospace\",\n    defaultValue: {\n      fontSize: 14,\n      lineHeight: \"1.5em\"\n    }\n  },\n  background: {\n    title: \"Fill\",\n    type: ControlType.Color,\n    optional: true\n  },\n  border: {\n    buttonTitle: \"Options\",\n    type: ControlType.Object,\n    optional: true,\n    controls: {\n      borderColor: {\n        type: ControlType.Color,\n        title: \"Border\",\n        defaultValue: \"#eee\"\n      },\n      borderWidth: {\n        title: \"Width\",\n        type: ControlType.FusedNumber,\n        toggleKey: \"isMixedBorderWidth\",\n        toggleTitles: [\"Border\", \"Border per side\"],\n        valueKeys: [\"borderWidthTop\", \"borderWidthRight\", \"borderWidthBottom\", \"borderWidthLeft\"],\n        valueLabels: [\"T\", \"R\", \"B\", \"L\"],\n        min: 0,\n        defaultValue: 1\n      },\n      borderStyle: {\n        title: \"Style\",\n        type: ControlType.Enum,\n        options: [\"solid\", \"dashed\", \"dotted\", \"double\"],\n        optionTitles: [\"Solid\", \"Dashed\", \"Dotted\", \"double\"],\n        defaultValue: \"solid\"\n      }\n    }\n  },\n  borderRadius: {\n    title: \"Radius\",\n    type: ControlType.FusedNumber,\n    toggleKey: \"isMixedBorderRadius\",\n    toggleTitles: [\"Radius\", \"Radius per corner\"],\n    valueKeys: [\"topLeftRadius\", \"topRightRadius\", \"bottomRightRadius\", \"bottomLeftRadius\"],\n    valueLabels: [\"TL\", \"TR\", \"BR\", \"BL\"],\n    min: 0,\n    defaultValue: 15\n  },\n  padding: {\n    title: \"Padding\",\n    type: ControlType.FusedNumber,\n    toggleKey: \"paddingPerSide\",\n    toggleTitles: [\"Padding\", \"Padding per side\"],\n    valueKeys: [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n    valueLabels: [\"T\", \"R\", \"B\", \"L\"],\n    min: 0,\n    defaultValue: 30\n  }\n});\nCodeBlock.displayName = \"Code Block\";\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"default\": {\n      \"type\": \"reactComponent\",\n      \"name\": \"CodeBlock\",\n      \"slots\": [],\n      \"annotations\": {\n        \"framerDisableUnlink\": \"*\",\n        \"framerComponentPresetProps\": \"borderRadius, border, font, themeMode, theme, lightTheme, darkTheme, background, padding\",\n        \"framerIntrinsicWidth\": \"500\",\n        \"framerSupportedLayoutWidth\": \"fixed\",\n        \"framerIntrinsicHeight\": \"200\",\n        \"framerContractVersion\": \"1\",\n        \"framerSupportedLayoutHeight\": \"any\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};", "import { jsx as e, jsxs as t } from \"react/jsx-runtime\";\nimport { addPropertyControls as a, ComponentPresetsConsumer as n, ControlType as r, Link as o } from \"framer\";\nimport { motion as i } from \"framer-motion\";\nimport * as s from \"react\";\nimport { Youtube as h } from \"https://framerusercontent.com/modules/NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js\";\nimport l from \"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js\";\nlet c = \"EBxzs_2xh\",\n  d = \"tcfKQ1IoL\",\n  u = \"WiyRi0nIW\",\n  p = \"FmlfgY9nf\",\n  m = \"pbymmDdoo\",\n  g = \"k6SCBxvoj\",\n  f = \"JLyijN6_N\",\n  w = (e, t) => {\n    if (e && \"object\" == typeof e) return {\n      ...e,\n      alt: t\n    };\n  },\n  b = [{\n    id: \"LlQb5DfDG\",\n    [c]: \"OtterTune November 2023 Product Update\",\n    [d]: \"ottertune-november-2023-product-update\",\n    [u]: \"2023-12-04T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/L4miJ72IKKZEoo2vJkxjJCyh2dY.png\",\n      srcSet: \"https://framerusercontent.com/images/L4miJ72IKKZEoo2vJkxjJCyh2dY.png?scale-down-to=512 512w, https://framerusercontent.com/images/L4miJ72IKKZEoo2vJkxjJCyh2dY.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/L4miJ72IKKZEoo2vJkxjJCyh2dY.png 2048w\"\n    }, \"\"),\n    [m]: \"Since releasing the much-anticipated OtterTune v2.0 in April of this year, we\u2019ve been working hard to further enhance our core feature functionality and polish existing workflows while delivering some exciting new features.\",\n    [g]: \"Dana Van Aken | Shannon Ferretti | Jason Lauritzen\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Since releasing the much-anticipated OtterTune v2.0 in April of this year, we\u2019ve been working hard to further enhance our core feature functionality and polish existing workflows while delivering some exciting new features.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDD25 Announcing the OtterTune API\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve worked hard to provide you with more developer-friendly ways to interact with your OtterTune recommendations. We know that some users would like additional ways to review and apply recommendations \u2013 other than via the UI \u2013 and that\u2019s one of the reasons we\u2019ve decided to release the \", /*#__PURE__*/e(o, {\n          href: \"https://documenter.getpostman.com/view/20047696/2s9YC5yCPG\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune REST API\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"OtterTune API documentation via Postman\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,j3RxzXS0clBEmmq3rl6myU.png\",\n        \"data-framer-height\": \"800\",\n        \"data-framer-width\": \"1700\",\n        height: \"400\",\n        src: \"https://framerusercontent.com/images/j3RxzXS0clBEmmq3rl6myU.png\",\n        style: {\n          aspectRatio: \"1700 / 800\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This means you can now call our API and receive your actionable recommendations programmatically. You may want to use this to display information on an internal dashboard or report, or transform them to create actionable tasks to assign to members of your team.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The easiest way to get started with the OtterTune API is to use Postman to send requests. Check out our \", /*#__PURE__*/e(o, {\n          href: \"https://documenter.getpostman.com/view/20047696/2s9YC5yCPG\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"API Documentation\"\n          })\n        }), \" for instructions on how to load the API into Postman and configure your API key so it\u2019s automatically included when you send requests.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For example, if you wanted to retrieve all your OtterTune recommendations for a database, you\u2019d do a curl request like this:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"curl --location 'https://service.ottertune.com/api/databases/:databaseId/recommendations' \\\\\\n--header 'Accept: application/json' \\\\\\n--header 'OT-API-KEY: <API Key>'\",\n            language: \"Markdown\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And you\u2019d get a JSON response like this. In this example scenario, OtterTune has flagged two duplicate indexes that can be dropped to free up disk space and improve query performance:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: '{\\n  \"count\": 2,\\n  \"previous\": null,\\n  \"next\": null,\\n  \"results\": [\\n    {\\n      \"id\": 7654,\\n      \"name\": \"Drop a duplicate index\",\\n      \"description\": \"Dropping this may improve query performance and data integrity.\",\\n      \"type\": \"index\",\\n      \"status\": \"applied\",\\n      \"createdTime\": \"2023-08-16T09:18:50.508710Z\",\\n      \"databaseId\": 12345,\\n      \"awsAccountId\": \"111222333445\",\\n      \"region\": \"us-east-2\",\\n      \"dbIdentifier\": \"prod-reader-1\",\\n      \"dbSystem\": \"Aurora PostgreSQL\",\\n      \"dbSystemVersion\": \"14\",\\n      \"indexId\": 876,\\n      \"indexName\": \"duplicate_index_1\",\\n      \"indexType\": \"btree\",\\n      \"action\": \"ALTER TABLE stock DROP INDEX duplicate_index_1;\",\\n      \"sizeBytes\": 48005120,\\n      \"columns\": \"OL_SUPPLY_W_ID\",\\n      \"tableName\": \"stock\",\\n      \"schema\": \"public\",\\n      \"logicalDb\": \"marketing\"\\n    },\\n    {\\n      \"id\": 7654,\\n      \"name\": \"Drop a duplicate index\",\\n      \"description\": \"Dropping this may improve query performance and data integrity.\",\\n      \"type\": \"index\",\\n      \"status\": \"applied\",\\n      \"createdTime\": \"2023-08-16T09:18:50.508710Z\",\\n      \"databaseId\": 12345,\\n      \"awsAccountId\": \"111222333445\",\\n      \"region\": \"us-east-2\",\\n      \"dbIdentifier\": \"prod-reader-1\",\\n      \"dbSystem\": \"Aurora PostgreSQL\",\\n      \"dbSystemVersion\": \"14\",\\n      \"indexId\": 876,\\n      \"indexName\": \"duplicate_index_1\",\\n      \"indexType\": \"btree\",\\n      \"action\": \"ALTER TABLE stock DROP INDEX duplicate_index_1;\",\\n      \"sizeBytes\": 48005120,\\n      \"columns\": \"OL_SUPPLY_W_ID\",\\n      \"tableName\": \"stock\",\\n      \"schema\": \"public\",\\n      \"logicalDb\": \"marketing\"\\n    }\\n  ]\\n} ',\n            language: \"JSX\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019re excited about expanding this offering in the future! If there are specific resources or use cases you'd like the API to support, \", /*#__PURE__*/e(o, {\n          href: \"mailto:info@ottertune.com\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"get in touch with us\"\n          })\n        }), \" or \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.canny.io/feature-requests\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"submit a feature request\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83E\uDEA3 AWS S3 bucket support (for Enterprise accounts)\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For our Enterprise customers with additional security needs, we\u2019ve updated the \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Otte\u200B\u200BrTune Agent\"\n          })\n        }), \" to support AWS S3 as an endpoint, so it will write the telemetry we collect from the database to an S3 bucket instead of sending it directly to the OtterTune service.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Using this feature, OtterTune can securely access customer data on AWS when public egress is not permitted. You can also use it as a way to track all of the data that OtterTune has accessed for auditing purposes.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,0oi6c9IFKRy6J23fND06NjAQNEM.png\",\n        \"data-framer-height\": \"500\",\n        \"data-framer-width\": \"1700\",\n        height: \"250\",\n        src: \"https://framerusercontent.com/images/0oi6c9IFKRy6J23fND06NjAQNEM.png\",\n        style: {\n          aspectRatio: \"1700 / 500\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Please reach out to \", /*#__PURE__*/e(o, {\n          href: \"mailto:sales@ottertune.com\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"sales@ottertune.com\"\n          })\n        }), \" if you are interested in using this feature.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDEE2\uFE0F Let OtterTune manage your AWS Database (DB) Parameter Groups\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune uses artificial intelligence (AI) to automatically optimize a database\u2019s configuration knobs by periodically applying new configurations, each time gaining a better understanding of how the knob settings impact your database\u2019s performance. One thing that sets OtterTune apart from other database tuning solutions is it can perform the optimization task in a \u201Cclosed loop\u201D, meaning that it can continue learning and finding better configurations without human intervention.\\xa0\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We expose this option in our UI by providing an auto-tuning mode that you can enable to let OtterTune to apply knob recommendations on your behalf (with or without your approval). If you\u2019re not ready to relinquish that level of control, you can also apply OtterTune\u2019s recommendations manually on your own \u2013 we also provide the AWS CLI commands to update your database\u2019s AWS RDS DB Parameter Group accordingly for convenience.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The majority of our customers (~80%) choose to enable auto-tuning mode, but based on talking with customers and our own experiences, we understand that configuring a DB Parameter Group and its permissions so OtterTune can modify it can be tricky, and issues are hard to debug.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To make this step faster and easier, you now have the option to offload the responsibility of configuring DB Parameter Groups to OtterTune. Our efforts are twofold.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One, when creating the AWS IAM Role for OtterTune in the onboarding process, you can now choose between two different permission levels. The Read-only option is the level we supported previously, which grants OtterTune the read permissions it needs for monitoring database activity. The new \", /*#__PURE__*/e(\"code\", {\n          children: \"Write:Limited\"\n        }), \" level additionally grants the write permissions OtterTune needs to clone the existing DB Parameter Group, associate it with your database or cluster, and modify its knob settings.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,HTXFAeuBC5q8kQJB5F3ExS1zXyk.png\",\n        \"data-framer-height\": \"850\",\n        \"data-framer-width\": \"1700\",\n        height: \"425\",\n        src: \"https://framerusercontent.com/images/HTXFAeuBC5q8kQJB5F3ExS1zXyk.png\",\n        style: {\n          aspectRatio: \"1700 / 850\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Two, If you grant OtterTune the Write:Limited permissions when creating the IAM Role, for any database belonging to that AWS account, in the Tuning Options tab you will now have the option to copy its DB Parameter Group and associate it with the instance. In the example below, selecting the \u201CCreate Parameter Group\u201D button will copy DB Parameter Group \", /*#__PURE__*/e(\"code\", {\n          children: \"postgres-14-pg\"\n        }), \" to a new DB Parameter Group named \", /*#__PURE__*/e(\"code\", {\n          children: \"ottertune-database-pg14\"\n        }), \", and assign it to this database instance.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,TBYVmZu0947EhpLgXwgqJAyupXY.png\",\n        \"data-framer-height\": \"850\",\n        \"data-framer-width\": \"1700\",\n        height: \"425\",\n        src: \"https://framerusercontent.com/images/TBYVmZu0947EhpLgXwgqJAyupXY.png\",\n        style: {\n          aspectRatio: \"1700 / 850\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,ufEeHIehhlyM6RXhRIaRh6SEzlg.png\",\n        \"data-framer-height\": \"500\",\n        \"data-framer-width\": \"1700\",\n        height: \"250\",\n        src: \"https://framerusercontent.com/images/ufEeHIehhlyM6RXhRIaRh6SEzlg.png\",\n        style: {\n          aspectRatio: \"1700 / 500\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Check out our documentation for more details on \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/49EvgwW7/create-iam-role\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"granting IAM Role permissions\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/xmewDj9V/tuning-options\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"creating DB Parameter Groups\"\n          })\n        }), \", and the specific \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/y9g8ZbWM/aws-permissions\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS permissions granted at each permission levels\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDC18 Support for PostgreSQL v15\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To keep up with the changing needs of our customers as they build new applications and upgrade older systems, we\u2019ve added support for PostgreSQL version 15 on Amazon RDS and Aurora.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune support for PostgreSQL version 16 on Amazon RDS and Aurora is tentatively on our roadmap for early 2024, pending its availability on Amazon Aurora (this is around the time we expect it\u2019ll be available based on the historical lag between releases of \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/release/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"open source PostgreSQL\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-release-calendar.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS\"\n          })\n        }), \", and \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Updates.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Aurora\"\n          })\n        }), \").\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDEA6 No interruptions when your database\u2019s storage size changes\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If OtterTune is optimizing a database\u2019s configuration in auto-tuning mode and the instance\u2019s hardware changes, any training data and safeguards like allowed knob ranges related to impacted resources (e.g., RAM, storage size, etc.) may no longer be valid. As such, it\u2019s important to transform this data to be compatible with the DB instance\u2019s new hardware to ensure OtterTune generates knob recommendations that are safe to apply.\\xa0\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Automatically handling DB instance hardware changes is non-trivial, and after observing how rarely such events happen with our customers, we opted for a simpler, more manual solution. Specifically, if we detect any changes to a DB instance\u2019s hardware, we disable auto-tuning (if needed) and adjust the impacted knob bounds and data accordingly. We then notify the customer of what happened, and ask them to review the updated tuning bounds before re-enabling auto-tuning on the database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Over the past few months, we\u2019ve seen an uptick in the frequency of hardware changes to our customers\u2019 databases. We did some digging and found that nearly all of the events were triggered by Amazon\u2019s storage auto-scaling features for RDS and Aurora, which have become increasingly popular among our customers. We spoke with a few customers using storage auto-scaling and learned that the way we handled hardware changes was a major pain point since they happen a lot more frequently, and having to re-enable auto-tuning each time becomes a chore.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We\u2019re excited to announce that OtterTune now automatically handles DB instance storage size changes, without any disruptions to you or your database tuning efforts. When OtterTune detects a change, it\u2019ll automatically adapt data and knob bounds for the latest storage size and then continue tuning your database.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\u2728 Carrying over requested features from OtterTune Classic\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Some of our long-time fans may already know this, but for those of you who don\u2019t \u2013 OtterTune version 1.0 (now referred to as \u201COtterTune Classic\u201D) was built with the needs of researchers and academics in mind. When we moved to OtterTune version 2.0, we shifted our focus to satisfying the daily needs of those who manage their teams\u2019 databases, whether that person is a database administrator or developer, or someone else tasked with that responsibility.\\xa0\\xa0\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When some of our users noticed that functionality was missing and reached out, we prioritized adding those feature functionalities to OtterTune v2.0.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83C\uDF9B\uFE0F Configurations\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Configurations enables you to drill down and analyze the configurations that have been applied to your database in greater detail. It makes it easy to view the raw knob values in any configuration and compare them with other configurations.\\xa0\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The list of configurations is sorted by the time it was applied by default, starting with the latest, but you can also sort by the target objective to see which configurations have achieved the highest performance so far.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,svCcM3E2EAu83MfqGx6cgcbh3IQ.gif\",\n        \"data-framer-height\": \"940\",\n        \"data-framer-width\": \"1718\",\n        height: \"470\",\n        src: \"https://framerusercontent.com/images/svCcM3E2EAu83MfqGx6cgcbh3IQ.gif\",\n        style: {\n          aspectRatio: \"1718 / 940\"\n        },\n        width: \"859\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83D\uDCC8 Performance charts\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The Performance Charts now have all the same bells and whistles provided in v1.0. You\u2019re able to create custom performance charts to analyze current and historical performance of the metrics, target objectives, and knobs among the databases in your fleet.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,orpyiqyf6hPMwmaLeX3TDaQ1To.gif\",\n        \"data-framer-height\": \"940\",\n        \"data-framer-width\": \"1718\",\n        height: \"470\",\n        src: \"https://framerusercontent.com/images/orpyiqyf6hPMwmaLeX3TDaQ1To.gif\",\n        style: {\n          aspectRatio: \"1718 / 940\"\n        },\n        width: \"859\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"On the Performance Charts, you can check the \u201CShow Configurations\u201D box to see the configurations that were applied to your database right on the chart. From here, you can click on that config to see the full details, compare it to other configurations, or even apply it to your database right away.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,d22xF8fU3soMYIRLi2utTM2VG6Y.gif\",\n        \"data-framer-height\": \"940\",\n        \"data-framer-width\": \"1718\",\n        height: \"470\",\n        src: \"https://framerusercontent.com/images/d22xF8fU3soMYIRLi2utTM2VG6Y.gif\",\n        style: {\n          aspectRatio: \"1718 / 940\"\n        },\n        width: \"859\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDEE0\uFE0F Enhancements to Query and Index Recommendations\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83D\uDC4D Query Recommendations\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Earlier this year, we released our long-awaited \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/L9P5PEWJ/query-recommendations\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Query Recommendations\"\n          })\n        }), \" feature. Since release, we\u2019ve made several impactful improvements. We\u2019ve reduced the amount of noise in our query checks by filtering out \u201Cnon-slow\u201D queries (that run in less than 1 second), tightening the query-check failure criteria, and improving the accuracy of our checks. \", /*#__PURE__*/e(\"br\", {}), /*#__PURE__*/e(\"br\", {}), \"We\u2019ve added a handful of new query checks to identify and help resolve potential issues with slow queries. Here are a few of them:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"We check for queries that have a \", /*#__PURE__*/e(\"code\", {\n              children: \"LIMIT\"\n            }), \", \", /*#__PURE__*/e(\"code\", {\n              children: \"ORDER BY\"\n            }), \" (or equivalently, min/max), and \", /*#__PURE__*/e(\"code\", {\n              children: \"WHERE\"\n            }), \" clause because it may counter-intuitively slow down queries, especially when the \", /*#__PURE__*/e(\"code\", {\n              children: \"WHERE\"\n            }), \" clause has low selectivity. We discuss the details in \", /*#__PURE__*/e(o, {\n              href: \"https://ottertune.com/blog/how-to-fix-slow-postgresql-queries\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"this blog article\"\n              })\n            }), \".\\xa0\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"We check for too many \", /*#__PURE__*/e(\"code\", {\n              children: \"OR\"\n            }), \" clauses in queries (the threshold is 10), as described in \", /*#__PURE__*/e(o, {\n              href: \"https://ottertune.com/blog/query-best-practices-when-should-you-use-the-in-instead-of-the-or-operator\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"this blog article\"\n              })\n            }), \".\\xa0\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"We check if queries have a \", /*#__PURE__*/e(\"code\", {\n              children: \"NOT IN\"\n            }), \" predicate that excludes many values (the threshold is 25).\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,UbFDsIyGyWkLH4X936rlpr48dl0.gif\",\n        \"data-framer-height\": \"940\",\n        \"data-framer-width\": \"1718\",\n        height: \"470\",\n        src: \"https://framerusercontent.com/images/UbFDsIyGyWkLH4X936rlpr48dl0.gif\",\n        style: {\n          aspectRatio: \"1718 / 940\"\n        },\n        width: \"859\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83D\uDDC4\uFE0F Index Recommendations\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve further refined our \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/wQXLyaQK/index-recommendations\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Index Recommendations\"\n          })\n        }), \" feature to more accurately identify the unused and duplicate indexes that are good candidates for removal, primarily focused on ensuring OtterTune is omitting primary keys from consideration. We also display the index type and referencing columns of indexes (when available).\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You can also see all indexes reported to OtterTune via the UI now.\\xa0\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,AJ7cQKi5CCFSjWs2VLwjspqQuY.gif\",\n        \"data-framer-height\": \"940\",\n        \"data-framer-width\": \"1718\",\n        height: \"470\",\n        src: \"https://framerusercontent.com/images/AJ7cQKi5CCFSjWs2VLwjspqQuY.gif\",\n        style: {\n          aspectRatio: \"1718 / 940\"\n        },\n        width: \"859\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\uD83D\uDC4F Onboarding enhancements for new users\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Getting the right connections and permissions to interact with databases is no joke! We\u2019ve put a lot of effort into making this process simpler and easier to troubleshoot for any issues encountered without needing to reach out to our support team (but we\u2019re always happy to chat with you and provide support via Slack, email, chat or a video support call if needed).\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83D\uDEAB Error handling\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If users encounter errors during the IAM role or agent-connection process, we don\u2019t simply flash a generic error message \u2013 we make the error message tangible, i.e., the user can act off it and should be able to quickly resolve the issue like in this example:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,GmLl1DfcQGLCp6EsZKxloP4AhQQ.png\",\n        \"data-framer-height\": \"500\",\n        \"data-framer-width\": \"1700\",\n        height: \"250\",\n        src: \"https://framerusercontent.com/images/GmLl1DfcQGLCp6EsZKxloP4AhQQ.png\",\n        style: {\n          aspectRatio: \"1700 / 500\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83C\uDFA6 Videos, videos and more videos\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We get it: some people like written documentation while others like instructional videos. We continue to update and improve \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/categories\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"our documentation\"\n          })\n        }), \", but for those that are more visual learners, we\u2019ve also made instructional videos for the main steps you need to complete to set up OtterTune.\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          \"--aspect-ratio\": \"560 / 315\",\n          aspectRatio: \"var(--aspect-ratio)\",\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",\n          children: t => /*#__PURE__*/e(h, {\n            ...t,\n            play: \"Off\",\n            shouldMute: !0,\n            thumbnail: \"Medium Quality\",\n            url: \"https://youtu.be/jMLk6Y0TH4I\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Additional videos we've created can be found below, and you can always access \", /*#__PURE__*/e(o, {\n          href: \"https://www.youtube.com/playlist?list=PLU5mx6trrIjk-h9UKoHQh2vbdvzZWCf55\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"this playlist on YouTube\"\n          })\n        }), \" for all our tutorial videos.\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://youtu.be/SJDpC-y4KsI\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How to set up an IAM role\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://youtu.be/rUwOs3Dg6Ts\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How to connect the OtterTune agent to your database\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://youtu.be/wVY1fgG22uo\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How to enable a database in OtterTune\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://youtu.be/NhZ8pojJn88\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How to add additional AWS accounts\"\n              })\n            })\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83E\uDE9C Progress stepper\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Four steps are required to get up and running with OtterTune: add an IAM role, enable a database, add our agent and apply knob recommendations. OtterTune now features a progress stepper that\u2019s pinned to the right side of the screen to let users know if they still need to complete a step and it links to relevant documentation about that step.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\uD83E\uDDA6 Agent status and troubleshooting tips\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\u2019s agent is critical \u2013 it\u2019s what listens and talks to your databases and helps inform our AI. Sometimes the agent can get disconnected and to help users more easily debug what is going on, we now provide an Agent Status section that reports on the health of the agent and offers an error log and suggestions to fix it if the connection is incomplete.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,I1VRc4LuLd5U6RXMxgazCr0sBpc.png\",\n        \"data-framer-height\": \"850\",\n        \"data-framer-width\": \"1700\",\n        height: \"425\",\n        src: \"https://framerusercontent.com/images/I1VRc4LuLd5U6RXMxgazCr0sBpc.png\",\n        style: {\n          aspectRatio: \"1700 / 850\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"\u23F2\uFE0F Best configuration timeline and tracking\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\u2019s AI needs to apply eight sets of knob configurations before it can get to the best configuration that improves your target objective over baseline, or where you started. The quicker users get to their initial best configuration, the faster our AI can be trained to improve database performance.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To help make that clearer and give it a visual treatment, we\u2019ve added an pie chart visualization that helps users track their progress:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,5JBk5FpQTU7UXUsTnymZnOxtcc.png\",\n        \"data-framer-height\": \"500\",\n        \"data-framer-width\": \"1700\",\n        height: \"250\",\n        src: \"https://framerusercontent.com/images/5JBk5FpQTU7UXUsTnymZnOxtcc.png\",\n        style: {\n          aspectRatio: \"1700 / 500\"\n        },\n        width: \"850\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The team has been primarily focused on elevating the OtterTune application experience this year. We\u2019ve been tweaking and improving feature functionality, user-experience flows, error handling, and UI components for a smoother, easier-to-use OtterTune.\\xa0\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019d love your feedback on improvements and new features! Please \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/contact\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"get in touch\"\n          })\n        }), \" with us or \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.canny.io/feature-requests\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"submit a feature request\"\n          })\n        }), \".\"]\n      })]\n    })\n  }, {\n    id: \"dy7TCtXFH\",\n    [c]: \"Query best practices: When should you use the IN instead of the OR operator?\",\n    [d]: \"query-best-practices-when-should-you-use-the-in-instead-of-the-or-operator\",\n    [u]: \"2023-08-30T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/JGY5Lr0YtPyBC3WtjOv85uJOQ.png\",\n      srcSet: \"https://framerusercontent.com/images/JGY5Lr0YtPyBC3WtjOv85uJOQ.png?scale-down-to=512 512w, https://framerusercontent.com/images/JGY5Lr0YtPyBC3WtjOv85uJOQ.png 1024w\"\n    }, \"dj ot in or query operator\"),\n    [m]: \"Query performance often varies depending on how you write queries. For PostgreSQL, what provides better performance? The IN or OR operator? \",\n    [g]: \"Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"The original idea of a declarative query language like SQL is that you ask a database management system (DBMS) to give you the answer you want it to and not how to compute it. It is up to the DBMS's query optimizer (aka planner, compiler) to determine the most efficient execution plan for a SQL query. Ideally, the DBMS should choose the same optimal plan if you ask the same question using different SQL commands.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But this is not always the case, especially in beloved open-source DBMSs like PostgreSQL. Query performance often varies depending on how you write queries. We have seen some OtterTune customers where a simple change of SQL leads to a remarkable \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"how-to-fix-slow-postgresql-queries\"\n            },\n            webPageId: \"bjtIur_Vg\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"10,000x speedup\"\n          })\n        }), \".\\xa0\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To better understand this problem, in this article, we focus on queries utilizing the IN and OR operators to compute a disjunction in their WHERE clauses. Below are two example queries, both yielding identical results, yet their performance differs wildly:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE id IN (1, 2, 3)  --- IN operator \\nSELECT * FROM item WHERE id = 1 OR id = 2 OR id = 3   --- OR operator \",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We will analyze the performance results obtained from our experiments in PostgreSQL, comparing IN operator and OR operator queries under various scenarios. By exploring the reasons behind these performance differences, our goal is to recommend best practices for writing efficient queries.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Experiment setup\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We use the following example table containing item information. Each row in the table includes the item name, price, quantity, and a unique ID serving as the primary key. We also create a composite index on (name, quantity).\\xa0\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here is the DDL commands to create this table and the INSERT statement to populate it with 10m tuples of random data:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"CREATE TABLE item (\\n\tid INT PRIMARY KEY,\\n\tname VARCHAR(32),\\n\tprice INT,\\n\tquantity INT\\n);\\nCREATE INDEX idx_item_name_quantity ON item (name, quantity);\\n\\nINSERT INTO item\\nSELECT id,\\n    SUBSTR(MD5(RANDOM()::text), 0, 32) AS name,\\n    (RANDOM() * 10000)::int AS price,\\n    (RANDOM() * 10000)::int AS quantity\\nFROM generate_series(1, 10000000) AS t(id);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We used a PostgreSQL v14 database on a db.t3.medium Amazon RDS instance equipped with 2 CPUs and 4GB RAM. The storage capacity is 200GB (gp2 storage). All experiments are conducted with PostgreSQL\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/jit-reason.html\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Just-in-Time Compilation (JIT)\"\n          })\n        }), \" feature enabled to compile predicates into machine code using LLVM. We conduct three consecutive runs for each query and report the average latency.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We use OtterTune\u2019s AI-powered service to optimize PostgreSQL\u2019s configuration knobs (e.g., AWS\u2019s ParameterGroup). We also pre-load the entire table into memory using \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/pgprewarm.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_prewarm\"\n          })\n        }), \":\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"CREATE EXTENSION pg_prewarm; \\nSELECT pg_prewarm('item');\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Single attribute filters\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We first examine queries that reference a single attribute in their WHERE clause. These represent the majority of the queries that we see in OtterTune\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/L9P5PEWJ/query-recommendations\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"automated query tuning\"\n          })\n        }), \" feature.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Single indexed attribute\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We measure PostgreSQL\u2019s performance on queries that retrieve multiple item records on an indexed attribute. We first use a single IN operator in the query\u2019s WHERE clause and then run the same lookups using multiple OR clauses. We run multiple variations of each query with an increasing number of id lookups.\\xa0\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE id IN (?); \u2013-  IN Clause\\nSELECT * FROM item WHERE id = ? OR id = ? OR ... ; -- OR Clauses\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The chart below shows the performance results. When the number of predicates in the filter condition is small, the performance difference between the IN clause and OR clauses is negligible. However, as the number of predicates per query increases, PostgreSQL executes the IN clause query much faster than the query with the OR clauses. Again, both queries are computing the same answer on the same table so the run times should be the same. But the performance gap between the two queries expands with a larger number of predicates.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"in vs or single indexed attribute chart\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,edLO5DComUoNjTci1C1cZ2ubjE.png?originalFilename=ottertune-in-vs-or-singleindexed.png\",\n        \"data-framer-height\": \"918\",\n        \"data-framer-width\": \"1908\",\n        height: \"459\",\n        src: \"https://framerusercontent.com/images/edLO5DComUoNjTci1C1cZ2ubjE.png\",\n        style: {\n          aspectRatio: \"1908 / 918\"\n        },\n        width: \"954\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"At 5000 predicates, the IN clause query is approximately 69x faster than the OR clause (7.56ms vs. 521.19ms). To understand why this is the case, we examine the query plans for both the IN clause and OR clause using PostgreSQL\u2019s EXPLAIN feature. For brevity, we consider the queries when using only three predicates:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"ottertune=> EXPLAIN SELECT * FROM item WHERE id IN (1,2,3);\\n                                  QUERY PLAN                                                    \\n-----------------------------------------------------------------------------------\\n Index Scan using item_pkey on item  (cost=0.43..17.36 rows=3 width=44)\\n   Index Cond: (id = ANY ('{1,2,3}'::integer[]))\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"ottertune=> EXPLAIN SELECT * FROM item WHERE id = 1 OR id = 2 OR id = 3;\\n                                    QUERY PLAN                                                       \\n-----------------------------------------------------------------------------------\\n Bitmap Heap Scan on item  (cost=12.90..24.52 rows=3 width=70)\\n   Recheck Cond: ((id = 1) OR (id = 2) OR (id = 3))\\n   Heap Blocks: exact=1\\n   ->  BitmapOr  (cost=12.90..12.90 rows=3 width=0)\\n         ->  Bitmap Index Scan on item_pkey  (cost=0.00..4.30 rows=1 width=0)\\n               Index Cond: (id = 1)\\n         ->  Bitmap Index Scan on item_pkey  (cost=0.00..4.30 rows=1 width=0)\\n               Index Cond: (id = 2)\\n         ->  Bitmap Index Scan on item_pkey  (cost=0.00..4.30 rows=1 width=0) \\n               Index Cond: (id = 3)\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The IN clause query uses PostgreSQL\u2019s Index Scan access method to retrieve data via an index. The DBMS scans the primary key index (item_pkey) to find which rows satisfy the query condition (i.e., id is any value in {1,2,3}) and then retrieves the matching rows from the table.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OR clause query utilizes PostgreSQL\u2019s Bitmap Index Scan access method to scan the index and construct a bitmap to track matching rows. Each entry in the bitmap represents a row position in the table and indicates whether that row satisfies the query conditions as the DBMS scans the table\u2019s primary key index (item_pkey). \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"After populating the bitmap, the DBMS retrieves the table pages containing matching records. The DBMS creates three bitmaps for each predicate in the disjunction clause. That is, PostgreSQL creates a bitmap to track (id = 1), another bitmap for (id = 2), and a third one for (id = 3). It then performs three index scans to populate each bitmap. But maintaining separate bitmaps is unnecessary because id is the primary key, which means that each predicate will match one and only one tuple. PostgreSQL then combines these bitmaps using a bitwise OR operation.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The number of bitmaps that PostgreSQL uses for these OR clause queries increases proportionally with the number of predicates in the WHERE clause. For example, when there are 5000 OR operations, the DBMS creates 5000 bitmaps, which causes a considerable slowdown compared to the IN clause that only requires one index scan. As the number of conditions increases, the DBMS OR clause incurs larger overhead in bitmap creation and combination, resulting in a notable performance gap compared to the IN clause.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"IN vs. OR: single unindexed attribute\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We next examined queries that filtered based on a single unindexed attribute (price). We again do the same comparison where we generate two variations of the same query: one using a single IN clause and one using multiple OR clauses with equality predicates. We then scale up the number of comparisons per query.\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE price IN (?); \u2013-  IN Clause\\nSELECT * FROM item WHERE price = ? OR price = ? OR price = ? OR ... ; -- OR Clauses\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As illustrated below, once again the IN clause queries outperforms the multiple OR clauses variants. The difference is much larger than the queries on the indexed attribute above and the gap widens even more with an increase in the number of predicates. With 5000 predicates, PostgreSQL executes the IN clause query approximately 288x faster than the OR clause (1.8 seconds vs. 518.2 seconds).\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"in vs or single unindexed attribute chart\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,KDwVT2mQqiJMVI2YCPxJ9DbT0M.png?originalFilename=ottertune-in-vs-or-singleunindexed.png\",\n        \"data-framer-height\": \"918\",\n        \"data-framer-width\": \"1908\",\n        height: \"459\",\n        src: \"https://framerusercontent.com/images/KDwVT2mQqiJMVI2YCPxJ9DbT0M.png\",\n        style: {\n          aspectRatio: \"1908 / 918\"\n        },\n        width: \"954\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Let's also compare two query plans to observe their differences:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"ottertune=> EXPLAIN SELECT * FROM item WHERE price IN (1,2,3);\\n                                    QUERY PLAN                                              \\n-----------------------------------------------------------------------------------\\n Gather  (cost=1000.00..152048.39 rows=2988 width=44)\\n   Workers Planned: 2\\n   ->  Parallel Seq Scan on item  (cost=0.00..150749.59 rows=1245 width=44)\\n         Filter: (price = ANY ('{1,2,3}'::integer[]))\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"ottertune=> EXPLAIN SELECT * FROM item WHERE price = 1 OR price = 2 OR price = 3;\\n                                     QUERY PLAN                                              \\n-----------------------------------------------------------------------------------\\n Gather  (cost=1000.00..167673.27 rows=2987 width=44)\\n   Workers Planned: 2\\n   ->  Parallel Seq Scan on item  (cost=0.00..166374.57 rows=1245 width=44)\\n         Filter: ((price = 1) OR (price = 2) OR (price = 3))\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Unlike in the previous experiment where the two query plans are different (Index Scan vs. Bitmap Index Scan), this time the plans are the same. As shown above, both queries execute Sequential Scans that read every page in the table and evaluate whether the price satisfies the filtering conditions on a row-by-row basis. However, the manner in which PostgreSQL performs the value comparison for filtering differs between the two plans, which explains the large performance advantage of IN versus OR.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For the OR clause query, the DBMS sequentially compares each condition's value one by one. In the given example, it performs three comparisons for each row to determine if (price = 1), (price = 2), and then (price = 3). This evaluation approach means that for N predicates, the complexity of the filtering operation per row is O(N).\\xa0\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"On the other hand, with the IN clause, PostgreSQL builds a temporary hash table populated with the elements in the query\u2019s IN clause (\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/postgres/postgres/blob/81ccbe520f42a9873734c614e4eb521190d8f8e4/src/backend/executor/execExprInterp.c#L3548C1-L3548C28\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ExecEvalHashedScalarArrayOp\"\n          })\n        }), \"). Then as the DBMS scans each tuple, it probes this hash table to see whether the tuple's attribute matches with any entry. This hash-based evaluation has a more efficient complexity of O(1) since the DBMS only needs to perform one lookup in the hash table per tuple.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Hence, as the number of predicates increases in a query, the OR clause incurs significant overhead because the DBMS evaluates predicates for each row individually, in contrast to the more efficient IN clause.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Multiple attribute filters\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We also ran tests using queries that filter records on using equality predicates on two attributes. We first evaluate the scenarios when both attributes are either indexed or unindexed. We then examined queries where there is an index for only one of the attributes.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The spoiler for this part is that PostgreSQL generates the same plan for the IN query as it does for the OR query in each scenario. This means that their performance is the same. Thus, it does not matter whether you use the IN clause or the OR clause when querying on multiple attributes since they both generate the same query plan.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Two indexed attributes\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The queries to filter the table on two attributes (name, quantity) using the the composite index (idx_item_name_quantity) are as follows:\\xa0\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE (name, quantity) IN (('a', 1), ('b', 2));\\nSELECT * FROM item WHERE (name='a' AND quantity=1) OR (name='b' AND quantity=2);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The query plan is as follows:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"Bitmap Heap Scan on item  (cost=9.14..13.16 rows=1 width=44)\\n   Recheck Cond: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2)))\\n   ->  BitmapOr  (cost=9.14..9.14 rows=1 width=0)\\n         ->  Bitmap Index Scan on idx_item_name_quantity  (cost=0.00..4.57 rows=1 width=0)\\n               Index Cond: (((name)::text = 'a'::text) AND (quantity = 1))\\n         ->  Bitmap Index Scan on idx_item_name_quantity  (cost=0.00..4.57 rows=1 width=0)\\n               Index Cond: (((name)::text = 'b'::text) AND (quantity = 2))\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"in vs or two indexed attributes chart\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,OhCfBk9uLQQna9Pb5qFnqgt3K0Y.png?originalFilename=ottertune-in-vs-or-twoindexed.png\",\n        \"data-framer-height\": \"918\",\n        \"data-framer-width\": \"1908\",\n        height: \"459\",\n        src: \"https://framerusercontent.com/images/OhCfBk9uLQQna9Pb5qFnqgt3K0Y.png\",\n        style: {\n          aspectRatio: \"1908 / 918\"\n        },\n        width: \"954\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These results show that the execution time is about the same for both queries. In both scenarios, PostgreSQL executes a separate Bitmap Index Scan per predicate in the WHERE clause as it did with the OR clause query with a single indexed attribute. That is, the DBMS does not apply any optimizations for the IN clause query.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Two unindexed attributes\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We next consider queries that filter on two unindexed attributes (price, quantity):\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE (price, quantity) IN ((1, 1), (2, 2));\\nSELECT * FROM item WHERE (price=1 AND quantity=1) OR (price=2 AND quantity=2);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Once again we see that PostgreSQL generates the same plans for both queries:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"Gather  (cost=1000.00..177791.33 rows=1 width=44)\\n   Workers Planned: 2\\n   ->  Parallel Seq Scan on item  (cost=0.00..176791.23 rows=1 width=44)\\n         Filter: (((price = 1) AND (quantity = 1)) OR ((price = 2) AND (quantity = 2)))\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"in vs or two unindexed attributes chart\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,liBbKnwQPdV9tvGuUWVNu8zfcOk.png?originalFilename=ottertune-in-vs-or-twounindexed.png\",\n        \"data-framer-height\": \"918\",\n        \"data-framer-width\": \"1908\",\n        height: \"459\",\n        src: \"https://framerusercontent.com/images/liBbKnwQPdV9tvGuUWVNu8zfcOk.png\",\n        style: {\n          aspectRatio: \"1908 / 918\"\n        },\n        width: \"954\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The above results show that the performance of the two queries are again essentially the same. This is because PostgreSQL does not build a temporary hash table to speed up IN clause evaluation when there is more than one attribute. PostgreSQL notably also does not support \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/hash-intro.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"multi-attribute hash indexes\"\n          })\n        }), \" either (see this \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/message-id/flat/350E317B.B6C728AE%40sid.trust.ee\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"psql-hackers email thread\"\n          })\n        }), \" discussing this limitation way back in 1998!).\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"One indexed + one unindexed\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Lastly, we test queries where there is only an index for one of the attributes (id) and one unindexed attribute (price):\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT * FROM item WHERE (id, price) IN ((1, 1), (2, 2));\\nSELECT * FROM item WHERE (id=1 AND price=1) OR (id=2 AND price=2);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And like the other tests, PostgreSQL chooses the same plan for both queries:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \" Bitmap Heap Scan on item  (cost=8.89..16.90 rows=1 width=36)\\n   Recheck Cond: ((id = 1) OR (id = 2))\\n   Filter: (((id = 1) AND (price = 1)) OR ((id = 2) AND (price = 2)))\\n   ->  BitmapOr  (cost=8.89..8.89 rows=2 width=0)\\n         -> Bitmap Index Scan on item_pkey (cost=0.00..4.44 rows=1 width=0)\\n               Index Cond: (id = 1)\\n         -> Bitmap Index Scan on item_pkey (cost=0.00..4.44 rows=1 width=0)\\n               Index Cond: (id = 2)\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"in vs or one index one unindexed chart\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,zcHUuhaK8R0Td2CqqBppYGoa6gs.png?originalFilename=ottertune-in-vs-or-mixed.png\",\n        \"data-framer-height\": \"918\",\n        \"data-framer-width\": \"1908\",\n        height: \"459\",\n        src: \"https://framerusercontent.com/images/zcHUuhaK8R0Td2CqqBppYGoa6gs.png\",\n        style: {\n          aspectRatio: \"1908 / 918\"\n        },\n        width: \"954\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And again we see that the queries execution times are unsurprisingly the same.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Best practices\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Based on our results, we find that PostgreSQL consistently exhibits equivalent or better performance for queries with an IN clause than OR clauses when filtering on a single attribute. This is especially true for queries with a large number of predicates. For small condition sizes (e.g., less than 10), the performance difference between the two query types is negligible.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When filtering on multiple attributes, both the IN and OR clauses have the same performance because PostgreSQL chooses the same plan for both queries.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Thus, we advise that you should always use IN clauses with PostgreSQL, making it a preferred choice for better efficiency.\"\n      })]\n    })\n  }, {\n    id: \"Kq7EM_WV9\",\n    [c]: \"Yes, PostgreSQL has problems, but we\u2019re sticking with it!\",\n    [d]: \"yes-postgresql-has-problems-but-we-re-sticking-with-it\",\n    [u]: \"2023-06-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/6hunJbfZCIqJLQEpH7Cd3lD1Q.jpeg\",\n      srcSet: \"https://framerusercontent.com/images/6hunJbfZCIqJLQEpH7Cd3lD1Q.jpeg?scale-down-to=512 512w, https://framerusercontent.com/images/6hunJbfZCIqJLQEpH7Cd3lD1Q.jpeg?scale-down-to=1024 1024w, https://framerusercontent.com/images/6hunJbfZCIqJLQEpH7Cd3lD1Q.jpeg 2048w\"\n    }, \"dj ot handshake with postgres elephant\"),\n    [m]: \"While we dislike PostgreSQL's multi-version concurrency control (MVCC), there are ways to address version copying, table bloat, index maintenance and vacuum management. \",\n    [g]: \"Bohan Zhang | Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Our previous blog article, \u201C\", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"the-part-of-postgresql-we-hate-the-most\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"The Part of PostgreSQL We Hate the Most\"\n          })\n        }), \",\u201D discussed the problems caused by everyone\u2019s favorite street-strength DBMS multi-version concurrency control (MVCC) implementation. These include version copying, table bloat, index maintenance, and vacuum management. This article will explore ways to optimize PostgreSQL for each problem.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Although PostgreSQL\u2019s MVCC implementation is the worst among other widely used databases like Oracle and MySQL, it remains our favorite DBMS, and we still love it! By sharing our insights, we hope to help users unlock the full potential of this powerful database system. The good news is that OtterTune automatically fixes a lot of these problems for you (but not all!).\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Problem #1: Version copying\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When a query modifies a tuple, regardless of whether it updates one or all of its columns, PostgreSQL creates a new version by copying all of its columns. This copying can result in significant data duplication and increased storage demands, particularly for tables with many columns and large row sizes.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Optimization:\"\n        }), \" Unfortunately, there are no workarounds to address this issue without a significant rewrite of PostgreSQL\u2019s internals that would be disruptive. It\u2019s not like replacing a \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/_NrsaTwx3OA?t=110\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"character on a sitcom that nobody notices\"\n          })\n        }), \". As mentioned in our previous article, EnterpriseDB started down this path with the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://wiki.postgresql.org/wiki/Zheap\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"zheap\"\n          })\n        }), \"\\xa0project in 2013, but the project\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.cybertec-postgresql.com/en/postgresql-zheap-current-status/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last update\"\n          })\n        }), \"\\xa0was in 2021.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Others have made hard forks of the PostgreSQL code to replace its MVCC implementation. Notable examples include\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/orioledb/orioledb\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OrioleDB\"\n          })\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.to/yugabyte/what-ottertune-hates-the-most-in-postgresql-is-solved-in-yugabytedb-1l1o\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"YugabyteDB\"\n          })\n        }), \". But the changes to these systems will never get merged back into the main PostgreSQL codebase. So we\u2019re stuck with PostgreSQL\u2019s append-only MVCC for the time being.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Problem #2: Table bloat\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"PostgreSQL stores expired versions (dead tuples) and live tuples on the same pages. Although PostgreSQL\u2019s autovacuum worker eventually removes these dead tuples, write-heavy workloads can cause them to accumulate faster than the vacuum can keep up. Additionally, the autovacuum only removes dead tuples for reuse (e.g., to store new versions) and does not reclaim unused storage space. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"During query execution, PostgreSQL loads dead tuples into memory (since the DBMS intermixes them on pages with live tuples), increasing disk IO and hurting performance because the DBMS retrieves useless data. If you are running Amazon\u2019s PostgreSQL Aurora, this will increase the DBMS\u2019s IOPS and cause you to \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"dont-overpay-amazon-web-service-for-db\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"give more money to Jeff Bezos!\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Optimization:\"\n        }), \" We recommend monitoring PostgreSQL\u2019s table bloat and then periodically reclaiming unused space. The \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/pgstattuple.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pgstattuple\"\n          })\n        }), \" built-in module accurately calculates the free space in a database but it requires full table scans, which is not practical for large tables in production environments.\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: '$ psql -c \"CREATE EXTENSION pgstattuple\" -d $DB_NAME\\n$ psql -c \"SELECT * FROM pgstattuple(\\'$TABLE_NAME\\')\" -d $DB_NAME',\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Alternatively, one can estimate tables\u2019 unused space using one-off \", /*#__PURE__*/e(o, {\n          href: \"https://wiki.postgresql.org/wiki/Show_database_bloat\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"queries or scripts\"\n          })\n        }), \"; these are much faster and more lightweight than \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/pgstattuple.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pgstattuple\"\n          })\n        }), \" because they provide a rough estimation of table bloat. If the amount of unused space is substantial, the \", /*#__PURE__*/e(o, {\n          href: \"https://reorg.github.io/pg_repack/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_repack\"\n          })\n        }), \" extension removes and reclaims pages from bloated tables and indexes. It works online without requiring an exclusive lock on tables during processing (unlike \", /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://www.postgresql.org/docs/current/sql-vacuum.html\",\n            openInNewTab: !0,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"VACUUM FULL\"\n            })\n          })\n        }), \").\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The following commands will install the pg_repack extension into a self-managed DBMS (see Amazon\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/database/remove-bloat-from-amazon-aurora-and-rds-for-postgresql-with-pg_repack/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"instructions for PostgreSQL RDS\"\n          })\n        }), \") and then compact a single table.\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: '$ psql -c \"CREATE EXTENSION pg_repack\" -d $DB_NAME\\n$ pg_repack -d $DB_NAME --table $TABLE_NAME',\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To minimize the potential impact on database performance, OtterTune recommends that our customers initiate this process during off-peak hours when traffic is low.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Problem #3: Secondary index maintenance\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When an application executes an \", /*#__PURE__*/e(\"code\", {\n          children: \"UPDATE\"\n        }), \" query on a table, PostgreSQL must also update all the indexes for that table to add entries to the new version. These index updates increase the DBMS\u2019s memory pressure and disk I/O, especially for tables with numerous indexes (one OtterTune customer has \", /*#__PURE__*/e(\"strong\", {\n          children: \"90\"\n        }), \" indexes on a single table!). \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As the number of indexes in a table increases, the overhead incurred when updating a tuple increases. PostgreSQL avoids updating indexes for \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/storage-hot.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Heap-Only Tuples\"\n          })\n        }), \" (HOT) updates, where the DBMS stores the new version on the same page as the previous version. But as we mentioned in our last article, OtterTune customers\u2019 PostgreSQL databases only use the HOT optimization for 46% of update operations.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Optimization:\"\n        }), \"\\xa0The obvious fix to reduce PostgreSQL\u2019s index write amplification is to reduce the number of indexes per table. But this is easier said than done. We recommend starting with\\xa0\", /*#__PURE__*/e(\"em\", {\n          children: \"duplicate\"\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(\"em\", {\n          children: \"unused\"\n        }), \"\\xa0indexes in tables. One can identify duplicate indexes by examining a database\u2019s schema to see if two indexes reference the same columns in the same order and use the same data structure (e.g., B+tree vs. hash table). \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For unused indexes, PostgreSQL maintains index-level metrics (e.g.,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-INDEXES-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_all_indexes.idx_scan\"\n          })\n        }), \") that track the number of index scans initiated on the index. If this value is zero for an index, then none of the applications\u2019 queries use that index. Make sure that you ignore unused primary key or unique indexes, as the DBMS is using those to enforce integrity constraints on your tables.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The screenshot below shows OtterTune\u2019s similar checks for automatically finding unnecessary indexes.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune identifies unused and duplicate indexes\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,p55srE9DJ4lDVU3HugJGxBlSrI.png\",\n        \"data-framer-height\": \"1547\",\n        \"data-framer-width\": \"3647\",\n        height: \"773\",\n        src: \"https://framerusercontent.com/images/p55srE9DJ4lDVU3HugJGxBlSrI.png\",\n        style: {\n          aspectRatio: \"3647 / 1547\"\n        },\n        width: \"1823\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Once you identify indexes to drop, the next step is to remove them. However, if your application uses an \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Object-Relational Mapping\"\n          })\n        }), \" (ORM) framework to manage its database schema, then you do not want to drop indexes manually because the ORM may recreate the indexes during future schema migrations. In such cases, it is necessary to update the schema in the application code. If the application is not using an ORM, then you can use the \", /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://www.postgresql.org/docs/current/sql-dropindex.html\",\n            openInNewTab: !0,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"DROP INDEX\"\n            })\n          })\n        }), \"\\xa0command.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Problem #4: Vacuum Management\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"PostgreSQL\u2019s performance heavily depends on the effectiveness of its autovacuum to clean up obsolete data and prune version chains in its MVCC scheme. However, configuring the autovacuum to operate correctly and remove this data in a timely manner is challenging due to its complexity. The default global autovacuum settings are inappropriate for large tables (millions to billions of tuples), as it may take too long before triggering vacuums. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Additionally, if each autovacuum invocation takes too long to complete or gets blocked by long-running transactions, the DBMS will accumulate dead tuples and suffer from stale statistics. Delaying the autovacuum for too long results in queries getting gradually slower over time, requiring manual intervention to address the problem.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Optimization:\"\n        }), \" Although having to vacuum tables in PostgreSQL is a pain, the good news is that it is manageable. But as we now discuss, there are a lot of steps to this and a lot of information you need to track.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The first step towards taming the autovacuum is to monitor the number of dead tuples for each table. PostgreSQL\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_all_tables\"\n          })\n        }), \" view provides essential metrics for monitoring tables, including estimates for the number of dead tuples (n_dead_tup) and live tuples (n_live_tup). With such table-level metrics, you can determine the percentage of expired tuples per table and identify which tables need extra \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/yBp6TbH3lmw\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"vacuum love\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For tables with a significant number of dead tuples, you can adjust their settings to enable PostgreSQL to trigger the autovacuum more frequently. PostgreSQL allows you to fine-tune the autovacuum parameters at the table level, and different tables may require different optimal settings. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The most important knob is \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-SCALE-FACTOR\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"autovacuum_vacuum_scale_factor\"\n          })\n        }), \": it specifies the minimal percentage of dead tuples in a table that must exist before PostgreSQL invokes the autovacuum on it. The default value for this knob is 20%. If one of your application\u2019s tables has 1 billion tuples, PostgreSQL does not run the vacuum on that table until there are at least 200 million dead tuples. If the average tuple size in that table is 1KB, then 200 million dead tuples will consume 200GB of disk storage. And this does not even include additional storage overhead for index pointers to these tables! \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To avoid this problem, you should set the scale factor knob for large tables to something smaller than 20% using the \", /*#__PURE__*/e(\"code\", {\n          children: \"ALTER TABLE\"\n        }), \" SQL command:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \" ALTER TABLE table_name SET (autovacuum_ vacuum_scale_factor = 0.05);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Next, you should check whether the autovacuum is getting blocked by long-running transactions. Once again, we can rely on PostgreSQL\u2019s internal telemetry to get this information. The \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_activity\"\n          })\n        }), \"\\xa0view provides real-time data on the current execution status of each PostgreSQL worker (i.e., process). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"It shows how long each active transaction has been running. If a transaction has been running for several hours, you should consider killing it off so that the autovacuum can complete its operations. The example query below finds all the transactions that have been running for more than five minutes:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT pid, NOW() - xact_start AS duration, query, state\\n  FROM pg_stat_activity\\n WHERE (NOW() - xact_start) > INTERVAL '5 minutes';\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You can then kill the query using the \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_cancel_backend\"\n          })\n        }), \"\\xa0admin function:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT pg_cancel_backend($PID_TO_KILL);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Of course, there are possible unintended consequences from knocking out a query on the streets, so you must ensure that killing them will not cause problems in your application. To avoid the same problem in the future, make sure that the transaction\u2019s queries are unnecessarily running longer because they are using inefficient query plans. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Refer to our previous articles on optimizing query performance, such as \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/blog/how-to-fix-slow-postgresql-queries/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"tricking out \"\n          })\n        }), /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://ottertune.com/blog/how-to-fix-slow-postgresql-queries/\",\n            openInNewTab: !0,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"ORDER BY...LIMIT\"\n            })\n          })\n        }), \"\\xa0and \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/blog/run-postgresql-analyze-to-fix-a-slowdow-in-db/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"running \"\n          })\n        }), /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://ottertune.com/blog/run-postgresql-analyze-to-fix-a-slowdow-in-db/\",\n            openInNewTab: !0,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"ANALYZE\"\n            })\n          })\n        }), \", to learn how to improve slow queries with OtterTune. You can also refactor your application to break up large transactions into smaller work units if you do not need them to be atomic (but admittedly, this is not always easy to do).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Lastly, you need to see whether there are long-running vacuum processes and then tune additional knobs. Similar to how\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_activity\"\n          })\n        }), \"\\xa0shows you the status of PostgreSQL\u2019s workers, the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/progress-reporting.html#VACUUM-PROGRESS-REPORTING\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_progress_vacuum\"\n          })\n        }), \"\\xa0view shows you the status of active autovacuum operations. With this view, you can determine whether a vacuum takes several hours or even days to finish. If your PostgreSQL DBMS does have long-running vacuums, then OtterTune recommends tuning three knobs:\"]\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"The\\xa0\", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-AUTOVACUUM-WORK-MEM\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"autovacuum_work_mem\"\n              })\n            }), \"\\xa0parameter specifies the maximum amount of memory the DBMS can use in each autovacuum invocation. Increasing this parameter can speed up the vacuum because it can prune more dead tuples per invocation.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"The\\xa0\", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-COST-LIMIT\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"autovacuum_vacuum_cost_limit\"\n              })\n            }), \"\\xa0parameter controls how much I/O active autovacuum workers can incur before PostgreSQL forces them to back off for a while. A higher value for this knob means the autovacuum will be more aggressive.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Related to this cost-based control mechanism, the\\xa0\", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/15/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-COST-DELAY\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"autovacuum_vacuum_cost_delay\"\n              })\n            }), \"\\xa0parameter determines how long an autovacuum worker must wait after the DBMS forces it to back off. A shorter delay means the autovacuum will return to action more quickly each time.\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"This is hard. OtterTune can help.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We have barely scratched the surface of how to prevent PostgreSQL\u2019s outdated MVCC implementation from ruining your day. There are many other factors and configurable options in the DBMS. We have only highlighted the ones that are the most important.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you feel like this a lot to manage yourself, you are not alone. Many of our customers tell us that they know they should be doing \", /*#__PURE__*/e(\"em\", {\n          children: \"something\"\n        }), \" in PostgreSQL to improve its performance and reduce their cloud costs but do not know where to start. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Fortunately, OtterTune is here to help! Our automated service for Amazon RDS uses artificial intelligence to learn the behavior of your DBMS and generate optimal configurations. You can get \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"egEhCCRg_\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"started today\"\n          })\n        }), \" without having to make changes to your application. You can also reach out to our database experts on our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"our Slack channel\"\n          })\n        }), \" if you have any questions about optimizing PostgreSQL or MySQL.\"]\n      })]\n    })\n  }, {\n    id: \"Yrjpj56Zb\",\n    [c]: \"The part of PostgreSQL we hate the most\",\n    [d]: \"the-part-of-postgresql-we-hate-the-most\",\n    [u]: \"2023-04-26T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/S8QBXrgWXkZ30oDW2VlnDk9i4o.jpeg\",\n      srcSet: \"https://framerusercontent.com/images/S8QBXrgWXkZ30oDW2VlnDk9i4o.jpeg?scale-down-to=512 512w, https://framerusercontent.com/images/S8QBXrgWXkZ30oDW2VlnDk9i4o.jpeg?scale-down-to=1024 1024w, https://framerusercontent.com/images/S8QBXrgWXkZ30oDW2VlnDk9i4o.jpeg 2048w\"\n    }, \"dj ot does not like postgresql autovacuum\"),\n    [m]: \"As much as we love PostgreSQL at OtterTune, its multi-version concurrency control (MVCC) is a big pain. We go over why.\",\n    [g]: \"Bohan Zhang | Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"There are a lot of choices in databases (\", /*#__PURE__*/e(o, {\n          href: \"https://dbdb.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"897\"\n          })\n        }), \" as of April 2023). With so many systems, it\u2019s hard to know what to pick! But there is an interesting phenomenon where the Internet collectively decides on the default choice for new applications. In the 2000s, the conventional wisdom selected MySQL because rising tech stars like Google and Facebook were using it. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Then in the 2010s, it was MongoDB because \", /*#__PURE__*/e(o, {\n          href: \"https://stackoverflow.com/a/3737121\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"non-durable writes\"\n          })\n        }), \" made it \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/b2F-DItXtZs\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"webscale\"\n          })\n        }), \"\u201C. In the last five years, PostgreSQL has become the Internet\u2019s darling DBMS. And for good reasons! It\u2019s dependable, feature-rich, extensible, and well-suited for most operational workloads.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But as much as we \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1534225032179814403\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"love PostgreSQL at OtterTune\"\n          })\n        }), \", certain aspects of it are not great. So instead of writing yet another blog article like everyone else touting the awesomeness of everyone\u2019s favorite elephant-themed DBMS, we want to discuss the one major thing that sucks: how PostgreSQL implements \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Multiversion_concurrency_control\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"multi-version concurrency control\"\n          })\n        }), \" (MVCC). \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2017/p781-wu.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"research\"\n          })\n        }), \" at Carnegie Mellon University and experience optimizing PostgreSQL database instances on Amazon RDS have shown that its MVCC implementation is the \", /*#__PURE__*/e(\"strong\", {\n          children: \"worst\"\n        }), \" among the other widely used relational DBMSs, including MySQL, Oracle, and Microsoft SQL Server. And yes, Amazon\u2019s PostgreSQL Aurora still has these problems.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In this article, we\u2019ll dive into MVCC: what it is, how PostgreSQL does it, and why it is terrible. Our goal at OtterTune is to give you \", /*#__PURE__*/e(\"em\", {\n          children: \"fewer\"\n        }), \" things to worry about with your databases, so we\u2019ve thought a lot about dealing with this problem. We\u2019ll cover OtterTune\u2019s solution for managing PostgreSQL\u2019s MVCC issues automatically for RDS and Aurora databases in a follow-up article next week.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What is Multi-Version Concurrency Control?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The goal of MVCC in a DBMS is to allow multiple queries to read and write to the database simultaneously without interfering with each other when possible. The basic idea of MVCC is that the DBMS never overwrites existing rows. Instead, for each (logical) row, the DBMS maintains multiple (physical) versions. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When the application executes a query, the DBMS determines which version to retrieve to satisfy the request according to some version ordering (e.g., creation timestamp). The benefit of this approach is that multiple queries can read older versions of rows without getting blocked by another query updating it. Queries observe a snapshot of the database as it existed when the DBMS started that query\u2019s transaction (snapshot isolation). \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This approach eliminates the need for explicit \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/explicit-locking.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"record locks\"\n          })\n        }), \" that block readers from accessing data while writers modify the same item.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"David Reed\u2019s 1978 MIT Ph.D. dissertation, \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://dspace.mit.edu/handle/1721.1/16279\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Concurrency Control in Distributed Database Systems\"\n          })\n        }), \",\u201D was, we believe, the first publication to describe MVCC. The first commercial DBMS implementation of MVCC was \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/InterBase#History\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"InterBase\"\n          })\n        }), \" in the 1980s. Since then, nearly every new DBMS created in the last two decades that supports transactions implements MVCC.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A systems engineer has to make several design decisions when building a DBMS that supports MVCC. At a high level, it comes down to the following:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"How to store updates to existing rows.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"How to find the correct version of a row for a query at runtime.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"How to remove expired versions that are no longer visible.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These decisions are not mutually exclusive. In the case of PostgreSQL, it\u2019s how they decided to handle the first question in the 1980s that caused problems with the other two that we still have to deal with today.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For our discussion, we will use the following example of a table containing movie information. Each row in the table includes the movie name, release year, director, and a unique ID serving as the primary key, with secondary indexes on the movie name and director. Here is the DDL command to create this table:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"CREATE TABLE movies (\\n  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,\\n  name VARCHAR(256) NOT NULL,\\n  year SMALLINT NOT NULL,\\n  director VARCHAR(128)\\n);\\nCREATE INDEX idx_name ON movies (name);\\nCREATE INDEX idx_director ON movies (director);\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The table contains a primary index (\", /*#__PURE__*/e(\"code\", {\n          children: \"movies_pkey\"\n        }), \") and two secondary B+Tree indexes (\", /*#__PURE__*/e(\"code\", {\n          children: \"idx_name\"\n        }), \", \", /*#__PURE__*/e(\"code\", {\n          children: \"idx_director\"\n        }), \").\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"PostgreSQL\u2019s Multi-Version Concurrency Control\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As discussed in Stonebraker\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://apps.dtic.mil/sti/citations/ADA187244\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"system design document from 1987\"\n          })\n        }), \", PostgreSQL was designed from the beginning to support multi-versioning. The core idea of PostgreSQL\u2019s MVCC scheme is seemingly straightforward: when a query updates an existing row in a table, the DBMS makes a copy of that row and applies the changes to this new version instead of overwriting the original row. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We refer to this approach as the \", /*#__PURE__*/e(\"strong\", {\n          children: \"append-only\"\n        }), \" version storage scheme. But as we now describe, this approach has several non-trivial implications in the rest of the system.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Multi-Versioned Storage\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"PostgreSQL stores all row versions in a table in the same storage space. To update an existing tuple, the DBMS first acquires an empty slot from the table for the new row version. It then copies the row content of the current version to the new version, and applies the modifications to the row in the newly allocated version slot. You can see this process in the example below when an application executes an update query on the movies database to change the release year of \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Shaolin_and_Wu_Tang\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Shaolin and Wu Tang\"\n          })\n        }), \"\u201D from 1985 to 1983:\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresql update existing tuples\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,9myQrTeo0tqHT1eTYW1rfyRlyto.png?originalFilename=Screenshot+2023-08-18+at+12.34.57+PM.png\",\n        \"data-framer-height\": \"631\",\n        \"data-framer-width\": \"1577\",\n        height: \"315\",\n        src: \"https://framerusercontent.com/images/9myQrTeo0tqHT1eTYW1rfyRlyto.png\",\n        style: {\n          aspectRatio: \"1577 / 631\"\n        },\n        width: \"788\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When an UPDATE query changes a tuple in the table, PostgreSQL copies the original version of the tuple and then applies the change to the new version. In this example, there is no more space in Table Page #1, so PostgreSQL creates the new version in Table Page #2.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Now with two physical versions representing the same logical row, the DBMS needs to record the lineage of these versions so that it knows how to find them in the future. MVCC DBMSs achieve this by creating a \", /*#__PURE__*/e(\"strong\", {\n          children: \"version chain\"\n        }), \" via a singly linked-list. The version chain only goes in one direction to reduce storage and maintenance overhead. This means that the DBMS has to decide what order to use: \", /*#__PURE__*/e(\"em\", {\n          children: \"newest-to-oldest\"\n        }), \" (N2O) order or \", /*#__PURE__*/e(\"em\", {\n          children: \"oldest-to-newest\"\n        }), \" (O2N). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For the N2O order, each tuple version points to its previous version and the version chain\u2019s head is always the latest version. For the O2N order, each tuple version points to its new version, and the head is the oldest tuple version. The O2N approach avoids the need for the DBMS to update indexes to point to a newer version of the tuple each time it\u2019s modified. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"However, it may take longer for the DBMS to find the latest version during query processing, potentially traversing a long version chain. Most DBMSs, including Oracle and MySQL, implement N2O. But PostgreSQL stands alone in using O2N (except for Microsoft\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/introduction-to-memory-optimized-tables?view=sql-server-ver16\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"In-Memory OLTP engine\"\n          })\n        }), \" for SQL Server).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The next issue is how PostgreSQL determines what to record for these version pointers. The header for each row in PostgreSQL contains a tuple id field (\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/storage-page-layout.html#STORAGE-TUPLE-LAYOUT\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"t_tcid\"\n          })\n        }), \") of the next version (or its own tuple id if it is the latest version). Thus, as shown in this next example, when a query requests the latest version of a row, the DBMS traverses the index, lands on the oldest version, and then follows the pointer until it finds a version that it needs.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresl version pointers\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,8gfgQbw0rbRubVcmRejWKsQ97DQ.png?originalFilename=Screenshot+2023-08-18+at+12.43.10+PM.png\",\n        \"data-framer-height\": \"630\",\n        \"data-framer-width\": \"1578\",\n        height: \"315\",\n        src: \"https://framerusercontent.com/images/8gfgQbw0rbRubVcmRejWKsQ97DQ.png\",\n        style: {\n          aspectRatio: \"1578 / 630\"\n        },\n        width: \"789\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The SELECT query traverses the index to find tuple with requested movie name. The index entry points to the oldest version of the tuple, which means PostgreSQL follows the version chain embedded in the original version to find the new version.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"PostgreSQL developers realized early on that there are two problems with its MVCC scheme. First, making a new copy of an entire tuple every time it is updated is expensive. And second, traversing the entire version chain just to find the latest version (which is what most queries want) is wasteful. Of course there is also the problem of cleaning up old versions, but we\u2019ll cover that below.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To avoid traversing the entire version chain, PostgreSQL adds an entry to a table\u2019s indexes for each physical version of a row. That means if there are five physical versions of a logical row, there will be (at most) five entries for that tuple in the index! In the example below, we see that the \", /*#__PURE__*/e(\"code\", {\n          children: \"idx_name\"\n        }), \" index contains entries for each of the \u201CShaolin and Wu Tang\u201D rows that are on separate pages. This enables direct access to the latest version of the tuple, without the need to traverse the long version chain.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresl new entry table index\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,l7VMVJ93pTMVWBotNyKBdcOlzY.png?originalFilename=Screenshot+2023-08-18+at+12.44.37+PM.png\",\n        \"data-framer-height\": \"624\",\n        \"data-framer-width\": \"1574\",\n        height: \"312\",\n        src: \"https://framerusercontent.com/images/l7VMVJ93pTMVWBotNyKBdcOlzY.png\",\n        style: {\n          aspectRatio: \"1574 / 624\"\n        },\n        width: \"787\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this example, the index contains multiple entries for the \u201CShaolin and Wu Tang\u201D tuple (one for each version). Now PostgreSQL uses the index to find the latest version and then immediately retrieves it from Table Page #2 without having to traverse the version chain starting at Table Page #1.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"PostgreSQL tries to avoid having to install multiple index entries and storing related versions over multiple pages by creating a new copy in the same disk page (block) as the old version to reduce disk I/O. This optimization is known as \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/storage-hot.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"heap-only tuple (HOT)\"\n          })\n        }), \" updates. The DBMS uses the HOT approach if an update does not modify any columns referenced by a table\u2019s indexes and the new version is stored on the same data page as the old version (if there is space in that page). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Now in our example, after the update the index still points to the old version and queries retrieve the latest version by traversing the version chain. During normal operation, PostgreSQL further optimizes this process by removing old versions to prune the version chain.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Version vacuum\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve established that PostgreSQL makes a copy of rows whenever an application updates them. The next question is how the system removes older versions (called \u201Cdead tuples\u201D). The original version of PostgreSQL from the 1980s did not remove dead tuples. The idea was that keeping all the older versions allowed applications to execute \u201Ctime-travel\u201D queries to examine the database at a particular point in time (e.g., run a \", /*#__PURE__*/e(\"code\", {\n          children: \"SELECT\"\n        }), \" query on the state of the database as it existed at the end of last week). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But never removing dead tuples means tables never shrink in size if the application deletes tuples. It also means long version chains for frequently updated tuples, which would slow down queries, except that PostgreSQL adds index entries that allow queries to quickly jump to the correct version instead of traversing the chain. But now, this means the indexes are larger, making them slower and adding additional memory pressure. Hopefully, you can understand now why all these issues are interconnected.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To overcome these problems, PostgreSQL uses a vacuum procedure to clean up dead tuples from tables. The vacuum performs a sequential scan on table pages modified since its last run and find expired versions. The DBMS considers a version \u201C\", /*#__PURE__*/e(\"strong\", {\n          children: \"expired\"\n        }), \"\u201D if it is not visible to any active transaction. This means no current transaction is accessing that version, and future transactions will use the latest \u201C\", /*#__PURE__*/e(\"strong\", {\n          children: \"live\"\n        }), \"\u201D version instead. Thus, removing the expired version and reclaiming the space for reuse is safe.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"PostgreSQL automatically executes this vacuum procedure (autovacuum) at regular intervals based on its configuration settings. In addition to the global settings that affect the vacuum frequency for all tables, PostgreSQL provides the flexibility to configure autovacuum at the table level to fine-tune the process for specific tables. Users can also trigger the vacuum manually to optimize database performance via the \", /*#__PURE__*/e(\"code\", {\n          children: \"VACUUM\"\n        }), \" SQL command.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why PostgreSQL\u2019s MVCC is the worst\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We will be blunt: if someone is going to build a new MVCC DBMS today, they should \", /*#__PURE__*/e(\"strong\", {\n          children: \"not\"\n        }), \" do it the way PostgreSQL does (e.g., append-only storage with autovacuum). In our \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2017/p781-wu.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2018 VLDB paper\"\n          })\n        }), \" (aka \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/902863242774634496\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"the best paper ever on MVCC\"\n          })\n        }), \"\u201C), we did not find another DBMS doing MVCC the way PostgreSQL does it. Its design is a relic of the 1980s and before the proliferation of \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Log-structured_merge-tree\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"log-structured\"\n          })\n        }), \" system patterns from the 1990s.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Let\u2019s talk about four problems that arise with PostgreSQL\u2019s MVCC. We will also talk about why other MVCC DBMSs like Oracle and MySQL avoid these problems.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Problem #1: Version copying\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With the append-only storage scheme in MVCC, if a query updates a tuple, the DBMS copies all its columns into the new version. This copying occurs no matter if the query updates a single or all of its columns. As you can imagine, append-only MVCC results in massive data duplication and increased storage requirements. This approach means that PostgreSQL requires more memory and disk storage to store a database than other DBMS, which means slower queries and higher cloud costs.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Instead of copying an entire tuple for a new version, MySQL and Oracle store a compact delta between the new and current versions (think of it like a git diff). Using deltas means that if a query only updates a single column in a tuple for a table with 1000 columns, then the DBMS only stores a delta record with the change to that one column. On the other hand, PostgreSQL creates a new version with the one column that the query changed and the 999 other untouched columns. We will ignore TOAST attributes because PostgreSQL \", /*#__PURE__*/e(o, {\n          href: \"https://dba.stackexchange.com/a/308779\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"handles them differently\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There was an attempt to modernize PostgreSQL\u2019s version storage implementation. EnterpriseDB started the \", /*#__PURE__*/e(o, {\n          href: \"https://wiki.postgresql.org/wiki/Zheap\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"zheap project\"\n          })\n        }), \" in 2013 to replace the append-only storage engine to use delta versions. Unfortunately the \", /*#__PURE__*/e(o, {\n          href: \"https://www.cybertec-postgresql.com/en/postgresql-zheap-current-status/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last official update was in 2021\"\n          })\n        }), \", and to the best of our knowledge the effort has fizzled out.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Problem #2: Table bloat\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Expired versions in PostgreSQL (i.e., dead tuples) also occupy more space than delta versions. Although PostgreSQL\u2019s autovacuum will eventually remove these dead tuples, write-heavy workloads can cause them to accumulate faster than the vacuum can catch up, resulting in continuous database growth. The DBMS has to load dead tuples into memory during query execution since the system intermingles dead tuples with live tuples in pages. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Unfettered bloat slows query performance by causing the DBMS to incur more IOPS and consume more memory than necessary during table scans. Additionally, inaccurate optimizer statistics caused by dead tuples can lead to poor query plans.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Suppose our movies table has 10 million live and 40 million dead tuples, making 80% of the table obsolete data. Assume also that the table also has many more columns than what we are showing and that the average size of each tuple is 1KB. With this scenario, the live tuples occupy 10GB of storage space while the dead tuples occupy ~40GB of storage; the total size of the table is 50GB. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When a query performs a full table scan on this table, PostgreSQL has to retrieve all 50GB from the disk and store it in memory, even if most of it is obsolete. Although Postgres has a \", /*#__PURE__*/e(o, {\n          href: \"https://madusudanan.com/blog/understanding-postgres-caching-in-depth/#SeqScans\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"protection mechanism\"\n          })\n        }), \" to avoid polluting its buffer pool cache from sequential scans, it does not help prevent IO costs.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Even if you make sure that PostgreSQL\u2019s autovacuum is running at regular intervals and able to keep up with your workload (which is not always easy to do, see below), the autovacuum cannot reclaim storage space. The autovacuum only removes dead tuples and relocates live tuples within each page, but it does not reclaim empty pages from the disk.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When the DBMS truncates the last page due to the absence of any tuple, other pages remain on disk. In our example above, even if PostgreSQL removed the 40GB of dead tuples from the movies table, it still retains the 50GB of allocated storage space from the operating system (or, in the case of RDS, from Amazon). To reclaim and return such unused space, one must use \", /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://www.postgresql.org/docs/current/sql-vacuum.html#:~:text=VACUUM%20FULL%20rewrites%20the%20entire,while%20it%20is%20being%20processed.\",\n            openInNewTab: !0,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"VACUUM FULL\"\n            })\n          })\n        }), \" or the \", /*#__PURE__*/e(o, {\n          href: \"https://reorg.github.io/pg_repack/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_repack\"\n          })\n        }), \" extension to rewrite the entire table to a new space with no wasted storage. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Running either of these operations is not an easy endeavor that one should take without considering the performance implications for production databases; they are resource-intensive and time-consuming operations that will crush query performance. The following figure shows how \", /*#__PURE__*/e(\"code\", {\n          children: \"VACUUM\"\n        }), \" and \", /*#__PURE__*/e(\"code\", {\n          children: \"VACUUM FULL\"\n        }), \" work.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresql table bloat\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,J8EXTtn1roMY0ZXSuUlS9g0huGw.png?originalFilename=Screenshot+2023-08-18+at+12.45.03+PM.png\",\n        \"data-framer-height\": \"629\",\n        \"data-framer-width\": \"1575\",\n        height: \"314\",\n        src: \"https://framerusercontent.com/images/J8EXTtn1roMY0ZXSuUlS9g0huGw.png\",\n        style: {\n          aspectRatio: \"1575 / 629\"\n        },\n        width: \"787\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With PostgreSQL\u2019s regular VACUUM operation, the DBMS only removes dead tuples from each table page and reorganizes it to put all the live tuples at the end of the page. With VACUUM FULL, PostgreSQL removes the dead tuples from each page, coalesces and compacts the remaining live tuples to a new page (Table Page #3), and then deletes the unneeded pages (Table Pages #1 / #2).\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Problem #3: Secondary index maintenance\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A single update to a tuple requires PostgreSQL to update all the indexes for that table. Updating all the indexes is necessary because PostgreSQL uses the exact physical locations of a version in both primary and secondary indexes. Unless the DBMS stores the new version in the same page as the previous version (HOT update), the system does this for every update.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Returning to our \", /*#__PURE__*/e(\"code\", {\n          children: \"UPDATE\"\n        }), \" query example, PostgreSQL creates a new version by copying the original version into a new page just like before. But it also inserts entries pointing to the new version in table\u2019s primary key index (\", /*#__PURE__*/e(\"code\", {\n          children: \"movies_pkey\"\n        }), \") and the two secondary indexes (\", /*#__PURE__*/e(\"code\", {\n          children: \"idx_director\"\n        }), \", \", /*#__PURE__*/e(\"code\", {\n          children: \"idx_name\"\n        }), \").\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresql secondary index maintenance\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,NairDYcNUT4amRGgKGOt1g2Gl0.png?originalFilename=Screenshot+2023-08-18+at+12.45.33+PM.png\",\n        \"data-framer-height\": \"746\",\n        \"data-framer-width\": \"1577\",\n        height: \"373\",\n        src: \"https://framerusercontent.com/images/NairDYcNUT4amRGgKGOt1g2Gl0.png\",\n        style: {\n          aspectRatio: \"1577 / 746\"\n        },\n        width: \"788\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Example of PostgreSQL index maintenance operations with a non-HOT update. The DBMS creates the new version of the tuple in Table Page #2, and then inserts new entries that point to that version in all the table\u2019s indexes.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The need for PostgreSQL to modify all of a table\u2019s indexes for each update has several performance implications. Obviously, this makes update queries slower because the system has to do more work. The DBMS incurs additional I/O to traverse each index and insert the new entries. Accessing an index introduces lock/latch contention in both the index and the DBMS\u2019s internal data structures (e.g., buffer pool\u2019s page table). \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Again, PostgreSQL does this maintenance work for all a table\u2019s indexes, even if queries are never going to use them (by the way, OtterTune \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/wQXLyaQK/index-recommendations\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"automatically finds unused indexes in your database\"\n          })\n        }), \"). These extra reads and writes are problematic in DBMSs that charge users based on IOPS, like Amazon Aurora.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As described above, PostgreSQL avoids updating indexes each time if it can perform a HOT write where the new version is on the same page as the current version. Our analysis of OtterTune customers\u2019 PostgreSQL databases shows that roughly 46% of updates use the HOT optimization on average. Although that\u2019s an impressive number, it still means more than 50% of the updates are paying this penalty.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There are many examples of users struggling with this aspect of PostgreSQL\u2019s MVCC implementation. The most famous testament of this is Uber\u2019s 2016 blog article about why they \", /*#__PURE__*/e(o, {\n          href: \"https://www.uber.com/blog/postgres-to-mysql-migration/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"switched from Postgres to MySQL\"\n          })\n        }), \". Their write-heavy workload was experiencing significant performance problems on tables with many secondary indexes.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Oracle and MySQL do not have this problem in their MVCC implementation because their secondary indexes do not store the physical addresses of new versions. Instead, they store a logical identifier (e.g., tuple id, primary key) that the DBMS then uses to look up the current version\u2019s physical address. Now this may make secondary index reads slower since the DBMS has to resolve a logical identifier, but these DBMS have other advantages in their MVCC implementation to reduce overhead.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Side comment:\"\n        }), \" There is an error in \", /*#__PURE__*/e(o, {\n          href: \"https://www.uber.com/blog/postgres-to-mysql-migration/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Uber\u2019s blog post\"\n          })\n        }), \" regarding PostgreSQL\u2019s version storage. Specifically, each tuple in PostgreSQL stores a pointer to the new version, not the previous one, as stated in the blog. This results in an O2N version chain ordering rather than the N2O version chain erroneously claimed by Uber.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Problem #4: Vacuum management\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"PostgreSQL\u2019s performance relies heavily on the effectiveness of the autovacuum to remove obsolete data and reclaim space (this is why OtterTune immediately checks the health status of the autovacuum when you first connect your database). It does not matter if you are running RDS, Aurora, or Aurora Serverless; all variants of PostgreSQL have the same autovacuum issues.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But making sure that PostgreSQL\u2019s autovacuum is running as best as possible is difficult due to its complexity. PostgreSQL\u2019s default settings for tuning the autovacuum are not ideal for all tables, particularly for large ones. For example, the default setting for the configuration knob that controls what percentage of a table PostgreSQL has to update before the autovacuum kicks in (\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/15/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-SCALE-FACTOR\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"autovacuum_vacuum_scale_factor\"\n          })\n        }), \") is 20%. This threshold means that if a table has 100 million tuples, the DBMS does not trigger the autovacuum until queries update at least 20 million tuples. As such, PostgreSQL may unnecessarily keep around a lot of dead tuples in a table (thereby incurring IO and memory costs) for a long time.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Another problem with the autovacuum in PostgreSQL is that it may get blocked by long-running transactions, which can result in the accumulation of more dead tuples and stale statistics. Failing to clean expired versions in a timely manner leads to numerous performance problems, causing more long-running transactions that block the autovacuum process. It becomes a vicious cycle, requiring humans to intervene manually by killing long-running transactions.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Consider the graph below that shows the number of dead tuples in an OtterTune customer\u2019s database over two weeks:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"dead tuples over time example\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,jOIDB4Mje3mgv7hCJPSEaZpID0.png?originalFilename=Screenshot+2023-08-18+at+12.45.58+PM.png\",\n        \"data-framer-height\": \"628\",\n        \"data-framer-width\": \"1573\",\n        height: \"314\",\n        src: \"https://framerusercontent.com/images/jOIDB4Mje3mgv7hCJPSEaZpID0.png\",\n        style: {\n          aspectRatio: \"1573 / 628\"\n        },\n        width: \"786\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The number of dead tuples over time in a PostgreSQL Amazon RDS database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The sawtooth pattern in the chart shows that the autovacuum performs a major clean-up about once every day. For example, on February 14th, the DBMS cleaned up 3.2 million dead tuples. This graph is actually an example of an unhealthy PostgreSQL database. The chart clearly shows an upward trend in the number of dead tuples because the autovacuum cannot keep up.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"At OtterTune, we see this problem often in our customers\u2019 databases. One PostgreSQL RDS instance had a long-running query caused by stale statistics after bulk insertions. This query blocked the autovacuum from updating the statistics, resulting in more long-running queries. OtterTune\u2019s automated health checks identified the problem, but the administrator still had to kill the query manually and run \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"run-postgresql-analyze-to-fix-a-slowdow-in-db\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ANALYZE after bulk insertions\"\n          })\n        }), \". The good news is that the long query\u2019s execution time went from 52 minutes to just 34 seconds.\"]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"Concluding remarks\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There are always hard design decisions one has to make when building a DBMS. And these decisions will cause any DBMS to perform differently on varying workloads. For Uber\u2019s specific write-intensive workload, PostgreSQL\u2019s index write amplification due to MVCC is why they switched to MySQL. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But please don\u2019t misunderstand our diatribe to mean that we don\u2019t think you should ever use PostgreSQL. Although its MVCC implementation is the wrong way to do it, PostgreSQL is still our favorite DBMS. To love something is to be willing to work with its flaws (see Dan Savage\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/r1tCAXVsClw\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"\u201CThe Price of Admission\u201D\"\n          })\n        }), \").\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"So how does one work around PostgreSQL\u2019s quirks? Well, you can spend an enormous amount of time and effort tuning it yourself. \", /*#__PURE__*/e(o, {\n          href: \"https://philbooth.me/blog/nine-ways-to-shoot-yourself-in-the-foot-with-postgresql\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Good luck with that\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We cover more about what you can do in our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"yes-postgresql-has-problems-but-we-re-sticking-with-it\"\n            },\n            webPageId: \"bjtIur_Vg\"\n          },\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"follow-up blog\"\n          })\n        }), \".\"]\n      })]\n    })\n  }, {\n    id: \"mOq_hZ114\",\n    [c]: \"OtterTune v2.0: Fresh look and killah features\",\n    [d]: \"ottertune-v2-0-fresh-look-and-killah-features\",\n    [u]: \"2023-04-05T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/GmzKx32HpTel0FzsTvnG46DfpnI.webp\"\n    }, \"dj ot ottertune v2 announcement\"),\n    [m]: \"We provide the same AI-powered automated knob tuning but now expand our recommendations to indexes and cloud settings. \",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Prepare for your dome piece to be rocked because we\u2019re dropping OtterTune v2.0 today! This release culminates three years of slinging since we forked the company out of Carnegie Mellon University in 2020. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Building on our previous research on using machine learning (ML) to optimize databases, the latest version of OtterTune goes beyond just trying to maximize efficiency and performance. It expands our use of ML to provide better visibility into database health over long periods.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune v2.0 is a completely different way of managing and tuning databases. It\u2019s not just about coming in and getting the quick win one database at a time. That\u2019s nice and all, but there\u2019s so much more people need help with. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Instead, OtterTune now takes a holistic view of how PostgreSQL and MySQL databases (and their applications) evolve over time and how they interact with other databases in an organization. We provide the same AI-powered automated knob tuning but now expand our recommendations to indexes and cloud settings. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are also releasing a preview version of our automated query tuning feature to select customers. The goal of this major update is to provide better visibility into database health and performance.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why the new version?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A lot of the feedback we\u2019ve gotten from customers is that they see a massive improvement in their database\u2019s performance when they first start using OtterTune through its automated tuning. But then they don\u2019t know whether to leave it on forever or turn it off.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The truth is your mileage with OtterTune will vary based on how your application changes over time. Most applications are not static. Developers add new features and functionality, which then hits up your database with new queries and data. As an application evolves, so do the tuning needs for the database. The more the application changes, the more drastic the config updates. And these changes add up over time.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"p99 query latency graph for ottertune\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,oKhW02GvBFkI8SmyEld7y914vEI.png?originalFilename=Screenshot+2023-08-18+at+12.46.52+PM.png\",\n        \"data-framer-height\": \"617\",\n        \"data-framer-width\": \"1137\",\n        height: \"308\",\n        src: \"https://framerusercontent.com/images/oKhW02GvBFkI8SmyEld7y914vEI.png\",\n        style: {\n          aspectRatio: \"1137 / 617\"\n        },\n        width: \"568\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Query Performance over time for OLTP workload on Amazon RDS PostgreSQL v13 using OtterTune.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You can see above one of our customers who initially ran OtterTune, then stuck with those settings without re-tuning for a while. The performance slowly declined (and increased costs) over time because their workload changed, but they did not update their database configuration. After they enabled OtterTune\u2019s automatic tuning again, the customer\u2019s database copped another 68% reduction in their P99 query latency.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This scenario happens a lot. It is rare for organizations not to update their application regularly in a way that requires re-examining their database configuration. The only organization we\u2019ve ever talked to that does \", /*#__PURE__*/e(\"em\", {\n          children: \"not\"\n        }), \" need to constantly worry about tuning its databases is the US Patent Office. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Dana and I spoke to them in 2018 after our \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/machine-learning/tuning-your-dbms-automatically-with-machine-learning/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Machine Learning blog article\"\n          })\n        }), \" came out. They told us they hadn\u2019t changed their MySQL database in the last three years! For the rest of us, we got to keep the lookout for our databases and re-up when needed.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But nobody can babysit a database 24/7 to ensure it is running with the best practices. Even if you have a full-time DBA on your team (spoiler: most companies do not!), they have many other important responsibilities than checking that each DBMS is configured correctly. The problem is even more challenging if you have multiple databases running in production: OtterTune customers have an average of ten RDS instances per AWS organization.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This is what the new version of OtterTune is aiming to solve. It is more than just a performance and optimization service for individual MySQL and PostgreSQL databases running on Amazon RDS. Yes, we still do that. But now OtterTune\u2019s more lofty goal is to provide users with \u201Cpeace of mind\u201D about their entire database fleet. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This means helping people sleep better at night, knowing that our algorithms always watch your database\u2019s behavior. And then, when things change, it will tell you what has changed and whether your database is still running with the best practices.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The idea is simple. We see a lot of databases at OtterTune, and we know what\u2019s best for them because we see how they react to all sorts of changes (e.g., workloads, query patterns, schema migrations, and version upgrades). Our algorithms learn from these experiences from other databases to ensure your database is running the best it possibly can.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"New features\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are excited to announce the following new bangers in this release. We have also restructured OtterTune\u2019s internal architecture for how it tracks individual databases. Existing users won\u2019t notice a difference, but it enables several more features we\u2019re working on back in the cut that we can share with everyone soon.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Health Score\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Starting in v2.0, OtterTune computes a Health Score for each database to give you a quick overview of how well it is running. Before this, OtterTune\u2019s algorithms only considered \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/h2zgB93KANE\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raw\"\n          })\n        }), \" database metrics like throughput, latency, and CPU utilization. Although these numbers are important, they don\u2019t show the complete picture. Databases are fickle beasts. \"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune dashboard fleet level health\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,O8EJa88cRJsdwubgCR4R1GRaDC0.webp\",\n        \"data-framer-height\": \"1786\",\n        \"data-framer-width\": \"2374\",\n        height: \"893\",\n        src: \"https://framerusercontent.com/images/O8EJa88cRJsdwubgCR4R1GRaDC0.webp\",\n        style: {\n          aspectRatio: \"2374 / 1786\"\n        },\n        width: \"1187\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Things can look fine one minute, and then connections start hanging suddenly because your database is bleeding out due to a bad setting or errant index. Our Health Score captures the big picture of how your database is doing, keeping in mind best practices for production databases and key indicators like cost and speed.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knob Configuration\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This new version expands on the ML algorithms we \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/projects/ottertune/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"developed at Carnegie Mellon\"\n          })\n        }), \" for automatic database configuration tuning. OtterTune v2.0\u2019s knob tuning feature now blends ML-generated and heuristics-based recommendations. This improvement helps guide the ML models to the optimal solution more quickly. OtterTune also allows you to apply them to your database in three ways. \"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune knob recommendations\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,hmpHML4bcVkqn55ehWMCk9BJ6nU.webp\",\n        \"data-framer-height\": \"2178\",\n        \"data-framer-width\": \"2370\",\n        height: \"1089\",\n        src: \"https://framerusercontent.com/images/hmpHML4bcVkqn55ehWMCk9BJ6nU.webp\",\n        style: {\n          aspectRatio: \"2370 / 2178\"\n        },\n        width: \"1185\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In addition to \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"human-in-the-loop-controls-video\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"manual and automated review\"\n          })\n        }), \", you can now copy + paste the command lines and use them themselves, in case you do not want to give OtterTune the necessary AWS permissions to apply changes automatically. And it\u2019s highly customizable. OtterTune tunes your eight most impactful knobs for MySQL and PostgreSQL by default and allows you to customize your tuning experience by enabling additional knobs.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Index Tuning\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The number one requested feature we got from customers last year is for OtterTune to provide automatic index tuning. This is, of course, a hard but essential task. Tuning a database\u2019s indexes can reduce costs and memory/storage usage so your database runs faster and more efficiently. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune identifies if your database has too many unused or duplicate indexes and recommends which ones to drop. It does this by periodically examining the access patterns of queries inside the DBMS instance. It then provides copyable commands to drop the indexes you select.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Query Tuning\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are most excited about this new feature in OtterTune v2.0! The service now identifies problematic queries and provides helpful recommendations for fixing them. Unfortunately, OtterTune cannot automatically fix them because it requires changing application code (we will eventually be able to do this, just not yet). But OtterTune now tracks anonymized query digests and database schemas to provide a centralized view of the bad queries in your database. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune then uses this data to make query recommendations to improve performance and avoid SQL anti-patterns. We are still working on the final polish for OtterTune\u2019s query tuning recommendations (this problem is hard, and we want to make sure we get it right), so it is currently not enabled for new customers. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/contact/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Hit us up\"\n          })\n        }), \" to try this feature for your database after you \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"egEhCCRg_\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"sign up for an account\"\n          })\n        }), \" and connect your database.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Improved UX and UI\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We designed the initial version of OtterTune in 2020 based on our experiences as scientists that needed to keep track of experiments for \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/resource/publications/\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"research papers\"\n          })\n        }), \". But in OtterTune v2.0, we designed it for software developers and engineers with better stuff to do than watch performance charts. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When you log into OtterTune, it provides an overview page where you can see all of your databases at a glance, ranked recommendations by the severity of impact (i.e., what\u2019s most important to fix). OtterTune also makes it easy to switch between multiple AWS accounts. We see a lot of customers have one AWS account for testing/dev databases and then another AWS account for production databases.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What\u2019s next?\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I\u2019m not trying to \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/T2cKV9zHIXI\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"die in these database streets alone\"\n          })\n        }), \". This is why the OtterTune team has been hard at work turning out this new release for the last year since we pulled up our series A funding last year. We now have a backend platform and a fancy frontend that makes it easier for us to deploy new database recommendations. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Our improved agility means that if you sign up for OtterTune today and see that your health score is satisfactory, you might get an alert from us in two weeks telling you that your database health is now dangerous because our new checks found something wrong with it. And this is the way it should be if you want the confidence that your database is always on point like Kobe in his prime.\"\n      })]\n    })\n  }, {\n    id: \"tLeMuqJmE\",\n    [c]: \"How Amazon RDS replication works and why the FAA\u2019s database problem won\u2019t happen in AWS\",\n    [d]: \"why-the-faas-database-problem-wont-happen-in-aws\",\n    [u]: \"2023-01-30T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/b4CkXp6rD1LkCrFLaQGqi0g9UM.png\",\n      srcSet: \"https://framerusercontent.com/images/b4CkXp6rD1LkCrFLaQGqi0g9UM.png?scale-down-to=512 512w, https://framerusercontent.com/images/b4CkXp6rD1LkCrFLaQGqi0g9UM.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/b4CkXp6rD1LkCrFLaQGqi0g9UM.png 1038w\"\n    }, \"dj ot faa database problem, rds replication\"),\n    [m]: \"On 1/11/23, all flights in the US were grounded because of a FAA NOTAM system outage tied to a corrupt database file. Here's why that wouldn't happen if the FAA was using Amazon RDS.\",\n    [g]: \"Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"On January 11, 2023, all flights in the US were grounded because of a Federal Aviation Administration (FAA) NOTAM system outage. According to the FAA, the outage was due to a \", /*#__PURE__*/e(o, {\n          href: \"https://www.cnn.com/travel/article/faa-ground-stop-causes/index.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"corrupt database file\"\n          })\n        }), \". An engineer then tried to replace the file with a backup but it turned out that the backup file was busted too. FAA officials said that it was an \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://abcnews.go.com/US/computer-failure-faa-impact-flights-nationwide/story?id=96358202\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"honest mistake that cost the country millions [of dollars]\"\n          })\n        }), \".\u201D\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This is a pretty big fuck up. And it shows the importance of high-availability and reliability for mission-critical systems. It\u2019s 2023 after all. Such a failure shouldn\u2019t happen for such a service. But the FAA\u2019s system is 30 years old. We don\u2019t know the details about their system and how the file got corrupted in the first (e.g., bit rot, software error), but clearly the FAA\u2019s database game was weak.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Since databases are the most important things in the world, we want to discuss how replication works in Relational Database Service (RDS) for both PostgreSQL and MySQL to ensure that your database continues to operate even when one of its parts fails or you get \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/mb6Jc4juSF8\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"locked up\"\n          })\n        }), \". But as we describe below, we see people that don\u2019t set up enable replication properly for their production databases.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For OtterTune\u2019s customers, \", /*#__PURE__*/e(\"strong\", {\n          children: \"70%\"\n        }), \" of production Aurora clusters have read replicas. But only \", /*#__PURE__*/e(\"strong\", {\n          children: \"32%\"\n        }), \" of production non-Aurora RDS instances are replicating to at least one standby instance\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There are two parts of this story. The first is how to ensure that the database\u2019s storage is replicated. Amazon RDS stores Elastic Block Storage (EBS) to maintain multiple copies of the files. Using EBS this way is not that interesting from a database perspective because the DBMS does not know about this replication. Furthermore, it does not solve the downtime issue that hit the FAA. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If the DBMS instance crashes, you have to either wait for the instance to come back online (or start a new one) and then recover the database. The more interesting challenge is how to ensure that if the DBMS crashes, the system can still stay online with minimal disruption and without any data loss.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We\u2019ll discuss how regular RDS databases achieve this first, then we\u2019ll talk about how Aurora is different.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How Amazon RDS replication works\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When you delete a file on your laptop by accident, you first see whether there is a backup of that file. The idea behind high-availability database systems is similar, and redundancy can make a system more robust and fault-tolerant against unexpected failures. A \", /*#__PURE__*/e(\"em\", {\n          children: \"primary\"\n        }), \" instance of the DBMS replicates the database to a standby \", /*#__PURE__*/e(\"em\", {\n          children: \"replica\"\n        }), \" instance. Some part of the system designates the replica as the new primary if the primary crashes or becomes unavailable. This failover process is either initiated from the replicas themselves or an external service. In the case of AWS, RDS coordinates this failover process.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With an Amazon RDS instance with Multi-AZ, the primary runs in one availability zone (AZ) and then replicates data to standby instances located in a different AZ. Amazon\u2019s Availability Zones are locations within a region that are isolated from each other (e.g., us-east-1a vs. us-east-1b). Otherwise, an issue affecting an entire AZ can simultaneously cause outages for both primary and standby instances. When AWS detects a failure in the primary, it automatically fails over to a standby instance.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Amazon RDS provides two types of \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/features/multi-az/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Multi-AZ deployments\"\n          })\n        }), \" that differ based on the number of standby instances. The first type is the Multi-AZ deployment with one standby instance, which limits applications to accessing data solely from the primary instance. The standby instance, in this type of deployment, is not exposed to applications. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The second type of deployment is the Multi-AZ deployment with two readable standbys. In this case, applications have the ability to read data from both standby instances and also read and write data from the primary instance. This type of deployment provides additional read capacity and faster failover, ensuring higher availability and fault tolerance.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To understand how the replication works, let\u2019s consider read-only workloads first. In this case, data in the primary instance does not change, so we only need to copy all the data to the standby instance once. For workloads with writes (e.g., \", /*#__PURE__*/e(\"code\", {\n          children: \"INSERT\"\n        }), \", \", /*#__PURE__*/e(\"code\", {\n          children: \"UPDATE\"\n        }), \", \", /*#__PURE__*/e(\"code\", {\n          children: \"DELETE\"\n        }), \" queries), the primary instance must propagate changes to the replica.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In a Multi-AZ DB instance with two readable standbys deployment, the replication process is accomplished through log shipping. Both MySQL and PostgreSQL use \", /*#__PURE__*/e(\"em\", {\n          children: \"redo logs\"\n        }), \" to record write changes. These DBMSs use different names for these logs, but they are essentially the same thing: MySQL calls them the \", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/binary-log.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"binary log\"\n          })\n        }), \" (binlog), and PostgreSQL calls them the \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/wal-intro.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"write-ahead log\"\n          })\n        }), \" (WAL). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"During the replication, the primary DB instance continuously sends the latest redo log entries to both standby instances. These standby instances subsequently store the redo log on disk and apply the changes to their local databases.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"After a standby instance receives the latest redo log and saves it on disk, it sends an acknowledgement to the primary instance. The primary instance will only commit a transaction after receiving an acknowledgement from either of the two standbys, ensuring no data loss during failover. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For example, suppose the application starts a transaction that changes the database on the primary. When the application attempts to commit (i.e., save) those changes, the primary waits until at least one of the standby servers acknowledges that it has stored the redo log entries on its local disk before the primary tells the application that the changes are saved (i.e., committed). \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Now, if the primary crashes, a replica which has the latest redo log entries becomes the new primary. The new primary can apply the redo logs to the database, ensuring no loss of data from previously committed transactions (i.e., the Durability guarantee in \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/W5FFiI5ALTc?t=1287\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ACID\"\n          })\n        }), \"). Of course, transactions will take longer to commit because of the extra communication costs.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"setup for amazon rds multi-az deployment\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,tNxs4NCLHRdE8ZK3xNxWjcciodM.svg\",\n        \"data-framer-height\": \"577\",\n        \"data-framer-width\": \"1160\",\n        height: \"288\",\n        src: \"https://framerusercontent.com/images/tNxs4NCLHRdE8ZK3xNxWjcciodM.svg\",\n        style: {\n          aspectRatio: \"1160 / 577\"\n        },\n        width: \"580\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In a Multi-AZ DB instance with one standby deployment, it synchronously replicates data to the standby database. Instead of shipping redo logs described above, it replicates all changes at the storage level. When an application writes data to the primary instance, the write is sent first to the EBS volume attached to the primary instance, and then to the EBS volume attached to the standby instance. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Only after the data is successfully written to both EBS volumes is the transaction committed. The replication process is \", /*#__PURE__*/e(\"em\", {\n          children: \"synchronous\"\n        }), \", meaning that the primary instance will not commit a transaction until it receives the acknowledgement that both the primary and standby instances have successfully written the data. This guarantees that the primary and standby instances are always in sync, eliminating the risk of data loss during failover.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How Amazon Aurora replication works\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Aurora MySQL and Aurora PostgreSQL replicate data slightly differently than their RDS counterparts. For this discussion, we will refer to both systems as \u201CAurora\u201D as they use the same replication procedure in their storage layer. Each Aurora storage node includes a computational component that natively processes redo log entries and applies them to database pages. This is the \u201Csecret sauce\u201D that Amazon created for this service.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Aurora stores each database in a \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.StorageReliability.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"cluster volume\"\n          })\n        }), \" that maintains multiple copies across different AZs. In an Aurora cluster, there is one primary instance that supports read and write operations, and multiple read-only replica instances. All instances connect to the same cluster volume in the storage layer. If a primary instance fails or crashes, one of the replica instances takes over as the new primary.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"amazon aurora cluster replication\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,Qju9Pz6uL6KHhXRbCb7lOxpsEsw.png\",\n        \"data-framer-height\": \"624\",\n        \"data-framer-width\": \"1125\",\n        height: \"312\",\n        src: \"https://framerusercontent.com/images/Qju9Pz6uL6KHhXRbCb7lOxpsEsw.png\",\n        style: {\n          aspectRatio: \"1125 / 624\"\n        },\n        width: \"562\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When handling a write request, Aurora sends data to six storage nodes across three AZs and waits for the acknowledgment from at least four nodes before the write is committed (i.e., quorum writes). Replicating the data to six nodes can generate huge network IO, but the system only sends redo log records to minimize network traffic. Each storage node asynchronously applies log records to data pages.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"By maintaining six copies of the data, Aurora detects failures in the disk volumes and repairs them using the data in other volumes. It can tolerate at most three damaged copies out of six copies. Even if three copies are damaged, Aurora can still rebuild them from other intact copies. This repair process is automatic. You do not need to hit up somebody on their pager at 2:00 am to get them back into the cut to manually copy a file like the feds tried.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why the FAA\u2019s problem can\u2019t happen in Amazon RDS\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Given all this, there are several reasons why we are so sure that you are not likely to have the NOTAM-style problem for your MySQL and PostgreSQL databases in RDS.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"First, Amazon does not allow you to modify database and log files manually. This means nobody can log into nodes and manually overwrite files like the FAA\u2019s engineer, which is a common practice for disaster recovery in on-prem databases. This restriction avoids many human errors.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"RDS also replicates data to multiple locations at the storage layer to protect it from the failure of any single component. Even in the rare event of the system going off the chain accidentally deleting or corrupting a file, the system can recover the data from other copies or historical copies (e.g., EBS snapshots).\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Lastly, Amazon RDS has replicated DB instances and supports failover. It synchronously replicates data from the primary instance to other instances deployed at different AZs. If the primary DB instance crashes due to any corrupted file, it will fail over to the standby or replica instance to continue operating correctly.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But it is important to understand that while Amazon makes sure that your RDS database files are safe (i.e., you are unlikely to face a file corruption problem), they do not provide standby replicas by default. You have to manually create replicas in AWS to get this capability. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Without this, then if (when) your DBMS instance crashes, your database will be unavailable until it comes back online. In the best case scenario, the DBMS will come back in under a minute. But depending on the size of the log and the last time the DBMS took a checkpoint, it could be hours or even days!\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When we examine the databases of OtterTune\u2019s customers, we were surprised to see that not everyone is running their production databases with replicated instances. This is not an exact survey. We just checked whether the name or tag of the RDS instance contained the word \", /*#__PURE__*/e(\"code\", {\n          children: \"prod\"\n        }), \" (roughly 40% of all OtterTune databases). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For Aurora, 70% of production Aurora clusters using OtterTune have read replicas (it was roughly the same for MySQL and PostgreSQL). But only 32% of production non-Aurora RDS instances are running with at least one standby instance. The following graph shows the percentage of these databases by instance size:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"production instances without replication\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,pJvn0ssir5EsnhbswTuiV27QNkw.png?originalFilename=Screenshot+2023-08-18+at+3.08.07+PM.png\",\n        \"data-framer-height\": \"774\",\n        \"data-framer-width\": \"1403\",\n        height: \"387\",\n        src: \"https://framerusercontent.com/images/pJvn0ssir5EsnhbswTuiV27QNkw.png\",\n        style: {\n          aspectRatio: \"1403 / 774\"\n        },\n        width: \"701\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As you can see, the majority of RDS databases are large or smaller. There is a surprisingly a few of the larger instance sizes (e.g., 24xlarge) that are running without either synchronous or asynchronous replication! If the database is so important to run on an instance that costs roughly $40,000 a year, you would think that they would want to make sure that it is always available. But it doubles the costs of the deployment. So people choose to go without database replication like driving without a seatbelt. YOLO.\"\n      })]\n    })\n  }, {\n    id: \"P5vhUetmW\",\n    [c]: \"Databases in 2022: A year in review\",\n    [d]: \"2022-databases-retrospective\",\n    [u]: \"2022-12-31T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/bR0pbQfsABpzX35p180oKb2HI.png\",\n      srcSet: \"https://framerusercontent.com/images/bR0pbQfsABpzX35p180oKb2HI.png?scale-down-to=512 512w, https://framerusercontent.com/images/bR0pbQfsABpzX35p180oKb2HI.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/bR0pbQfsABpzX35p180oKb2HI.png 1078w\"\n    }, \"dj ot with microphone\"),\n    [m]: \"Another year has gone by, and I\u2019m still alive. As such, it is an excellent time to reflect on what happened in the world of databases last year.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Another year has gone by, and I\u2019m still alive. As such, it is an excellent time to reflect on what happened in the world of databases last year. It was quiet in the streets as the benchmark wars between DBMS vendors have quieted down. I had fun writing \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/blog/2021-databases-retrospective/\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last year\u2019s retrospective\"\n          })\n        }), \", so I am excited to share with you the things that stand out from 2022 and my thoughts on them.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Big database funding has slowed big time\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As I discussed \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"2021-databases-retrospective\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last year\"\n          })\n        }), \", 2021 was a banner year for database funding. There was a lot of money being thrown at start-ups building new DBMSs as investors continue to search for the next Snowflake. The beginning of 2022 looked like it was going to be another repeat of the previous year with lots of big funding round announcements. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The party started in February with Timescale\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://www.timescale.com/blog/year-of-the-tiger-110-million-to-build-the-future-of-data-for-developers-worldwide/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$110m series C\"\n          })\n        }), \", Voltron Data\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/02/17/voltron-data-grabs-110m-to-build-startup-based-on-apache-arrow-project/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$110m seed + series A\"\n          })\n        }), \", and Dbt Labs\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://www.forbes.com/sites/kenrickcai/2022/02/24/dbt-labs-series-d-4-billion-less-than-planned/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$222m series D\"\n          })\n        }), \". Starburst announced their \", /*#__PURE__*/e(o, {\n          href: \"https://www.starburst.io/blog/starburst-announces-250m-series-d/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$250m Series D\"\n          })\n        }), \" in March to expand their Trino offering. Imply pulled out a \", /*#__PURE__*/e(o, {\n          href: \"https://imply.io/blog/imply-raises-100mm-in-series-d-funding/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$100m series D\"\n          })\n        }), \" in May for their commercial version of Druid. DataStax got \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/06/15/datastax-proves-its-still-possible-to-raise-nine-figures-at-higher-valuation-in-2022/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$115m in funding\"\n          })\n        }), \" on its way to IPO in June. Lastly, SingleStore dropped their \", /*#__PURE__*/e(o, {\n          href: \"https://www.singlestore.com/media-hub/releases/singlestore-announces-116m-funding\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$116m series F\"\n          })\n        }), \" in July and then extended it with another \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/10/04/singlestore-raises-30m-more-to-brings-its-database-tech-to-new-customers/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$30m in October\"\n          })\n        }), \". \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There were several other smaller companies with impressive series A rounds in the first half of 2022, including Neon\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://neon.tech/blog/funding-a1/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$30m series A\"\n          })\n        }), \" for their serverless PostgreSQL offering, ReadySet\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/04/05/readyset-raises-29m-to-expedite-access-to-enterprise-scale-app-data/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$29m series A\"\n          })\n        }), \" for their query caching layer, Convex\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://blog.convex.dev/series-a/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$26m series A\"\n          })\n        }), \" for their application framework built on PostgreSQL, and QuestDB\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://questdb.io/blog/2022/01/03/two-year-journey-raising-15m-venture-capital/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$15m series A\"\n          })\n        }), \" for their time-series DBMS. Although we\u2019re not building a new DBMS or related infrastructure, OtterTune flexed with our own \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/05/10/2309852/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$12m series A\"\n          })\n        }), \" in April.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But then, the massive funding rounds stopped in the second half of 2022. Although there were smaller rounds for early-stage start-ups, there were no more nine-figure dollar amounts for more seasoned companies. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://www.risingwave.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"RisingWave\"\n          })\n        }), \" copped a \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/10/18/streaming-data-processing-platform-risingwave-lands-36m-to-launch-a-cloud-service/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$36m series A\"\n          })\n        }), \" for their streaming processing engine in October. Keebo raised a \", /*#__PURE__*/e(o, {\n          href: \"https://venturebeat.com/data-infrastructure/keebo-ai-optimizes-data-warehouses-with-automated-learning-platform-raises-10-5m/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$10.5m series A\"\n          })\n        }), \" for their Snowflake query accelerator. In November, we saw announcements for MotherDuck\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/11/15/motherduck-secures-investment-from-andreessen-horowitz-to-commercialize-duckdb/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$45m seed + series A\"\n          })\n        }), \" to commercialize a cloud version of DuckDB and EdgeDB\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://www.edgedb.com/blog/edgedb-series-a\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$15m series A\"\n          })\n        }), \" in November. Lastly, the SurrealDB brothers picked up a \", /*#__PURE__*/e(o, {\n          href: \"https://www.crunchbase.com/funding_round/surrealdb-series-unknown--3acd814d\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$6m seed round\"\n          })\n        }), \". I probably missed some others, but this is not meant to be an exhaustive list.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The only other notable financial event in databases was MariaDB\u2019s disastrous public offering in December (via a \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Special-purpose_acquisition_company\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"SPAC\"\n          })\n        }), \"), where the share price dropped by \", /*#__PURE__*/e(o, {\n          href: \"https://www.bizjournals.com/sanjose/news/2022/12/19/mariadb-goes-public-in-spac-merger.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"40% on its first day of trading\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy's take\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There are two reasons for the reduction in big funding rounds in 2022 compared to 2021. The most obvious reason is that the entire tech sector has cooled, partly fueled by concerns about inflation, interest rates, and the collapse of the crypto economy. The other reason is that everyone in a position to take a large round due already did so before things dried up. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For example, Starburst raised its series D in 2022 after its \", /*#__PURE__*/e(o, {\n          href: \"https://www.starburst.io/blog/starburst-announces-100m-series-c-led-by-andreessen-horowitz/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$100m series C\"\n          })\n        }), \" in 2021. The database companies that raised huge rounds in the last two years will need to raise more money soon to keep the growth train going. Others have \", /*#__PURE__*/e(o, {\n          href: \"https://www.itbusinessedge.com/business-intelligence/data-startups-eye-popping-funding-rounds/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"commented\"\n          })\n        }), \" on the staggering amounts that these companies are getting.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The bad news is that these companies are in trouble unless the tech sector improves and big institutional investors start turning their money out on the street again. The market cannot sustain so many independent software vendors (ISVs) for databases. The only path to continue forward for these companies with billion-dollar valuations is going IPO or bankrupt. They are too expensive for acquisition (unless the VCs are willing to take massive cuts) for most companies. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Furthermore, the major tech companies (e.g., Amazon, Google, Microsoft) that do large M&A\u2019s already have their own cloud database offerings. Hence, it is not clear who will acquire these database start-ups. It does not make sense for Amazon to buy Clickhouse at their \", /*#__PURE__*/e(o, {\n          href: \"https://clickhouse.com/blog/click-house-raises-a-250m-series-b-at-a-2b-valuationand-we-are-hiring\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2021 $2b valuation \"\n          })\n        }), \"when they are already making billions per year from Redshift. This problem is not exclusive to OLAP database companies; OLTP database companies will face the same issue soon.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I am not the only one making such dire predictions about the fate of database start-ups. Gartner analysts predict that \", /*#__PURE__*/e(o, {\n          href: \"https://blogs.gartner.com/andrew_white/2021/01/12/our-top-data-and-analytics-predicts-for-2021/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"50% of independent DBMS vendors will go out of business\"\n          })\n        }), \" by 2025. I am obviously biased, but I think the companies that will survive will be the ones that work in front of DBMSs to improve/enhance them rather than replace them (e.g., dbt, ReadySet, Keebo, and OtterTune).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I cannot comment on whether the SPAC \u201Cspeedrun to IPO\u201D method, like what MariaDB did, is a good idea. Such financial instruments are outside of my area of expertise (i.e., databases). But since it is the \", /*#__PURE__*/e(o, {\n          href: \"https://gizmodo.com/trump-truth-social-spac-merger-twitter-1849813269\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"same thing\"\n          })\n        }), \" the previous US president is doing with his social media company, I assume that it\u2019s probably shady AF.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Blockchain databases are still a stupid idea\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There have been wild claims about how \", /*#__PURE__*/e(o, {\n          href: \"https://www.nytimes.com/2021/12/05/business/dealbook/what-is-web3.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"web3\"\n          })\n        }), \" represents a radical change in how people will build new applications. I had a \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/uikbtpVZS2s?t=1490\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"student storm out of my class\"\n          })\n        }), \" because I was teaching relational databases instead of web3. The core tenet of the web3 movement is storing state in a blockchain database. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Blockchains are essentially decentralized log-structured databases (i.e., ledger) that maintain incremental checksums using some variation of \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Merkle_tree\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Merkle trees\"\n          })\n        }), \" and a BFT consensus protocol to determine the next update to install into the database. These incremental checksums are how a blockchain ensures that the database\u2019s log records are immutable: clients use these checksums to verify that previous database updates are not altered.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Blockchains are a clever amalgamation of previous ideas. But the belief that a decentralized ledger is how everyone should build their OLTP applications is \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/jimmy_wales/status/1226868636020805632\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"misguided\"\n          })\n        }), \". From a database perspective, they have nothing to offer over existing DBMS technologies for any practical use-case other than cryptocurrencies. Furthermore, any claim that blockchains provide better security and auditability in databases over existing DBMSs is simply wrong.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"So if cryptocurrency was the best-case scenario for blockchain databases, it did not help that the crypto market crashed in 2022, which just further hindered their future. I\u2019ll ignore the collapse of FTX for this discussion because it appears to be straight-up fraud and has nothing to do with databases. I will point out, however, that FTX, like all other crypto exchanges, didn\u2019t run their business on a blockchain database and instead \", /*#__PURE__*/e(o, {\n          href: \"https://discuss.systems/@andy_pavlo/109507691859803604\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"used PostgreSQL\"\n          })\n        }), \". \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But other blockchain database use cases not related to cryptocurrencies, like \", /*#__PURE__*/e(o, {\n          href: \"https://www.forbes.com/sites/michaeldelcastillo/2022/11/16/seminal-blockchain-project--goes-down-the-drain-chairman-apologizes/?sh=694d292817d3\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"trading\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://coingeek.com/axie-infinity-left-thousands-of-filipino-players-in-debt-and-now-they-are-leaving-the-game/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"gaming\"\n          })\n        }), \" platforms, have fizzled out due to their impracticality or scams.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy's take\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"One rule to follow when assessing a technology is that it is no longer \u201Cnew\u201D once IBM makes a television commercial about it. This means if there is no compelling use case for something by the time IBM starts advertising about it, then there will never be one. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For example, IBM was touting Linux as a hot new thing in a \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/fJA9eiUktcA\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2002 commercial\"\n          })\n        }), \", but thousands of companies were already using it as their primary server OS by then (including \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/History_of_Google#Beginnings\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Google\"\n          })\n        }), \"). So when IBM put out their \", /*#__PURE__*/e(o, {\n          href: \"https://www.facebook.com/IBM/videos/ibm-blockchain-is-the-blockchain-built-for-smarter-business/10216050406397964/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"blockchain commercial in 2018\"\n          })\n        }), \", I knew that the technology was going nowhere beyond cryptocurrencies because there was not a problem that a decentralized blockchain could solve that a centralized DBMS could not. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"And it\u2019s not surprising that IBM announced this year they were shutting down their \", /*#__PURE__*/e(o, {\n          href: \"https://www.wsj.com/articles/blockchain-fails-to-gain-traction-in-the-enterprise-11671057528\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"supply chain IT infrastructure overhaul project\"\n          })\n        }), \" with shipping magnate Maersk (the same thing they hyped in their commercial).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Blockchains are horribly inefficient compared to a well-written transactional DBMS controlled by a trusted authority that only allows trusted clients to connect directly. Almost every real-world interaction works this way except cryptocurrencies (see above) or illicit activities like \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/ib1zWLrUHCc\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"trapping\"\n          })\n        }), \". \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are required to trust others to have a functioning society. For example, I authorize the company that hosts the OtterTune website to charge our credit card, and they trust a cloud provider to host their software. Nobody needs a blockchain database for these transactions.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Switching from a proof-of-work (PoW) to a less energy-intensive \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2022/09/15/ethereum-switches-to-proof-of-stake-consensus-after-completing-the-merge/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"proof-of-stake\"\n          })\n        }), \" (PoS) consensus mechanism does improve the performance of blockchain databases. But that only affects the database\u2019s throughput; blockchain transaction latencies are still measured in tens of seconds. If the solution to these long latencies is to use a PoS blockchain with fewer participants, then the application is better off just using PostgreSQL and authenticating those participants.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"See this \", /*#__PURE__*/e(o, {\n          href: \"https://www.tbray.org/ongoing/When/202x/2022/11/19/AWS-Blockchain\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"great article from Tim Bray\"\n          })\n        }), \" about internal discussions he had with AWS top brass about whether there was a viable use case for blockchains. Note that he says AWS concluded in 2016 that blockchain databases were a solution looking for a problem, two years before IBM came out with their commercial! \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"And although AWS did eventually release its \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/qldb/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"QLDB\"\n          })\n        }), \" service in 2018, it is not the same thing as a blockchain; it is a centralized verifiable ledger that does not use BFT consensus. Customer adoption of QLDB has been less than stellar, especially compared to Amazon\u2019s wildly successful Aurora offerings.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Side Comment #1: \"\n        }), \"I recently participated in a \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/RaceCapital/status/1582425316144087041\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"panel discussion at an SFO conference\"\n          })\n        }), \" where SBF also flew in from the Bahamas to appear. I stuck around to see his talk. The audience went wild when \", /*#__PURE__*/e(o, {\n          href: \"https://mobile.twitter.com/RaceCapital/status/1582471176869539840\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"SBF arrived on the stage\"\n          })\n        }), \". My contemporary Slack messages indicate I was not impressed with SBF\u2019s \u201Cyep\u201D responses to the moderator\u2019s questions.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Side Comment #2:\"\n        }), \" Three weeks before FTX imploded, somebody pointed out to \", /*#__PURE__*/e(o, {\n          href: \"https://www.linkedin.com/in/dana-van-aken-b7337113b/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Dana Van Aken\"\n          })\n        }), \" and me that OtterTune had the same number of full-time engineers as FTX\u2019s team in the Bahamas. This person then told us that since we had the same number of engineers, OtterTune should be more agile/aggressive like FTX and have $1b in ARR by now. Oops.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"New database systems\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This year there were several major announcements for new DBMS software.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://cloud.google.com/alloydb\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Google AlloyDB\"\n              })\n            }), \": The biggest bombshell this year was when Google Cloud announced its new database service in May. Instead of building on top of Spanner, AlloyDB is a modified version of PostgreSQL that separates its compute and storage layers and supports WAL record processing directly in storage.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://www.snowflake.com/en/data-cloud/workloads/unistore/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Snowflake Unistore\"\n              })\n            }), \": In June, Snowflake \", /*#__PURE__*/e(o, {\n              href: \"https://www.theregister.com/2022/06/22/snowflake_unistore_analysis/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"announced\"\n              })\n            }), \" their new Unistore engine with \u201Chybrid tables\u201D to support lower latency transactions for DML operations. When queries update a table, the changes get propagated to Snowflake\u2019s columnar storage. Somebody at SingleStore got a \", /*#__PURE__*/e(o, {\n              href: \"https://twitter.com/DomenicRavita/status/1537261233858138112\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"little feisty\"\n              })\n            }), \" and mentioned that they have some patents around this space, but nothing has come of it.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://www.oracle.com/mysql/heatwave/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"MySQL Heatwave\"\n              })\n            }), \": After Oracle realized that Amazon makes more money off of MySQL than they do, they finally decided to build their own cloud offering for MySQL in 2020. But instead of just making an RDS clone, they extended MySQL with an in-memory vectorized OLAP engine called Heatwave. Last year Oracle announced that their MySQL service also supports \", /*#__PURE__*/e(o, {\n              href: \"https://blogs.oracle.com/mysql/post/mysql-autopilot-machine-learning-automation-for-mysql-heatwave\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"automated database optimizations\"\n              })\n            }), \" (but different from what OtterTune provides). This year, Oracle finally realized that \", /*#__PURE__*/e(o, {\n              href: \"https://clouddb.substack.com/i/66819578/oracle-touts-multi-cloud-then-the-layoffs-begin\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"they are not the leading cloud vendor\"\n              })\n            }), \" and relented to support \", /*#__PURE__*/e(o, {\n              href: \"https://www.oracle.com/news/announcement/mysql-heatwave-on-aws-2022-09-12/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"MySQL Heatwave on AWS\"\n              })\n            }), \".\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://velox-lib.io/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Velox\"\n              })\n            }), \": Meta started building Velox as a new execution engine for PrestoDB in 2020. Two years later, they \", /*#__PURE__*/e(o, {\n              href: \"https://engineering.fb.com/2022/08/31/open-source/velox/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"announced the project\"\n              })\n            }), \" and published a \", /*#__PURE__*/e(o, {\n              href: \"https://research.facebook.com/publications/velox-metas-unified-execution-engine/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"VLDB paper\"\n              })\n            }), \" about it. Velox is not a full DBMS: it does not come with a SQL parser, catalog, optimizer, or networking support. Instead, it\u2019s a C++ extensible execution engine with a memory pool and storage connectors. One could use Velox to build a full-fledged DBMS around it.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://www.influxdata.com/blog/influxdb-engine/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"InfluxDB IOx\"\n              })\n            }), \": Like Meta with Velox, the Influx squad has been working on their new IOx engine for the past two years. They finally \", /*#__PURE__*/e(o, {\n              href: \"https://www.influxdata.com/blog/influxdb-engine/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"announced\"\n              })\n            }), \" they went to GA with their new engine in October. InfluxDB built IOx from scratch based on \", /*#__PURE__*/e(o, {\n              href: \"https://arrow.apache.org/datafusion/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"DataFusion\"\n              })\n            }), \" and Apache Arrow. Thankfully they also ditched MMAP in their new system after I warned Influx\u2019s CTO in 2017 that using \", /*#__PURE__*/e(o, {\n              href: \"https://twitter.com/andy_pavlo/status/1395569792979976193\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"MMAP was a bad idea\"\n              })\n            }), \".\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy's take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Databases are the \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/uikbtpVZS2s?t=156\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"second most important thing in my life\"\n          })\n        }), \", so I enjoy seeing all the developments in the last year.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"My hot take on AlloyDB is that it is a neat system, and an impressive amount of engineering went into it, but I still don\u2019t know what is novel about it yet. AlloyDB\u2019s architecture is similar to Amazon Aurora and \", /*#__PURE__*/e(o, {\n          href: \"https://neon.tech/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Neon\"\n          })\n        }), \", where the DBMS storage has an additional compute layer to process WAL records independently of the compute nodes. Despite already having a solid database portfolio (e.g., Spanner, BigQuery), Google Cloud felt the need to build AlloyDB to try to catch up with Amazon and Microsoft.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The long-term trend to watch is the proliferation of frameworks like Velox, DataFusion, and \", /*#__PURE__*/e(o, {\n          href: \"https://www.pola.rs/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Polars\"\n          })\n        }), \". Along with projects like \", /*#__PURE__*/e(o, {\n          href: \"https://substrait.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Substrait\"\n          })\n        }), \", the \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1523666179247595520\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"commoditization\"\n          })\n        }), \" of these query execution components means that all OLAP DBMSs will be roughly equivalent in the next five years. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Instead of building a new DBMS entirely from scratch or hard forking an existing system (e.g., how Firebolt forked Clickhouse), people are better off using an extensible framework like Velox. This means that every DBMS will have the same vectorized execution capabilities that were unique to Snowflake ten years ago. And since in the cloud, the storage layer is the same for everyone (e.g., Amazon controls EBS/S3), the critical differentiator between DBMS offerings will be things that are difficult to quantify, like UI/UX stuff and query optimization.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"The loss of a database pioneer\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"On a more somber note, we lost \", /*#__PURE__*/e(o, {\n          href: \"https://www.cwi.nl/news/2022/in-memoriam-martin-kersten\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Martin Kersten\"\n          })\n        }), \" in July 2022. Martin was a researcher at \", /*#__PURE__*/e(o, {\n          href: \"https://www.cwi.nl/research/groups/database-architectures\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"CWI\"\n          })\n        }), \" that was a leader on several influential database projects, including one of the first distributed in-memory DBMSs in the 1990s (\", /*#__PURE__*/e(o, {\n          href: \"https://research.utwente.nl/en/publications/prismadb-a-parallel-main-memory-relational-dbms\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PRISMA/DB\"\n          })\n        }), \") and one of the first columnar OLAP DBMS in the 2000s (\", /*#__PURE__*/e(o, {\n          href: \"https://www.monetdb.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MonetDB\"\n          })\n        }), \"). Martin was awarded \", /*#__PURE__*/e(o, {\n          href: \"https://www.cwi.nl/news/2020/cwi-fellow-martin-kersten-receives-royal-decoration\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"a royal knighthood by the Dutch government in 2020\"\n          })\n        }), \", specifically for his work on databases.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The MonetDB codebase was a springboard for several other OLAP system projects. In the late 2000s, Peter Boncz and Marcin \u017Bukowski forked it to make \", /*#__PURE__*/e(o, {\n          href: \"https://www.cidrdb.org/cidr2005/papers/P19.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MonetDB/X100\"\n          })\n        }), \", which then was commercialized as \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Vectorwise\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Vectorwise\"\n          })\n        }), \" (now known as \", /*#__PURE__*/e(o, {\n          href: \"https://www.actian.com/analytic-database/vector-analytic-database/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Actian Vector\"\n          })\n        }), \"). Marcin then went off to co-found Snowflake using a lot of the techniques that he developed on the original MonetDB code. More recently, Hannes M\\xfchleisen created an embedded version of MonetDB called \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/MonetDB/MonetDBLite-R\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MonetDBLite\"\n          })\n        }), \", which he then rewrote again into what is now DuckDB.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Martin\u2019s contribution to modern database systems cannot be overstated. If you use any modern analytical DBMS (e.g., Snowflake, Redshift, BigQuery, Clickhouse), then you are benefiting from many of the advancements developed by Martin and his students over the last 30 years.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy's take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I acknowledge that Martin was probably not well known to people outside the database research community compared to people like Mike Stonebraker. I always thought of Martin as the European version of Stonebraker: they are both prolific database researchers that are tall, thin, wear glasses, and are about the same age. But Martin is \", /*#__PURE__*/e(\"strong\", {\n          children: \"not\"\n        }), \" some off-brand knockoff like a \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/AustinJohnPlays/status/1208391845253984256\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Nintendo Smitch\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Beyond the research, Martin was always generous with his time and eager to discuss database architectures with anyone. I last saw him at VLDB 2019 before the pandemic. He and I argued for almost an hour about why he felt that using MMAP in MonetDB was the right choice; he claimed that because MonetDB focuses on read-only OLAP workloads, then MMAP was good enough. I felt terrible because he also had to deal with students watching my database courses on Youtube and then emailing him about why MonetDB made design choices that I claim were inferior.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I encourage you to watch one of the \", /*#__PURE__*/e(o, {\n          href: \"https://www.youtube.com/watch?v=vjWRE0UnJDQ&list=PLSE8ODhjZXjbeqnfuvp30VrI7VXiFuOXS&index=18\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last talks\"\n          })\n        }), \" Martin gave in 2021 for our CMU-DB Seminar Series. I promised Martin I wouldn\u2019t derail his talk by complaining about MonetDB\u2019s use of \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/mmap-cidr2022/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MMAP\"\n          })\n        }), \". But if you watch the first 60 seconds, you will see I hired a Dutch person to record a \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1547748253512347648\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"fake royal intro for Martin\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Using A database fortune to save democracy\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"I always want to end my year-end retrospective articles on a happy note. Databases are supposed to make people feel good about their lives. They represent the culmination of scientific and engineering breakthroughs that enable us to organize data about any facet of modern life. Given this, my last story should make everyone feel good. It is an example of somebody doing the right thing for the right reason.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In May 2022, the Washington Post \", /*#__PURE__*/e(o, {\n          href: \"https://www.washingtonpost.com/politics/2022/05/20/larry-ellison-oracle-trump-election-challenges/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"reported\"\n          })\n        }), \" that Larry Ellison, Oracle founder and sailing enthusiast, participated in a November 2020 conference call with the US president and other conservative leaders about the recently completed election.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The call focused on different strategies that the president\u2019s allies and roustabouts could employ to overturn the results of the presidential election. As the Post\u2019s article points out, it is unclear why the administration included Larry on the call. One speculation is that given Larry\u2019s obvious strong technical background, he might be in a good position to assess whether the allegations of using \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Italygate\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Italian satellites to manipulate air-gapped voting machines\"\n          })\n        }), \" are legitimate.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy's take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Both Larry and I are sick of people making outlandish claims about his support for right-wing causes in the US. Some have even said this one phone call is the worst thing Larry has ever done. This is not true, and I personally know that it hurts Larry to read such statements about himself in the news and on social media. These journalists made it sound like Larry was doing something nefarious or indecent, like the time he made his \", /*#__PURE__*/e(o, {\n          href: \"https://www.google.com/books/edition/The_Difference_Between_God_and_Larry_Ell/oqK4tzQ0xBoC?hl=en&gbpv=1&bsq=prenuptial\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pregnant third wife sign a prenup two hours before their wedding\"\n          })\n        }), \". \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I can assure you that Larry was only trying to use his vast wealth as the \", /*#__PURE__*/e(o, {\n          href: \"https://www.bloomberg.com/billionaires/profiles/lawrence-j-ellison/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"7th richest person in the world\"\n          })\n        }), \" to help his country. His participation in this call is admirable and should be lauded. Free and fair elections are not a trivial affair, like a \", /*#__PURE__*/e(o, {\n          href: \"https://www.reuters.com/article/us-sailing-americascup-cheating/oracle-hit-with-unprecedented-penalties-for-americas-cup-cheating-idUSBRE98211Y20130904\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"boat race\"\n          })\n        }), \" where sometimes shenanigans are okay as long as you win. Larry has done other great things with his money that are overlooked, like spending \", /*#__PURE__*/e(o, {\n          href: \"https://www.newyorker.com/magazine/2017/04/03/silicon-valleys-quest-to-live-forever\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$370m on anti-aging research\"\n          })\n        }), \" so that he can live forever and investing \", /*#__PURE__*/e(o, {\n          href: \"https://www.businessinsider.com/elon-musk-texted-larry-ellison-before-twitter-deal-hold-2022-9\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$1b to help Elon Musk\"\n          })\n        }), \" run(?) Twitter. So I stand by Larry\u2019s actions in this example.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Next year is going to be lit\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For me personally, there were a lot of changes in 2022:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"OtterTune raised our \", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"databases-pandemic-funding\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"series A\"\n              })\n            }), \" in April.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"My #1 Ph.D. student \", /*#__PURE__*/e(o, {\n              href: \"https://twitter.com/Lin_Ma_/status/1529173307471417345\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"joined the University of Michigan\"\n              })\n            }), \" as a new database professor.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"I was indefinitely \u201Cnot fired\u201D from Carnegie Mellon University in July (although I am still bound by the university\u2019s \", /*#__PURE__*/e(o, {\n              href: \"https://www.cmu.edu/policies/faculty/appointment-and-tenure-policy.html#dismissal\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"\u201Cmoral turpitude\u201D clause\"\n              })\n            }), \" for tenured faculty).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"I returned to \", /*#__PURE__*/e(o, {\n              href: \"https://www.youtube.com/playlist?list=PLSE8ODhjZXjaKScG3l0nuOiDTTqpfnWFf\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"teaching full-time\"\n              })\n            }), \" in September.\"]\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I also contracted four non-COVID sinus infections from my \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1202619686485200896\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"biological daughter\"\n          })\n        }), \" after she started preschool.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I am excited about where OtterTune is going next year. We plan to announce a complete rewrite of our database automation service in the first half of 2023. I have posted \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1598789316616294400\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"previews of the new features\"\n          })\n        }), \" that we are working on now. We also had some legal issues with our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.bandcamp.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"record label\"\n          })\n        }), \" due to transporting otters across state lines, but we\u2019ve sorted out that mess and hope to release new albums in 2023.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"P.S.: As always, please don\u2019t forget to run \", /*#__PURE__*/e(\"code\", {\n          children: /*#__PURE__*/e(o, {\n            href: \"https://ottertune.com/blog/run-postgresql-analyze/\",\n            openInNewTab: !1,\n            smoothScroll: !1,\n            children: /*#__PURE__*/e(\"a\", {\n              children: \"ANALYZE\"\n            })\n          })\n        }), \" on your databases over the holidays. Or let OtterTune \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"egEhCCRg_\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"automatically figure it out\"\n          })\n        }), \" for you.\"]\n      })]\n    })\n  }, {\n    id: \"YkuArz3Lc\",\n    [c]: \"OtterTune v1.5\",\n    [d]: \"ottertune-v1-5\",\n    [u]: \"2022-12-14T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/VVWaRTs6pMwvCvhpyXMwdK6SdU.png\",\n      srcSet: \"https://framerusercontent.com/images/VVWaRTs6pMwvCvhpyXMwdK6SdU.png?scale-down-to=512 512w, https://framerusercontent.com/images/VVWaRTs6pMwvCvhpyXMwdK6SdU.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/VVWaRTs6pMwvCvhpyXMwdK6SdU.png 1474w\"\n    }, \"dj ot on stoop with boombox\"),\n    [m]: \"What's new in OtterTune v1.5? User approval of configuration changes; health checks for indexes, configuration, database tables, and autovacuum; and new performance insights.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Open-source databases are blowing up. (Trust us \u2013 this is a good thing.) And OtterTune is keeping up.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our new software release, OtterTune v1.5 (\", /*#__PURE__*/e(o, {\n          href: \"https://www.prnewswire.com/news-releases/ottertune-v1-5-adds-management-features-and-health-checks-for-database-optimization-301703174.html?tc=eml_cleartime\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"press release here\"\n          })\n        }), \"), includes all the good things we were able to implement in 2022, including: human in the loop capability for user approval of configuration changes; health checks for indexes, configuration, database tables, and autovacuum; and new performance insights.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune is available through the \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/marketplace/pp/prodview-rwj6bldwozrea?sr=0-1&ref_=beagle&applicationId=AWSMPContessa\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS Marketplace\"\n          })\n        }), \", where users can pay for the service with AWS credits, as well as the \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune website\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Our Database Insights + Health Checks Overview feature gives you a view of your database instance\u2019s status at a glance.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune database insights\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,aO6aK8qlMHuhyJbo8hjsIRUfEr0.jpg\",\n        \"data-framer-height\": \"634\",\n        \"data-framer-width\": \"1014\",\n        height: \"317\",\n        src: \"https://framerusercontent.com/images/aO6aK8qlMHuhyJbo8hjsIRUfEr0.jpg\",\n        style: {\n          aspectRatio: \"1014 / 634\"\n        },\n        width: \"507\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And OtterTune is now much easier to install. OtterTune v1.5 is integrated with the Okta single sign-on platform; with CloudFormation and Terraform for installation; and both email and Slack for alerts. OtterTune is now SOC 2 compliant.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As our friends know, and our rivals fear, OtterTune makes and recommends changes iteratively; results often improve steadily as OtterTune tracks changes in database updates and queries. The service is available for MySQL and PostgreSQL on \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS\"\n          })\n        }), \" and, more recently, \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/aurora/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Aurora\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/aurora/serverless/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Aurora Serverless\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Users can connect an initial database instance for free; enhanced tuning options and additional instances can be connected for $110 per month per instance directly from the website, or under contract for more flexible terms. (Buy now; that number may not be so low in the New Year. We\u2019re just sayin\u2019.)\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune uses a local agent (which is not a secret agent \u2013 it\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"open source software\"\n          })\n        }), \") to gather database and query metadata. OtterTune uses this data to recommend, or directly make changes to a database instance\u2019s configuration, indexes, and queries. For both PostgreSQL and MySQL, OtterTune now helps users tune for P99 query latency.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These dank beats, and more, add to the original OtterTune feature set: the use of machine learning to improve your configuration settings (\u201Cknobs\u201D); version tracking for configurations; tuning schedules; and tight integration with PostgreSQL and MySQL for Amazon RDS. \"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What we\u2019ve learned since launch\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Since \", /*#__PURE__*/e(o, {\n          href: \"https://www.prnewswire.com/news-releases/ottertune-launches-to-improve-database-performance-through-automated-database-configuration-tuning-301289311.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"our launch\"\n          })\n        }), \" in May of this year, our customers have taught us about life out there in database land. They mostly don\u2019t put cost first; performance is #1 with most of these hard cases. Of course, it\u2019s a trade-off \u2013 more expensive hardware should get you better performance \u2013 but we see fast query response as being vitally important to our crew.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"At the same time, the snakes on this particular plane are rising cloud costs. Cloud providers are getting hit with inflation, especially higher energy costs, especially in the UK and Europe. So we will be seeing price increases in 2023, just as companies want to tighten their belts in the face of possible hard times.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Customers also want to know that their database instances are operating well and at peak efficiency all the time. Once they get the 411, they will take action where needed. And finally, OtterTune users want easy installation.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune v1.5 meets all these requirements. For instance, there\u2019s a smooth onboarding experience and the ability to tune for P99 query latency, and even more improvements on the drawing board. Future releases of OtterTune will be more interactive and will help to optimize a broader range of database functionality.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And we find that customers want more ways to engage with OtterTune:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(o, {\n              href: \"https://ottertune.com/pricing/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Do-it-yourself purchase and installation\"\n              })\n            }), \", our initial focus, remains popular.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Users with several OtterTuned instances often prefer to \", /*#__PURE__*/e(o, {\n              href: \"https://ottertune.com/pricing\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"move to contract\"\n              })\n            }), \" \u2013 and some prefer to start that way.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"The \", /*#__PURE__*/e(o, {\n              href: \"https://aws.amazon.com/marketplace/pp/prodview-rwj6bldwozrea?sr=0-1&ref_=beagle&applicationId=AWSMPContessa\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"AWS Marketplace\"\n              })\n            }), \" is an important addition to our payment availability options.\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"OtterTune basics\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When it comes to configuration, both PostgreSQL and MySQL are playing the dozens \u2013 dozens of configuration options, known as knobs, which control the operation of each database. Knob values can greatly improve or hinder database operation.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The automatic changes and user recommendations that OtterTune delivers can achieve price/performance improvements of up to 2x compared to unoptimized databases. When users try to hand-tune knobs themselves, they take a lot of time, have to consult contradictory sources, and can even do more harm than good. Users who have OtterTune know that their database optimization is in good hands.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This screenshot shows the Unused Instances Health Check, which helps you find \u2013 you guessed it \u2013 instances that get no traffic.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune unused instances health check\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,2LTFAnNyleKJgfwRNKS74e7pRhU.jpg\",\n        \"data-framer-height\": \"985\",\n        \"data-framer-width\": \"835\",\n        height: \"492\",\n        src: \"https://framerusercontent.com/images/2LTFAnNyleKJgfwRNKS74e7pRhU.jpg\",\n        style: {\n          aspectRatio: \"835 / 985\"\n        },\n        width: \"417\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"All that\u2019s new in v1.5\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Since OtterTune\u2019s launch in May 2021, we have added product features in eight areas. As of OtterTune v1.5, available today, major feature improvements include:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Improved installation\"\n            }), \". The setup process is much easier now. OtterTune can use CloudFormation and Terraform templates for installation and/or provisioning; Okta for self-service registration; and Kubernetes manifests for deploying the OtterTune agent.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Integrations\"\n            }), \". OtterTune works with Slack for alerting when our algorithms generate a new configuration for your database.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Now with more database services\"\n            }), \". OtterTune has added Amazon Aurora and Amazon Aurora Serverless support in addition to stock Amazon RDS for PostgreSQL and MySQL.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Supported database versions\"\n            }), \". Added support for PostgreSQL 14.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Agent\"\n            }), \". The OtterTune Agent now collects anonymized query statistics, query digests, and some anonymized schema info.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Tuning objectives\"\n            }), \". Tuning can now address \", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"query-latency-vs-thoughput\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"99th percentile (p99) query latency\"\n              })\n            }), \" as well as CPU utilization.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Tuning management\"\n            }), \". OtterTune now includes customizable tuning schedules for when automatic optimizations are made; configuration versioning under end user control; human-in-the-loop user approval of knob changes; rating of different OtterTune configurations vs. the (original) baseline price/performance; and the ability to manage the user\u2019s OtterTune subscription from the Account Settings page in the software.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Health checks\"\n            }), \". OtterTune has added a wide range of database health checks, including performance and workload insights; memory utilization and resource under-utilization checks; table-level statistics; index statistics and health; vacuum health for PostgreSQL on RDS and Aurora; database event analysis; and improvements to troubleshooting and error handling.\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This screenshot shows OtterTune\u2019s autovacuum Health Check, which helps make sure that the database instance is receiving sufficient vacuuming attention to keep performance high \u2013 without running the vacuum so often that the vacuuming process itself causes an undue hit on performance.\\xa0\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune autovacuum health check\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,ODXOlvQrXDHuOkAPYWTxIO1xiD8.jpg\",\n        \"data-framer-height\": \"606\",\n        \"data-framer-width\": \"994\",\n        height: \"303\",\n        src: \"https://framerusercontent.com/images/ODXOlvQrXDHuOkAPYWTxIO1xiD8.jpg\",\n        style: {\n          aspectRatio: \"994 / 606\"\n        },\n        width: \"497\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Data security and privacy\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Security and privacy are a key concern for OtterTune. OtterTune uses an open source agent to gather metadata about databases and queries, with query specifics anonymized; no database or query content is included in the information that OtterTune gathers.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To assure themselves about what OtterTune gathers and doesn\u2019t gather, and how OtterTune uses the information, customers can:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Inspect the \", /*#__PURE__*/e(o, {\n              href: \"https://github.com/ottertune/ot-agent\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"agent source code\"\n              })\n            }), \".\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Modify (if needed), compile, and run the agent themselves.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Monitor traffic between the agent and OtterTune.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Review \", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"we-got-our-soc-2-type-ii-report\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"OtterTune\u2019s SOC 2 Type II certification\"\n              })\n            }), \".\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Reach out to OtterTune to create a custom plan that specifies and limits what information the OtterTune agent is allowed to gather (verifiable by inspecting the agent source code).\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Future releases of OtterTune are expected to offer specific security improvements for databases running the service.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How to learn more\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For full information about OtterTune, see our \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"full documentation\"\n          })\n        }), \". And our \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"Owida8HbZ\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"homepage\"\n          })\n        }), \" gives a overview of the product.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To try OtterTune for yourself, visit our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Pricing page\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are also gathering user requirements for a brand new OtterTune coming in early 2023! The next version of OtterTune is going to go beyond just optimizing your database for performance or cost. It is going to provide you with 24/7 automation of your database so that you can sleep better at night knowing that OtterTune\u2019s advanced AI algorithms are watching your database at all times.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This release will help optimize an even wider range of database functionality and will further increase interactivity with OtterTune\u2019s capabilities. So if you have questions about our product, or feature requests, please \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/contact/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"contact OtterTune\"\n          })\n        }), \".\"]\n      })]\n    })\n  }, {\n    id: \"RviMtVtLw\",\n    [c]: \"Postgres is on the rise\",\n    [d]: \"postgres-is-on-the-rise\",\n    [u]: \"2022-12-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/01jItAKxv2fUCQohW9ma9dBvAM.png\",\n      srcSet: \"https://framerusercontent.com/images/01jItAKxv2fUCQohW9ma9dBvAM.png?scale-down-to=512 512w, https://framerusercontent.com/images/01jItAKxv2fUCQohW9ma9dBvAM.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/01jItAKxv2fUCQohW9ma9dBvAM.png 1112w\"\n    }, \"dj ot sitting on database with computer\"),\n    [m]: \"Postgres is moving on up! But why? In this blog post, we pull together some of the most important reasons.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Postgres is moving on up! But why? In this blog post, we pull together some of the most important reasons \u2013 and show you how OtterTune can help improve one of the few important gaps in the Postgres story.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The origins of Postgres date back to 1986. It started as the POSTGRES project at Cal, led by Professor \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Michael_Stonebraker\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Michael Stonebraker\"\n          })\n        }), \", and now has more than 35 years of active development. Thanks to the dedicated, vendor-neutral community that continues to improve it, Postgres is on the rise.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://twitter.com/ahachete/status/1582864087720960003/photo/1\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OnGres founder \\xc1lvaro Hern\\xe1ndez charts it\"\n          })\n        }), \": Postgres continues to climb the rankings compared to other established relational databases.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"DB-Engines charts the popularity of databases, based on \", /*#__PURE__*/e(o, {\n          href: \"https://db-engines.com/en/ranking\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"a number of components\"\n          })\n        }), \". \", /*#__PURE__*/e(o, {\n          href: \"https://www.techtarget.com/whatis/definition/data-gravity#:~:text=Data%20gravity%20is%20the%20ability,(the%20amount%20of%20data).\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Data has gravity\"\n          })\n        }), \", so the rankings tend to change slowly. (And commercial databases, unlike open source Postgres, have sales and marketing teams to promote them.) But Postgres has rocketed upward, relatively speaking, going from the sixth most popular database in 2012 to the fourth most popular in 2022.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The Postgres renaissance, especially during the last five years, continues as strong as ever due to \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/TanelPoder/status/1580464443271434240\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"several factors\"\n          })\n        }), \": Postgres\u2019 rich set of features, mixing object storage and relational capabilities; its extensibility; and its status as an open source project, with a \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/about/licence/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"permissive open source license\"\n          })\n        }), \", giving users the right to use, copy, modify, and distribute the software and documentation for any purpose. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Part of the reason the licensing is so important is that it allows private companies, including the cloud providers, to sell Postgres upstream (the unchanged open source code) and derivatives without permission or fees.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Scalability, familiarity\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Another factor fueling Postgres\u2019 ongoing resurgence is its ability to scale horizontally to meet the demands of giants like \", /*#__PURE__*/e(o, {\n          href: \"https://www.datanami.com/2022/05/11/google-cloud-launches-new-postgres-compatible-database-alloydb/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Google\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/free/database/?trk=83add82a-8e52-4837-bc73-c323da62d78c&sc_channel=ps&s_kwcid=AL!4422!3!610000101555!e!!g!!aws%20postgre%20sql&ef_id=Cj0KCQiA99ybBhD9ARIsALvZavVCRQX2udpbtVOomzPgvRkneGmUS0taj6TF27ttZlpxexAC8iKhmJwaAmV2EALw_wcB:G:s&s_kwcid=AL!4422!3!610000101555!e!!g!!aws%20postgre%20sql\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon\"\n          })\n        }), \". That wasn\u2019t always the case for Postgres \u2013 or for most other relational databases, for that matter. But with \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/citusdata\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Citus\"\n          })\n        }), \", an open-source extension to Postgres, it\u2019s now easy to scale out Postgres across multiple nodes and intelligently distribute transactions and SQL queries to get massive parallelism.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"An important reason that Postgres is popular with developers is that there are few surprises. \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/elijah_zupancic/status/937784649509584896\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Elija Zupancic\"\n          })\n        }), \", Director of Solutions Engineering at Joyent, cites great documentation, a wealth of relational database experience among developers, and familiar data types as the reasons Postgres is a \u201Cpleasure to use.\u201D Postgres is also thriving because the datasets are \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/kangadac/status/1582829104780701696\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"obscenely relational\"\n          })\n        }), \"\u201D \u2013 and there are benefits to database consistency.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Low cost never goes out of style\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Perhaps the most important factor in Postgres\u2019 popularity is cost. Many companies are migrating their databases from expensive legacy DBMSs like Oracle to less expensive open source alternatives such as Postgres and MySQL. \", /*#__PURE__*/e(o, {\n          href: \"https://www.enterprisedb.com/blog/gartners-state-open-source-dbms-market-2019\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"According to Gartner\"\n          })\n        }), \", 70% of greenfield application development projects by 2022 are built on open source DBMSs instead of costly legacy databases.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Open source licensing is a lot less expensive than Oracle licensing. Oracle costs roughly $47,500 per CPU versus $0 for Postgres open source, or a few thousand dollars per CPU for commercially supported versions. Here\u2019s a \", /*#__PURE__*/e(o, {\n          href: \"https://dzone.com/articles/postgresql-vs-oracle-difference-in-costs-ease-of-u\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"comparison\"\n          })\n        }), \" of the costs, ease-of-use, and functionality.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Valid concerns\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Can you really rely on the open-source community and the Postgres community to fix bugs and get new features implemented? \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Yes\"\n          })\n        }), \". More than 35 years of active development has earned Postgres a strong reputation for reliability, feature robustness, and performance. Another concern for people familiar with Oracle: they often think Postgres has a steep learning curve. They wonder if it has detailed documentation (\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"it does\"\n          })\n        }), \") \u2013 but especially for beginners, it may still seem daunting.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Can you configure and tune Postgres?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The other big question is whether you can tune Postgres to optimize its performance. After all, there\u2019s no single company behind open source Postgres to help you tune it for each specific situation you use Postgres in.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This is where OtterTune comes in. OtterTune uses machine learning to automatically and expertly configure Postgres (and MySQL) for you.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Significant benefits can be realized by tuning the configuration settings for Postgres to fit your specific needs. However, with hundreds of settings to consider, most database users must rely on time-consuming trial and error tuning or boilerplate configuration settings that can leave databases well short of optimal performance. In contrast, OtterTune\u2019s machine learning-based system automates tuning and continually adjusts the configuration to optimize the database for its specific, evolving workload.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Proof OtterTune can help\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We ran a test that compared TPC-C benchmark performance for:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Oracle using default configuration.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Oracle tuned by OtterTune.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Postgres default config.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Postgres tuned by OtterTune.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresl ottertune vs oracle vs rds default\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,8VpJyyZYMrFosqpuV2Oi6LSs.png\",\n        \"data-framer-height\": \"485\",\n        \"data-framer-width\": \"707\",\n        height: \"242\",\n        src: \"https://framerusercontent.com/images/8VpJyyZYMrFosqpuV2Oi6LSs.png\",\n        style: {\n          aspectRatio: \"707 / 485\"\n        },\n        width: \"353\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The results show that OtterTune can automatically configure Postgres to run competitively with Oracle. It does this without you, the database owner, having to learn all the Postgres configuration knobs, or spending time tweaking them (via trial and error) to optimize Postgres performance. And you don\u2019t risk the service interruptions that might occur if you mistakenly change the settings too much.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Migrate to open source with confidence, and OtterTune\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you\u2019re considering moving your database workloads off expensive legacy databases and onto a lower cost, open-source DBMS such as Postgres, don\u2019t let the open-source database learning curve or performance worries be a blocker. OtterTune automatic configuration can help. And this all happens safely \u2014 OtterTune does not need to access your user data.\"\n      })]\n    })\n  }, {\n    id: \"nCpMxXXbi\",\n    [c]: \"We got our SOC 2 Type II report (and you can, too)\",\n    [d]: \"we-got-our-soc-2-type-ii-report\",\n    [u]: \"2022-11-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/7olkIaDjDakxR2MoqXJtsByF6E.png\",\n      srcSet: \"https://framerusercontent.com/images/7olkIaDjDakxR2MoqXJtsByF6E.png?scale-down-to=512 512w, https://framerusercontent.com/images/7olkIaDjDakxR2MoqXJtsByF6E.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/7olkIaDjDakxR2MoqXJtsByF6E.png 1458w\"\n    }, \"dj ot breakdance\"),\n    [m]: \"We\u2019re excited to announce that we have completed our first SOC 2 Type II audit process with zero exceptions.\",\n    [g]: \"Dana Van Aken | Dao Chen\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"At OtterTune, building a trusted and secure platform has been a top priority from the beginning. But as a company that deals with customer data in the cloud, we recognize how important it is for us to go the extra step and demonstrate our dedication to security to our customers. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This led us to pursue a SOC 2 Type II report that would provide evidence of our compliance with industry-standard best practices when handling customer data. \", /*#__PURE__*/e(\"strong\", {\n          children: \"We\u2019re excited to announce that we have completed our first SOC 2 Type II audit process with zero exceptions! \"\n        }), \"\uD83C\uDF89\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this blog post, we walk through what it means to be SOC 2 Type II compliant and explain why and how we did it. We hope to add to the reading material we found most helpful: articles from other early-stage SaaS companies sharing their experiences and insights from completing the SOC 2 audit.\"\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"What is SOC 2?\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"SOC 2 means Service Organizational Control 2, and it\u2019s pronounced \u201Csock two.\u201D SOC 2 is a \", /*#__PURE__*/e(o, {\n          href: \"https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"compliance standard\"\n          })\n        }), \" developed by the American Institute of CPAs (AICPA), and it dictates controls\\xa0 on security, availability, processing integrity, confidentiality, and privacy. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Certified CPA firms use the standard to perform SOC 2 audits and verify which parts of the standard an organization meets. Security is the only category that is mandatory for the SOC2 report. (OtterTune, however, met the standard in all areas, not just security.)\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"SOC 2 Type I vs. SOC 2 Type II\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There are two types of SOC 2 reports: Type I and Type II. For both reports, the auditor checks that the relevant controls are in place and meet the criteria. The key difference is that the SOC 2 Type I report looks at a snapshot of controls at a specific moment in time, whereas the SOC 2 Type II report observes the controls over a period of time, typically 3 to 12 months. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The Type II report provides a higher level of rigor since it not only checks that the controls are in place but also that they are effective. Given this, a Type II report takes longer to complete \u2013 generally between 6-18 months \u2013 compared to a Type I report, which takes less than 6 months.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"Zero Exceptions\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If an auditor finds controls that are not designed or implemented correctly or that do not meet the criteria, these instances get recorded as audit exceptions in the SOC 2 report. When we announced at the beginning of this post that our report was delivered with zero exceptions, that means the auditors did not find any issues with our controls during their assessment, in security or any of the other areas checked: availability, processing integrity, confidentiality, and privacy.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why we did this (and why now)\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Since our initial product launch in October 2020, we\u2019ve found data security to be a leading concern among our customers. We routinely receive requests from our prospective customers for proof of our strong security posture; the SOC 2 Type II report is the document that gets requested the most, by a large margin.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Interestingly, of the dozens of customers that have requested security documents from us over the years, not having a SOC 2 Type II report has only been a dealbreaker for two of them. We\u2019ve found that in lieu of, or in addition to, SOC 2 and other standardized reports, many of our potential customers require their vendors to complete detailed questionnaires for their security teams to review. The issue with these security questionnaires is that they are verbose and hard to reuse, since companies typically tailor them to the specific security controls that they care about the most.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We quickly realized after filling out a couple of security questionnaires that it was a tedious, manual process and would not scale with our growing number of customers. As a result, the security review process would often take weeks or even months to complete. We lost a handful of business deals since a lot could change during these long processing times \u2013 for example, due to company priorities shifting or our \u201Cchampion\u201D leaving the company.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Our decision to pursue a SOC 2 Type II report was largely motivated by our need to streamline the security reviews required by our prospective customers to eliminate a key friction point in our deal cycles. Another reason is that it shows our customers that we care about security. A SOC 2 Type II report gives our customers a greater level of assurance than self-attested security questionnaires.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Lastly, one of the unforeseen benefits was that it helped with another project that was also underway \u2013 selling our product on AWS Marketplace. Many of the best practices and controls required by the Foundational Technical Review overlapped with those we had already put in place for the SOC 2 audit.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"Why we went directly for a SOC 2 Type II report\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The resources we came across when choosing between SOC 2 Type I and SOC 2 Type II offered similar guidance: if you\u2019ve found that a non-negligible number of your potential customers will not accept a Type I report, then chances are you\u2019ll need a Type II report relatively soon. If so, then going straight for a Type II report can save time and money overall.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We also determined which of the SOC 2 policies and controls we had already implemented at OtterTune to help assess how much extra work Type II would be compared to Type I. Some controls take longer to implement than others, and finding that we\u2019d instituted some of the more time-consuming ones, like annual performance reviews, also helped us decide that a SOC 2 Type II audit was the right choice for our company.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How it went\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This was our first time going through a SOC 2 Type II audit and the experience was pretty painless. The end-to-end process took around five months, including the time we time spent learning about SOC 2 and choosing our vendors. The timeline below shows how long it took and what we had to do during the planning, audit, and reporting stages. It also highlights when key events with our vendors took place.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"timeline to soc 2 compliance completion\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,n35b080teHweG8xVoefUtaKAw.png?originalFilename=Screenshot+2023-08-18+at+12.53.37+PM.png\",\n        \"data-framer-height\": \"949\",\n        \"data-framer-width\": \"1695\",\n        height: \"474\",\n        src: \"https://framerusercontent.com/images/n35b080teHweG8xVoefUtaKAw.png\",\n        style: {\n          aspectRatio: \"1695 / 949\"\n        },\n        width: \"847\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"What we did right\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We made it through our SOC 2 Type II audit relatively fast and didn\u2019t hit any major snags along the way. There were three things we did that simplified our audit process.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The first is that we had already implemented some of the controls and policies prior to SOC 2. This essentially gave us a \u201Chead start\u201D when preparing for the audit. Our policies and processes included:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Encrypting data at rest and in transit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Enabling branch protection and requiring reviews for pull requests (PRs) in GitHub\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Using Terraform to deploy and manage our infrastructure\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We also had policies and documents related to addressing potential risk in the company, such as the annual performance reviews we mentioned earlier. Our company documents included:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Job descriptions\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"An org chart\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Board meeting minutes\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The second thing was that we used a compliance automation platform. This was a no-brainer for us, since a platform greatly reduces the effort needed to achieve compliance for companies with common tech stacks (like OtterTune). Also, as a company that offers tools to automate complex processes, saving the customer time and money, it seemed like something we \u201Cotter\u201D do.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We went with Vanta because they supported integrations for our stack and were recommended by a colleague. After plugging them into our stack, the platform provided real-time visibility into our compliance status, gave actionable instructions to fix any issues detected, and assisted with evidence collection. They also had resources readily available at each step, from security policy templates to security training for employees.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The third thing we did was we followed the advice from companies that did their SOC 2 audit before us. For example, a recommendation we came across more than once was to confirm the audit date early on in the process. We took note of this and as you can see in the timeline, we started this discussion with our auditors less that a week after signing our contract with Vanta.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"What was challenging\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We put in a lot of effort to make sure that the processes and policies we created were not only SOC 2-compliant, but also suitable for our company. Here are some examples:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"We are 100% remote. To ensure workstations are secure, our employees must install an agent that checks for device vulnerabilities on each of their workstations.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"To ensure best practices in our daily operations, new employees must go through security training. We also have a strict change management process where all changes requires a security review.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"We store a lot of data in our system (> 2TB). We need a robust and flexible infrastructure to deal with security.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Our company is fast-growing and we deliver a lot of new features over time. To ensure that our system is always secure and compliant, when we find a security bug, we fix it immediately. We also require a security review for each change.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What\u2019s next\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Completing our SOC 2 Type II audit is a major milestone for us, but our security efforts are ongoing. We\u2019re committed to improving and maintaining our security controls and participating in these audits on an annual basis.\"\n      })]\n    })\n  }, {\n    id: \"qcyIRxaH6\",\n    [c]: \"Cloud spending may be heading for a fall\",\n    [d]: \"cloud-spending-may-be-heading-for-a-fall\",\n    [u]: \"2022-10-12T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/oEkmvLyXdzS4dyTvCCBbqgOMO5k.png\",\n      srcSet: \"https://framerusercontent.com/images/oEkmvLyXdzS4dyTvCCBbqgOMO5k.png?scale-down-to=512 512w, https://framerusercontent.com/images/oEkmvLyXdzS4dyTvCCBbqgOMO5k.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/oEkmvLyXdzS4dyTvCCBbqgOMO5k.png 1090w\"\n    }, \"dj ot torches phonebooth\"),\n    [m]: \"Cloud spending is projected to flatten or be reduced. As budgets tighten, what can you do to control costs?\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"In a \", /*#__PURE__*/e(o, {\n          href: \"https://venturebeat.com/data-infrastructure/report-81-of-it-teams-directed-to-reduce-or-halt-cloud-spending-by-c-suite/amp/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"recent article\"\n          })\n        }), \", VentureBeat shared some potentially grim news for cloud providers. According to a survey by \", /*#__PURE__*/e(o, {\n          href: \"https://www.wanclouds.net/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Wanclouds\"\n          })\n        }), \", which specializes in cloud migrations, more than 80% of respondents plan to hold cloud spending flat or reduce it. Only 18% plan to increase cloud spending.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Now, for many companies, this may be a statement of intention rather than a solid and thought-out plan. Still, it seems concerned about cloud spending is rising in today\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://www.worldbank.org/en/news/press-release/2022/09/15/risk-of-global-recession-in-2023-rises-amid-simultaneous-rate-hikes#:~:text=WASHINGTON%2C%20September%2015%2C%202022%E2%80%94,lasting%20harm%2C%20according%20to%20a\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"challenging economic environment\"\n          })\n        }), \". And budgets may indeed tighten, slowing the \", /*#__PURE__*/e(o, {\n          href: \"https://www.fortunebusinessinsights.com/cloud-computing-market-102697\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"rapid growth of cloud spending\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Startups are likely to be affected, too. They may well feel pressure to tighten cloud expenditures that can \", /*#__PURE__*/e(o, {\n          href: \"https://hackernoon.com/how-cutting-cloud-costs-can-help-startup-fundraising#:~:text=Cloud%20costs%2C%20too%2C%20can%20quickly,a%202020%20study%20by%20Harness.\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"easily exceed a million dollars\"\n          })\n        }), \", so as to preserve investment dollars and lengthen their current budgetary runway.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What to do?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"How can you respond to this potential chill? We at OtterTune have some suggestions.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"First, increase your use of open-source databases. The two that we at OtterTune have chosen to support are PostgreSQL, \u201Cthe world\u2019s most advanced open source database,\u201D \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"according to Postgres.org\"\n          })\n        }), \", and MySQL, \u201Cthe world\u2019s most popular open source relational database,\u201D \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/mysql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"according to AWS\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"processes in postgresql\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,QyzNe4un1kqEkk4ENOfEy7jK40.jpg\",\n        \"data-framer-height\": \"1915\",\n        \"data-framer-width\": \"2560\",\n        height: \"957\",\n        src: \"https://framerusercontent.com/images/QyzNe4un1kqEkk4ENOfEy7jK40.jpg\",\n        style: {\n          aspectRatio: \"2560 / 1915\"\n        },\n        width: \"1280\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Second, use our product, \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \". As our name suggests, OtterTune automatically tunes PostgreSQL and MySQL running on databases on AWS. You can choose to optimize your databases for lower cost, higher performance, or a combination. We have seen increases of roughly 2x in price/performance among customers using OtterTune. \"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why open source databases?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Why do we recommend open-source databases? Mainly because they offer the greatest leverage for improved price/performance. Open-source databases have many wonderful features, but they tend to be less optimized than commercial databases. So OtterTune can make a big difference for you, as a database user, when run with open-source databases.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As the name implies, open-source databases also offer you a great deal of freedom. There is no licensing cost; you only pay for the hardware you run them on, whether that means buying and running your own servers or paying for compute capability and storage space in the cloud. And open source databases have much less restrictive licensing terms than commercial products.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And with open source, you can make changes to the source code. You can:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Fork the centrally maintained code and change your copy of the code, then compile and run it\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Submit change suggestions to the centrally maintained (\u201Cupstream\u201D) code and wait to see if they\u2019re accepted, then use the newly changed upstream code\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Fork the code and make the change locally, but also submit it upstream for potential adoption\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And open source code offers a kind of security blanket that commercial code can\u2019t offer. You get access to rich, active communities around your open-source database. And you aren\u2019t subject to the business decisions of any specific provider, nor to business problems that may cause them to cut back on support, on new features, or even on their product line. Open source code tends to improve steadily and predictably over long periods of time.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why OtterTune?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune seeks to give you the best of both worlds, commercial and open source. Your database instances, and the code you write to run against them, get all the benefits of open-source database software. OtterTune\u2019s operational enhancements don\u2019t conflict with the benefits of your open-source database, and the cost is far less than commercial database licensing. You keep control and get valuable improvements.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune is currently offered on AWS, the leading cloud provider, including in the \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/marketplace/seller-profile?id=26c928b5-0b18-4f21-a861-a82847147ba6\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS Marketplace\"\n          })\n        }), \". You can learn much more about OtterTune\u2019s features on our \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"Owida8HbZ\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"homepage\"\n          })\n        }), \".\"]\n      })]\n    })\n  }, {\n    id: \"lgDkDQ2dK\",\n    [c]: \"OtterTune intern showcase 2022\",\n    [d]: \"ottertune-intern-showcase-2022\",\n    [u]: \"2022-09-19T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/8cCypu6BdWQLtlbkKOKesIPcI.png\",\n      srcSet: \"https://framerusercontent.com/images/8cCypu6BdWQLtlbkKOKesIPcI.png?scale-down-to=512 512w, https://framerusercontent.com/images/8cCypu6BdWQLtlbkKOKesIPcI.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/8cCypu6BdWQLtlbkKOKesIPcI.png 1100w\"\n    }, \"dj ot, little otter, breaking into car\"),\n    [m]: \"From PostgreSQL autovacuum monitoring to database health check improvements, our interns produced great work in 2022.\",\n    [g]: \"Evelyn Chen\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Otters are social animals. Otters don\u2019t like to be \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/qdy7DEhvsVU\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"alone\"\n          })\n        }), \" \u2013 and this applies to river otters, sea otters, and to all of us otters at OtterTune. So we love having summer interns hang out with us. This year we were excited to have two plucky students join us: \", /*#__PURE__*/e(o, {\n          href: \"https://www.linkedin.com/in/priyank-bhandia/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Priyank Bhandia\"\n          })\n        }), \" from Carnegie Mellon University and \", /*#__PURE__*/e(o, {\n          href: \"https://www.linkedin.com/in/pratu16x7/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Prateeksha Singh\"\n          })\n        }), \" from the University of Buffalo.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We aim for the interns to work on parts of our automated database optimization service that will have a real impact. They build features, write tests, and ship code, acting as full-time engineers. To achieve this, we assign one engineering team member to mentor each intern during the summer. This involves daily meetings to discuss their progress, provide feedback, and answer questions. Given our academic roots at Carnegie Mellon, we know how important it is to give students exposure to real-world software systems to both bolster and flex what they learn in the classroom.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"ottertune-intern-showcase-2021\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2021 internship program\"\n          })\n        }), \" was a success. Both of our interns, Haonan Wang and Sylvia Zhang \u2013 CMU students at the time of their internships \u2013 joined OtterTune full-time when they graduated.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"So we close this summer out by showcasing Priyank\u2019s and Prateeksha\u2019s internship projects.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"PostgreSQL autovacuum monitoring and health checks\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Intern: Priyank Bhandia\"\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Any DBA knows the importance of\", /*#__PURE__*/e(o, {\n          href: \"https://www.geeksforgeeks.org/postgresql-autovacuum/#:~:text=Autovacuum%20is%20a%20daemon%20or,conf%20file.\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \" autovacuum in Postgres\"\n          })\n        }), \". Without it, your database will have a lot of dead tuples (a.k.a. useless information), wasting precious space and disk cycles, and causing poor query performance.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The problem is that there\u2019s a fair amount that can go wrong while Postgres\u2019 autovacuum is scanning and cleaning up tables. Query performance can suffer while the autovacuum workers are busily reading and writing data from disk. And when there is contention for resources, the autovacuum interrupts itself to back off. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This means that a long-running query that stops the vacuuming process for a long time causes dead tuples to pile up. In turn, future vacuum invocations take longer to run. Long-running vacuums affect query performance. And the database user can sit there wasting time manually checking in on autovacuum to see if it\u2019s getting the job done.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"So, Priyank set out to create a dashboard tool to monitor and check how autovacuum is doing automatically. OtterTune will soon have monitoring and health checks for autovacuum built in, thanks to his work. OtterTune users will have an at-a-glance view when things go wrong in the vacuuming process and a table view showing all the information about the autovacuum\u2019s progress. In terms of health checks, you\u2019ll be able to check in on problems such as:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"See if an autovacuum process has been blocked for a long time by a competing query\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Find out if the autovacuum process does not have enough buffer space, causing it to repeat the full scan too many times and waste resources\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To make this work, the \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"new-agent-deployment-options\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Agent\"\n          })\n        }), \" retrieves autovacuum information from your database, runs it through OtterTune, and presents it to you. This will give you more time to groom your database and keep it healthy \u2013 which is what our other Otter intern, Prateeksha Singh, worked on over the summer.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Database Health Check improvements\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Intern: Prateeksha Singh\"\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune Database Health is extremely popular among Otters. It does the background checking for you, so you don\u2019t get surprised by outages or performance drops. OtterTune monitors your database and collects metrics about your workload. It informs you if your database shows unhealthy behavior and recommends corrective actions. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With Database Health your databases run smoothly, stay available, and avoid slow performance. This way, management (a.k.a. \u201Cthe man\u201D) stays off your back. For her project, Prateeksha chose Snowflake as the initial platform to build the data pipeline and create new features. However, the upgrades to Database Health Checks that she developed will apply to all databases OtterTune supports.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You Otter know things like: \u201CWhat are the top few checks that are failing? The top few databases that are failing? The top few checks that are failing for the top few databases that are failing?\u201D Soon you will be able to know all this and more, much more easily. And you will have dashboards so you can get answers without searching for them.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\u2019s new health check capabilities don\u2019t just provide values for things like resource utilization; they let you see, under just one tab, whether the value is healthy or not. You also get a history section that shows the status of every check performed over a certain period, as well as trends and threshold analysis.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune health checks\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,2zfjsGMYWwbdF3NT0joaC8YJ2s.svg\",\n        \"data-framer-height\": \"546\",\n        \"data-framer-width\": \"768\",\n        height: \"273\",\n        src: \"https://framerusercontent.com/images/2zfjsGMYWwbdF3NT0joaC8YJ2s.svg\",\n        style: {\n          aspectRatio: \"768 / 546\"\n        },\n        width: \"384\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Data can be sliced and diced in multiple ways, such as seeing how many health checks were done for memory utilization or connection counts over time and which were healthy or unhealthy. You can define your own filters to get very granular, such as determining which particular data fails the most in your top failing databases. Or, you could see how long a specific health check has been falling. Useful, right?\"\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"Join the team!\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019d like to join the OtterTune team, whether as an intern or as a full-time developer, please visit our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/careers\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"careers page\"\n          })\n        }), \" to start the process. We\u2019re a distributed team, and we look forward to hearing from you.\"]\n      })]\n    })\n  }, {\n    id: \"mwuC82Iek\",\n    [c]: \"Fixing slow PostgreSQL queries: How to make a smart optimizer more stupid\",\n    [d]: \"how-to-fix-slow-postgresql-queries\",\n    [u]: \"2022-08-30T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/0je5tZhKD6iLouWlMYw2Pbns.png\",\n      srcSet: \"https://framerusercontent.com/images/0je5tZhKD6iLouWlMYw2Pbns.png?scale-down-to=512 512w, https://framerusercontent.com/images/0je5tZhKD6iLouWlMYw2Pbns.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/0je5tZhKD6iLouWlMYw2Pbns.png 1097w\"\n    }, \"dj ot kneel at basketball court\"),\n    [m]: \"You've got a slow-running PostgreSQL query, so you run ANALYZE, but what if ANALYZE can't fix it? \",\n    [g]: \"Haonan Wang | Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Ah, the frustrating slow-running PostgreSQL query. What\u2019s an otter to do?\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"run-postgresql-analyze-to-fix-a-slowdow-in-db\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"first thing to do\"\n          })\n        }), \" \u2014 without question \u2014 is run \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/sql-analyze.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ANALYZE\"\n          })\n        }), \". PostgreSQL\u2019s \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \" command collects statistics about specific table columns, entire tables, or entire databases and stores the results in the \", /*#__PURE__*/e(\"code\", {\n          children: \"pg_statistic\"\n        }), \" system catalog. PostgreSQL\u2019s query planner then uses these statistics to help determine the most efficient execution plans for queries.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We have found that running \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \" more frequently has solved many of our customers\u2019 slow query problems. It\u2019s like the \u201Crestart your computer when it gets slow\u201D advice for databases. OtterTune has a health check in place to determine if ANALYZE needs to be run more often.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But what if running \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \" doesn\u2019t provide the necessary improvement? A recent interaction with an OtterTune user might shed light on your issue.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"When good optimizers go bad\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Recently, a Postgres user contacted us via the \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Community Slack channel\"\n          })\n        }), \". This OtterTune user reported that a query ran slowly when using \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" along with the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT 10\"\n        }), \" clause. This \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" will cause us problems later in this article, which is why we are calling it out.\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT item.id\\n  FROM item\\n  JOIN item_set ON (item_set.id = item.item_set_id)\\n WHERE item_set.name = 'ABC'\\n   AND item.added_rev_id = 3)\\n ORDER BY item.id ASC LIMIT 10;\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This is a common query pattern in many applications to show the top \", /*#__PURE__*/e(\"em\", {\n          children: \"n\"\n        }), \" entries in a table (e.g., the most recent orders for a customer). In this case, the application retrieves the first ten items from a set named \u2018ABC.\u2019 But the customer reported that the query took an inexplicably long time to complete (18 seconds!).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune\u2019s automated health checks initially recommended that the customer to increase statistics collection on the table (i.e., \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \") by increasing PostgreSQL\u2019s \", /*#__PURE__*/e(\"code\", {\n          children: \"statistics_target\"\n        }), \" configuration knob. But while this recommendation made other queries run faster, it did not help this problem.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There are several StackOverflow posts with others that have similar issues in PostgreSQL queries that use \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clauses with \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" (\", /*#__PURE__*/e(o, {\n          href: \"https://stackoverflow.com/questions/6037843/extremely-slow-postgresql-query-with-order-and-limit-clauses\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Example 1\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://stackoverflow.com/questions/6037843/extremely-slow-postgresql-query-with-order-and-limit-clauses\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Example 2\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://stackoverflow.com/questions/55344598/slow-postgres-query-using-limit\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Example 3\"\n          })\n        }), \"). See also this \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/XA3SBgcZwtE?t=2717\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Carnegie Mellon Database Tech Talk\"\n          })\n        }), \" from a leading \", /*#__PURE__*/e(o, {\n          href: \"https://rhaas.blogspot.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PostgreSQL developer\"\n          })\n        }), \" that discusses this exact problem (starts at \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/XA3SBgcZwtE?t=2717\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"45:15\"\n          })\n        }), \"). So this problem is not unique to our customer.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our engineers worked with the customer to get the query\u2019s execution plan using \", /*#__PURE__*/e(\"code\", {\n          children: \"EXPLAIN ANALYZE\"\n        }), \". We then use Dalibo\u2019s fantastic \", /*#__PURE__*/e(o, {\n          href: \"https://explain.dalibo.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"visualization tool\"\n          })\n        }), \" to examine the plan to understand what is going wrong. In the visualization shown here, we see that PostgreSQL\u2019s optimizer overestimates the number of tuples that it expects the nested-loop join operator to emit by almost 1000x. This causes it use an index scan on the \", /*#__PURE__*/e(\"code\", {\n          children: \"item\"\n        }), \" table\u2019s primary key index (\", /*#__PURE__*/e(\"code\", {\n          children: \"item.id\"\n        }), \") for the outer table (i.e., the child operator on the left side of the join). \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Using this index will automatically sort the item tuples in the same order needed in the query\u2019s \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" clause. The optimizer is trying to be clever here: it knows that there is an \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" operator above the join, so rather than sort the thousands of tuples that it expects from the join to only grab the first ten tuples, it uses the \", /*#__PURE__*/e(\"code\", {\n          children: \"item\"\n        }), \" table\u2019s index to get the data pre-sorted.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"Original query plan with the ORDER BY and LIMIT clauses\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,408C2UVWAFLPuVtJfIRmOVuN0E.png?originalFilename=Screenshot+2023-08-18+at+12.55.57+PM.png\",\n        \"data-framer-height\": \"516\",\n        \"data-framer-width\": \"1473\",\n        height: \"258\",\n        src: \"https://framerusercontent.com/images/408C2UVWAFLPuVtJfIRmOVuN0E.png\",\n        style: {\n          aspectRatio: \"1473 / 516\"\n        },\n        width: \"736\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Original query plan with the \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" and \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clauses. Execution Time: 18 seconds.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The problem is that the DBMS does not know where the rows are located physically in the item index that will satisfy the predicate \", /*#__PURE__*/e(\"code\", {\n          children: \"item_set.name = 'ABC'\"\n        }), \" on the other side of the join operator. The DBMS thinks it will be only ten rows, but it ends up being 9400! Notice how it almost correctly estimates the number of rows it will retrieve from the index scan on the \", /*#__PURE__*/e(\"code\", {\n          children: \"item\"\n        }), \" table. This would not have been a big deal if the DBMS\u2019s assumption that it could cut off the scan after the first ten rows were correct.\"]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"LIMIT is ruining my life\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"On a lark, we decided to try the SQL query again, but this time without the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clause since that seems to be the source of the problem. To our surprise, the query finished in \", /*#__PURE__*/e(\"strong\", {\n          children: \"0.085 ms\"\n        }), \"! This is a massive 99.9995% reduction. Of course, we were initially suspicious, as one can often make mistakes when running experiments that can lead to erroneous results. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We ran the query several times more, and the result was always about the same. As you can see in the visualization below, the new query plan switches the order of the tables for the join operator:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"Updated query plan after removing the LIMIT clause\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,YxnDqxyrLby8lAd9GreYNXrlPts.png?originalFilename=Screenshot+2023-08-18+at+12.56.37+PM.png\",\n        \"data-framer-height\": \"516\",\n        \"data-framer-width\": \"1472\",\n        height: \"258\",\n        src: \"https://framerusercontent.com/images/YxnDqxyrLby8lAd9GreYNXrlPts.png\",\n        style: {\n          aspectRatio: \"1472 / 516\"\n        },\n        width: \"736\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Updated query plan after removing the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clause. Execution Time: 0.085 ms.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The question we then had to figure out was what PostgreSQL is doing here that would cause such a dramatic performance difference when we remove the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clause. Well, once again, it has to do with the optimizer mispredicting how many rows it will access. The outer table for the join operator is now an index scan on the \", /*#__PURE__*/e(\"code\", {\n          children: \"item_set\"\n        }), \" table using a unique index on its name field. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Because the index is unique, we know it will return at most one \", /*#__PURE__*/e(\"code\", {\n          children: \"item_set\"\n        }), \" row. Now there is a single probe into an index on the \", /*#__PURE__*/e(\"code\", {\n          children: \"item\"\n        }), \" table\u2019s \", /*#__PURE__*/e(\"code\", {\n          children: \"item_set_id\"\n        }), \" field for the join\u2019s inner table that feeds into the sort operator.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The crux of the problem is that we want the join ordering in the plan that PostgreSQL generates in the query without the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" but still keep the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \". The customer could have modified the application code to just do truncation itself, but that seems wrong. And we\u2019re database people, after all, and this kind of problem should be solved without having to modify the application code. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"It also can cause problems in the future if the assumptions we make now about the query change. For example, the query only returns 20 rows right now, but what happens if the database changes and now the query returns 1 million rows?\"\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"PostgreSQL hints without hints\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One way to solve this problem is to add hints to the query to tell the optimizer the right way to join these two tables. But PostgreSQL famously does not support plan hints (at least not natively \u2014 you have to install \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ossc-db/pg_hint_plan\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_hint_plan\"\n          })\n        }), \"). In our example, the customer did not have the necessary permissions to install this extension in RDS, and the person who could do it was on vacation.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We needed another way to trick the optimizer into not picking the \", /*#__PURE__*/e(\"code\", {\n          children: \"item\"\n        }), \" table\u2019s primary key index. To do this, we can rely on two important facts about PostgreSQL\u2019s optimizer implementation. The first is it does not resolve arbitrary expressions in \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" clauses before execution. For example, if you use the expression \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY a + 0\"\n        }), \" (where attribute \", /*#__PURE__*/e(\"code\", {\n          children: \"a\"\n        }), \" is an integer), it does not infer that it can rewrite \", /*#__PURE__*/e(\"code\", {\n          children: \"a + 0\"\n        }), \" into just \", /*#__PURE__*/e(\"code\", {\n          children: \"a\"\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The second fact about PostgreSQL\u2019s optimizer is that it looks for exact key matches when identifying whether it can use an index to access a table to remove the need to add an additional Sort operator (we can ignore prefix searches for now). In the case of the \", /*#__PURE__*/e(\"code\", {\n          children: \"item.id\"\n        }), \" index for our example, unless the \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" clause contains the same columns as the index, then it will always include the Sort operator in the query plan.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Putting these two ideas together, we can fake out PostgreSQL\u2019s optimizer into \", /*#__PURE__*/e(\"strong\", {\n          children: \"not\"\n        }), \" using the \", /*#__PURE__*/e(\"code\", {\n          children: \"item.id\"\n        }), \" index by changing the \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" clause to be \", /*#__PURE__*/e(\"code\", {\n          children: \"item.id + 0\"\n        }), \":\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT item.id\\n  FROM item\\n  JOIN item_set ON (item_set.id = item.item_set_id)\\n WHERE item_set.name = 'ABC'\\n   AND item.added_rev_id = 3)\\n ORDER BY item.id + 0 ASC LIMIT 10;\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As humans, we know that \", /*#__PURE__*/e(\"code\", {\n          children: \"item.id + 0\"\n        }), \" and \", /*#__PURE__*/e(\"code\", {\n          children: \"item.id\"\n        }), \" are semantically the same, but PostgreSQL isn\u2019t clever enough to figure that out. Interestingly the optimizer decides to perform a sequential scan on the \", /*#__PURE__*/e(\"code\", {\n          children: \"item_set\"\n        }), \" table instead of using the unique index on the \", /*#__PURE__*/e(\"code\", {\n          children: \"name\"\n        }), \" attribute. Other than that, the new query plan is essentially the same as the one without the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" (i.e., it joins the tables in the right order).\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"Final query plan using the ORDER BY trick\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,ZkgGPJb1lmZkxBDIo774PFbH4k.png?originalFilename=Screenshot+2023-08-18+at+12.57.03+PM.png\",\n        \"data-framer-height\": \"518\",\n        \"data-framer-width\": \"1482\",\n        height: \"259\",\n        src: \"https://framerusercontent.com/images/ZkgGPJb1lmZkxBDIo774PFbH4k.png\",\n        style: {\n          aspectRatio: \"1482 / 518\"\n        },\n        width: \"741\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Final query plan using the \", /*#__PURE__*/e(\"code\", {\n          children: \"ORDER BY\"\n        }), \" trick. Execution Time: 1.39 ms.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The execution time for this new query is \", /*#__PURE__*/e(\"strong\", {\n          children: \"1.39 ms\"\n        }), \". This was not as good as the 0.085 ms execution time when removing the \", /*#__PURE__*/e(\"code\", {\n          children: \"LIMIT\"\n        }), \" clause entirely, but the customer was happy because the new query is still 10,000x faster than before.\"]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"The future of OtterTune\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We are here to help suss out issues like this and help databases work better. The above problem exemplifies where we are going next with OtterTune. Although automated configuration tuning is critical as it greatly benefits database performance and efficiency, if the DBMS still chooses crappy query plans, then all our efforts are for naught.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune\u2019s machine learning algorithms\\xa0continue to evolve, and we are working on ways to provide additional automated solutions. We are building out the next version of OtterTune that will start to tackle these exact kinds of problems for MySQL and PostgreSQL. In the meantime, reach out to us via \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"our Slack channel\"\n          })\n        }), \". We\u2019re here to help.\"]\n      })]\n    })\n  }, {\n    id: \"E6IagfPD7\",\n    [c]: \"OtterTune August \u201922 product update: A better tomorrow\",\n    [d]: \"august-2022-product-update\",\n    [u]: \"2022-08-11T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/FpMavrDWzlflZ1pVyDA6qgLqZo.png\",\n      srcSet: \"https://framerusercontent.com/images/FpMavrDWzlflZ1pVyDA6qgLqZo.png?scale-down-to=512 512w, https://framerusercontent.com/images/FpMavrDWzlflZ1pVyDA6qgLqZo.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/FpMavrDWzlflZ1pVyDA6qgLqZo.png 1092w\"\n    }, \"dj ot spraypainting ottertune logo\"),\n    [m]: \"We\u2019re pleased to announce OtterTune\u2019s new health checks for database tables and indexes. This product update also includes new ways to interact with and collaborate with your team.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"At OtterTune, we continue to plow ahead with our plan to make databases better and easier to manage for everyone. We told you in our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"march-2022-product-update\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"previous product update\"\n          })\n        }), \" about our automated table-level health checks for PostgreSQL and MySQL. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Today, we\u2019re pleased to announce OtterTune\u2019s new health checks for database tables and indexes. This product update also includes new ways to interact with and collaborate with your people in \", /*#__PURE__*/e(o, {\n          href: \"https://open.spotify.com/track/1OB7p2ulZT8Z8qkY5akeZB?si=289dd8160c7c46e5\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"lockdown\"\n          })\n        }), \" on your OtterTune-connected databases.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Refer to our release notes if you want to see the complete run-down of all the fresh features we\u2019ve added to OtterTune in the last few months.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We have also updated our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pricing\"\n          })\n        }), \" to allow you to pay a low monthly subscription fee per database. And as always, you can get started with OtterTune on your first database for free.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you are an existing OtterTune user, then you must update your \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OT-Agent\"\n          })\n        }), \" to take advantage of these new features. See our \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"documentation for upgrading instructions\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Table Health Checks\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"One recurring issue we find with customers\u2019 databases is that even after OtterTune optimizes their configuration knobs, they still have unexpected performance anomalies. Often after our engineers look into the issue with the customer, we find the root cause of the problem because their tables are unhealthy. PostgreSQL is more susceptible to this problem because of the way it implements multi-versioning.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To address this issue, we introduced OtterTune\u2019s new Table Health Checks automatically examine the internal information about each table and then checks whether they are having problems. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"These checks enable you to diagnose and resolve common database problems within tables. OtterTune also tracks table-specific metrics about (1) table sizes, (2) I/O efficiency, (3) memory utilization, (4) vacuum status (PostgreSQL only), and (5) \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \" status. Table Checks supports all versions of PostgreSQL and MySQL for both Amazon RDS and Amazon Aurora.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune table and index health checks\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,7eItGRHCzDC36iwyxYd6CmYIA.png?originalFilename=Screenshot+2023-08-18+at+12.58.35+PM.png\",\n        \"data-framer-height\": \"917\",\n        \"data-framer-width\": \"663\",\n        height: \"458\",\n        src: \"https://framerusercontent.com/images/7eItGRHCzDC36iwyxYd6CmYIA.png\",\n        style: {\n          aspectRatio: \"663 / 917\"\n        },\n        width: \"331\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune currently limits its monitoring to the largest 1000 tables per database (based on the number of tuples in the table). We have found that the tables with the most problems have the most tuples compared to other tables (especially in PostgreSQL) versus prioritizing other metrics like storage size or query usage. Please contact us if your database has more than 1000 tables that you think OtterTune should track.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"PostgreSQL checks\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Dead Tuple Ratio\"\n            }), \" \u2014 A \u201Cdead tuple\u201D is a row in your table that has either been (1) recently updated and is not visible to any active transaction or (2) recently deleted. Dead tuples slow down queries and cause inefficient storage utilization.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Stale Statistics\"\n            }), \" \u2014 As your application inserts, updates, and deletes records in a table, the system\u2019s \", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/current/view-pg-stats.html\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"statistical summaries\"\n              })\n            }), \" about the table get out of date. Old statistics are often the reason why the DBMS\u2019s optimizer chooses bad query plans. This check indicates that it is time to run PostgreSQL\u2019s \", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"run-postgresql-analyze-to-fix-a-slowdow-in-db\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"ANALYZE\"\n              })\n            }), \" command to update the table\u2019s statistics.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Excessive Reads\"\n            }), \" \u2014 OtterTune checks whether queries read more data from a table relative to other tables in your database. Suppose you\u2019re running an operational workload (i.e., not analytics). In that case, this could indicate that your table is missing indexes, and the system is not executing queries as efficiently as it could.\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"MySQL checks\"\n      }), /*#__PURE__*/e(\"ul\", {\n        children: /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Fragmentation Ratio\"\n            }), \" \u2014 As queries update records with \", /*#__PURE__*/e(o, {\n              href: \"https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"variable-length data\"\n              })\n            }), \" (e.g., \", /*#__PURE__*/e(\"code\", {\n              children: \"VARCHAR\"\n            }), \", \", /*#__PURE__*/e(\"code\", {\n              children: \"TEXT\"\n            }), \", \", /*#__PURE__*/e(\"code\", {\n              children: \"BLOB\"\n            }), \" columns), MySQL may need to allocate new pages and store a large record across multiple pages. These new pages will initially contain some empty space that can add up and lead to performance degradation. This occurs when the DBMS reads a page from the disk that mostly contains empty space. Thus, this check indicates whether your table has too much fragmentation and is slowing down the system.\"]\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We announced this new feature \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"table-health-checks\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"two weeks ago\"\n          })\n        }), \" because we wanted to show it off immediately.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Index Health Checks\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Most databases need indexes to ensure queries avoid slow table scans. But indexes can be fickle jawns like tables. If your database has too many of them, they can waste storage and make queries run slower.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This latest release of OtterTune includes our initial automated Index Health Checks. With these new checks, OtterTune connects to your database and retrieves usage statistics about its indexes. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune tracks up to 10,000 indexes for the tables that it monitors with its Table Health Checks. To avoid overwhelming you with too much information, OtterTune ignores any index smaller than 32MB. We support these Index Checks on all versions of PostgreSQL and MySQL for both Amazon RDS and Amazon Aurora.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune will automatically identify whether you have superfluous indexes in two different ways:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Unused Indexes\"\n            }), \" \u2014 OtterTune deems an index as \u201Cunused\u201D if the DBMS has not executed a query that accessed the index since the last system restart. Note we define \u201Caccess\u201D as using the index to find records (e.g., \", /*#__PURE__*/e(\"code\", {\n              children: \"WHERE\"\n            }), \" clause) and not if the DBMS had to update the index because the underlying table changed.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Duplicate Indexes\"\n            }), \" \u2014 If a table contains multiple indexes with the same columns, then OtterTune flags them as duplicates. The current version of this check only identifies duplicate indexes with the same columns listed in the same order. That is, OtterTune will not flag two indexes \", /*#__PURE__*/e(\"code\", {\n              children: \"I<sub>1</sub>(a, b)\"\n            }), \" and \", /*#__PURE__*/e(\"code\", {\n              children: \"I<sub>2</sub>(b, a)\"\n            }), \" as duplicates of each other. We are working on an enhanced version of this check that can find these kinds of duplicate indexes and ensure that no queries will suffer performance degradation.\"]\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To enable this new feature, make sure that you have \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"connected OtterTune\u2019s agent\"\n          })\n        }), \" to your database. Then head over to the Index Health tab at the top of the Database Overview page. You can see the latest information about your indexes, including the detailed metrics that OtterTune collects. We also provide historical statistics about your indexes to see how they evolve. \"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Collaboration tools\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We know it can be lonely when you\u2019re out on the corner by yourself, ensuring your database is running smoothly. Sometimes you need to reach out to somebody to help you solve database issues. To make your job easier, we\u2019ve added new ways in OtterTune to connect with others and tools to help get you what you need to keep your databases \u2014 and trap \u2014 swimming along. In this latest release, you can invite Otters from your team to your OtterTune account and get important OtterTune notifications within Slack.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As always, \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/xmewgB9V/support\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"contact us\"\n          })\n        }), \" if you need help getting your database hooked up to OtterTune.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Invite teammates to OtterTune\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Let\u2019s say you\u2019ve started setting up OtterTune but you\u2019re stumped by \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"deploying the OtterTune Agent\"\n          })\n        }), \". Or you don\u2019t have the right AWS permissions to even \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/wmjvaGmV/enabling-database-instances\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"connect your database\"\n          })\n        }), \" for monitoring.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You can now invite others from your team to your OtterTune account. Now if these or other annoying things happen to you, you can request the right person from your organization to help, and now both can see all the databases connected to your account. Your invited user will receive an email invitation for them to create an OtterTune account and connect to your organization. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The email will copy you on it so that your homey knows it\u2019s legit. Your invited teammate can create their account and confirm that we should connect your two accounts. This ensures we don\u2019t connect anyone\u2019s account without explicit permissions from both users.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Slack integration\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We know notification noise is annoying. We also know it\u2019s slightly less annoying when all your actually important notifications are in one place. This is one of the reasons why we added \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/pWr8eMQn/slack-integration\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Slack integration\"\n          })\n        }), \" in the latest version of OtterTune. Well, that, and that one of our customers asked us to \u2014 and we aim to please (we got you, fam).\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Once you add OtterTune\u2019s bot to your Slack workspace, you\u2019ll get notified whenever OtterTune has a new configuration ready for your review on your databases. Alternatively, if you have human-in-the-loop control disabled, you\u2019ll see notifications when OtterTune has applied a new configuration to your database.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"User docs and support community on Slack\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Check out our \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune user documentation\"\n          })\n        }), \", which details how to connect OtterTune to your database and start the machine learning (ML)-driven tuning process.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Create your OtterTune account\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"join us on Slack\"\n          })\n        }), \" to let us know how it\u2019s going. We love helping people that have nasty database problems that no DBA wants to touch.\"]\n      })]\n    })\n  }, {\n    id: \"ccmH1hqbI\",\n    [c]: \"Get granular without the grunt work: OtterTune Table Health Checks let you diagnose issues automatically\",\n    [d]: \"table-health-checks\",\n    [u]: \"2022-07-20T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/5ZYTff4aQPxg6OZBMvLTAuWUHg.png\",\n      srcSet: \"https://framerusercontent.com/images/5ZYTff4aQPxg6OZBMvLTAuWUHg.png?scale-down-to=512 512w, https://framerusercontent.com/images/5ZYTff4aQPxg6OZBMvLTAuWUHg.png 705w\"\n    }, \"dj ot inspecting database\"),\n    [m]: \"OtterTune\u2019s new Table Health Checks automatically examine vital statistics and health checks to diagnose and resolve common database problems within tables.\",\n    [g]: \"Ruogu Du | Yuze Liao | Evelyn Chen\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"No one wants to get \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/UmtuRRhtGQw\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"lit up\"\n          })\n        }), \" for database downtime or sluggish performance. OtterTune is here for you and your trap.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We introduced \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"introducing-database-health-checks\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Database Health Checks\"\n          })\n        }), \" back in March as a powerful way to automatically check whether your MySQL and PostgreSQL databases are running in top shape on Amazon RDS and Amazon Aurora. The health checks automatically detect resource utilization, efficiency, and cache management issues in your databases in real-time and provides you with recommendations to fix them.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Today we\u2019re happy to announce that we\u2019ve expanded health checks to go a level deeper. OtterTune\u2019s new Table Health Checks automatically examine vital statistics and health checks to diagnose and resolve common database problems within tables. It provides a real-time and historical analysis of your tables\u2019 health conditions and suggests actions to fix the issues.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Table Health Checks & Table Statistics monitoring\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When you \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/wmjvaGmV/enabling-database-instances\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"connect your database to OtterTune\"\n          })\n        }), \", the service first retrieves basic information about all the tables in your database. It then selects the largest 1000 tables (based on the number of tuples) and starts monitoring their runtime metrics. We have found that the tables with the most problems are the ones with the most tuples (especially in PostgreSQL), versus prioritizing other metrics like the tables with the largest storage size or tables that are used in the most queries.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"OtterTune Table Health dashboard for PostgreSQL\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,mKALSUlu7bttNptPeTro8iPsY.png\",\n        \"data-framer-height\": \"565\",\n        \"data-framer-width\": \"1024\",\n        height: \"282\",\n        src: \"https://framerusercontent.com/images/mKALSUlu7bttNptPeTro8iPsY.png\",\n        style: {\n          aspectRatio: \"1024 / 565\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune then runs its health check engine to determine whether your tables are in good shape or whether they are sick. You can then check whether your database tables are passing or failing these checks on OtterTune\u2019s Table Health dashboard. If your tables are failing health checks, OtterTune recommends corrective actions that improve table health and performance. This reduces the time, guess-work, and worry required for proper database administration,\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In addition to the checks, OtterTune\u2019s dashboard also shows you a multitude of table statistics that we have curated for helping you diagnose problems. You can customize which statistics are displayed, and you can also look at how statistics have changed over time. OtterTune knows to display health checks and statistics that are specific to the PostgreSQL or MySQL databases you\u2019re running.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"PostgreSQL\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Because of the way PostgreSQL implements multi-versioning for tables (you can think of it like how git stores diffs for commits but more \", /*#__PURE__*/e(o, {\n          href: \"https://www.percona.com/live/19/sessions/zheap-the-next-generation-storage-engine-for-postgres\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"inefficient\"\n          })\n        }), \"), it is more susceptible than other DBMSs to table health issues. Every time your application updates a tuple, the DBMS first copies the original tuple and then updates the copy. The original version is then marked as deprecated and will be cleaned up by the vacuum process at some point in the future.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The current version of OtterTune\u2019s Table Health Checks for PostgreSQL tracks the following information about the most important tables in your database:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Dead Tuple Ratio\"\n            }), \" \u2014 A \u201Cdead tuple\u201D is a row in your table that has either been (1) recently updated and is not visible to any active transaction or (2) recently deleted. Dead tuples slow down queries and causes inefficient storage utilization (time to vacuum!).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Stale Statistics\"\n            }), \" \u2014 The DBMS maintains \", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/current/view-pg-stats.html\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"statistical summaries\"\n              })\n            }), \" about each column\u2019s values. As your application inserts, updates, and deletes records in the database, these statistics get out of date. Old statistics can lead the DBMS\u2019s optimizer to make bad choices when generating query plans. Thus, this check indicates that it might be time to \", /*#__PURE__*/e(o, {\n              href: \"https://ottertune.com/blog/run-postgresql-analyze/\",\n              openInNewTab: !1,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"RUN ANALYZE\"\n              })\n            }), \" to keep SQL queries performing efficiently.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Excessive Reads\"\n            }), \" \u2014 Lastly, OtterTune checks whether your application executes queries that read too much data from the table compared to other tables. If you\u2019re running an operational workload (i.e., not analytics), then this could indicate that your DBMS is missing the right indexes and the system is not executing queries as efficient as it could. (Spoiler: OtterTune is working on automatic index tuning!)\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune also tracks over 30 different PostgreSQL table statistics that provide at-a-glance information about (1) table sizes, (2) I/O efficiency, (3) Heap, Page, and Buffer utilization, and (4) vacuum and analyze status.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"MySQL\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune tracks only a single health check for MySQL tables. This is because MySQL doesn\u2019t have to run an additional autovacuum worker in the background to clean up dead tuples. MySQL also does not enable all its \", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"performance schema\"\n          })\n        }), \" tracking by default, so that limits what OtterTune can discover on its own about your tables. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As such, OtterTune\u2019s Table Health Checks for MySQL will identify the following problems about your tables: performs a single table health check for MySQL (InnoDB only):\"\n      }), /*#__PURE__*/e(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Fragmentation Ratio\"\n            }), \" \u2014 As queries update records with \", /*#__PURE__*/e(o, {\n              href: \"https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"variable-length data\"\n              })\n            }), \" (e.g., \", /*#__PURE__*/e(\"code\", {\n              children: \"VARCHAR\"\n            }), \", \", /*#__PURE__*/e(\"code\", {\n              children: \"TEXT\"\n            }), \", \", /*#__PURE__*/e(\"code\", {\n              children: \"BLOB\"\n            }), \" columns), MySQL could split a record into two or more new pages to store the changes. These new pages will initially contain empty space because the DBMS will want to be able to store new data in them in the future without having to allocate new pages each time. But this empty space can lead to performance degradation (e.g., each page read from disk provides less data that is actually useful) and wasted storage allocation. Thus, this check indicates whether your table has too much fragmentation and is slowing down the system.\"]\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And of course OtterTune monitors and groups together 12 MySQL table statistics that is available in the dashboard: (1) table storage information, (2) index storage information, (3) allocated vs. utilized storage space, and (4) fragmentation ratios.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"OtterTune is watching your back\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019re spending too much (or not enough!) time tending to your database and tables, let OtterTune help you out. It automates database management for you with database health, table health, and machine learning-driven automatic configuration tuning. OtterTune helps ensure optimum performance and uptime, while you stay focused on development, customers, eating oysters, or \", /*#__PURE__*/e(o, {\n          href: \"https://www.youtube.com/watch?v=6UTfdEh4UpQ\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"harassing kayakers\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Create an \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune account\"\n          })\n        }), \" to run our automated health checks for your database and its tables. Then use its AI-powered tuning algorithm to auto-tune your database for free. \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Join us on Slack\"\n          })\n        }), \" to ask us, or other OtterTune community members, questions.\"]\n      })]\n    })\n  }, {\n    id: \"cRGBqDqte\",\n    [c]: \"Introducing OtterTune database quick-enable\",\n    [d]: \"database-quick-enable\",\n    [u]: \"2022-06-16T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/vZCMO2EZLiWsXdP9svsgJYruE.png\",\n      srcSet: \"https://framerusercontent.com/images/vZCMO2EZLiWsXdP9svsgJYruE.png?scale-down-to=512 512w, https://framerusercontent.com/images/vZCMO2EZLiWsXdP9svsgJYruE.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/vZCMO2EZLiWsXdP9svsgJYruE.png 1152w\"\n    }, \"dj ot running\"),\n    [m]: \"With OtterTune's Database Quick Enable feature, you get a dashboard that makes OtterTune setup easier by automatically pulling your Amazon RDS and Amazon Aurora database fleet information using the AWS IAM role you provide to OtterTune.\",\n    [g]: \"Sylvia Zhang | Michael Hermenault\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Our otters have been busily retooling the way you set up databases with OtterTune. The result: \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/wmjvaGmV/enabling-database-instances\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Database Quick Enable\"\n          })\n        }), \". With this new feature, you get a dashboard that makes OtterTune setup easier by automatically pulling your Amazon RDS and Amazon Aurora database fleet information using the AWS IAM role you provide to OtterTune. This is especially useful to OtterTune users who want to manage and auto-tune many RDS and Aurora database instances.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune database quick enable\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,Qhb8ELeuiadFWkPI4UbfZYOV210.png\",\n        \"data-framer-height\": \"586\",\n        \"data-framer-width\": \"1024\",\n        height: \"293\",\n        src: \"https://framerusercontent.com/images/Qhb8ELeuiadFWkPI4UbfZYOV210.png\",\n        style: {\n          aspectRatio: \"1024 / 586\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You can start using the basic features of OtterTune such as \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"introducing-database-health-checks\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Database Health Checks\"\n          })\n        }), \" just by clicking on the database entry in the list, and confirming that you\u2019d like to start using OtterTune with this database instance. You will still need to \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"new-agent-deployment-options\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"set up the OtterTune Agent\"\n          })\n        }), \" or enter credentials for the database instance before you can start using machine learning to optimize your databases.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How Database Quick Enable works\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Once you\u2019ve added your IAM role, you will be referred to the main dashboard that shows all your databases with OtterTune enabled, as well as the rest of the AWS RDS fleet that your IAM role has access to. Once you find the desired database, you simply click the \u201CEnable OtterTune\u201D button, verify the AWS database identifier and region, and click \u201CConfirm\u201D to start using OtterTune\u2019s basic features.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To establish a connection between OtterTune and your database and start tuning, follow the \u201CNext Step\u201D prompt. You will be walked through the process of providing permissions to OtterTune to collect metrics from your database, so you can take advantage of OtterTune\u2019s advanced optimization and full machine learning-driven tuning features.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"It\u2019s as easy as:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,HLtIfyGGOD45Mq49sn4AlPZhOU.png\",\n        \"data-framer-height\": \"1024\",\n        \"data-framer-width\": \"748\",\n        height: \"512\",\n        src: \"https://framerusercontent.com/images/HLtIfyGGOD45Mq49sn4AlPZhOU.png\",\n        style: {\n          aspectRatio: \"748 / 1024\"\n        },\n        width: \"374\"\n      })]\n    })\n  }, {\n    id: \"gOB3z3ZQs\",\n    [c]: \"Databases! Pandemic! Funding! A look back and a look forward\",\n    [d]: \"databases-pandemic-funding\",\n    [u]: \"2022-06-08T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/ZaqWzwwWXQRkL309RHs2eis9g.jpg\",\n      srcSet: \"https://framerusercontent.com/images/ZaqWzwwWXQRkL309RHs2eis9g.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/ZaqWzwwWXQRkL309RHs2eis9g.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/ZaqWzwwWXQRkL309RHs2eis9g.jpg 1094w\"\n    }, \"dj ot playing dice\"),\n    [m]: \"The start-up game is rough. We thought it would be helpful to others if we reflected on OtterTune\u2019s journey from an academic research project to a thriving start-up.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"The start-up game is rough. Fellow co-founders Dana Van Aken, Bohan Zhang, and I took a gamble on trying to build a start-up using ML for database tuning. And if launching the company during a pandemic wasn\u2019t difficult enough, trying to raise a funding round amid dicey economic and political news certainly made things harder. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But these issues are why we were especially excited to announce last month that OtterTune raised \", /*#__PURE__*/e(o, {\n          href: \"https://www.prnewswire.com/news-releases/ottertune-raises-12-million-series-a-funding-to-revolutionize-cloud-database-operations-led-by-intel-capital-and-race-capital-301543245.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$12 million in Series A funding\"\n          })\n        }), \", co-led by \", /*#__PURE__*/e(o, {\n          href: \"https://www.intelcapital.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Intel Capital\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://race.capital/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Race Capital\"\n          })\n        }), \", with \", /*#__PURE__*/e(o, {\n          href: \"https://www.accel.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Accel\"\n          })\n        }), \" participating.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We thought it would be helpful to others if we reflected on OtterTune\u2019s journey from an academic research project to a thriving start-up. We also want to talk about the challenges of creating a remote-first company.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Academic spin out\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We decided to form the OtterTune company right before the pandemic in February 2020. But when the US economy shut down in March 2020, venture capital funding wasn\u2019t easy to come by. We ended up taking angel funds from our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"lets-do-this\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"database friends\"\n          })\n        }), \". We got some bad advice from somebody in Pittsburgh and did not raise enough money initially, but we sorted that out later.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"dana van aken ottertune 2015 prototype\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,291HsrdzZfY04P1W2oJLyufY.jpg\",\n        \"data-framer-height\": \"1194\",\n        \"data-framer-width\": \"1492\",\n        height: \"597\",\n        src: \"https://framerusercontent.com/images/291HsrdzZfY04P1W2oJLyufY.jpg\",\n        style: {\n          aspectRatio: \"1492 / 1194\"\n        },\n        width: \"746\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Dana Van Aken presenting an early prototype of OtterTune at Carnegie Mellon University in 2015.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The next challenge that we faced was how to move the project from the university to the start-up. This migration was seemingly straightforward at first because we did not patent anything related to OtterTune at Carnegie Mellon University (CMU) during Dana\u2019s Ph.D. We just said that the OtterTune academic project ended, and we switched our focus to the new OtterTune start-up. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I believe that patents are valuable when \", /*#__PURE__*/e(o, {\n          href: \"https://www.reuters.com/article/us-marvell-technlgy-carnegiemellon/marvell-technology-to-pay-carnegie-mellon-750-million-over-patents-idUSKCN0VQ2YE\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"used correctly\"\n          })\n        }), \", but I decided not to pursue them based on advice from Mike Stonebraker. Mike told me long ago that not having any patents makes it easier to spin out a research project from the university as a company because you don\u2019t have to deal with lawyers.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But one problem that we did not anticipate was how to handle the source code. We weren\u2019t planning on using the academic OtterTune source code, and the original algorithms are publicly available in our \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/resources/\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"academic papers\"\n          })\n        }), \". \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But when we raised the seed round with Accel in 2021, the VC lawyers were concerned that we were starting a company based on our research, but there was no agreement with the university about what IP we were allowed to use. They wanted some assurance that the CMU would not have some claim over our new software in the future.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Although OtterTune\u2019s academic code was open-source, one mistake that we did make was to switch the license of the source code of OtterTune from Apache to MariaDB\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://mariadb.com/bsl11/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Business Source License\"\n          })\n        }), \" (BSL) in 2019. We did this because we had some sketchy conversations with somebody at a major cloud vendor about their plans to use OtterTune. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This person told Dana and me that they wanted our help getting our software running for them so that they could \u201Cmake a ton of money\u201D with it. But they said that they could not provide us with any research funds for our time and effort. We said fuck that and changed the source code\u2019s license to the BSL, which was enough to scare them away.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This switch to the BSL caused a problem with the VC lawyers. They felt that the BSL would restrict us in the future. We ended up having to license the source code from CMU even though we never used it. If I had to do it over again, I would have left the code with the Apache license and ignored the cloud vendor\u2019s requests for help because their engineers never figured out how to make OtterTun\u2019s ML algorithms work on their own. Again, applying ML to databases is hard.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I greatly appreciate working with our friends at Accel (\", /*#__PURE__*/e(o, {\n          href: \"https://www.accel.com/people/ping-li\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Ping Li\"\n          })\n        }), \") in guiding us through the early stages of our company. The first question that other VCs ask is when I will leave CMU (spoiler: I\u2019m not). Ping didn\u2019t bother me with that noise and instead focused on what we needed to get the product to market and scale the company.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Ramping up, remote first\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With our new cash money in 2020, we set out to find our first set of hires. One of the aspects of being a professor that I greatly enjoy is helping my students get jobs at database companies. But now, it was my time to hire them for myself.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune employee pizza party\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,QeHYc2QevzJaOTinY6JdzptVUw.jpg\",\n        \"data-framer-height\": \"1024\",\n        \"data-framer-width\": \"1024\",\n        height: \"512\",\n        src: \"https://framerusercontent.com/images/QeHYc2QevzJaOTinY6JdzptVUw.jpg\",\n        style: {\n          aspectRatio: \"1024 / 1024\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune asynchronous pizza party in April 2021.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We reached out to the best students from my first eight years at CMU and, luckily, were able to hire four of them right away. Today, roughly 60% of the OtterTune team are from CMU, including myself and the other co-founders (Dana, Bohan). CMU has the best Computer Science students in the world, so why wouldn\u2019t we try to hire them? Many other people, such as \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/HBQpeyF-QZs?t=64\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Mark Zuckerburg\"\n          })\n        }), \", have come to the same conclusion.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Since the company started at the height of the pandemic, we had no plans to rent an office, and the company was remote first from the beginning. The \u201Cwork from home\u201D freedom had some interesting outcomes and challenges. One unexpected trend for me is that everyone we hired who lived in the Bay Area wanted to move after joining us. Some moved back to Pittsburgh, and others moved to Seattle. This migration trend during the pandemic has been \", /*#__PURE__*/e(o, {\n          href: \"https://www.sfchronicle.com/sf/article/S-F-population-fell-6-3-most-in-nation-to-17199403.php\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"reported widely\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Luckily, since many of our first hires were former \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"CMU-DB\"\n          })\n        }), \" students, we had already worked with each other before. They were also familiar with my database-centric lifestyle, so I didn\u2019t have to explain my \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/HenryR/status/553314588062539777\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"eccentricities\"\n          })\n        }), \". But for the employees who were not previously my students, we had to develop ways to make them feel included. One thing that we did was get everyone a Nintendo Switch and hold weekly gaming competitions. We also encouraged everyone to attend the weekly \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/seminar2021/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"database tech talks\"\n          })\n        }), \" that I hosted.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Another thing we did was order everyone pizza for themselves at home when we hit a significant milestone. These things may sound trite to some, but I like to think they helped us keep it together in the formative months of the company.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What\u2019s next\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Despite pandemic-induced challenges, our \", /*#__PURE__*/e(o, {\n          href: \"https://amazing-animals-planet.com/post/what-is-a-group-of-river-otters-called\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raft\"\n          })\n        }), \" continues to grow. We are expanding at a rapid pace. Two more talented CMU students joined us as \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"ottertune-intern-showcase-2021\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"interns in 2021\"\n          })\n        }), \" and returned full-time after graduating in 2022. We are also excited to work with our new friends at Intel Capital (\", /*#__PURE__*/e(o, {\n          href: \"https://www.linkedin.com/in/nick-washburn-32216226/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Nick Washburn\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://www.linkedin.com/in/assaf-araki-2015054/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Assaf Araki\"\n          })\n        }), \") and Race Capital (\", /*#__PURE__*/e(o, {\n          href: \"https://race.capital/team/alfred-chuang/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Alfred Chuang\"\n          })\n        }), \").\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"I am more convinced now than when OtterTune was just an academic project that using ML for knob tuning provides huge improvements for many databases. And Gartner agrees, based on their inclusion of OtterTune in the \", /*#__PURE__*/e(\"strong\", {\n          children: \"2022 Cool Vendors in Augmented Data Management report.\"\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But there are steep challenges to getting people to set up their databases to achieve that benefit. And then, it is challenging to convey to them how much we made things better, especially in production environments with workloads that vary during the day/week. This round of funding enables us to expand OtterTune\u2019s automation capabilities for databases beyond knob tuning (e.g., index tuning, query tuning, and other optimizations).\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"So stay tuned this year for all the great things we are adding to OtterTune to provide you with peace of mind for your PostgreSQL and MySQL databases. You should also get amped for new \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.bandcamp.com/artists\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Records\"\n          })\n        }), \" releases.\"]\n      })]\n    })\n  }, {\n    id: \"F7HMnDG4s\",\n    [c]: \"Run ANALYZE. Run ANALYZE. Run ANALYZE.\",\n    [d]: \"run-postgresql-analyze-to-fix-a-slowdow-in-db\",\n    [u]: \"2022-05-19T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/OU7wVHZZjI9PWFgAunAKKsUJU.jpg\",\n      srcSet: \"https://framerusercontent.com/images/OU7wVHZZjI9PWFgAunAKKsUJU.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/OU7wVHZZjI9PWFgAunAKKsUJU.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/OU7wVHZZjI9PWFgAunAKKsUJU.jpg 1488w\"\n    }, \"dj ot magnifying glass\"),\n    [m]: \"We\u2019ve said it before, we\u2019ll say it again: one of the first things you should do, if not the first, when trying to solve a slow-running PostgreSQL query problem is run ANALYZE\",\n    [g]: \"Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve said it before, we\u2019ll say it again: one of the first things you should do, if not the first, when trying to solve a slow-running PostgreSQL query problem is run \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/sql-analyze.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ANALYZE\"\n          })\n        }), \". A recent interaction with an OtterTune user is a good case in point.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"About PostgreSQL ANALYZE\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Getting statistics about how your queries and jobs are operating is essential. The PostgreSQL ANALYZE command collects statistics about specific table columns, entire tables, or entire databases, and stores the results in the \", /*#__PURE__*/e(\"code\", {\n          children: \"pg_statistic\"\n        }), \" system catalog. The PostgreSQL query planner then uses these statistics to help determine the most efficient execution plans for queries.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"By default, ANALYZE examines every table in the current database. If you supply a table name as a parameter, ANALYZE examines only that table. You can also give ANALYZE a list of column names, in which case it collects only the statistics for those columns.\"\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"OtterTune user with slow-running load-transform jobs\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Recently, a PostgreSQL user contacted us via the \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Community Slack channel\"\n          })\n        }), \". This OtterTune user had an ETL workload running scripts that bulk-loaded data, and then ran queries to pre-aggregate values and store them. They had been experiencing slow performance problems for months.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"They were running \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/postgresql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS PostgreSQL\"\n          })\n        }), \". The Load & Transform jobs ran daily, and they processed roughly 4 million rows of data. The jobs took about one hour to run, on average. OtterTune tuning improved the data normalization time by 30%, but that was only part of the overall job.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In response to the user\u2019s help request, I dug into the issue. The first thing I did was ask the user to send us EXPLAIN ANALYZE output on his queries.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We saw that his database was not using an index on the table and doing a sequential scan of ~3.5 million rows. Hence, queries were running very slowly. We investigated further and noticed that query plans were different from those the customer ran manually \u2014 very much so.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When run manually, the analysis used:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"Hash Cond: (mrt_contributions.project_id = mrt_projects.project_id)\",\n            language: \"Python\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our guess was that the user did not run ANALYZE after the bulk loading, so the stats were not updated. This resulted in the optimizer choosing not to use an index. We asked the user to run ANALYZE after loading the data in the \", /*#__PURE__*/e(\"code\", {\n          children: \"dbt\"\n        }), \" script and uncovered an important issue in this line:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"Seq Scan on mrt_contributions (cost=0.00..242575.00 rows=1 width=4) \\n(actual time=0.006..1955.159 rows=3474601 loops=1)\",\n            language: \"Python\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We immediately recognized the problem: the row was 1 in the estimation, but the actual number of rows was 3474601. That\u2019s why the optimizer was choosing \", /*#__PURE__*/e(\"code\", {\n          children: \"seq scan\"\n        }), \" in the query plan, because it thought there was only one row.\"]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"From 52 minutes to 34 seconds\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The customer quickly learned the importance of running ANALYZE and is now creating a script so ANALYZE runs at regular intervals, automatically. We know from experience that running ANALYZE quickly pinpoints and provides a path to solving most issues. Said this customer: \u201CProof is in the pudding. Calling ANALYZE after building the models dropped the query times dramatically.\u201D\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Dramatically, indeed. The job run time went from 52 minutes to 34 seconds.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"elt job duration with vs without postgresql analyze\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,7XPCCFyVqZAxWheVsdno8XUM8I.svg\",\n        \"data-framer-height\": \"1962\",\n        \"data-framer-width\": \"3140\",\n        height: \"981\",\n        src: \"https://framerusercontent.com/images/7XPCCFyVqZAxWheVsdno8XUM8I.svg\",\n        style: {\n          aspectRatio: \"3140 / 1962\"\n        },\n        width: \"1570\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"This made OtterTune smarter\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this case, we solved the problem manually, and in the process learned to enhance OtterTune to recognize this pattern going forward and alert users that running ANALYZE is a good idea.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In the meantime, always run ANALYZE Also, reach out to us via \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"our Slack channel\"\n          })\n        }), \". We\u2019re here to help.\"]\n      })]\n    })\n  }, {\n    id: \"UIec54pHL\",\n    [c]: \"New deployment methods for the OtterTune Agent\",\n    [d]: \"new-agent-deployment-options\",\n    [u]: \"2022-04-20T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/K9RBJNB0vMrabL4rxTJGIQmOODA.png\",\n      srcSet: \"https://framerusercontent.com/images/K9RBJNB0vMrabL4rxTJGIQmOODA.png?scale-down-to=512 512w, https://framerusercontent.com/images/K9RBJNB0vMrabL4rxTJGIQmOODA.png 752w\"\n    }, \"dj ot jumping from plane\"),\n    [m]: \"The OtterTune agent is an open-source Python program that collects monitoring data from your database. We support installation via CloudFormation, Dock, Kubernetes Manifest and Helm Chart.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"The \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"how-ottertune-securely-collects-metrics\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Agent\"\n          })\n        }), \" is an open-source Python program that collects monitoring data from your database for OtterTune to analyze. Many of our customers opt to install the OtterTune Agent instead of using Guarded Public Access because it offers a secure, auditable application that can run in any environment.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"At OtterTune, we want \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"installing the agent\"\n          })\n        }), \" to be as easy as possible. Toward that end, we\u2019ve recently expanded our guided onboarding experience to include two new ways to install the agent in addition to the two existing approaches, totaling four guided onboarding experiences available on our website:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"CloudFormation Stack\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Docker\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Kubernetes Manifest (New!)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Helm Chart (New!)\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this post, we\u2019ll describe each of the four guided onboarding approaches and identify the different use cases for each.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"CloudFormation Stack\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune has a CloudFormation (CF) Stack template to deploy the agent on Fargate. You can fill out a form directly in the AWS console with your credentials and API key, and CloudFormation will take care of configuring, permissioning, and deploying the agent as a Docker container in AWS Fargate. This is by far the fastest way to get up and running and it\u2019s especially useful for organizations that already rely heavily on CloudFormation to manage their infrastructure. However, organizations with less CF familiarity might feel the process has too much magic.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Pros\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"The fastest approach to get up-and-running.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Cheap and effective. Using a Fargate container lets you right-size the agent so you don\u2019t pay for more resources than you need.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Fire and forget. Fargate is responsible for restarting failed containers.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Predictable pricing, if you\u2019re tracking it.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Cons\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Harder to track cloud spending. Many organizations prefer tracking their infrastructure in GitHub?. Resources created in the AWS console using this onboarding guide may need to be added to Source Control at a later time.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Easy to lose track of the cost. If you don\u2019t track your costs in Source Control, you can find your budget slowly draining over time. It\u2019s easy to create a resource in a far-off region with CF and forget to shut it down later. AWS\u2019s billing information, though extensive, isn\u2019t always easy to parse.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Docker\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The OG reliable method of software packaging and delivery. You can\u2019t go wrong with a \", /*#__PURE__*/e(o, {\n          href: \"https://www.docker.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Docker image\"\n          })\n        }), \". OtterTune distributes a \", /*#__PURE__*/e(o, {\n          href: \"https://gallery.ecr.aws/ottertune/agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"public Docker image\"\n          })\n        }), \" via \", /*#__PURE__*/e(o, {\n          href: \"https://gallery.ecr.aws/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Elastic Container Registry Public\"\n          })\n        }), \". Docker allows users to install and deploy the image in seconds on most major operating systems. Additionally, most operators are familiar with Docker, and using the OtterTune Agent is no different than any other Docker image!\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The biggest weakness with using Docker is database connectivity. Since the agent needs to connect to your AWS database, the Docker container must be running on a host with network access to the database. This could mean using a VPC and running the Docker container locally, or running the container on an EC2 node on an internal network. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Additionally, Docker containers aren\u2019t automatically restarted if they fail, so if the container crashes due to a system reboot, your monitoring data will look lumpy and OtterTune won\u2019t be able to generate new recommendations for knob settings. One quick solution to this is to run boot your Docker container with your operating system\u2019s init system. For example, on Linux distros that use \", /*#__PURE__*/e(\"code\", {\n          children: \"systemd\"\n        }), \", you can get away with a simple unit file like this:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: '[Unit] Description = \"OtterTuneAgent\"  \\n[Service] KillSignal=INT \\nExecStart=/usr/local/bin/docker run public.ecr.aws/ottertune/agent \\nRestart=always \\nExecStopPost=sleep 5',\n            language: \"Shell\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Pros\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Super familiar for many developers, making knowledge transfer lightweight.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Configure the agent using environment variables, following \", /*#__PURE__*/e(o, {\n              href: \"https://12factor.net/config\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"12-factor methodology\"\n              })\n            }), \".\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Best choice for anyone running the agent on a VM or bare metal.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Best choice for anyone running a Containers-As-A-Service platform like Google Cloud Run or Docker Swarm.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Cons\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"No local network access to the database.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Requires tweaking a supervisor to restart containers to prevent possible service disruption.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Most production platforms use a service orchestrator on top of Docker containers, requiring extra configuration.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"Kubernetes Manifest\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As mentioned in the last section, most cloud-native production architectures use a service orchestrator to supervise Docker containers. Far and away the most popular service orchestrator is Kubernetes (K8s). If you\u2019re already a K8s shop, then the Docker onboarding guide just isn\u2019t enough to get you up and running. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The Kubernetes manifest brings you one step closer by providing an example \", /*#__PURE__*/e(\"code\", {\n          children: \"Deployment\"\n        }), \" resource for the OtterTune agent. Just like any Kubernetes \", /*#__PURE__*/e(\"code\", {\n          children: \"Deployment\"\n        }), \", the agent will self-heal if the host node goes down, avoiding the problems discussed in the Docker section above.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The K8s manifest is especially useful for organizations whose RDS instances are only accessible from applications inside of the cluster. Using the manifest, you can deploy the agent alongside your applications, connecting the agent to RDS just like they do.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"However, K8s clusters are highly variable, and you might have to edit the manifest quite heavily to make it fit your cluster. The manifest we provide is the simplest possible, to make it as comprehensible as possible to those with little K8s exposure. If you have more sophisticated requirements for applications in your cluster, you may find it easier to pull code from existing \", /*#__PURE__*/e(\"code\", {\n          children: \"Deployment\"\n        }), \" manifests in your cluster than using this bare-bones example. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For example, if you want to use a \", /*#__PURE__*/e(\"code\", {\n          children: \"ConfigMap\"\n        }), \" or \", /*#__PURE__*/e(\"code\", {\n          children: \"Secret\"\n        }), \" to configure the OtterTune agent, you\u2019ll likely be writing twice as much YAML than you get in this manifest.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Pros\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Cluster networking allows you to securely connect to RDS instances.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Fastest approach if you already have a cluster.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Best choice for simple clusters.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Cons\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Overly simplistic manifest for most production scenarios.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Only applicable for organizations with a Kubernetes cluster.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Can\u2019t check the manifest into version control without storing sensitive information.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"Helm Chart\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Continuing with the theme of increasingly sophisticated container setups, OtterTune offers an \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/agent-helm-chart\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"open source Helm Chart\"\n          })\n        }), \" to handle more advanced Kubernetes setups. With the Helm Chart, you can perform more complex administrative tasks, like creating a \", /*#__PURE__*/e(\"code\", {\n          children: \"ServiceAccount\"\n        }), \", attaching annotation labels, node affinities, and resource constraints to the Agent Deployment, and storing credentials in Secrets. The Helm Chart is the most production-ready option for organizations using Kubernetes. If you\u2019re already using Helm, installing the Agent is a breeze:\"]\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Run this command: \", /*#__PURE__*/e(\"code\", {\n              children: \"helm repo add ottertune https://ottertune.github.io/agent-helm-chart/\"\n            })]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Create your \", /*#__PURE__*/e(\"code\", {\n              children: \"values.yaml\"\n            }), \" file.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Lastly, run this command: \", /*#__PURE__*/e(\"code\", {\n              children: \"helm install\"\n            })]\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019re not using Helm, consider giving it a try! Helm is the most widely used tool for Kubernetes package installation. We don\u2019t have any plans to add guided onboarding experiences for Helm alternatives like Cue, Dhall, or Kustomize, but \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune-community.slack.com/join/shared_invite/zt-wr4gztk0-Sta_86xRQ6~o3WRpMvRlgA#/shared-invite/email\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"let us know if that\u2019s something you\u2019d like to see\"\n          })\n        }), \". Helm can be a lot to learn, so if you want to go this route, there are several things to keep in mind:\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Pros\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Most production-ready approach for Kubernetes clusters.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Solves the problems present in the \", /*#__PURE__*/e(\"code\", {\n              children: \"Docker\"\n            }), \" and \", /*#__PURE__*/e(\"code\", {\n              children: \"Kubernetes Manifest\"\n            }), \" guides.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Easy support for \", /*#__PURE__*/e(\"code\", {\n              children: \"Secrets\"\n            }), \" \u2013 keep your credentials private!\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Configuration is extremely flexible and pragmatic.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Cons\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Helm, and Kubernetes more broadly, have a very high learning curve.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"The Helm Chart would benefit from supporting a wider set of features, like volume mounts.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"By default Helm still store \", /*#__PURE__*/e(\"code\", {\n              children: \"values\"\n            }), \" in plaintext in \", /*#__PURE__*/e(\"code\", {\n              children: \"etcd\"\n            }), \", so sensitive information like API keys and AWS credentials should be provided using an existing Kubernetes \", /*#__PURE__*/e(\"code\", {\n              children: \"Secret\"\n            }), \". Check out the \", /*#__PURE__*/e(o, {\n              href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"documentation\"\n              })\n            }), \" for more.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Helm isn\u2019t a perfect fit for everyone. If your organization is avoiding it, you might have to fall back on the Kubernetes manifest onboarding guide, and write a lot of YAML by hand.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We want to make OtterTune set-up as simple and secure as possible, so we\u2019re providing you with several options to deploy the OtterTune Agent deploy within your virtual private cloud (VPC) as a Kubernetes pod, on an EC2 instance, or anywhere else it can talk to your database.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019re a curious Otter, then come \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"talk to us on Slack\"\n          })\n        }), \". Our team is more than happy to help.\"]\n      })]\n    })\n  }, {\n    id: \"FdVLU3ocV\",\n    [c]: \"Keeping your database \u201COtterly\u201D healthy\",\n    [d]: \"introducing-database-health-checks\",\n    [u]: \"2022-03-30T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/TlKMD9WUiWoZXkFrk0a9gTNENtI.png\",\n      srcSet: \"https://framerusercontent.com/images/TlKMD9WUiWoZXkFrk0a9gTNENtI.png?scale-down-to=512 512w, https://framerusercontent.com/images/TlKMD9WUiWoZXkFrk0a9gTNENtI.png 744w\"\n    }, \"dj ot barbell curls\"),\n    [m]: \"Our Database Health Checks automatically detect and inform you of possible issues in your database in real-time and provide recommendations to fix what\u2019s going on\",\n    [g]: \"Bohan Zhang | Ruogu Du\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"It\u2019s no joke if your database is sick. Unexpected downtime or sluggish performance is bad news for business and will \", /*#__PURE__*/e(o, {\n          href: \"https://news.ycombinator.com/item?id=26286293\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"lead co-workers to turn on each other\"\n          })\n        }), \". That\u2019s why you need to \", /*#__PURE__*/e(o, {\n          href: \"https://www.doi.gov/blog/12-facts-about-otters-sea-otter-awareness-week\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"groom your database like an otter\"\n          })\n        }), \" to keep it running smoothly, stay available, and avoid slow performance. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Carving time out for regularly scheduled grooming is easier said than done when you have so many competing priorities to keep your database and your core business humming along. To make matters worse, database vendors now update their software on the regular; making it hard to keep up with every product version.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The good news? We\u2019re helping you keep your database in top shape with \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/BWzAvY9E/health-score\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Database Health Checks\"\n          })\n        }), \". This new feature automatically detects and informs you of possible issues in your database in real-time and provides recommendations to fix what\u2019s going on. As with all things OtterTune, we\u2019re here to help you keep your database optimized, efficient, scalable and highly available.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"What database health automatically checks\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Using Database Health Checks, you can stay on top of everything from your buffer cache hit rate to your disk space usage or the number of joins without using indexes. The Database Health checks are unique to different target databases, so the number of possible checks varies a little depending on what database you\u2019re running. \"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune database health checks\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,OXHbDJEKnnXG8rVvbl2P3OEKvYg.png\",\n        \"data-framer-height\": \"1568\",\n        \"data-framer-width\": \"3006\",\n        height: \"784\",\n        src: \"https://framerusercontent.com/images/OXHbDJEKnnXG8rVvbl2P3OEKvYg.png\",\n        style: {\n          aspectRatio: \"3006 / 1568\"\n        },\n        width: \"1503\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database Health also provides in-depth descriptions of each health check:\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Resource utilization\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune checks whether your database resource utilization is within a healthy range. For example, if your disk IOPS is under-utilized , it will recommend reducing provisioned IOPS to save cost. If it\u2019s over-utilized, it will suggest increasing the provisioned IOPS.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"CPU Utilization\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Database Connection Utilization\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Disk IOPS Utilization\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Disk Space Usage\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Local Storage Usage\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Memory Utilization\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Resource Under-utilization\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Cache management\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune checks whether your database cache management is efficient. For example, if your buffer cache hit rate is low, it will recommend increasing your database\u2019s buffer pool size.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Buffer Cache Hit Rate\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Index Cache Hit Rate\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Opened Table Rate\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Sort Merge Passes Ratio\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Database efficiency\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune checks whether your database index, autovacuum, and checkpoint management are efficient. For example, if your database has many joins without using indexes, it will recommend adding missing indexes and optimizing slow queries.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Dead Tuple Ratio\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Index Scan Ratio\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Join Without Indexes Rate\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Requested Checkpoint Ratio\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You can get started quickly with Database Health Checks. The first time you load the dashboard, it usually takes 20 to 30 seconds. After that, the cache speeds up the loading process.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Where Database Health gets its data\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Some of OtterTune\u2019s Database Health Checks use data from \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/cloudwatch/index.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon CloudWatch\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/performance-insights/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"RDS Performance Insights\"\n          })\n        }), \". Other checks require data from the OtterTune Agent. Rest assured that Database Health, like the \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"how-ottertune-securely-collects-metrics\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Agent\"\n          })\n        }), \", doesn\u2019t need access to schema, indexes, queries, or application data. And you don\u2019t need to expose your database for external access.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"So many clams, so little time\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We otters need to \", /*#__PURE__*/e(o, {\n          href: \"https://www.doi.gov/blog/12-facts-about-otters-sea-otter-awareness-week\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"eat 25 percent of our body weight in food every day\"\n          })\n        }), \". That takes a lot of time and effort. Let OtterTune Database Health do the hunting, digging and cracking for you.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Create an \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune account\"\n          })\n        }), \" to run health checks or auto-tune your database for free. \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Join us on Slack\"\n          })\n        }), \" to ask us, or other OtterTune community members, questions.\"]\n      })]\n    })\n  }, {\n    id: \"Q14HDbD2_\",\n    [c]: \"OtterTune March \u201922 product update: Protect ya neck\",\n    [d]: \"march-2022-product-update\",\n    [u]: \"2022-03-16T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Om6LofqLpP2KzpHKb7zv8E0ltg.png\",\n      srcSet: \"https://framerusercontent.com/images/Om6LofqLpP2KzpHKb7zv8E0ltg.png?scale-down-to=512 512w, https://framerusercontent.com/images/Om6LofqLpP2KzpHKb7zv8E0ltg.png 921w\"\n    }, \"dj ot breakdancing\"),\n    [m]: \"We introduced new features to make sure your database is running correctly and provide insights about how applications are using them. We also added the ability for you to have more control over its configuration tuning process, and make it easier to integrate OtterTune in your production environment.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Since our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"human-in-the-loop\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"last product update\"\n          })\n        }), \", we\u2019ve made many improvements to our automated tuning service for PostgreSQL and MySQL. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this latest update, we introduce new features to make sure your database is running correctly and provide insights about how applications are using them. We also added the ability for you to have more control over its configuration tuning process, and make it easier to integrate OtterTune in your production environment. We now discuss these new key features.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Database health and insights\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OtterTune auto-tuning engine continuously monitors your database metrics and runs machine learning algorithms to recommend optimization improvements. In this new release, we\u2019ve made OtterTune\u2019s analysis of your database workload more transparent. This transparency comes via three new helpful features:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Database Health Checks \u2013 OtterTune informs you of potentially problematic database behavior.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Database Insights \u2013 OtterTune shows you how it categorizes your database workload, so you can rationalize OtterTune change recommendations, and also make better scheduling and capacity planning decisions.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Best Configuration Baseline \u2013 OtterTune now makes it clear which configuration among its different configuration optimization iterations yielded the best results for your chosen tuning objective.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This release is the first step towards expanding OtterTune to provide you with peace of mind about all facets of your databases.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Database health\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune\u2019s \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/496DgZmX/database-instance-health-score\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Database Health Checks\"\n          })\n        }), \" feature automatically provides real-time analysis of your database\u2019s health conditions and suggests actions to fix the issues to improve your database\u2019s performance.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune database health checks\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,CZyGWoI0uppB4JKomNwwvElZxEw.jpg\",\n        \"data-framer-height\": \"1335\",\n        \"data-framer-width\": \"2560\",\n        height: \"667\",\n        src: \"https://framerusercontent.com/images/CZyGWoI0uppB4JKomNwwvElZxEw.jpg\",\n        style: {\n          aspectRatio: \"2560 / 1335\"\n        },\n        width: \"1280\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The Database Health checks are unique to different target databases (e.g., PostgreSQL vs. MySQL, and Amazon RDS vs. Amazon Aurora). They inform you about healthy or unhealthy resource utilization, cache, buffer, and I/O efficiency, and other conditions. If your database fails a health check, OtterTune will recommend fixes to the issue.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Database insights\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune Database Insights reveals how the service categorizes your database workload. It reports metrics that provide you with an overview of your database\u2019s behavior:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Workload Classification (read-only, read-heavy, write-heavy, write-only, balanced);\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Peak time based on throughput; and\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Disk read and write IOPs.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune database insights\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,kayA8nRVTMJwWWEGmq5bwBC7rYw.jpg\",\n        \"data-framer-height\": \"521\",\n        \"data-framer-width\": \"2560\",\n        height: \"260\",\n        src: \"https://framerusercontent.com/images/kayA8nRVTMJwWWEGmq5bwBC7rYw.jpg\",\n        style: {\n          aspectRatio: \"2560 / 521\"\n        },\n        width: \"1280\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune uses this information in its tuning algorithm and health checks. The Insights summary helps you understand why OtterTune makes the recommendations it gives you. If you don\u2019t understand why OtterTune is recommending something, take a look at the panel. The insights can also help you make better maintenance scheduling decisions and help with capacity planning (something OtterTune is working on automating, stay tuned!).\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Best configuration baseline\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune now automatically tracks the \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/y9qoPpmA/best-configuration-and-current-status\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Best Configuration\"\n          })\n        }), \" that it has discovered for your database. This is the best configuration OtterTune has seen so far and the latest performance and status information for the database. To help you maximize database performance, this panel includes statistics on measured target objectives for the database\u2019s best configuration, percentage improvement of target objective value of the best configuration over the baseline (first) configuration, and the name and status of the best configuration.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune best configuration baseline\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,p4BKt7wnZTwv05lv023XoRwoYG0.jpg\",\n        \"data-framer-height\": \"360\",\n        \"data-framer-width\": \"2070\",\n        height: \"180\",\n        src: \"https://framerusercontent.com/images/p4BKt7wnZTwv05lv023XoRwoYG0.jpg\",\n        style: {\n          aspectRatio: \"2070 / 360\"\n        },\n        width: \"1035\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To enable this feature:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"The tuning interval must be at least 24 hours.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"The baseline (first) configuration has at least 24 hours of target objective data; and,\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"The target objective cannot be throughput.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"New target objective: CPU utilization\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We also support more Target Objectives for OtterTune\u2019s tuning algorithm: p99 query latency (the \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"query-latency-vs-thoughput\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"recently-announced default\"\n          })\n        }), \") and all-new CPU utilization. The Target Objective is what OtterTune optimizes for when it generates new configurations for the database. You can change the Target Objective to guide OtterTune towards optimizing performance versus cost, for example.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Auto-tune Aurora for free\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Amazon Aurora support is now available with our free Starter tier plan, which offers basic auto-tuning of the most common knobs. We now support Aurora MySQL v5.6 and v5.7 (v8.0 coming soon!) and Aurora PostgreSQL versions v10, v11, v12, and v13.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You can get started auto-tuning Aurora for free by \", /*#__PURE__*/e(o, {\n          href: \"https://service.ottertune.com/signin/register\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"creating an OtterTune account\"\n          })\n        }), \" and following \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/categories/amRZXxmJ/getting-started\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: 'the \"Getting Started\" documentation'\n          })\n        }), \". Please refer to the \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune pricing information\"\n          })\n        }), \" for auto-tuning more than one database or additional enterprise features.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Auto-tune PostgreSQL v14\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Those of you running the latest version of PostgreSQL can now use OtterTune to auto-tune your databases and monitor database health. We\u2019ve also added support for new configuration knobs introduced in PostgreSQL 14. Here\u2019s the list of \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"postgresql-knobs-list\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"100+ PostgreSQL knobs\"\n          })\n        }), \" that OtterTune optimizes.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"More integration options\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve also added more integration options to make OtterTune a seamless part of your environment. We offer Kubernetes support for deploying the \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Agent\"\n          })\n        }), \", so you can \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"how-ottertune-securely-collects-metrics\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"connect to your database privately and securely\"\n          })\n        }), \", and send its knob/metric data back to the OtterTune service.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019re also streamlining identity and access management with Terraform support for \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/49EvgwW7/create-iam-role\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"IAM role\"\n          })\n        }), \" connectivity in addition to support for CloudFormation. Setup for Terraform can either be done manually or automatically.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"User docs and an open support community on Slack\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Check out our \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune user documentation\"\n          })\n        }), \", which details how to connect OtterTune to your database and start the machine learning (ML)-driven tuning process.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Create your OtterTune account\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"join us on Slack\"\n          })\n        }), \" to let us know how it\u2019s going. We look forward to your questions and feedback!\"]\n      })]\n    })\n  }, {\n    id: \"uONRYi2V0\",\n    [c]: \"Ten database commandments\",\n    [d]: \"database-ten-commandments\",\n    [u]: \"2022-03-09T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/osUrguSuwczYAR3xLwDTT14MPjI.jpg\",\n      srcSet: \"https://framerusercontent.com/images/osUrguSuwczYAR3xLwDTT14MPjI.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/osUrguSuwczYAR3xLwDTT14MPjI.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/osUrguSuwczYAR3xLwDTT14MPjI.jpg 1488w\"\n    }, \"dj ot with notorious big\"),\n    [m]: \"At OtterTune, we take the database hustle seriously. In memory of Biggie, we present our 10 street rules for databases.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Today is a sorrowful day for me because it marks the 25-year anniversary of \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/The_Notorious_B.I.G.\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"The Notorious B.I.G.\"\n          })\n        }), \"\u2018s murder. The seminal hip-hop artist was shot four times in a \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Murder_of_the_Notorious_B.I.G.\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"drive-by shooting\"\n          })\n        }), \" in Los Angeles on March 9th, 1997. He was only 24 years old. This was a rough time in hip hop because Biggie was killed just six months after \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Murder_of_Tupac_Shakur\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Tupac was shot\"\n          })\n        }), \" in Las Vegas.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One of Biggie\u2019s most popular songs (and probably my favorite) is \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Ten_Crack_Commandments\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Ten Crack Commandments\"\n          })\n        }), \", a step-by-step guide to achieving success in the game. The song is based on Biggie\u2019s experience in slinging rock at \", /*#__PURE__*/e(o, {\n          href: \"https://www.nytimes.com/1994/12/18/arts/pop-music-biggie-smalls-rap-s-man-of-the-moment.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"age 12 on Fulton Street in Brooklyn\"\n          })\n        }), \". Biggie spits fire over the beats produced by \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/DJ_Premier\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"DJ Premier\"\n          })\n        }), \". Ten Crack Commandments is on Biggie\u2019s final studio album, \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Life_After_Death\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Life After Death\"\n          })\n        }), \", released 16 days after his death.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"At OtterTune, we take the database hustle seriously \u2014 our goal is to make sure your database is running smoothly to keep your trap online no matter if you\u2019re doing operations or analytics. In memory of Biggie, we now present our 10 street rules for databases. You can listen to the \", /*#__PURE__*/e(o, {\n          href: \"https://www.youtube.com/watch?v=Ikq5ZmsBd6s\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2007 remastered version\"\n          })\n        }), \" as you read (or check out this \", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/neQJ2JIP1Fo?t=394\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"excellent 2013 remix\"\n          })\n        }), \" by DJ Finesse).\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #1: Never let no one know how much dough you hold\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never let a database vendor know what your budget is.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The list prices for databases are never what you end up paying. There are always discounts to be had if you push. But if a vendor knows about your bankroll for a database project, their salespeople will be less inclined to cut you a price break since they know you can afford it. There are plenty of stories of people getting shivved by their database vendors. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In 2018, reports said that Oracle was \", /*#__PURE__*/e(o, {\n          href: \"https://www.theinformation.com/articles/oracles-aggressive-sales-tactics-are-backfiring-with-customers\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"threatening customers with expensive license audits\"\n          })\n        }), \" unless they signed up for Oracle\u2019s cloud services. Nobody said that Larry Ellison bought his \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Lanai\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Hawaiian island\"\n          })\n        }), \" by being your friend.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/reserved-instances/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS Reserved Instances\"\n          })\n        }), \" give you the option to reserve a DB instance for a one- or three-year term and, in turn, receive a significant discount compared to the On-Demand Instance pricing. Reserved Instances can save you up to 69% over On-Demand rates, so do yourself a favor \u2013 don\u2019t flush your dough down the toilet.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #2: Never let 'em know your next move\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never let the man know what database tool you are going to use next.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"People write software tools because they want to solve a problem that they have. There are many new tools that people are turning out on the street (\u201C\", /*#__PURE__*/e(o, {\n          href: \"https://news.ycombinator.com/show\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Show HN\"\n          })\n        }), \"\u201D is a good place to start). The ones that I find the most interesting these days (other than OtterTune) are \", /*#__PURE__*/e(o, {\n          href: \"https://www.getdbt.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"dbt\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://datasette.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Datasette\"\n          })\n        }), \", and \", /*#__PURE__*/e(o, {\n          href: \"https://ibis-project.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Ibis\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you can\u2019t solve a problem using your organization\u2019s existing tooling, then give something new a try. You don\u2019t need to tell your boss or manager that you are doing this. It is better to ask for forgiveness than permission. Just be careful about copying or exposing data outside your organization so that you don\u2019t get popped.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #3: Never trust nobody\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never give permissions to developers who don\u2019t need direct access to the database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There are many ways to screw up your database. You don\u2019t want randos at your organization logging in and running queries that they found on Stack Overflow. Or worse, they could access sensitive data that they aren\u2019t supposed to and expose your organization to costly data breaches.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"I\u2019ve been one of those randos. At my first programming job when I was 17 years old in high school. Back then, my life was a mess. I got fired from a chicken restaurant because my friend Crazy Eddie accidentally played audio from an adult film on the building\u2019s speaker system, and some customers complained. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To keep me out of jail, I got a job programming websites using old-school PHP3 sites backed by MySQL ISAM. I wrote a DELETE query to clean up some erroneous data from our production database. But my query did not have a WHERE clause. I ended up blowing away the entire table.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"All the major DBMSs have sophisticated security measures to restrict access and operations to tables. As of 2022, the Postgres security protocols are more robust than the MySQL protocols since Postgres supports \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/ddl-rowsecurity.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"row-level security\"\n          })\n        }), \". Make sure you use these properly to protect your neck.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #4: Never get high on your own supply\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never store a DBMS\u2019s monitoring data back in the same DBMS.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Database systems generate a lot of metrics about themselves. This information is helpful to monitor and understand the system\u2019s runtime behavior. For example, the Postgres \", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_stat_all_tables\"\n          })\n        }), \" view tracks the number of tuples inserted, updated, and deleted in each table. Likewise, the MySQL \", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"performance schema\"\n          })\n        }), \" keeps counters for similar telemetry. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune uses these metrics to identify workload patterns and recommend optimized knob configurations when you \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/xmewDj9V/tuning-options\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"enable its optimization mode\"\n          })\n        }), \" on your database. Starting this week, OtterTune also continuously analyzes these metrics for its \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/496DgZmX/database-instance-health-score\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"automated health checks\"\n          })\n        }), \" to ensure that your database is running properly.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"All of this data is great, and it helps you understand why the DBMS does what it does (or does not). You should turn on performance monitoring.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"What you should not do is store this data back in the same DBMS instance that generated it. Monitoring data is less important than application data. So why would you overburden your production DBMS with it? Use a separate DBMS to store this information or offload it to third-party services (e.g., \", /*#__PURE__*/e(o, {\n          href: \"https://www.datadoghq.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"DataDog\"\n          })\n        }), \") designed for this kind of telemetry.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #5: Never sell no crack where you rest at\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never run your app on the same server as your DBMS.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A DBMS has better and more stable performance when it doesn\u2019t incur interference from external factors. Such factors are when the DBMS has to contend with other applications for hardware resources. The OS doesn\u2019t know that DBMSs are the most important thing in the world, and therefore it strives to treat each process that is running on it fairly.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"One of the craziest setups I\u2019ve seen was an application where the web server would SSH into the DBMS box and start a terminal process to interact with the database every time a customer logged into the site. And no surprise, when their site had 1000s of active users, each with their own process running on the DBMS machine, the DBMS performance was unstable.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Luckily, Amazon RDS MySQL and PostgreSQL instances run in their own VM controlled by Amazon, preventing people from doing this.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #6: That goddamn credit, dead it. You think a crackhead paying you back, shit forget it!\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never let DBMS tuning eat up all your time because you won\u2019t get it back.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Diagnosing DBMS performance issues is a daunting task. If you\u2019re a developer with DevOps responsibilities that require you to take care of your organization\u2019s databases, you can spend a lot of your time searching the web and forums looking for tuning advice. You\u2019ll find plenty of blog articles that give general advice. Most of them are correct, but we sometimes come across ones that suggest changes that are incorrect for some workloads. You can get sucked down a tuning rabbit hole, and you\u2019ll never get that time back. You are better off working on your application to add new features or fix bugs.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There are some automated tools to identify performance DBMS problems. For example, Amazon announced their \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/about-aws/whats-new/2021/12/amazon-devops-guru-rds-ml-powered-capability-amazon-aurora/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"DevOps Guru\"\n          })\n        }), \" service in December 2021 that can automatically detect and diagnose performance in RDS. An even better idea is to use an automated DBMS optimization service like OtterTune to handle the dirty tuning stuff for MySQL and Postgres.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #7: Keep your family and business completely separated\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never run too many database tenants on the same DBMS instance.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Hosting too many databases on a single DBMS instance can affect performance, especially if they support write-heavy applications. Each database is contending for hardware resources, and the DBMS may accommodate all requests equally.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Unlike \u201Centerprise\u201D DBMSs, like Oracle, MSSQL, and DB2, the two most popular open-source DBMSs, MySQL and Postgres, do not have built-in control mechanisms to limit resources per tenant. The Postgres extension \", /*#__PURE__*/e(o, {\n          href: \"https://github.com/cybertec-postgresql/pg_cgroups\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"pg_cgroups\"\n          })\n        }), \" can control the DBMS workers, but you cannot use it in RDS. Without such controls, the DBMS treats each tenant and their queries equally. This means that if one application\u2019s database hogs all the CPU and I/O, then there is no way to prevent it from affecting other databases hosted on the same DBMS instance.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you are maintaining multiple databases on a single DBMS instance now, you should make sure you use a proxy in front of the DBMS. The proxy will make it (potentially) easier for you to migrate databases to separate DBMSs in the future without having to modify application code. If you\u2019re running on AWS, then you should consider their \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/proxy/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"RDS Proxy\"\n          })\n        }), \" service.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #8: Never keep no weight on you!\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never weigh your database down with data jums.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A DBMS is a ravenous beast. It wants to consume all the CPU, memory, and disk IOPs it can get to run your queries. And when you give your system these resources it is never satisfied.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One way to get a temporary performance boost in your DBMS is to delay maintenance tasks. These maintenance tasks can vary from OS and DBMS version updates to patch security vulnerabilities or background operations that touch the physical database (e.g., checkpoints, background writer, ANALYZE, auto-vacuum). The former avoids having to restart the DBMS, while the latter can \", /*#__PURE__*/e(o, {\n          href: \"https://saurabhbadhwar.xyz/blog/2018/11/01/working-around-postgresql-autovacuum-performance-issues/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"free up resources\"\n          })\n        }), \" for queries.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But know that while your DBMS may run faster for a brief period, it is accumulating \u201Csystem debt\u201D and cruft over time. For example, Postgres\u2019 multi-version scheme (MVCC) means that every time you update a tuple, it makes a copy of that tuple with the new changes instead of overwriting the original tuple. The auto-vacuum goes through the tables and removes these dead tuples. If you turn this off, your tables will continue to grow, and it will take longer to find data because queries have to look at a bunch of useless data to find what they want. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You will also eventually run out of storage space. Similarly, if you turn off the background writer, then the DBMS will not proactively write out dirty pages in the buffer pool, which could mean that when a query needs to fetch a new page, it has to wait until the system writes out a dirty one to make space.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Don\u2019t mortgage your database\u2019s future by delaying these maintenance tasks. AWS makes scheduling updates during \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"maintenance windows\"\n          })\n        }), \" really easy. OtterTune can also automatically tune the frequency of these background tasks for both MySQL and Postgres to get the right balance between performance and protection.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #9: It you ain't gettin' bagged, stay the fuck from police\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never talk to the police about your database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If other programmers or DBAs think you are snitching, they will not try to listen to your excuses. They will be sitting in your kitchen, waiting to start hitting.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Rule #10: Consignment strictly for live men, not for freshmen\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Database: Never over-provision your DBMS for traffic that you don\u2019t have yet.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Cloud vendors like AWS are dangerous pushers. They provide you with nearly unlimited resources for your database. It only takes a few clicks to scale up your DBMS instance. And as I said in Rule #8, the DBMS will gladly use all the resources you give it. That is unless you don\u2019t actually need it.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You need to be careful that you don\u2019t overprovision your database. This means using an instance type that is too large, allocating too much storage space, or needlessly jacking up your provisioned IOPs. So unless you are getting high amounts of traffic that require this heat, you are wasting money (see our \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"dont-overpay-amazon-web-service-for-db\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"previous blog article\"\n          })\n        }), \" on this problem). And AWS is going to come collect their money from you whether you use those resources or not.\"]\n      })]\n    })\n  }, {\n    id: \"n2M1LfIbz\",\n    [c]: \"Databases, machine learning and Parisian riots\",\n    [d]: \"databases-machine-learning-riots\",\n    [u]: \"2022-02-11T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/1XhVMWZlRh3I5EGOmZw0P4DxLC0.jpg\",\n      srcSet: \"https://framerusercontent.com/images/1XhVMWZlRh3I5EGOmZw0P4DxLC0.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/1XhVMWZlRh3I5EGOmZw0P4DxLC0.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/1XhVMWZlRh3I5EGOmZw0P4DxLC0.jpg 1488w\"\n    }, \"andy palvo paris\"),\n    [m]: \"For Societe Generale (SG), a large French bank, we deployed a custom version of OtterTune for Oracle and saw 45% improvement vs. DBA-selected knobs.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"In our early experiments with OtterTune, we got great results in improving the performance of MySQL and PostgreSQL by optimizing their knob configurations. Before deciding to spin out the OtterTune research project into a start-up company, we wanted to prove that it could work on real-world applications.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"After publishing a \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/machine-learning/tuning-your-dbms-automatically-with-machine-learning/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"blog article\"\n          })\n        }), \" with Amazon about our SIGMOD 2017 paper, several companies reached out to us and asked whether we could set up OtterTune for them. One of them was a director of a database team at \", /*#__PURE__*/e(o, {\n          href: \"https://www.societegenerale.com/en\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Societe Generale\"\n          })\n        }), \" (SG), a large French bank. SG was interested in deploying OtterTune on their on-prem databases that support their IT infrastructure. The director understood the challenges of database tuning and was interested in applying new technologies, like machine learning, to alleviate performance problems.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We were excited by this collaboration! Dana Van Aken and I flew to Paris in December 2018 to meet SG\u2019s database team and discuss the deployment. Our visit coincided with the December 8th \u201C\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Yellow_vests_protests\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"yellow vest\"\n          })\n        }), \"\u201D protests in Paris around economic justice and political reform. We went out on the streets in support and ended up \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1071718604268277763\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"getting tear gassed\"\n          })\n        }), \" by the Parisian riot police. Nobody ever said databases were easy.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This blog article contains additional background information about the deployment of OtterTune at SG.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"SG database infrastructure\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The deployment of OtterTune at SG was originally supposed to target Postgres databases. SG turned out to be primarily an Oracle shop, so we created a custom version of OtterTune to support Oracle. The commercial version of OtterTune does not support this yet. If you\u2019re interested in OtterTune for Oracle (or any other DBMS other than PostgreSQL or MySQL), \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/contact/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"you can let us know here\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Updating OtterTune to support Oracle took a few months. It mostly required changes in its agent component that connects to the DBMS and retrieves metrics/knob information. Importantly, we did not need to change the machine learning (ML) algorithms. This is because OtterTune does not employ DBMS-specific optimizations in its underlying ML models.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"Societe Generale ottertune setup\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,LxDeWpOfAWTbpfpnkkGvQkSSwFY.png?originalFilename=Screenshot+2023-08-18+at+1.03.45+PM.png\",\n        \"data-framer-height\": \"592\",\n        \"data-framer-width\": \"1466\",\n        height: \"296\",\n        src: \"https://framerusercontent.com/images/LxDeWpOfAWTbpfpnkkGvQkSSwFY.png\",\n        style: {\n          aspectRatio: \"1466 / 592\"\n        },\n        width: \"733\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"At the time of our deployment, SG was running most of its database applications on Oracle (v12) on a virtualized private cloud infrastructure with non-local storage. They provide self-service provisioning for DBMS deployments that use a pre-tuned configuration based on a user-specified expected workload (e.g., OLTP vs. OLAP). The initial knob configuration for each Oracle instance is selected from a set of pre-tuned configurations that SG uses for its entire database fleet.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These Oracle deployments are managed by a team of skilled DBAs with experience in knob tuning, creating the ideal situation for making a comparison between the human DBA results and automatic tuning using ML.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Target database & workload\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We tested OtterTune on a 1TB Oracle v12.1 database that supported an IT issue tracking application, similar to Jira or Github Issues. We created a snapshot of the TicketTracker database from its production server using the \", /*#__PURE__*/e(o, {\n          href: \"https://www.oracle.com/database/technologies/high-availability/rman.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Oracle Recovery Manager\"\n          })\n        }), \" tool. The total uncompressed size of the database on disk is \u223C1.1 TB, of which 27% is table data, 19% is table indexes, and 54% is large objects (LOBs). This LOB data is notable because Oracle has knobs specifically for tuning BLOG memory pools.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Up to 45% improvement\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We compared the quality of the configurations OtterTune generated against DBA-selected knobs. To keep the comparison fair, we accounted for issues like long-running and failed configurations, as well as Oracle\u2019s background maintenance tasks.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We evaluated tuning 10, 20, and 40 knobs. Our experiments showed that 10 knobs turned out, on average, to produce the best results for this workload.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune can also automatically rank knobs based on how much impact they have on the DBMS\u2019s behavior. This ranking allows OtterTune to prioritize tuning knobs that have the highest likelihood to improve performance. We found that OtterTune\u2019s ranking algorithm performed as well as SG\u2019s in-house Oracle experts\u2019 rankings. For example, both OtterTune and the DBA targeted knobs related to the DBMS\u2019s memory allocations and query optimization. We see a similar trend when OtterTune tunes corresponding knobs in PostgreSQL.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"Societe Generale ottertune oracle performance\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,fmSBLWuWzkjuTdNG1imQA6isyDY.png?originalFilename=Screenshot+2023-08-18+at+1.04.44+PM.png\",\n        \"data-framer-height\": \"679\",\n        \"data-framer-width\": \"1536\",\n        height: \"339\",\n        src: \"https://framerusercontent.com/images/fmSBLWuWzkjuTdNG1imQA6isyDY.png\",\n        style: {\n          aspectRatio: \"1536 / 679\"\n        },\n        width: \"768\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Our results showed that our ML algorithms could generate knob configurations that improve performance by up to 45% over ones generated by a human expert.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We\u2019ve since deployed OtterTune in many real-world environments, with terrific results. The full details of the SG project are \", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2021/p1241-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"published here in VLDB 2021\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Acknowledgements\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We\u2019d like to thank Sebastian Brillard and Christian Bilien of SG for the great collaboration and support during this deployment.\"\n      })]\n    })\n  }, {\n    id: \"a47brsxYp\",\n    [c]: \"Video: OtterTune \u201CHuman-in-the-Loop\u201D mode\",\n    [d]: \"human-in-the-loop-controls-video\",\n    [u]: \"2022-01-28T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/ehbsrmiBQjdT1BttHWIjgfslVw.jpg\",\n      srcSet: \"https://framerusercontent.com/images/ehbsrmiBQjdT1BttHWIjgfslVw.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/ehbsrmiBQjdT1BttHWIjgfslVw.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/ehbsrmiBQjdT1BttHWIjgfslVw.jpg 1488w\"\n    }, \"otter human-in-the-loop\"),\n    [m]: \"This short video goes over how to activate human-in-the-loop controls, how to review recommendations, applying and skipping recommendations and controlling acceptable value ranges for configuration knobs.\",\n    [g]: \"Neal Kaviratna\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"A few weeks ago, I wrote about OtterTune\u2019s new \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"human-in-the-loop\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"\u201CHuman-in-the-Loop\u201D (HITL) controls\"\n          })\n        }), \" over automatic database configuration tuning. I recently presented a short talk and demo on the topic, and you can view the recording below.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The HITL mode enables OtterTune users to control what knobs OtterTune can automatically optimize and also control when and how changes are applied to the database. In the video, I explain the reasons for implementing HITL controls. We built them in response to users who requested the ability to apply change recommendations manually or who have DBMS change review/approval processes in place.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Then I demonstrated:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"How to activate HITL controls\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"How to review new configuration change recommendations\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Applying and skipping change recommendations\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Controlling acceptable value ranges for configuration knobs\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"I also touched on additional HITL features we plan to add this year. The video is just 10 minutes long, and it\u2019s a quick way to see how OtterTune let\u2019s you manage automatic database optimization more closely:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          \"--aspect-ratio\": \"560 / 315\",\n          aspectRatio: \"var(--aspect-ratio)\",\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",\n          children: t => /*#__PURE__*/e(h, {\n            ...t,\n            play: \"Off\",\n            shouldMute: !0,\n            thumbnail: \"High Quality\",\n            url: \"https://www.youtube.com/watch?v=ZdELrZ5Cayo\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Questions & Answers\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"After the talk, I received some interesting questions from the attendees, which I\u2019m sharing below.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Q: Does using OtterTune result in downtime for my production databases? Does it have to restart the database for changes to take effect?\"\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The answer depends on the knobs OtterTune changes. Some require a restart and some don\u2019t. In OtterTune, you can actually set a switch that prohibits OtterTune from changing knobs that require restarts. We wrote a \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"automatic-database-tuning-tips-handling-restarts\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"blog post related to this topic\"\n          })\n        }), \" a few months ago.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Q: Can OtterTune run in my data centers?\"\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As of January 2022, OtterTune can only tune Amazon RDS and Amazon Aurora databases (PostgreSQL and MySQL). We plan to add support for other cloud database platforms, other DBMSs, and eventually support for on-premises databases. If there are other DBMSs or platforms you\u2019d like to see us support, just let us know in the \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Slack channel\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Q: Does OtterTune also make recommendations for table partitioning, or disabling and creating indexes?\"\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"At this time, OtterTune recommends configuration tuning optimizations. We\u2019ve done research into using machine learning to automate the optimization of database design and queries, etc., so that\u2019s a possibility in the future.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you have questions, I invite you to \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/slack\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"join the OtterTune community Slack channel\"\n          })\n        }), \" and ask away!\"]\n      })]\n    })\n  }, {\n    id: \"dxDGTSDnW\",\n    [c]: \"Which PostgreSQL configuration settings does OtterTune optimize?\",\n    [d]: \"postgresql-knobs-list\",\n    [u]: \"2022-01-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Pgjy2i9Xx34BbXty3k3xfsV7Wg.jpg\",\n      srcSet: \"https://framerusercontent.com/images/Pgjy2i9Xx34BbXty3k3xfsV7Wg.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/Pgjy2i9Xx34BbXty3k3xfsV7Wg.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/Pgjy2i9Xx34BbXty3k3xfsV7Wg.jpg 1488w\"\n    }, \"otter postgresql knobs\"),\n    [m]: \"OtterTune optimizes each of 100+ PostgreSQL configuration settings to support the database\u2019s specific workload. This list goes over all the knobs OtterTune tunes.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"OtterTune automatic configuration tuning helps Amazon RDS PostgreSQL and Amazon Aurora PostgreSQL database users get better database performance at a lower cost, and with less DBA effort:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune postgresl sql vs rds vs pgtune\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,KMyAJx6UKivgUIQ3t5MOmIewac.png\",\n        \"data-framer-height\": \"338\",\n        \"data-framer-width\": \"699\",\n        height: \"169\",\n        src: \"https://framerusercontent.com/images/KMyAJx6UKivgUIQ3t5MOmIewac.png\",\n        style: {\n          aspectRatio: \"699 / 338\"\n        },\n        width: \"349\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune works by analyzing a PostgreSQL database\u2019s workload, and then using machine learning algorithms to optimize each of 100+ PostgreSQL configuration settings to support the database\u2019s specific workload. There are 3 questions people commonly ask about OtterTune:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Does OtterTune need to access my PostgreSQL data or queries? No (\u201C\", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"how-ottertune-securely-collects-metrics\"\n                },\n                webPageId: \"bjtIur_Vg\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How OtterTune Securely Collects Metrics\"\n              })\n            }), \"\u201C).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Can I control how OtterTune makes changes to database settings? Yes (\u201C\", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"human-in-the-loop\"\n                },\n                webPageId: \"bjtIur_Vg\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Human-in-the-Loop Control Over Auto-tuning\"\n              })\n            }), \"\u201C).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"What PostgreSQL configuration settings does OtterTune optimize? Read on to learn more about what knobs OtterTune optimizes.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Which PostgreSQL configuration settings does OtterTune auto-tune?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune analyzes and auto-tunes over 100 different PostgreSQL knobs. The exact list of knobs depends on two things:\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The edition of OtterTune you run:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"OtterTune Starter edition \u2013 free version, tunes a core set of 20 knobs\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"OtterTune Standard and Enterprise edition \u2013 paid versions, which tune 100+ knobs\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The version of PostgreSQL you run\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"As new, performance-related knobs are added to PostgreSQL, OtterTune adds support for them.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Amazon Aurora PostgreSQL implements a different storage layer than Amazon RDS and thus has fewer adjustable knobs. Therefore, Aurora users should note that OtterTune optimizes a slightly smaller subset of the knobs it tunes for Amazon RDS PostgreSQL.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Below, we list the Amazon RDS PostgreSQL knobs that OtterTune automatically optimizes.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\u201CCore\u201D PostgreSQL knobs tuned by the free OtterTune starter edition\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The free OtterTune Starter Edition tunes the following knobs for Amazon RDS PostgreSQL versions 9.6, 10, 11, 12, 13, and 14:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_cost_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_cost_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_scale_factor\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_threshold\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"bgwriter_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"bgwriter_lru_maxpages\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"bgwriter_lru_multiplier\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"checkpoint_completion_target\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"checkpoint_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"default_statistics_target\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"effective_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"effective_io_concurrency\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"maintenance_work_mem\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_wal_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_worker_processes\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"random_page_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"shared_buffers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"temp_buffers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_buffers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_writer_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"work_mem\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"100+ PostgreSQL knobs tuned by OtterTune standard and enterprise editions\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The paid OtterTune Standard and Enterprise Editions tune the same knobs as OtterTune Starter, above, plus these additional 90+ knobs, depending on which version of PostgreSQL you run:\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in PostgreSQL 9.6 and higher (except where noted)\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_analyze_scale_factor\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_analyze_threshold\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_freeze_max_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_max_workers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_multixact_freeze_max_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_naptime\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_work_mem\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"backend_flush_after\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"bgwriter_flush_after\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"checkpoint_flush_after\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"commit_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"commit_siblings\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"cpu_index_tuple_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"cpu_operator_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"cpu_tuple_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"cursor_tuple_fraction\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"deadlock_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"from_collapse_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"geqo_effort\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"geqo_generations\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"geqo_pool_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"geqo_selection_bias\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"geqo_threshold\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"gin_fuzzy_search_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"gin_pending_list_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"join_collapse_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_locks_per_transaction\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_parallel_workers_per_gather\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_pred_locks_per_transaction\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_standby_archive_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_standby_streaming_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_wal_senders\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"min_parallel_relation_size (version 9.6 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"min_wal_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"parallel_setup_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"parallel_tuple_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"replacement_sort_tuples (versions 9.6 and 10 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"seq_page_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"sql_inheritance (version 9.6 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"temp_file_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cost_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cost_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cost_page_dirty\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cost_page_hit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cost_page_miss\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_defer_cleanup_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_freeze_min_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_freeze_table_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_multixact_freeze_min_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_multixact_freeze_table_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_compression\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_keep_segments (versions 9.6, 10, 11, and 12 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_receiver_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_sender_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_sync_method\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"wal_writer_flush_after\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in PostgreSQL 10 and higher (except where noted)\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In PostgreSQL 10, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_logical_replication_workers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_parallel_workers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_pred_locks_per_relation\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_pred_locks_per_transaction\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_sync_workers_per_subscription\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"min_parallel_index_scan_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"min_parallel_table_scan_size\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in PostgreSQL 11 and higher\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In PostgreSQL 11, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"jit_above_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"jit_inline_above_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"jit_optimize_above_cost\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"parallel_leader_participation\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_cleanup_index_scale_factor\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"PostgreSQL 12\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There weren\u2019t any new knobs introduced in PostgreSQL 12 worth auto-tuning.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in PostgreSQL 13 and higher\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In PostgreSQL 13, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_insert_scale_factor\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"autovacuum_vacuum_insert_threshold\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"hash_mem_multiplier\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"logical_decoding_work_mem\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"maintenance_io_concurrency\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_slot_wal_keep_size\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in PostgreSQL 14\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In PostgreSQL 14, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"client_connection_check_interval\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"min_dynamic_shared_memory\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_failsafe_age\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"vacuum_multixact_failsafe_age\"\n          })\n        })]\n      })]\n    })\n  }, {\n    id: \"j4cyTyk8x\",\n    [c]: \"Which MySQL configuration settings does OtterTune optimize?\",\n    [d]: \"mysql-configuration-settings-list\",\n    [u]: \"2022-01-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/n4gV1uAI7WZVhKJ8KAud3EjO5JU.jpg\",\n      srcSet: \"https://framerusercontent.com/images/n4gV1uAI7WZVhKJ8KAud3EjO5JU.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/n4gV1uAI7WZVhKJ8KAud3EjO5JU.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/n4gV1uAI7WZVhKJ8KAud3EjO5JU.jpg 1488w\"\n    }, \"otter mysql knobs\"),\n    [m]: \"OtterTune optimizes each of 150+ MySQL configuration settings to support the database\u2019s specific workload. This list goes over all the knobs OtterTune tunes.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune automatically optimizes Amazon RDS MySQL and Amazon Aurora MySQL configuration settings (\u201Cknobs\u201D) to help database users get \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"benchmark-using-machine-learning-to-optimize-amazon-rds-mysql-performance\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"better database performance at a lower cost\"\n          })\n        }), \" and with less DBA effort:\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune mysql vs rds vs mysqltuner\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,eKQv5XaVBnp5uXVudl3hZ6Dl1iI.png\",\n        \"data-framer-height\": \"622\",\n        \"data-framer-width\": \"1024\",\n        height: \"311\",\n        src: \"https://framerusercontent.com/images/eKQv5XaVBnp5uXVudl3hZ6Dl1iI.png\",\n        style: {\n          aspectRatio: \"1024 / 622\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune works by analyzing a database\u2019s workload, and then using machine learning algorithms to optimize each of 150+ MySQL configuration settings to support the database\u2019s specific workload. There are 3 questions people commonly ask about OtterTune:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Does OtterTune need to access my data or queries? No (\u201C\", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"how-ottertune-securely-collects-metrics\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How OtterTune Securely Collects Metrics\"\n              })\n            }), \"\u201C).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Can I control how OtterTune makes changes to my database settings? Yes (\u201C\", /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"human-in-the-loop\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Human-in-the-Loop Control Over Auto-tuning\"\n              })\n            }), \"\u201C).\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"What MySQL configuration settings does OtterTune optimize? Read on to learn more about what knobs OtterTune optimize.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Which MySQL configuration settings does OtterTune auto-tune?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune analyzes and auto-tunes over 150 different MySQL knobs on Amazon. The exact list of knobs depends on two things:\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"edition of OtterTune\"\n          })\n        }), \"\\xa0you run:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"OtterTune Starter edition \u2013 free version, tunes a core set of 15 MySQL knobs.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"OtterTune Standard and Enterprise edition \u2013 paid versions, which tunes 150+ MySQL knobs.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The version of MySQL you run:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"As new, performance-related knobs are added to MySQL, OtterTune adds support for them.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Amazon Aurora MySQL implements a different storage layer than Amazon RDS MySQL and has fewer adjustable configuration settings. Therefore, Aurora users should note that OtterTune optimizes a slightly smaller subset of the knobs it tunes for Amazon RDS MySQL.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Below, we list the Amazon RDS MySQL knobs that OtterTune optimizes.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"\u201CCore\u201D MySQL knobs tuned by the free OtterTune starter edition\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"free OtterTune Starter Edition\"\n          })\n        }), \" tunes the following Amazon RDS MySQL configuration settings for MySQL versions 5.6 and higher, except where noted):\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_adaptive_flushing_lwm\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_adaptive_hash_index\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_adaptive_max_sleep_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_instances\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_change_buffering\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_io_capacity\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_file_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_max_dirty_pages_pct\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_max_dirty_pages_pct_lwm (versions 5.7 and higher)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_sync_array_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_thread_concurrency\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_heap_table_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"thread_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"tmp_table_size\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"150+ MySQL knobs tuned by OtterTune standard and enterprise editions\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The paid OtterTune Standard and Enterprise Editions tune the same knobs as OtterTune Starter, above, plus these additional 150+ knobs, depending on which version of MySQL you run:\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in MySQL 5.6 and higher (except where noted)\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"binlog_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"binlog_max_flush_queue_time\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"binlog_stmt_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"eq_range_index_dive_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"host_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_adaptive_flushing\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_autoextend_increment\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_dump_now\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_load_at_startup\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_load_now\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_change_buffer_max_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_commit_concurrency\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_compression_failure_threshold_pct\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_compression_level\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_compression_pad_pct_max\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_concurrency_tickets\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_flush_log_at_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_flush_neighbors\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_flushing_avg_loops\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_ft_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_ft_result_cache_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_ft_sort_pll_degree\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_io_capacity_max\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_lock_wait_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_lru_scan_depth\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_max_purge_lag\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_max_purge_lag_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_old_blocks_pct\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_old_blocks_time\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_online_alter_log_max_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_page_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_purge_batch_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_purge_threads\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_random_read_ahead\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_read_ahead_threshold\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_read_io_threads\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_replication_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_rollback_segments\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_sort_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_spin_wait_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_sync_spin_loops\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_thread_sleep_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_use_native_aio\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_write_io_threads\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"join_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"lock_wait_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_binlog_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_binlog_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_binlog_stmt_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_delayed_threads\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_insert_delayed_threads\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_join_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_length_for_sort_data\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_seeks_for_key\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_sort_length\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_sp_recursion_depth\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_tmp_tables (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_write_lock_count\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"metadata_locks_cache_size (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"optimizer_prune_level\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"optimizer_search_depth\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"preload_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_alloc_block_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_cache_limit (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_cache_min_res_unit (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_cache_size (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_cache_type (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_cache_wlock_invalidate (versions 5.6 and 5.7 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"query_prealloc_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"range_alloc_block_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"read_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"read_rnd_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_checkpoint_group\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_checkpoint_period\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_parallel_workers\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_pending_jobs_size_max\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"sort_buffer_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"stored_program_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"table_definition_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"table_open_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"table_open_cache_instances\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"thread_stack\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"timed_mutexes (version 5.6 only)\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"transaction_alloc_block_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"transaction_prealloc_size\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in MySQL 5.7 and higher (except where noted)\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In MySQL 5.7, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"binlog_group_commit_sync_delay\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"binlog_group_commit_sync_no_delay_count\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_adaptive_hash_index_parts\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_chunk_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_buffer_pool_dump_pct\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_disable_sort_file_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_flush_sync\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_ft_total_cache_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_write_ahead_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_max_undo_log_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_page_cleaners\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_purge_rseg_truncate_frequency\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"range_optimizer_max_mem_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"rpl_stop_slave_timeout\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_allow_batching\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"slave_parallel_type\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Knobs tuned in MySQL 8\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In MySQL 8, OtterTune tunes all of the knobs listed above (except where noted), plus these knobs:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_dedicated_server\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_doublewrite_batch_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_doublewrite_files\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_doublewrite_pages\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_files_in_group\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_spin_cpu_abs_lwm\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_spin_cpu_pct_hwm\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"innodb_log_wait_for_flush_spin_hwm\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"max_relay_log_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"open_files_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"parser_max_mem_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"relay_log_space_limit\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"rpl_read_size\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"stored_program_definition_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"tablespace_definition_cache\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"temptable_max_ram\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Try it yourself\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019d like to learn more about how OtterTune automates MySQL database configuration tuning, watch \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"ottertune-explained-in-five-minutes\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"this short video\"\n          })\n        }), \".\"]\n      })]\n    })\n  }, {\n    id: \"GvGMLdrtd\",\n    [c]: \"Databases in 2021: A year in review\",\n    [d]: \"2021-databases-retrospective\",\n    [u]: \"2021-12-28T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/VJFIYym7Gb6PChDc69RztEv9E6A.jpg\",\n      srcSet: \"https://framerusercontent.com/images/VJFIYym7Gb6PChDc69RztEv9E6A.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/VJFIYym7Gb6PChDc69RztEv9E6A.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/VJFIYym7Gb6PChDc69RztEv9E6A.jpg 1488w\"\n    }, \"2021 databases in review andy pavlo\"),\n    [m]: \"It was a wild year for the database industry, with newcomers overtaking the old guard, vendors fighting over benchmark numbers, and eye-popping funding rounds. It\u2019s worth reflecting and taking stock as we move into 2022\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"It was a wild year for the database industry, with newcomers overtaking the old guard, \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1460429162741645330\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"vendors fighting\"\n          })\n        }), \" over benchmark numbers, and eye-popping funding rounds. We also had to say goodbye to some of our database friends through acquisitions, bankruptcies, or retractions.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As the end of the year draws near, it\u2019s worth reflecting and taking stock as we move into 2022. Here are some of the highlights and a few of my thoughts on what they might mean for the field of databases.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Dominance of PostgreSQL\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The conventional wisdom among developers has shifted: PostgreSQL has become the first choice in new applications. It is reliable. It has many features and keeps adding more. In 2010, the PostgreSQL development team switched to a more aggressive release schedule to put out a new major version once per year (H/T \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/fuzzycz/status/1475956928295673857\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Tomas Vondra\"\n          })\n        }), \"). And of course PostgreSQL is open-source.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"PostgreSQL \", /*#__PURE__*/e(o, {\n          href: \"https://dbdb.io/browse?compatible=postgresql\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"compatibility\"\n          })\n        }), \" is a distinguishing feature for a lot of systems now. Such compatibility is achieved by supporting PostgreSQL\u2019s SQL dialect (\", /*#__PURE__*/e(o, {\n          href: \"https://news.ycombinator.com/item?id=24531606\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"DuckDB\"\n          })\n        }), \"), wire protocol (\", /*#__PURE__*/e(o, {\n          href: \"https://questdb.io/docs/reference/api/postgres\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"QuestDB\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://databasearchitects.blogspot.com/2015/04/using-hyper-with-postgresql-drivers.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"HyPer\"\n          })\n        }), \"), or the entire front-end (\", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/database/introducing-the-aurora-storage-engine/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon Aurora\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://docs.yugabyte.com/latest/api/ysql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"YugaByte\"\n          })\n        }), \", \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Yellowbrick_Data\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Yellowbrick\"\n          })\n        }), \"). The big players have jumped on board. Google announced in October that they added \", /*#__PURE__*/e(o, {\n          href: \"https://www.infoq.com/news/2021/10/cloud-spanner-postgresql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PostgreSQL compatibility in Cloud Spanner\"\n          })\n        }), \". Also in October, Amazon announced the \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/about-aws/whats-new/2021/10/babelfish-aurora-postgresql-now-generally-available/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Babelfish\"\n          })\n        }), \" feature for converting SQL Server queries into Aurora PostgreSQL.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One measurement of the popularity of a database is the \", /*#__PURE__*/e(o, {\n          href: \"https://db-engines.com/en/ranking/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"DB-Engine rankings\"\n          })\n        }), \". This ranking is not perfect and the score is somewhat subjective, but it\u2019s a reasonable approximation for the top 10 systems. As of December 2021, the ranking shows that while PostgreSQL remains the fourth most popular database (after Oracle, MySQL, and MSSQL), it reduced the gap with MSSQL in the past year.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Another trend to consider is how often PostgreSQL is mentioned in online communities. This gives another signal for what people are talking about in databases. I downloaded all of the 2021 comments made on the \", /*#__PURE__*/e(o, {\n          href: \"https://reddit.com/r/database/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Database Subreddit\"\n          })\n        }), \" and counted the frequency of database names (in PostgreSQL of course). I cross-referenced the list of every database that I know about from my \", /*#__PURE__*/e(o, {\n          href: \"https://dbdb.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Database of Databases\"\n          })\n        }), \", cleaned up abbreviations (e.g., Postgres \u2192 PostgreSQL, Mongo \u2192 MongoDB, ES \u2192 Elasticsearch), and then calculated the top 10 most-mentioned DBMS:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"     dbms      | cnt \\n---------------+-----\\n PostgreSQL    | 656\\n MySQL         | 317\\n MongoDB       | 266\\n Oracle        | 222\\n SQLite        | 213\\n Redis         |  88\\n Elasticsearch |  70\\n Snowflake     |  52\\n DGraph        |  46\\n Neo4j         |  42\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Of course this ranking is not scientific, since I am not doing sentiment analysis on the comments. But it clearly shows that people are mentioning Postgres more than other systems in the past year. There are often posts from developers asking what DBMS to use for their new application, and the response from the community is almost always Postgres.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy\u2019s take\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Foremost, it is a good thing that a relational database system has become the first choice in greenfield applications. This shows the staying power of Ted Codd\u2019s relational model from the 1970s. Second, PostgreSQL is a great database system. Yes, it has known issues and dark corners, as does every DBMS. But with so much attention and energy focused on it, PostgreSQL is only going to get better over the years.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Benchmark violence\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There\u2019s no love lost between different database vendors this year over benchmark results. Vendors trying to show that their system is faster than their competitors\u2019 goes back to the late 1980s. That\u2019s why \", /*#__PURE__*/e(o, {\n          href: \"http://tpc.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"TPC\"\n          })\n        }), \" was set up to provide a non-partisan forum for officiating over comparisons. But as the influence and prevalence of TPC has \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1461164543825129481\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"waned over the last decade\"\n          })\n        }), \", we now find ourselves in a new round of database benchmark wars.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"There were three major street battles that heated up this year over benchmark results.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"Databricks vs. Snowflake\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Databricks announced that their new Photon SQL engine set a \", /*#__PURE__*/e(o, {\n          href: \"https://databricks.com/blog/2021/11/02/databricks-sets-official-data-warehousing-performance-record.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"new world record in 100TB TPC-DS\"\n          })\n        }), \". Snowflake fired back, saying its database is \", /*#__PURE__*/e(o, {\n          href: \"https://www.snowflake.com/blog/industry-benchmarks-and-competing-with-integrity/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2x faster\"\n          })\n        }), \" and that Databricks ran Snowflake incorrectly. \", /*#__PURE__*/e(o, {\n          href: \"https://databricks.com/blog/2021/11/15/snowflake-claims-similar-price-performance-to-databricks-but-not-so-fast.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Databricks countered\"\n          })\n        }), \", claiming their SQL engine provides superior execution and price performance over Snowflake.\"]\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"Rockset vs. Apache Druid vs. ClickHouse\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://altinity.com/blog/clickhouse-nails-cost-efficiency-challenge-against-druid-rockset\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ClickHouse came out swinging\"\n          })\n        }), \", saying it nailed cost efficiency when compared to Druid and Rockset. But not so fast: \", /*#__PURE__*/e(o, {\n          href: \"https://imply.io/blog/druid-vs-rocktset-revisted/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Imply responded\"\n          })\n        }), \" with tests on a newer version of Druid and claimed victory. \", /*#__PURE__*/e(o, {\n          href: \"https://rockset.com/blog/comparing-rockset-apache-druid-clickhouse-real-time-analytics/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Rockset joined in\"\n          })\n        }), \", saying its performance is was better for real-time analytics than the other two.\"]\n      }), /*#__PURE__*/e(\"h5\", {\n        children: \"ClickHouse vs. TimescaleDB\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Smelling blood in the water, tiger-style \", /*#__PURE__*/e(o, {\n          href: \"https://blog.timescale.com/blog/what-is-clickhouse-how-does-it-compare-to-postgresql-and-timescaledb-and-how-does-it-perform-for-time-series-data/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Timescale joined the fray\"\n          })\n        }), \". They shot out their own benchmarks results and took the opportunity to point out weaknesses in ClickHouse\u2019s technology. The discussion of third-party benchmarks \", /*#__PURE__*/e(o, {\n          href: \"https://news.ycombinator.com/item?id=29096541\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"got heated on Hacker News\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy\u2019s take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Too much blood has been shed in the database community in previous benchmark turf wars [\", /*#__PURE__*/e(o, {\n          href: \"https://www.mongodb.com/blog/post/high-performance-benchmarking-mongodb-and-nosql-systems\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"1\"\n          })\n        }), \"] [\", /*#__PURE__*/e(o, {\n          href: \"https://www.percona.com/blog/2011/02/28/is-voltdb-really-as-scalable-as-they-claim/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"2\"\n          })\n        }), \"] [\", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/-TIUGC4X2q8?t=418\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"3\"\n          })\n        }), \"]. I fully admit that I \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/296336208588595200\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"used to be in the game\"\n          })\n        }), \". But I\u2019ve lost too many friends in the streets. I even broke up with a girlfriend once because of sloppy benchmark results. As I\u2019ve gotten older, I can now say that it\u2019s not worth it. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"It\u2019s even harder now to compare systems because cloud DBMSs have so many moving parts and tunable options that it is often difficult to ascertain the real reasons for performance differences. Real applications also do more than just run the same queries one after another. The user experience when ingesting, transforming, and cleaning data can matter as much as raw performance numbers. And as I told the reporter \", /*#__PURE__*/e(o, {\n          href: \"https://www.protocol.com/enterprise/databricks-snowflake-data-warehouse-tpc\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"in this article about Databricks\u2019 benchmarks results\"\n          })\n        }), \", only old people care about official TPC numbers.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Big data, big money\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The number of venture rounds worth at least $100 million has been steadily increasing since the second half of 2020. There were 327 of these mega-deals in 2020 (just less than half of total VC deal volume). And as of January of 2021, there were \", /*#__PURE__*/e(o, {\n          href: \"https://explodingtopics.com/blog/vc-trends\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"over 100 venture-backed investment rounds\"\n          })\n        }), \" worth $100 million or more.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"A lot of that investment money was thrown at database companies in 2021. For operational databases, CockroachDB led the fundraising leaderboard by starting the year with a \", /*#__PURE__*/e(o, {\n          href: \"https://venturebeat.com/2021/01/12/cockroachdb-creator-cockroach-labs-raises-160-million-at-a-2-billion-valuation/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$160m round\"\n          })\n        }), \" and then closed it off with raising another \", /*#__PURE__*/e(o, {\n          href: \"https://www.cockroachlabs.com/news/press-release-series-f-funding/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$278m in December 2021\"\n          })\n        }), \". Yugabyte got paid when they \", /*#__PURE__*/e(o, {\n          href: \"https://hrnxt.com/news/investment/yugabyte-closes-188-million-series-c-funding-round-bringing-valuation-to-over-1-3b/44702/2021/11/02/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised a $188m Series C round\"\n          })\n        }), \". PlanetScale pulled out a \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2021/06/23/planetscale-raises-30m-series-b-for-its-database-service/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$20m Series B\"\n          })\n        }), \" for their hosted version of \", /*#__PURE__*/e(o, {\n          href: \"https://vitess.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Vitess\"\n          })\n        }), \". The comparatively older NoSQL stalwart DataStax, too, raised \", /*#__PURE__*/e(o, {\n          href: \"https://www.crunchbase.com/funding_round/datastax-series-unknown--75eb1d91\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$37.6m in a venture round\"\n          })\n        }), \" for their Cassandra business.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As impressive as these amounts are, the analytical database market is even more heated. TileDB raised an \", /*#__PURE__*/e(o, {\n          href: \"https://tiledb.com/blog/lockheed-martin-ventures-and-ntt-docomo-ventures-invest-in-tiledb-inc-to-advance-their-universal-database-2021-09-29/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"undisclosed amount\"\n          })\n        }), \" in September 2021. Vectorized.io \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2021/01/26/vectorized-announces-15-5m-investment-to-build-simpler-streaming-data-tool/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised $15m\"\n          })\n        }), \" for their Kafka-compatible streaming platform. StarTree came out of stealth and announced its \", /*#__PURE__*/e(o, {\n          href: \"https://www.zdnet.com/article/apache-pinot-focused-startree-raises-24m-series-a/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$24m round\"\n          })\n        }), \" to commercialize Apache Pinot. The matviews-on-steroids DBMS Materialize announced that they \", /*#__PURE__*/e(o, {\n          href: \"https://venturebeat.com/2021/09/30/streaming-database-platform-provider-materialize-lands-60m/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"copped $60m for their series C\"\n          })\n        }), \". Imply \", /*#__PURE__*/e(o, {\n          href: \"https://venturebeat.com/2021/06/16/data-analytics-startup-imply-nabs-70m-to-grow-cloud-service/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised $70m\"\n          })\n        }), \" for database service based on Apache Druid. SingleStore \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2021/09/08/real-time-database-platform-singlestore-raises-80m-more-now-at-a-940m-valuation/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised $80m\"\n          })\n        }), \" in September 2021, taking them one step closer to going IPO. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"At the beginning of the year, Starburst Data \", /*#__PURE__*/e(o, {\n          href: \"https://www.bloomberg.com/news/articles/2021-01-06/starburst-data-hits-1-2-billion-valuation-as-andreessen-invests\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised $100m\"\n          })\n        }), \" for its Trino system (formerly PrestoSQL). Firebolt was another DBMS start-up coming out of stealth to announced that they \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2021/06/24/firebolt-raises-127m-more-for-its-new-approach-to-cheaper-and-more-efficient-big-data-analytics/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised $127m\"\n          })\n        }), \" for its new cloud data warehouse based on a fork of ClickHouse. A new company, ClickHouse, Inc., \", /*#__PURE__*/e(o, {\n          href: \"https://www.businesswire.com/news/home/20211028005287/en/ClickHouse-Raises-250M-Series-B-To-Scale-Groundbreaking-OLAP-Database-Management-System-Globally\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raised a staggering $250m\"\n          })\n        }), \" to establish a new company around the system (as well as securing the rights to use the ClickHouse name from Yandex).\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But the clear winner in the largest funding round this year was Databricks, who blew everyone else away by \", /*#__PURE__*/e(o, {\n          href: \"https://techcrunch.com/2021/08/31/databricks-raises-1-6b-at-38b-valuation-as-it-blasts-past-600m-arr/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"raising a whopping $1.6b\"\n          })\n        }), \" in August 2021.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy\u2019s take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We are in the golden era of databases. There are so many excellent choices available today. Investors are searching for database start-ups that can become the next Snowflake-like IPO. These fundraising amounts are larger than previous database start-ups. For example, \", /*#__PURE__*/e(o, {\n          href: \"https://craft.co/snowflake-computing/funding-rounds\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Snowflake did not have a round over $100m until its Series D\"\n          })\n        }), \", which was five years into the company\u2019s life. Starburst completed a $100m round within less than three years of its founding. Now there are a lot of factors involved in funding (e.g. the Starburst team was working on Presto at TeraData for years before spinning out), but I feel like more money is being thrown around these days.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"In Memoriam\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Regretfully, we said goodbye to some database friends in the past year.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: /*#__PURE__*/e(o, {\n          href: \"https://www.zdnet.com/article/servicenow-acquires-database-performance-company-swarm64/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"ServiceNow acquired Swarm64\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The company started off as an FPGA accelerator for running analytical workloads on PostgreSQL. They then switched to being a software-only accelerator for PostgreSQL using extensions. But they failed to gain traction, especially against the other well-funded cloud data warehouses. After the ServiceNow acquisition, there\u2019s still no word on whether the Swarm64 product will continue.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: /*#__PURE__*/e(o, {\n          href: \"https://www.theregister.com/2021/08/26/splice_machine_insolvency/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Splice Machine went bust\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Splice was pushing a hybrid (HTAP) DBMS that combined HBase for operational workloads and Spark SQL for analytics. They then pushed to provide a platform for operational/real-time ML applications. But, an all-in-one hybrid system failed to make inroads in the database market due to the dominance of specialized OLTP and OLAP systems.\"\n      }), /*#__PURE__*/e(\"h5\", {\n        children: /*#__PURE__*/e(o, {\n          href: \"https://www.wsj.com/articles/kkr-cd-r-near-deal-to-buy-cloudera-11622510459\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Private equity firms bought Cloudera\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Since the world moved away from MapReduce and Hadoop technologies in the second half of the last decade, Cloudera has failed to have the same traction in the cloud data warehouse market. Most of the original engineering teams for \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Apache_Impala\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Impala\"\n          })\n        }), \" and \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Apache_Kudu\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Kudu\"\n          })\n        }), \" have left the company, although the projects are still under development and putting out new releases. The stock has dropped to below its IPO price from 2018. It remains to be seen whether its new investors will be able to turn the company around.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy\u2019s take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"It\u2019s always sad to see another database project or company go under, but that is the bloodsport nature of the database industry. Being open-source potentially helps a DBMS outlive the company that created it, but not always. Due to their complexity, databases require full-time crews working on them to fix bugs and add new features. Moving source code rights and control of a defunct DBMS to an open-source software foundation, like the \", /*#__PURE__*/e(o, {\n          href: \"https://www.apache.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Apache Foundation\"\n          })\n        }), \" or \", /*#__PURE__*/e(o, {\n          href: \"https://www.cncf.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"CNCF\"\n          })\n        }), \", does not mean that the project will be magically revived. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For example, \", /*#__PURE__*/e(o, {\n          href: \"https://rethinkdb.com/blog/rethinkdb-joins-linux-foundation/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"RethinkDB was donated to the Linux Foundation\"\n          })\n        }), \" after the \", /*#__PURE__*/e(o, {\n          href: \"https://rethinkdb.com/blog/rethinkdb-shutdown/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"company went bust\"\n          })\n        }), \", but from all appearances on Github they are dead in the water (few commits, PRs not getting merged). Another example of this happening include DeepDB: the company failed and created \", /*#__PURE__*/e(o, {\n          href: \"https://www.businesswire.com/news/home/20170502005138/en/Deep-Information-Sciences-Goes-Open-Source-Relaunches-as-Deep-Software-Foundation\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"their own non-profit foundation\"\n          })\n        }), \" for the code but nobody ever worked on it. I anticipate that there will be more database companies going under in the next year that are unable to compete with the major cloud vendors and the well-funded start-ups listed above.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"A Testament to Perseverance\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The pandemic has been a trying time for many. With so many terrible things being reported in the news, it is always good when an uplifting story happens. As many of you know, Oracle co-founder \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Larry_Ellison\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Larry Ellison\"\n          })\n        }), \" has been down on his luck in recent years. Back in 2015, Larry was feeling good about things because he was \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/The_World's_Billionaires_2015\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"the 5th richest person in the world\"\n          })\n        }), \". But the vicissitudes of life struck and Larry dropped down to a lowly \", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/The_World%27s_Billionaires#2018\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"10th place\"\n          })\n        }), \" in the 2018 billionaire ranking.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But this changed in December 2021 when Larry Ellison surpassed Google co-founders Larry Page and Sergey Brin, rising in the ranks to become the 5th richest person in the world again. \", /*#__PURE__*/e(o, {\n          href: \"https://www.cnbc.com/2021/12/10/larry-ellison-is-now-richer-than-the-google-co-founders-page-and-brin.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Larry Ellison made $16b in a single day\"\n          })\n        }), \" in December 2021, after Oracle\u2019s stock had its second-highest increase in a single day over the last 20 years due to an announcement of better-than-expected corporate earnings. The news media are chalking it up to heightened confidence among investors that Oracle\u2019s shift to the cloud is working.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Andy\u2019s take\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Larry and I go \", /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1164345071983976448\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"way back\"\n          })\n        }), \", and this certainly is an heartwarming story for the database community and humanity as a whole. He might have been feeling a bit melancholy when he was down on his luck as just the 10th richest person in the world. But I am glad to see that he was able to pull himself out of the gutters and get back up in the listing where he belongs.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Databases are the most important thing in my life after my family\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We\u2019re looking forward to ushering in a bright new year. Databases is an industry of remarkable resilience and innovation, and we\u2019re excited to be part of it.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Wishing you and your \", /*#__PURE__*/e(o, {\n          href: \"https://www.euclidlibrary.org/tickle/otters\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"romp\"\n          })\n        }), \" a healthy and happy 2022!\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"P.S.: Don\u2019t forget to run \", /*#__PURE__*/e(\"code\", {\n          children: \"ANALYZE\"\n        }), \" over the holidays.\"]\n      })]\n    })\n  }, {\n    id: \"kaTClCi3J\",\n    [c]: \"Introducing human-in-the-loop control over automatic database tuning\",\n    [d]: \"human-in-the-loop\",\n    [u]: \"2021-12-17T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/4q5yGxzuiT73kC12jCMrMN04d0.jpg\",\n      srcSet: \"https://framerusercontent.com/images/4q5yGxzuiT73kC12jCMrMN04d0.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/4q5yGxzuiT73kC12jCMrMN04d0.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/4q5yGxzuiT73kC12jCMrMN04d0.jpg 1488w\"\n    }, \"otters human-in-the-loop\"),\n    [m]: \"Automated database optimization is great, but we realize many want to review recommendations. Ask and you shall receive! Our human-in-the-loop feature gives you more control.\",\n    [g]: \"Neal Kaviratna\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Everybody loves \u201COtter-Mation\u201D when it removes everyday drudgery. But sometimes there\u2019s also a need for oversight. OtterTune already has \", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"prevent-machine-learning-from-wrecking-your-database\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"safeguards\"\n          })\n        }), \" to restrict OtterTune\u2019s ML algorithms to ensure that your database operates correctly. And today we\u2019re pleased to announce that we\u2019re now offering \u201CHuman in the Loop\u201D features that give you even more control over OtterTune\u2019s automatic database tuning process.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why some humans want to keep otters under control\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The new features provide more control and human oversight over what gets deployed to the database \u2014 an especially important consideration when making changes to live production databases. Human in the Loop features are also crucial for organizations with specific policies requiring comprehensive documentation and formal approval of any infrastructure changes, including the parameter groups OtterTune automatically recommends changing.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune human-in-the-loop\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,7wwONTM63eKi28XYjQxY1tYHROo.png?originalFilename=Screenshot+2023-08-18+at+1.22.53+PM.png\",\n        \"data-framer-height\": \"538\",\n        \"data-framer-width\": \"1244\",\n        height: \"269\",\n        src: \"https://framerusercontent.com/images/7wwONTM63eKi28XYjQxY1tYHROo.png\",\n        style: {\n          aspectRatio: \"1244 / 538\"\n        },\n        width: \"622\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Human in the Loop control gives PostgreSQL and MySQL users the ability to review OtterTune-generated config recommendations (2) and accept or reject the changes (3). Rejected configs are discarded. Accepted configs are applied to the database (4) and perpetuate the machine learning feedback loop (1).\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"New human in the loop features\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The first iteration of OtterTune Human in the Loop features includes:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Email notifications\"\n            }), \" \u2014 OtterTune\u2019s tuning service will alert you when it has a series of recommended knob changes for a specific database.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Tuning recommendations\"\n            }), \" \u2014 When you log into the OtterTune dashboard, the Database Overview page has a new tab that shows the recommended changes for your database. You can either skip or approve them. Currently, OtterTune lets you accept or reject the full list of recommended knob changes.\"]\n          })\n        })]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune tuning recommendations\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,y7oTvQ11uP8yVCPepHreT9xQI.png\",\n        \"data-framer-height\": \"553\",\n        \"data-framer-width\": \"1024\",\n        height: \"276\",\n        src: \"https://framerusercontent.com/images/y7oTvQ11uP8yVCPepHreT9xQI.png\",\n        style: {\n          aspectRatio: \"1024 / 553\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"ul\", {\n        children: /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Custom Knob Value Ranges\"\n            }), \" \u2014 You can control which knobs OtterTune is permitted to consider tuning and what knob value ranges are acceptable for those knobs. These affect OtterTune whether or not a human is in the loop.\"]\n          })\n        })\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune knob value ranges\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,qM32ASVSf1y0ztIU1tp9Vm51RU0.png\",\n        \"data-framer-height\": \"450\",\n        \"data-framer-width\": \"932\",\n        height: \"225\",\n        src: \"https://framerusercontent.com/images/qM32ASVSf1y0ztIU1tp9Vm51RU0.png\",\n        style: {\n          aspectRatio: \"932 / 450\"\n        },\n        width: \"466\"\n      }), /*#__PURE__*/e(\"ul\", {\n        children: /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Configuration Version History\"\n            }), \" \u2014 OtterTune keeps the complete history of all the configurations it has recommended. You can manually apply them at any time to revert the database back to a previous configuration if you need to do so.\"]\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"No changes, no learning. Some changes, some learning.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune is designed to get smarter over time as it \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/E9LdG59w/how-ottertune-works\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"observes the behavior\"\n          })\n        }), \" of your database. If OtterTune recommends a configuration change but you choose not to apply it to your database, then OtterTune will not learn whether those changes improve your database. If you do choose to apply OtterTune\u2019s recommended configuration changes, then that information gets fed back to the service and its algorithms get smarter. The improvements may not be included in the next iteration, but the recommended knob changes will get better over time.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Caveats & what\u2019s coming next\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Currently, for each configuration recommendation that OtterTune generates for your database, you must accept or reject the changes to all the knobs in the recommendation. If you wish to accept only a portion of the recommended changes or edit the configurations before applying them, then you must manually make those config changes to the database. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For example, if the recommendation changes knobs related to PostgreSQL\u2019s checkpoint operations (checkpoint_completion_target) and background writer (bgwriter_lru_maxpages) but you only want to apply the change for the former, you have to manually apply the change to database using \", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon\u2019s Parameter Group\"\n          })\n        }), \" interface. As soon as you do that, OtterTune will detect the configuration change in the database, discard the recent configuration recommendation and begin analyzing database performance with its machine learning models.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In future releases, we may allow you to accept or reject recommended changes one by one and edit the values before applying them, depending on your feedback. We\u2019re also considering adding the ability to export configurations to external applications like Jira, so OtterTune can become more integrated with DevOps workflows.\"\n      }), /*#__PURE__*/e(\"h2\", {\n        children: \"Getting started\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019d like to give Human + Otter tuning a whirl, the first step is to \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"sign up for an account\"\n          })\n        }), \". Once you\u2019ve set up your database, or if you\u2019ve already got one connected, edit the tuning options of that database and set Approval Method to Manual. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Congratulations, you\u2019re now working together with OtterTune! For more information check out the \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune documentation\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune approval methods\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,vWpXuL7tVudbaR8XBoqtSOJjh0.png\",\n        \"data-framer-height\": \"232\",\n        \"data-framer-width\": \"709\",\n        height: \"116\",\n        src: \"https://framerusercontent.com/images/vWpXuL7tVudbaR8XBoqtSOJjh0.png\",\n        style: {\n          aspectRatio: \"709 / 232\"\n        },\n        width: \"354\"\n      })]\n    })\n  }, {\n    id: \"ZjajKjDSw\",\n    [c]: \"Query latency vs. throughput as a database tuning objective\",\n    [d]: \"query-latency-vs-thoughput\",\n    [u]: \"2021-12-09T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/fxBK4QysdobOqPc00P6GyPI1hAI.jpg\",\n      srcSet: \"https://framerusercontent.com/images/fxBK4QysdobOqPc00P6GyPI1hAI.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/fxBK4QysdobOqPc00P6GyPI1hAI.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/fxBK4QysdobOqPc00P6GyPI1hAI.jpg 1488w\"\n    }, \"otter query latency vs throughput\"),\n    [m]: \"Throughput is generally not a good target objective for applications that have daily workload patterns because it varies with the time of day. It\u2019s dependent on the application wheras query latency is less dependent on the application and does not strongly vary with demand.\",\n    [g]: \"Ruogu Du | Bohan Zhang | Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"When automatically tuning database configurations, the OtterTune default optimization objective is now 99th percentile query latency. You may be wondering why. Here\u2019s a bit more about why we chose query latency and the reasons behind why computing that metric is tricky.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Why we now use query latency as our target objective\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune provides several target objectives for users to choose from when they are ready to start tuning their database, but some are less effective for certain workloads. For example, consider an application that has a peak throughput of 10,000 transactions per second during business hours, but then drops to 100 transactions per second outside of those hours. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Throughput is generally not a good target objective for applications that have daily workload patterns such as this one because it varies with the time of day \u2014 it\u2019s dependent on the application.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As a result, the configurations OtterTune tries outside of business hours will appear to have \u201Cworse\u201D performance (lower throughput), even for high-quality configurations. Throughput is a suitable target objective for tuning over-utilized databases, but this scenario is not common for real-world applications.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The query latency, however, is less dependent on the application and does not strongly vary with demand like throughput does. We can improve query latency by tuning the database, making the database faster, whereas we can only increase the throughput if the database is over-utilized. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This is the reason that most companies define their service-level objectives (SLOs) in latencies. To illustrate the difference, here\u2019s a graph showing how the 99th percentile query latency measurement stays more consistent over time, even as transaction throughput varies more widely:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"data consistency of p99 query latency vs throughput\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,GoaPozCVNExUxCbQf1xtxOT79ho.png\",\n        \"data-framer-height\": \"519\",\n        \"data-framer-width\": \"1024\",\n        height: \"259\",\n        src: \"https://framerusercontent.com/images/GoaPozCVNExUxCbQf1xtxOT79ho.png\",\n        style: {\n          aspectRatio: \"1024 / 519\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"AverageLatency vs. 99th percentile query latency\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Previously, OtterTune provided customers with Throughput and AverageLatency (average ReadLatency + WriteLatency from \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/cloudwatch/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon CloudWatch\"\n          })\n        }), \") as the target objectives. However, some customers found these insufficient for their demands, especially when AverageLatency could not accurately describe the overall latency situation. This happened whenever long-tail transactions were given more emphasis than average ones.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The other issue with CloudWatch\u2019s AverageLatency metric is that it measures disk I/O latency, not query latency. It\u2019s therefore not a good indicator of database performance. To meet the needs of customers, OtterTune developed a set of target objectives of latency percentiles.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How OtterTune calculates 99th percentile query latency\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Computing 99th percentile query latency so it can be used to tune the database is technically challenging. In most other instances, OtterTune collects numeric counters maintained by the DBMS and uses those as metrics for tuning. 99th Percentile Query Latency is an exception \u2014 OtterTune must compute latency based on the query digest, which is maintained by the DBMS. In addition to that, developing target objectives for latency percentiles differs for every database. Here we discuss how to get latency percentiles directly from PostgreSQL and MySQL\u2019s internal metrics, without using external monitoring tools.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Calculating query latency for MySQL\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For all supported MySQL versions, we can use metrics in the \", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"performance schema\"\n          })\n        }), \" to compute the query latency. Specifically, we use \", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/mysql-perfschema-excerpt/8.0/en/performance-schema-summary-tables.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"performance schema summary tables\"\n          })\n        }), \", which contain aggregated information for groups of events over time. (Note that you can enable the performance schema in \", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS\"\n          })\n        }), \" by activating Performance Insights.)\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"MySQL 5.6/5.7\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For MySQL 5.6 and 5.7, we can use the \", /*#__PURE__*/e(\"code\", {\n          children: \"events_statements_summary_by_digest\"\n        }), \" in the performance schema to approximate the latency percentiles.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/performance-schema-statement-summary-tables.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: /*#__PURE__*/e(\"strong\", {\n              children: \"Events_statements_summary_by_digest:\"\n            })\n          })\n        }), \" provides aggregated information for each statement digest. We can get the number of executions and average/min/max latency for each statement digest. We then approximate the latency percentiles using the number of executions and average latency.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Query statement digest:\"\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"MySQL\u2019s statement digest tables store the normalized SQL statements. For example, consider the following statements:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"select * from OKA where name = \u2018DJ OT\u2019\\nselect * from OKA where name = \u2018Ice Paws\u2019\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Both of these statements have the same normalized SQL in the statement digest:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"select * from OKA where name = ?\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Steps:\"\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We query the following data from the digest table:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Digest: statement digest value\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Count_star: the number of times the statement digest was called\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Avg_timer_wait: the average execution time of the statement digest\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Query:\"\n        })\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT digest, count_star, avg_timer_wait \\nFROM performance_schema.events_statements_summary_by_digest;\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Example:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,2vkVpQPHwNbZfJvs7l60FO6Kqk.png?originalFilename=Screenshot+2023-08-18+at+1.25.41+PM.png\",\n        \"data-framer-height\": \"333\",\n        \"data-framer-width\": \"1200\",\n        height: \"166\",\n        src: \"https://framerusercontent.com/images/2vkVpQPHwNbZfJvs7l60FO6Kqk.png\",\n        style: {\n          aspectRatio: \"1200 / 333\"\n        },\n        width: \"600\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For each statement digest, we assume every call (count_star) takes the same average time (avg_timer_wait). This lets us approximate the execution time for each statement. We can then sort the execution times and compute the latency percentiles.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In the results above, we have two statement digests, D1 and D2. D1 executes 9 times, the average latency is 1ms. D2 executes 1 time, the average latency is 2ms. If we assume each execution of D1 has the same latency (1s), then the approximate 90th %-tile latency is 1ms.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"MySQL 8.0\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Starting from MySQL 8.0, the performance schema provides the histograms of the statements latency to give better visibility of the distribution of data. The accuracy of the latency percentiles computed from these histograms is much better than the approximation we get when using the statement digest data in MySQL 5.6/5.7. OtterTune uses data from the \", /*#__PURE__*/e(\"code\", {\n          children: \"events_statements_histogram_global\"\n        }), \" table to compute the latency percentiles for the global system.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Events_statements_histogram_global:\"\n        }), \" summarizes latencies globally across schema and query digest using a single histogram.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Steps:\"\n        }), /*#__PURE__*/e(\"br\", {}), \"We query the following data from the histogram table:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Bucket_timer_low: lower latency bound for this bucket\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Bucket_timer_high: upper latency bound for this bucket\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Count_bucket: number of statements measured with a latency in the interval [Bucket_timer_low, Bucket_timer_high).\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Query:\"\n        })\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT bucket_timer_low, bucket_timer_high, count_bucket \\nFROM performance_schema.events_statements_histogram_global;\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Example:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,DtoGmxzAo8uGBbBvLJ8ol0RvnsA.png?originalFilename=Screenshot+2023-08-18+at+1.27.26+PM.png\",\n        \"data-framer-height\": \"277\",\n        \"data-framer-width\": \"1190\",\n        height: \"138\",\n        src: \"https://framerusercontent.com/images/DtoGmxzAo8uGBbBvLJ8ol0RvnsA.png\",\n        style: {\n          aspectRatio: \"1190 / 277\"\n        },\n        width: \"595\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The results above returned two bucket entries. The first entry shows that 9 statements were executed with latency in the range [0ms, 10ms). The second has 1 statement executed with latency in the interval [10ms, 16ms). We compute the average of the upper/lower latency bounds for each bucket, which are displayed in the \u201CAverage latency\u201D column. If we assume all statements in a given bucket have the same average latency, then the 90th %-tile latency is 5ms.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Calculating query latency for PostgreSQL\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"With PostgreSQL, for example, we can leverage the \", /*#__PURE__*/e(\"code\", {\n          children: \"pg_stat_statements\"\n        }), \" module to compute query latencies.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/pgstatstatements.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: /*#__PURE__*/e(\"strong\", {\n              children: \"pg_stat_statements:\"\n            })\n          })\n        }), \" this module provides planning and execution statistics of all SQL statements executed by a server.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Prerequisite: You\u2019ll need to load the module on the database if it does not exist.\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"CREATE EXTENSION pg_stat_statements IF NOT EXISTS\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Steps:\"\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We query the following data from the table:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Queryid: identifier for normalized statements\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Calls: the number of times the statement was executed\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Mean_exec_time: average time spent executing the statement\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"strong\", {\n          children: \"Query:\"\n        })\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"SELECT queryid, calls, mean_exec_time FROM pg_stat_statements;\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We can then compute the latency percentiles the same as we did with MySQL 5.6/5.7: For each normalized statement, we assume every call (calls) takes the same average time (mean_exec_time) to execute. We can then sort the execution times and compute the latency percentiles.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Getting to the right target objective for your business\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Despite the difficulties, it is important to select a good target objective because OtterTune will optimize for it when creating new configurations for your database. Keep in mind that you can guide OtterTune toward optimizing performance versus cost. Also, it is possible to configure OtterTune to optimize for other objectives in a database, such as CPU utilization or storage IOPs. The query latency tuning objective capability is available in \", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"all versions of OtterTune\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/xmewDj9V/tuning-options\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune documentation\"\n          })\n        }), \" provides more information about selecting a good target objective and tuning for specific databases.\"]\n      })]\n    })\n  }, {\n    id: \"QDBgqtYfs\",\n    [c]: \"How to simplify Oracle-to-PostgreSQL migration with automatic database tuning\",\n    [d]: \"oracle-postgresql-migration-automatic-tuning\",\n    [u]: \"2021-12-03T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Rn7xc7p3bpiuu7c7JZEaGUqA.jpg\",\n      srcSet: \"https://framerusercontent.com/images/Rn7xc7p3bpiuu7c7JZEaGUqA.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/Rn7xc7p3bpiuu7c7JZEaGUqA.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/Rn7xc7p3bpiuu7c7JZEaGUqA.jpg 1488w\"\n    }, \"otter swimming oracle-postgresql migration\"),\n    [m]: \"At $47,500 per CPU core, Oracle is pricey proposition against Postgres (which is effectively $0). OtterTune can help those looking to make the Oracle-to-PostgreSQL migration.\",\n    [g]: \"Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Otters don\u2019t migrate. They stay put for the most part, even in winter. They would rather\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://youtu.be/JdCJMwsIv-A\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"die fighting\"\n          })\n        }), \"\\xa0than give up their\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Otter#Terminology\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"holt\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"On the other hand, a lot of people are migrating their databases from expensive legacy DBMSs like Oracle to open source alternatives like PostgreSQL and MySQL. By next year,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.gartner.com/en/documents/3970418/state-of-the-open-source-dbms-market-2019\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Gartner predicts\"\n          })\n        }), \"\\xa0that most new application development projects will be built on open source DBMSs instead of costly legacy databases.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"One big reason for this migration is cost savings. Open source database licensing is a lot less expensive than Oracle licensing. The enterprise edition of Oracle costs roughly\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.oracle.com/assets/technology-price-list-070617.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$47,500 per CPU core\"\n          })\n        }), \"\\xa0versus $0 for PostgreSQL (unsupported). If you want commercial support for PostgreSQL, then it will cost you a few thousand of dollars per CPU core. Different PostgreSQL vendors have different pricing models, but they\u2019re all substantially cheaper than Oracle.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Worried about PostgreSQL\u2019s open waters?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"At OtterTune, we often talk to experienced Oracle users who are new to PostgreSQL and are concerned about PostgreSQL\u2019s performance and learning curve. Optimizing the PostgreSQL configuration is often a time-consuming part of the Oracle-to-PostgreSQL migration process, in part because they have not yet mastered the hundreds of knobs that affect PostgreSQL performance.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Driven by machine learning algorithms, automatic database tuning (using a service like\\xa0OtterTune), can help accelerate the Oracle-to-PostgreSQL migration process. It can shave weeks off of the migration process by eliminating time spent consulting PostgreSQL documentation and forums for tuning best practices and performing tedious trial-and-error configuration tuning.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"From zero to optimized in one hour\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To illustrate the benefits of the automatic database tuning approach, we ran a quick benchmark to show how quickly one could optimize PostgreSQL performance for a specific workload, and achieve performance equal to or greater than Oracle.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To run this comparison test, we deployed an Oracle (v19) and PostgreSQL (v11) database on Amazon RDS\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0instances (16 vCPUs, 64 GB of RAM) with 4000 provisioned IOPs.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We used the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/cmu-db/benchbase\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"BenchBase SQL\"\n          })\n        }), \"\\xa0benchmarking framework to run the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://www.tpc.org/tpcc/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"TPC-C\"\n          })\n        }), \"\\xa0OLTP workload. We configured BenchBase to load a TPC-C database with 200 warehouses (~25 GB of table data) and execute transactions across 50 simultaneous connections using each DBMS\u2019s latest JDBC driver. We ran the benchmark on three different configurations:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Amazon RDS Oracle default configuration settings\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Amazon RDS PostgreSQL default configuration\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Amazon RDS PostgreSQL with OtterTune-optimized configuration\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For the OtterTune-optimized PostgreSQL configuration, we first connected the DBMS to OtterTune and then ran the benchmark for one hour with OtterTune\u2019s tuning mode enabled. We configured OtterTune to optimize\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/xmewDj9V/tuning-options\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PostgreSQL\u2019s throughput\"\n          })\n        }), \"\\xa0as its target objective.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We ran the TPC-C benchmark three times for each DBMS and reported the average throughput over these trials:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune improves postgresql throughput\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,8VpJyyZYMrFosqpuV2Oi6LSs.png\",\n        \"data-framer-height\": \"485\",\n        \"data-framer-width\": \"707\",\n        height: \"242\",\n        src: \"https://framerusercontent.com/images/8VpJyyZYMrFosqpuV2Oi6LSs.png\",\n        style: {\n          aspectRatio: \"707 / 485\"\n        },\n        width: \"353\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The above graph is not meant to give you the impression that Oracle is slower than PostgreSQL (clearly, the default Amazon RDS Oracle configuration settings are not a good fit for TPC-C).\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Instead, we want to demonstrate that, within one hour, OtterTune was able to automatically optimize the PostgreSQL configuration for its hardware and workload. OtterTune accelerated PostgreSQL by over 3x in this test, without requiring you to learn all the PostgreSQL configuration knobs or spending time tweaking them (trial and error) to optimize the DBMS\u2019s performance.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Migrate to Open Source with Confidence (and OtterTune)\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you\u2019re considering moving your database workloads off expensive legacy databases and onto lower cost, open-source DBMSs like PostgreSQL and MySQL, do not let the open-source database learning curve or performance worries be a blocker. OtterTune automatic configuration can help (safely \u2014 OtterTune does not need to access your user data).\"\n      })]\n    })\n  }, {\n    id: \"A50YD10MW\",\n    [c]: \"OtterTune intern showcase 2021\",\n    [d]: \"ottertune-intern-showcase-2021\",\n    [u]: \"2021-11-11T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/H68Zq1bwigS1oym8wUEiVcNlhXE.jpg\",\n      srcSet: \"https://framerusercontent.com/images/H68Zq1bwigS1oym8wUEiVcNlhXE.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/H68Zq1bwigS1oym8wUEiVcNlhXE.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/H68Zq1bwigS1oym8wUEiVcNlhXE.jpg 1488w\"\n    }, \"otter ottertune intern showcase 2021\"),\n    [m]: \"From database checkup tools to detecting workload and other fluctuations to maximize tuning success, our interns produced such fantastic work that they're now full-time employees.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"This summer OtterTune welcomed its first interns to the team. We took on two interns from Carnegie Mellon University:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://github.com/haonanw98\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Haonan Wang\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://www.linkedin.com/in/ziyu-zhang-136109139/\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Sylvia Zhang\"\n              })\n            })\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We kicked things off in late May with a team go-karting event in Pittsburgh. When it came time to get to work, we assigned each intern to a mentor who met with them daily to discuss progress, provide feedback, and answer questions. We closed the summer with a showcase that gave them the chance to highlight their work.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here\u2019s what they built.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Evaluation and feedback of customers\u2019 database environments\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Customers always ask us how much benefit they will get from OtterTune before signing up. This is tough to predict because it depends on many factors, such as workload patterns, data sizes, DBMS version, and hardware configurations. These factors are the reason why database tuning is a difficult problem and why an automated solution like OtterTune that uses machine learning to figure it out for you is the right approach.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This year is the first year that we asked two interns to help us figure out how to better predict how our customers will benefit from using OtterTune. Sylvia Zhang and Haonan Wang \u2014 now both OtterTune employees \u2014 made significant strides in helping us learn how to predict what influences OtterTune configuration improvements.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Database Checkup Tool\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Sylvia Zhang\u2019s project introduced OtterTune to prospective customers by giving them an evaluation of their database environment and feedback on their database metadata. Her work generated a heuristic-based workload summary and pointed out potential improvements. Ideally, her work will lead to an adjunct product to OtterTune that would generate performance forecasts based on data supplied by the customer.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For her project, she created a command-line interface that collects statistics from a customer database and dumps them into a local file for the customer to inspect and upload. The front-end of her system makes available for download compiled binaries of the command line interface and enables the customer to enter their contact information and upload the database statistics.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"On the backend, the system she created packs the customer data and puts the data entry into storage. Once the data storage change occurs, it triggers a data analysis pipeline that feeds the stored data into algorithms that generate a workload summary, heuristics (read-write ratio, cache-hit ratio, and so on), and performance forecast and sends the feedback to the customer\u2019s email. Although there are several enhancements to be made, the system holds promise as a useful tool for customers needing to evaluate their database environment, analyze feedback, and determine potential improvements.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Detecting workload and other fluctuations to maximize tuning success\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Haonan Wang\u2019s project involved building a model to detect when a workload has changed significantly so that customers can be alerted and restart the tuning process. He used several tools, including\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://facebookresearch.github.io/Kats/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Facebook Kats\"\n          })\n        }), \", to detect change points in clients\u2019 workloads and then validated them using OLTP benchmark results. First, he used CUSUM to detect an up/down shift in a time series. To locate the change point, he used an interactive process, initializing a change point in the middle of a time series and the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/CUSUM\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"CUSUM\"\n          })\n        }), \"\\xa0of time series based on this change point. Then, he iteratively used the point that maximizes the CUSUM of time series as the new change point until finding a stable one. He then tested the statistical significance of the change points and used magnitude comparison to reduce the influence of seasonality with a short period of historical data as reference.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"He used OLTP benchmarks and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/YCSB\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"YCSB datasets\"\n          })\n        }), \"\\xa0for validation. The change point detection was validated across three types of changes, using CPU ratio metrics:\"]\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Query complexity changes\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Read-heavy becoming Read/Write\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Throughput changes\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"He found that the changepoint detector can successfully detect the changes on these three workloads and is robust to noise at the same time, meaning that the detector does not overreact to temporary variations and can capture real workload changes. For each change point detected, the detector also produces a confidence score that can help determine if the workload has changed enough to recommend re-tuning. By finding the workload change, the OtterTune product will be able to restart the tuning process and recommend new configuration.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"He discovered insights that could become a potential OtterTune product that would help optimize recommended configuration improvements, despite shifts in factors such as throughput and query complexity.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Join the team!\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019d like to join the OtterTune team, as a full-time developer, or as an intern, please visit our\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/careers\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"careers page\"\n          })\n        }), \"\\xa0to start the process. We\u2019re a distributed team, and we look forward to hearing from you.\"]\n      })]\n    })\n  }, {\n    id: \"wrcr_nbSQ\",\n    [c]: \"How OtterTune securely collects database metrics\",\n    [d]: \"how-ottertune-securely-collects-metrics\",\n    [u]: \"2021-11-04T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/0EvDypHj1DLLjrG1ocKF4isp0.jpg\",\n      srcSet: \"https://framerusercontent.com/images/0EvDypHj1DLLjrG1ocKF4isp0.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/0EvDypHj1DLLjrG1ocKF4isp0.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/0EvDypHj1DLLjrG1ocKF4isp0.jpg 1488w\"\n    }, \"otter ottertune db metrics\"),\n    [m]: \"The OtterTune Agent only pushes metrics and knob settings information out; it does not accept data in. It also does not look at any sensitive user data or queries.\",\n    [g]: \"Neal Kaviratna\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Tuning databases requires information collection, and that means access to schema, indexes, queries, and application data, right? And tuning via a public service means you need to expose your database for external access, right?\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Not in OtterTune\u2019s case. Like their cousin the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.youtube.com/watch?v=qJF84oz93jw\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"honeybadger\"\n          })\n        }), \", Otters don\u2019t care*. OtterTune automates database configuration tuning by analyzing knob settings and metrics\u2013not application data, queries, or schema.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We designed OtterTune to collect metrics from your database securely, via an open source Agent. The\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune Agent\"\n          })\n        }), \"\\xa0solves the problem of having to expose your database \u2014 it\u2019s software you can deploy within your virtual private cloud (VPC) as a Kubernetes pod, on an EC2 instance, or anywhere else it can talk to your database. With the OtterTune Agent, you can connect to the database privately and securely, and send its knob/metric data back to the OtterTune tuning service.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The Agent reports metrics back to the OtterTune tuning service via a secure protocol, but the OtterTune service does not need to talk back to the agent. This means that you can set up an OtterTune Agent without allowing any inbound traffic to your network, helping to keep your system safe from any outside attacks. The only data from your systems that will be sent out by the agent are\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent/tree/main/driver/collector\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"internal database metrics\"\n          })\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent/blob/main/driver/aws/cloudwatch.py\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS Cloudwatch information\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Simple setup\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"When setting up a database that is monitored by the OtterTune Agent, you will be directed to an Agent Setup page. Note that the OtterTune Agent needs valid AWS credentials for a user or role to inspect the database and collect CloudWatch metrics for the database you wish to optimize (see the agent\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent/blob/main/driver/aws/rds.py\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS access here\"\n          })\n        }), \"). You then deploy the Agent as an AWS Fargate stack or launch a Docker container in your network. The OtterTune service generates a secret API Key that is used to authenticate Agent information being passed to the OtterTune service. See the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune documentation\"\n          })\n        }), \"\\xa0for recommended approaches.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"how to connect the ottetune agent\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,Lm0S7pOGwgqSQFqZBG5LUg2AIKY.png?originalFilename=Screenshot+2023-08-18+at+3.20.36+PM.png\",\n        \"data-framer-height\": \"706\",\n        \"data-framer-width\": \"1536\",\n        height: \"353\",\n        src: \"https://framerusercontent.com/images/Lm0S7pOGwgqSQFqZBG5LUg2AIKY.png\",\n        style: {\n          aspectRatio: \"1536 / 706\"\n        },\n        width: \"768\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Fewer security worries\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OtterTune Agent runs in your internal environment, so there\u2019s no need to expose your database to external traffic. Nor is there any requirement to allow inbound access to the database to the OtterTune service. The Agent only pushes metrics and knob settings information out; it does not accept data in.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The OtterTune service also does not look at any sensitive user data or queries. OtterTune only collects runtime metrics from the database (e.g., InnoDB stats, pg_stat_database) and CloudWatch. Check out the relevant code\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent/tree/main/driver/collector\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"here\"\n          })\n        }), \". These performance measures are enough of a signal to tell how your application uses the database and how to optimize the system accordingly.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Comprehensive metrics\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You may wonder why you would need the Agent if you are already using a monitoring system that collects metrics.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"MySQL and PostgreSQL expose many internal (native) runtime metrics that are not available in CloudWatch but are useful for OtterTune\u2019s machine learning-based configuration recommendations. The OtterTune Agent is necessary for collecting these metrics because it requires connecting to the customer database (CloudWatch metrics can be collected through AWS\u2019s APIs).\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The OtterTune Agent is also able to collect the database\u2019s internal runtime metrics more frequently than CloudWatch metrics. Additionally the metrics OtterTune gathers are useful for performance monitoring too, and customers can view them in the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/jW7qgYQq/performance-charts\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Performance Charts\"\n          })\n        }), \"\\xa0in OtterTune\u2019s UI.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Open source\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We open sourced the OtterTune Agent so you can see exactly how it connects to your database and what information it collects. We also welcome pull requests from the community if you\u2019re interested in contributing!. See the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"repository on GitHub\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"honey badgers, otters\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,RiTP4BRx2LHZefMYCQyTepWSmww.jpg\",\n        \"data-framer-height\": \"512\",\n        \"data-framer-width\": \"1024\",\n        height: \"256\",\n        src: \"https://framerusercontent.com/images/RiTP4BRx2LHZefMYCQyTepWSmww.jpg\",\n        style: {\n          aspectRatio: \"1024 / 512\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"*Members of the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/Mustelidae\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Mustelidae family\"\n          })\n        }), \"\\xa0are viciously cute and uninterested in the contents of any database.\"]\n      })]\n    })\n  }, {\n    id: \"Bjuyyd4EV\",\n    [c]: \"Automatic database tuning tips: Handling restarts\",\n    [d]: \"automatic-database-tuning-tips-handling-restarts\",\n    [u]: \"2021-10-20T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/6wpFMriDsrlGmkA6gKMYpbD9PU.jpg\",\n      srcSet: \"https://framerusercontent.com/images/6wpFMriDsrlGmkA6gKMYpbD9PU.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/6wpFMriDsrlGmkA6gKMYpbD9PU.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/6wpFMriDsrlGmkA6gKMYpbD9PU.jpg 1488w\"\n    }, \"otter ottertune auto-tuning tips\"),\n    [m]: \"Whether you use OtterTune, or you tune by hand, these tips are helpful when it comes to the dreaded database restart.\",\n    [g]: \"Dana Van Aken\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Business continuity is a top priority, and many organizations cannot operate without their production databases running 24/7. This requirement makes automatic database configuration tuning tricky because some knobs require you to restart the database before they take effect. We refer to these as static knobs. Contrast this with dynamic knobs that do not need you to restart the database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here are four key lessons we\u2019ve learned building and implementing the\\xa0OtterTune. Whether you use OtterTune, or you tune by hand, these tips are helpful when it comes to the dreaded database restart.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Tune dynamic knobs first, then static knobs second\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"To get the most benefit from database tuning, you will need to target multiple knobs, some dynamic and some static. To avoid too many restarts, you should start with tuning the dynamic knobs first. Then if you are still unsatisfied with your database\u2019s performance, expand the tuning scope to include static knobs.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Tune within a specific time window\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If your databases are running in production all the time, you will want to tune them within a specific time window each day. The ideal window is one where the load is not too much that configuration changes could cause degradations.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"It may only be possible to restart once a day, in which case, you can still get on with tuning the database, but it may take longer to reach a near-optimal configuration. OtterTune allows you to specify custom restart time windows.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Remember that time-to-restart varies\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"It is crucial to keep in mind that with some databases, the time it takes for the system to come back online after restarting is not deterministic. For example, if you change MySQL\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"INNODB_LOG_FILE_SIZE\"\n          })\n        }), \"\\xa0knob, the restart time varies depending on whether the new value is greater or less than the previous value. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you reduce the log file size, MySQL may have to compact the log file upon restart to get it under the new threshold. That process could take quite a bit of time, depending on the disk speed and other factors. Because of this, it makes sense in some instances to restrict yourself to a once-daily database restart.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Create a control database\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If your current database cannot tolerate restarts and you have the tools available, you can copy the data onto a server with similar hardware and replay a query trace. This way, you can tune static knobs offline using a control database. The list below includes some of the open source tools you can use to accomplish this.\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"Copy database\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"PostgreSQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/app-pgdump.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"pg_dump\"\n                  })\n                }), \" and \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/app-pgrestore.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"pg_restore\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"MySQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"mysqldump\"\n                  })\n                })]\n              })\n            })]\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"Capture query trace\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"PostgreSQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/runtime-config-logging.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"PostgreSQL Log\"\n                  })\n                }), \" (\", /*#__PURE__*/e(o, {\n                  href: \"https://github.com/laurenz/pgreplay#usage\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"see here\"\n                  })\n                }), \" for configuration)\"]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"MySQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"MySQL Slow Query Log\"\n                  })\n                }), \"\\xa0(\", /*#__PURE__*/e(o, {\n                  href: \"https://github.com/Percona-Lab/query-playback#capturing-everything-in-the-slow-log\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"see\\xa0here\"\n                  })\n                }), \"\\xa0for configuration)\"]\n              })\n            })]\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"Replay query trace\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"PostgreSQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://github.com/laurenz/pgreplay\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"pgreplay\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"MySQL = \", /*#__PURE__*/e(o, {\n                  href: \"https://github.com/Percona-Lab/query-playback\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"Percona Playback\"\n                  })\n                })]\n              })\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"A Final Thought\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Whether you\u2019re tuning production databases or have greater flexibility and more time to test out your tuning settings, database tuning frequently requires restarts. The key is to choose knobs wisely, be willing to restart only within set windows, and create an environment that allows you to measure the success of your efforts.\"\n      })]\n    })\n  }, {\n    id: \"EsfjuAMj2\",\n    [c]: \"OtterTune Oct 2021 product update: Bring da ruckus\",\n    [d]: \"ottertune-2021-10-product-update\",\n    [u]: \"2021-10-14T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Z1cBhkra5rLa7hYytfk5hNYaSw.jpg\",\n      srcSet: \"https://framerusercontent.com/images/Z1cBhkra5rLa7hYytfk5hNYaSw.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/Z1cBhkra5rLa7hYytfk5hNYaSw.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/Z1cBhkra5rLa7hYytfk5hNYaSw.jpg 1488w\"\n    }, \"otter ottertune october 2021 product update\"),\n    [m]: \"Our primary focus since the first release of OtterTune has been to make it easier to get started with OtterTune and put it to work auto-tuning your databases. Here\u2019s what\u2019s new in this latest update.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"We have been a busy raft of otters since the launch of the preview release of the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune automatic database tuning service\"\n          })\n        }), \"\\xa0in May. Our primary focus since then has been to make it easier to get started with OtterTune and put it to work auto-tuning your databases. Here\u2019s what\u2019s new in this latest update.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Tune Your First Database for Free\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We now allow people to get started using OtterTune by auto-tuning their first database for free. A new free Starter tier supports basic auto-tuning of the most common knobs for Amazon RDS PostgreSQL or MySQL (in any/all AWS availability zones as of October 21).\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You can get started by\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://service.ottertune.com/signin/register\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"creating your free OtterTune account\"\n          })\n        }), \"\\xa0and following \", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/categories/amRZXxmJ/getting-started\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: 'the \"Getting Started\" documentation.'\n          })\n        }), \"\\xa0Please refer to the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/pricing\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune pricing information\"\n          })\n        }), \"\\xa0for auto-tuning more than one database or additional enterprise features.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Easier setup and connectivity\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OtterTune account creation and setup process has been automated to make it easier for you to get started on your own. New features include:\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Fast setup with CloudFormation templates\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune provides\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"AWS CloudFormation\"\n          })\n        }), \"\\xa0templates that make it fast and easy to set up the AWS IAM role and the OtterTune agent (see below) needed to monitor and auto-tune your database. See the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/49EvgwW7/create-iam-role\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"documentation\"\n          })\n        }), \"\\xa0for more details.\"]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Monitor your database with OtterTune\u2019s agent\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune now provides a containerized\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/A93xgYW0/agent-setup\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"metrics collection agent\"\n          })\n        }), \"\\xa0to make it easier for you to connect your AWS database with OtterTune. The new agent allows the OtterTune auto-tuning service to monitor and optimize your database without needing to provide us with inbound network access to your private network. It retrieves internal metrics from the database and AWS CloudWatch. The source code for OtterTune\u2019s agent is\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/ottertune/ot-agent\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"available on GitHub.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Okta self-service registration\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune now uses\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.okta.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Okta\"\n          })\n        }), \"\\xa0to provide you with a seamless, secure authentication experience. The security and safety of your database is a top priority for us. This is why we do not need to look at your user tables or queries to figure out how to optimize your database.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"New auto-tuning controls\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Based on feedback from early OtterTune users, we\u2019ve added features that give you more control over how and when OtterTune applies configuration changes to your databases:\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Flexible optimization with tuning schedules\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\u2019s Tuning Schedule\\xa0allows you to specify time windows for when the service will attempt to optimize the database\u2019s configuration. These schedules allow you to avoid potential performance degradation during an application\u2019s peak usage. If you enable database restarts, then the Tuning Schedule also lets you specify when OtterTune is allowed to restart the database.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Apply configurations manually\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune provides an \u201CApply Configuration\u201D button that enables you to immediately override the current (active) configuration with one that was applied to the database previously.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Track your configurations with configuration versioning\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/support/kb/articles/XQY2vR9P/configurations-view-and-compare\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"keeps track of each configuration\"\n          })\n        }), \"\\xa0that it installs on the database which allows you to view the knob settings for each configuration and the measured performance. You can also compare the differences between two configurations.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune view configurations\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,CQbD0bAIZaXjvjreZBOeT9EIioU.png\",\n        \"data-framer-height\": \"644\",\n        \"data-framer-width\": \"1024\",\n        height: \"322\",\n        src: \"https://framerusercontent.com/images/CQbD0bAIZaXjvjreZBOeT9EIioU.png\",\n        style: {\n          aspectRatio: \"1024 / 644\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"User docs and an open support community on Slack\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We published the first version of\", /*#__PURE__*/e(o, {\n          href: \"https://docs.ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"\\xa0OtterTune user documentation\"\n          })\n        }), \", which details how to connect OtterTune to your database and start the machine learning (ML)-driven tuning process.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We also created an open support community on Slack. If you have questions about OtterTune,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://join.slack.com/t/ottertune-community/shared_invite/zt-19a9g8vn8-OA5nlYTzZilI1VHwHXnf5w\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"join us on Slack\"\n          })\n        }), \"\\xa0and ask us for help.\"]\n      })]\n    })\n  }, {\n    id: \"BAdTOeTQx\",\n    [c]: \"You are overpaying Jeff Bezos for your databases (and the things he does with that extra money)\",\n    [d]: \"dont-overpay-amazon-web-service-for-db\",\n    [u]: \"2021-09-30T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/TadJItpYOgnCiReLAkSoJOKJ7UI.png\",\n      srcSet: \"https://framerusercontent.com/images/TadJItpYOgnCiReLAkSoJOKJ7UI.png?scale-down-to=512 512w, https://framerusercontent.com/images/TadJItpYOgnCiReLAkSoJOKJ7UI.png?scale-down-to=1024 1024w, https://framerusercontent.com/images/TadJItpYOgnCiReLAkSoJOKJ7UI.png 2048w\"\n    }, \"dj ot kicks amazon package\"),\n    [m]: \"We have met AWS users spending hundreds of thousands per month on database services, some of which are spending up to 40% of their monthly AWS bill on databases. And a large portion of this database revenue comes from people overpaying for their unoptimized RDS instances\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Jeff Bezos has a lot of money. Most think he acquired his wealth from people buying everything from books and toilet paper on the Amazon storefront. The truth is that nowadays, Bezos is making a lot of money via Amazon Web Services (AWS).\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We have met AWS users spending hundreds of thousands per month on database services, some of which are spending up to 40% of their monthly AWS bill on databases. And a large portion of this database revenue comes from people overpaying for their unoptimized RDS instances. In other words, they are paying Amazon more money to run their MySQL and PostgreSQL databases than what they actually need to support their applications. But it does not need to be this way.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In this article, I want to discuss three ways that we have seen AWS customers unnecessarily padding Bezos\u2019 bank account with expensive database costs. I will also mention what Bezos does with that extra money that you give him each month. Some of his purchases are admittedly pretty good; for example, he got a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.vice.com/en/article/jg845g/oh-cool-jeff-bezos-just-put-a-soft-serve-machine-in-his-house\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$22,000 soft-serve ice cream machine\"\n          })\n        }), \"\\xa0for his $165M house in Los Angeles. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But as we will see, other purchases are more exorbitant. I hope this will motivate the AWS DBMS user community to do something about it (spoiler:\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \"\\xa0automatic database tuning can help!) and bring Bezos\u2019 exotic spending habits back down to earth.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"#1 \u2013 Using larger instance sizes than needed = backup superyacht\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The great thing about running your database in the cloud is Amazon makes it easy to scale vertically and use a bigger instance size. Instead of procuring new hardware and then migrating your database to the new machine (which can take weeks or months), AWS lets you upgrade your database with more CPU and RAM with only a few clicks. Such easy scaling is helpful if your database grows and you find that query performance is getting slower over time. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"But there is a limit to how much faster your DBMS can get by scaling vertically, especially if you do not adjust its configuration as you change the system\u2019s hardware. But we see customers blindly increasing their RDS instance sizes without first checking whether they can optimize their DBMS for its current instance size. And this is, of course, giving Bezos more money than he needs.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To show again the limits of scaling vertically, we ran a quick experiment using the industry-standard TPC-C benchmark on PostgreSQL RDS (v13). We start with the smallest instance size (\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.large\"\n        }), \") and then scale up the instance size to measure the database\u2019s performance. For each instance, use the same database size and workload generator settings. We also let OtterTune optimize the DBMS\u2019s configuration for each instance. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The graph below shows that for this workload, using an instance size larger than\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.8xlarge\"\n        }), \"\\xa0does not make a difference. The application cannot push more queries through the system, and thus using a larger instance is a waste of money. Capacity planning for databases is a challenging problem. Using an automated tool like OtterTune to manage the DBMS\u2019s configuration is the first step towards solving it.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"postgresl rds does not improve with a large database\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,jmWtzFnymMt8QrQOeBAMiSfiEE.png?originalFilename=Screenshot+2023-08-18+at+1.37.25+PM.png\",\n        \"data-framer-height\": \"630\",\n        \"data-framer-width\": \"1555\",\n        height: \"315\",\n        src: \"https://framerusercontent.com/images/jmWtzFnymMt8QrQOeBAMiSfiEE.png\",\n        style: {\n          aspectRatio: \"1555 / 630\"\n        },\n        width: \"777\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"What Bezos bought with this money\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"It is hard to quantify how many people are paying for a larger RDS instance than they need, but I am sure there are many. Bezos is getting rich off people\u2019s indolence in managing their DBMSs. He then uses that money to buy a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.bloomberg.com/news/features/2021-05-07/jeff-bezos-s-new-superyacht-heralds-roaring-market-for-big-boats\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"backup yacht for his new $500m superyacht\"\n          })\n        }), \". It is well known that database billionaires like to build superyachts (Oracle\u2019s Larry Ellison had\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.clubyacht.net/yachts-and-owners/larry-ellisons-superyachts/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"four boats\"\n          })\n        }), \"\\xa0at one point). But buying a smaller yacht so your main yacht does not get lonely is next-level garishness.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"#2 \u2013 Running with the default configuration = $23M \u201Cmuseum\u201D mansion\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Part of what makes DBMSs so enigmatic is that their performance and scalability are highly dependent on their configurations. Further exacerbating this problem is that the default configurations of DBMS knobs are notoriously bad. Know that the defaults always produce suboptimal results, even if they are \u201Cpre-tuned\u201D by a cloud database provider like Amazon Web Services.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To give you a sense of how much using the default configuration can cost you, we ran another experiment on two PostgreSQL RDS databases. For the first database, we used a\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0instance (16 vCPUs, 64GB RAM) with 4000 provisioned IOPs. For the second database, we used a smaller\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.2xlarge\"\n        }), \"\\xa0instance (8 vCPUs, 32GB RAM) with 2000 provisioned IOPS. We then ran the TPC-C benchmark on each database instance twice: once with Amazon\u2019s default RDS configuration and once using OtterTune\u2019s optimized configuration.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The graph below shows that the OtterTune-optimized PostgreSQL instance on the smaller instance achieves the same throughput performance as the larger instance still using the default configuration. But the OtterTune-optimized instance only costs $8,544/year while the other database costs $17,088/year. That means if your database is using the default configuration, you could be paying Amazon 50% more than you need to for it.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune optimized postgresql rds instance\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,TszWS09o9s7rsjWFEEKAgOJFMI.png?originalFilename=Screenshot+2023-08-18+at+1.38.07+PM.png\",\n        \"data-framer-height\": \"636\",\n        \"data-framer-width\": \"1544\",\n        height: \"318\",\n        src: \"https://framerusercontent.com/images/TszWS09o9s7rsjWFEEKAgOJFMI.png\",\n        style: {\n          aspectRatio: \"1544 / 636\"\n        },\n        width: \"772\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"What Bezos bought with this money\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"And so what does Jeff Bezos do with all that extra money that he earns from people using the default database configuration? He bought a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.wusa9.com/article/features/producers-picks/jeff-bezos-amazon-dc-kalorama-mansion-racking-up-parking-tickets/65-d3f68b7d-d262-42aa-9cf3-b0b9e3312aa2\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$23M museum in Washington, DC\"\n          })\n        }), \"\\xa0and turned it into a new house for himself. The property was already the largest mansion in the city at 22,000 square feet before Bezos bought it. But after paying for extensive renovations with his database monies, the house is even larger at 34,000 square feet.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"#3 \u2013 Paying for unnecessary provisioned IOPs = $42M underground clock\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Using Provisioned IOPs (PIOPs) is an essential optimization in AWS to ensure that your PostgreSQL and MySQL RDS databases achieve consistent read/write performance. But PIOPs are expensive: the maximum amount of 80,000 PIOPs for a single node DBMS costs $16,000 per month as of September 2021. We have met customers that are paying AWS more money for PIOPs than for the RDS instances themselves.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Like using an instance size that is too large, people are often overpaying Amazon for more PIOPs than their RDS databases need. The challenge, of course, is that it is hard to determine the right PIOPs setting for your database as it depends on many factors. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For example, suppose your application executes mostly read queries (i.e., it does not perform many writes). Then the amount of data that the DBMS reads from the disk will partly depend on whether the application\u2019s working set (table and index data) fits in memory. PIOPs levels for write-heavy workloads are more challenging to predict because DBMSs have many internal components that write data (e.g., double-writeback buffer, write-ahead log, background writer, autovacuum).\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Given this complexity, an all too common approach to improving RDS performance problems that seem to be related to disk I/O is to increase PIOPs blindly. Adjusting this setting may boost your database performance at first, but this will have diminishing returns. Unless you take the time to analyze your application\u2019s behavior and how it uses the database, you may set the PIOPs level too high and thus overpay for unused resources.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To illustrate this point, we ran the TPC-C benchmark again on a PostgreSQL instance (\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.2xlarge\"\n        }), \") and scaled up the PIOPs setting for the database from the smallest amount (1000 IOPs) to the maximum amount (80,000 IOPs). We use the same instance size for every trial in this deployment but allow OtterTune to generate a new optimized configuration for each PIOPs level.\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune increased throughput postgresl rds\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,eo1z8bdQY4ueKqx7NAZfsZkiQ.png?originalFilename=Screenshot+2023-08-18+at+1.38.14+PM.png\",\n        \"data-framer-height\": \"634\",\n        \"data-framer-width\": \"1547\",\n        height: \"317\",\n        src: \"https://framerusercontent.com/images/eo1z8bdQY4ueKqx7NAZfsZkiQ.png\",\n        style: {\n          aspectRatio: \"1547 / 634\"\n        },\n        width: \"773\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"As shown in the graph above, the additional PIOPs increase PostgreSQL\u2019s throughput by almost 6x for a 10x cost increase: from 1k ($200/month) to 10k ($2000/month). But beyond 10k PIOPs, PostgreSQL\u2019s performance does not improve. These results do not mean PostgreSQL cannot take advantage of additional PIOPs beyond 10k; it does not make a difference for our write-heavy workload (TPC-C). So at 80k PIOPs, we would pay an extra $14,000/month for faster storage but not getting any benefit.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"What Bezos bought with this money\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We have found that many others have also misconfigured PIOPs for their RDS instances in similar ways. And Bezos is laughing all the way to the bank. He then takes all his PIOPs winnings and writes a check to buy a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.theverge.com/tldr/2018/2/20/17031836/jeff-bezos-clock-10000-year-cost\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$42M clock inside a mountain that only ticks once per year\"\n          })\n        }), \". From a scientific point of view, I agree that this clock is kind of cool, but it is clearly something that you buy when you already have everything. It is like getting something from\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/The_Sharper_Image\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"The Sharper Image\"\n          })\n        }), \"\\xa0but for billionaires.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"br\", {\n          className: \"trailing-break\"\n        })\n      })]\n    })\n  }, {\n    id: \"wN3oxTRaz\",\n    [c]: \"Benchmark: Using machine learning to optimize Amazon RDS MySQL performance\",\n    [d]: \"benchmark-using-machine-learning-to-optimize-amazon-rds-mysql-performance\",\n    [u]: \"2021-09-21T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/0MRDRv7pNia5K2DbsCnTUn165Y.jpg\",\n      srcSet: \"https://framerusercontent.com/images/0MRDRv7pNia5K2DbsCnTUn165Y.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/0MRDRv7pNia5K2DbsCnTUn165Y.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/0MRDRv7pNia5K2DbsCnTUn165Y.jpg 1488w\"\n    }, \"otter otterune vs amazon rds vs mysqltuner\"),\n    [m]: \"Amazon\u2019s default settings use general-purpose values for the most common workloads. They are not particularly bad for any application\u2019s workload. But of course, this means that they are also not optimal for your database\u2019s specific workload.\",\n    [g]: \"Ruogu Du | Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/mysql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS MySQL\"\n          })\n        }), \"\\xa0is a popular choice for running a MySQL database. When you provision an RDS MySQL instance, it comes pre-installed with Amazon\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html#Appendix.MySQL.CommonDBATasks.Parameters\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"default configuration settings\"\n          })\n        }), \"\\xa0for dozens of tunable knobs. These knobs control the DBMS\u2019s runtime behavior (e.g., buffer pool policies, thread scheduling). \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Amazon\u2019s default settings use general-purpose values for the most common workloads. That is, they are not particularly bad for any application\u2019s workload. But of course, this means that they are also not optimal for your database\u2019s specific workload.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Correctly setting these knobs to optimize your database\u2019s price-versus-performance trade-offs is non-trivial. It requires you to have both of the following:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Specialized knowledge of MySQL internals.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Time to make changes and test the impact of the change on performance until it is optimized (i.e., trial-and-error).\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you run Amazon RDS MySQL and you lack (1) or (2) above, or if your workload changes over time, your cloud costs are likely higher than they should be for your database.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Comparing MySQL Configurations for Amazon RDS\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We wanted to see how poor Amazon\u2019s RDS knob settings could be and understand how to fix them. We ran an experiment using MySQL (v8.0) on Amazon RDS and measured its performance using three database configurations:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Default Amazon RDS knob settings\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [\"Knob setting recommendations from\\xa0\", /*#__PURE__*/e(o, {\n              href: \"https://github.com/major/MySQLTuner-perl\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"MySQLTuner\"\n              })\n            })]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Knob setting recommendations from OtterTune\u2019s\\xa0machine learning algorithms\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We ran the tests on an Amazon\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0RDS instance equipped with:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"16 vCPUs\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"64 GB RAM\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"2000 provisioned IOPs\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We used the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/cmu-db/benchbase\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"BenchBase\"\n          })\n        }), \"\\xa0framework to run the industry-standard\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://www.tpc.org/tpcc/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"TPC-C benchmark\"\n          })\n        }), \". TPC-C models an order processing application similar to an online storefront, where customers purchase items and the database keeps track of inventory. We configured BenchBase to load a TPC-C database with 200 warehouses (~25 GB of table data) and simulate an application with 50 active connections.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"MySQLTuner Setup\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To use MySQLTuner on an RDS instance, we downloaded the latest version of the script from Github and then ran it on an EC2 instance inside of our Amazon VPC. Since this EC2 instance is inside our firewall, we only have to provide MySQLTuner the username and password for the target MySQL instance. MySQLTuner is unaware that the database is running in Amazon RDS, so we have to manually edit the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Parameter Group\"\n          })\n        }), \"\\xa0using the AWS console.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We applied the following configuration that MySQLTuner recommended. We note that MySQLTuner performs many\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/major/MySQLTuner-perl/blob/master/INTERNALS.md\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"other useful checks\"\n          })\n        }), \", but it only recommended that we modify two knobs for MySQL\u2019s InnoDB storage engine:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"innodb_buffer_pool_instances = 46\\ninnodb_log_file_size = 5368709120\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"OtterTune Setup\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We provided OtterTune the necessary information to connect to MySQL using Amazon\u2019s AWS API and the database itself to retrieve MySQL\u2019s runtime metrics via SQL.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune uses MySQL\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"performance schema\"\n          })\n        }), \"\\xa0to calculate the database\u2019s throughput. We set MySQL\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_monitor_enable\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"INNODB_MONITOR_ENABLE\"\n          })\n        }), \"\\xa0knob to\\xa0module_trx\\xa0to enable transaction counters. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We then instructed OtterTune\u2019s ML algorithms to generate MySQL configurations that optimize for the total number of transactions committed (trx_rw_commits\\xa0+\\xa0trx_ro_commits\\xa0+\\xa0trx_nl_ro_commits). \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We can confirm that MySQL is properly collecting these counters by checking the system\u2019s internal\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/information-schema-innodb-metrics-table.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"INNODB_METRICS\"\n          })\n        }), \"\\xa0catalog table to make sure that the counters are enabled:\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"mysql> SELECT name, comment, status \\nFROM INFORMATION_SCHEMA.INNODB_METRICS\\nWHERE name LIKE 'trx_%_commits';\\nmysql> SELECT name, comment, status FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE name LIKE 'trx_%_commits';\\n+-------------------+--------------------------------------------------------------------+---------+\\n| name              | comment                                                            | status  |\\n+-------------------+--------------------------------------------------------------------+---------+\\n| trx_rw_commits    | Number of read-write transactions  committed                       | enabled |\\n| trx_ro_commits    | Number of read-only transactions committed                         | enabled |\\n| trx_nl_ro_commits | Number of non-locking auto-commit read-only transactions committed | enabled |\\n+-------------------+--------------------------------------------------------------------+---------+\\n3 rows in set (0.00 sec)\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We allowed OtterTune to tune 16 MySQL knobs. The listing below is the best configuration that OtterTune generated for the\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0RDS instance.\"]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"innodb_adaptive_flushing_lwm = 8\\ninnodb_adaptive_hash_index = ON\\ninnodb_adaptive_max_sleep_delay = 208252\\ninnodb_buffer_pool_instances = 27\\ninnodb_buffer_pool_size = 47110422528\\ninnodb_change_buffering = purges\\ninnodb_io_capacity = 311\\ninnodb_log_file_size = 19437453312\\ninnodb_max_dirty_pages_pct = 98\\ninnodb_max_dirty_pages_pct_lwm = 49.401562\\ninnodb_sync_array_size = 799\\ninnodb_thread_concurrency = 637\\ninnodb_thread_sleep_delay = 0\\nmax_heap_table_size = 154674176\\nthread_cache_size = 86\\ntmp_table_size = 208992983\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Some of these knobs do not require OtterTune to restart MySQL before they take effect. Such knobs are referred to as\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"dynamic system variables\"\n          })\n        }), \"\\xa0in MySQL. Other knobs do not take affect until you restart the DBMS.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Result: OtterTune makes MySQL 4x faster\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"mysql ottertune vs rds vs mysqltuner\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,9MpQ7htDCWGZMNMugw5hqm3ChuU.png\",\n        \"data-framer-height\": \"622\",\n        \"data-framer-width\": \"1024\",\n        height: \"311\",\n        src: \"https://framerusercontent.com/images/9MpQ7htDCWGZMNMugw5hqm3ChuU.png\",\n        style: {\n          aspectRatio: \"1024 / 622\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In the graph above, we see that, as expected, Amazon\u2019s default configuration for MySQL RDS performs the worst with only 781 transactions per second (txn/sec). MySQLTuner\u2019s recommendations improve MySQL\u2019s throughput by 116% over the RDS default by changing two knobs. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This improvement is undoubtedly good, but OtterTune optimizes more MySQL knobs to improve its performance even further. OtterTune\u2019s ML algorithm achieves the best performance with over 3500 txn/sec, 4x higher than the default RDS configuration from Amazon and 20% higher than the MySQLTuner outcome.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Better performance or lower cost?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The first test showed how OtterTune customizes MySQL\u2019s knob settings for the application\u2019s workload to get better performance than Amazon\u2019s default settings and the popular MySQLTuner tool. Better performance means that the DBMS can execute more queries quickly even if your database grows over time or your application adds new features. Improving a database\u2019s performance helps applications that may be running a bit slow.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For people who are satisfied with their database\u2019s current speed, but would like to lower their monthly AWS bills, tuning database knobs can also help. To demonstrate that, we reran the TPC-C benchmark on a smaller\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.2xlarge\"\n        }), \"\\xa0RDS with fewer provisioned IOPs than the instance we tested above:\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"8 vCPUs\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"32 GB RAM\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"1000 provisioned IOPs\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In the graph below, we see that, again, OtterTune can optimize MySQL\u2019s configuration to get better performance than Amazon and MySQLTuner. On this smaller instance, using the OtterTune-generated configuration makes MySQL run 288% and 63% faster than Amazon and MySQLTuner, respectively.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"better throughput ottertune mysql\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,mAqu6jfcnvv2Z03gMhBM5iS7Jc.png\",\n        \"data-framer-height\": \"622\",\n        \"data-framer-width\": \"1024\",\n        height: \"311\",\n        src: \"https://framerusercontent.com/images/mAqu6jfcnvv2Z03gMhBM5iS7Jc.png\",\n        style: {\n          aspectRatio: \"1024 / 622\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"But what is most impressive is that OtterTune\u2019s optimized configuration for MySQL on the\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.2xlarge\"\n        }), \"\\xa0instance achieves almost 2x better performance than the default Amazon RDS configuration for the\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0instance. \"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"As of the time of this article in September 2021, the smaller\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.2xlarge\"\n        }), \"\\xa0instance costs $7,191/year (instance cost + provisioned IOPs), while the\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"db.m5.4xlarge\"\n        }), \"\\xa0instance costs $14,383/year.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These results mean that for this workload, OtterTune gets double the performance at half the cost! It is important to remember that this result is specific to this workload. Other applications may experience a smaller improvement, while others may have an even more significant performance boost and cost reduction. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"There are too many factors that affect MySQL\u2019s runtime behavior. This complexity is why database tuning is so hard. But we are fairly certain that you should probably\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"not\"\n        }), \"\\xa0use Amazon\u2019s default RDS configuration.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"br\", {\n          className: \"trailing-break\"\n        })\n      })]\n    })\n  }, {\n    id: \"J0RrkRHpu\",\n    [c]: \"How will machine learning transform database administration?\",\n    [d]: \"how-will-machine-learning-transform-database-administration\",\n    [u]: \"2021-09-14T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/lA8ZthNBMZTwBrsLMppY4uwtVKI.jpg\",\n      srcSet: \"https://framerusercontent.com/images/lA8ZthNBMZTwBrsLMppY4uwtVKI.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/lA8ZthNBMZTwBrsLMppY4uwtVKI.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/lA8ZthNBMZTwBrsLMppY4uwtVKI.jpg 1488w\"\n    }, \"otter ottertune machine learning database adminstration\"),\n    [m]: \"Autonomous database tuning is a growing trend that database developers and administrators should be tracking.\",\n    [g]: \"Dana Van Aken\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Autonomous database tuning relies on machine learning (ML) algorithms to automate tasks that have, to date, been performed manually by database administrators (DBAs). Today, you can find ML-powered automated tuning tools in products like\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \",\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.oracle.com/autonomous-database/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Oracle Autonomous Database\"\n          })\n        }), \", and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://blogs.oracle.com/mysql/mysql-autopilot-machine-learning-automation-for-mysql-heatwave\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MySQL Autopilot\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Will machine learning make DBAs and devops obsolete?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"I get that question from time to time. My answer is always, \u201CNo, ML will not make humans obsolete,\u201D but the technology will change how humans administer databases and require some new skills to master. Here are three predictions about the impact that automatic database tuning will have on database administration:\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Prediction #1: ML will yield better DB price-performance with less effort\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This first prediction is obvious; it is why DBMS technology developers are investing so much R&D into the functionality. Optimizing DBMS performance is a complex process. Consider configuration tuning, which involves tweaking hundreds of knobs to optimize the DBMS performance for a specific workload on a given hardware and OS platform. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Finding the perfect settings is tedious\u2013usually a trial and error process that can take days. It is so tedious that people do not do it frequently enough, or too often, they do not do it at all, which is inefficient and results in poor performance or higher DBMS hosting costs.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Autonomous database tuning solves this by implementing ML algorithms trained to determine the optimal config settings (or query plan, index selection) for a given workload. The approach is automatic, generates better performance, and saves developers time and effort. Where ML shines is with large deployments of several dozen or hundreds of databases. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"No human has the time (or patience) to tune each database individually. But the ML-automated tuning process needs guidance, which leads me to my next prediction.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Prediction #2: Humans will guide autonomous database operations\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"When it comes to database tuning, ML algorithms do not know and do not care what they are tuning in the system, leading to a complex set of challenges. For example, what if an algorithm sets the size of a buffer pool to be larger than the amount of memory available on the system and then restarts the system? \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Some database systems, like PostgreSQL, will refuse to start because the buffer pool is too large. Other systems, like MySQL, will gladly start the system even though the knob is erroneously set. It may then crash or get killed by the OS when the database tries to allocate more memory than is available.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For this reason, humans (e.g., devops, DBAs, etc.) will need to oversee and guide ML-driven automation to make sure databases are tuned correctly and safely. There are several facets to this:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"What the ML algorithms should optimize in the database (e.g., query latency, cost).\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Whether to sacrifice the data safety and correctness in exchange for better performance.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Confirming appropriate value ranges for different knobs.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Specifying which knobs, if any, are off-limits to ML (and should only be changed manually).\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Defining tuning time windows to control when the ML algorithms databases perform tuning and potentially restart the database (for specific config changes to take effect).\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune helps humans and ML work better together by exposing a customizable list of recommended knobs and values, and estimating which knobs will have the most impact on performance.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Prediction #3: ML will add a new dimension to database troubleshooting\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Humans working with ML-based database tuning tools will require some familiarity with ML. Such understanding is necessary if the database has unexpected behavior: a human operator will need to identify whether the behavior is due to ML-based decision-making and if so, what metrics and data were fed into the ML algorithms. It will also be helpful to have human-decipherable explanations of why the algorithms are making certain changes. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"DBAs need to be thoughtful about what data trains or signals ML models, especially with databases supporting cyclic workloads with complex patterns, because the system state is constantly changing.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Final Thoughts\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Autonomous database tuning is a growing trend that database developers and administrators should be tracking. If you want to learn more about it, here are some helpful resources:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://youtu.be/SJdnpAMI_q4\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"OtterTune Explainer Video\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"rds-postgres-tuning-benchmark\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"OtterTune vs. PGTune Performance Benchmarks\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: {\n                pathVariables: {\n                  tcfKQ1IoL: \"prevent-machine-learning-from-wrecking-your-database\"\n                },\n                webPageId: \"tPSFzK3kB\"\n              },\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"How to keep Machine Learning from Wrecking your Database\"\n              })\n            })\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: /*#__PURE__*/e(o, {\n              href: \"https://www.youtube.com/watch?v=tKYapjd62Eg\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"Oracle Autonomous Database Technical Overview Video\"\n              })\n            })\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"And one more thing\u2026never use the default database configuration! The default configuration file (my.cnf, postgresql.conf) that you get when you first install a database or create one in Amazon RDS is always terrible and makes your database run slow. \"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Use human expertise and some type of automated tuning tools, whether that\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \",\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://pgtune.leopard.in.ua/#/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PGTune\"\n          })\n        }), \",\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/major/MySQLTuner-perl\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MySQLTuner\"\n          })\n        }), \", or any of the various ones from commercial vendors. Any automated knob tuning can deliver significant improvement, without having to make drastic changes.\"]\n      })]\n    })\n  }, {\n    id: \"grAsZl1v9\",\n    [c]: \"External vs. internal automatic database tuning approaches\",\n    [d]: \"external-vs-internal-automatic-database-tuning\",\n    [u]: \"2021-09-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/g4ft77RswMoWjsA3gzCLhFE3w.jpg\",\n      srcSet: \"https://framerusercontent.com/images/g4ft77RswMoWjsA3gzCLhFE3w.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/g4ft77RswMoWjsA3gzCLhFE3w.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/g4ft77RswMoWjsA3gzCLhFE3w.jpg 1488w\"\n    }, \"otter ottertune external vs internal database tuning\"),\n    [m]: \"In the last 20 years, MySQL and PostgreSQL have increased the number of knobs that they expose to tune by 7x and 5x, respectively. What are the pros and cons of tuning those knobs externally vs. internally?\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Databases expose many configuration parameters (or \u201Cknobs\u201D) that allow you to change the system\u2019s runtime behavior. Correctly tuning these knobs is key to good application performance and efficiency, but it\u2019s a complex task because of the many possible choices that one has to make. What settings to use for your database depends on many factors: what the queries are, how big the database is, what the application is, and what the hardware is. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These systems have gotten harder to tune over time too. For example, in the last 20 years, MySQL and PostgreSQL have increased the number of knobs that they expose to tune by 7x and 5x, respectively.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"increase in knobs mysql, postgresql\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,2ZfugXXFhzt1fbj2cPrgqeHam8.png\",\n        \"data-framer-height\": \"426\",\n        \"data-framer-width\": \"1024\",\n        height: \"213\",\n        src: \"https://framerusercontent.com/images/2ZfugXXFhzt1fbj2cPrgqeHam8.png\",\n        style: {\n          aspectRatio: \"1024 / 426\"\n        },\n        width: \"512\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"This increased complexity has led to the development of machine learning (ML) approaches to automatically tuning database management systems (DBMSs). Commercial examples include\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.oracle.com/autonomous-database/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Oracle Autonomous Database\"\n          })\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \", as well as academic research projects like our\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://noise.page/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"NoisePage project\"\n          })\n        }), \"\\xa0at\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Carnegie Mellon\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Machine-learning approaches to automatic database tuning fall into two categories:\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"external tuning\"\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"internal tuning\"\n        }), \". As we now discuss, both have their pros and cons.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"External Database Automation\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"An external ML approach is when the tuning algorithm can only observe the target\u2019s inputs and outputs in its decision making process; the algorithm has no knowledge of the system\u2019s internal structure, design, or implementation. In the context of database tuning, an external tuning tool interacts with the DBMS only through its standard APIs (e.g., SQL) and monitoring services (e.g., Amazon CloudWatch). In other words, an external ML approach does not require changes to the DBMS\u2019s source code, nor does it need the user to install custom extensions.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune is an external tuning service; it uses the target DBMS\u2019s standard interfaces (SQL) to:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Retrieve the database\u2019s current configuration and other runtime info (e.g., metrics),\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Change the configuration, and\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Restart the system if necessary.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune implements an exteranl tuning ML algorithm to improve a database\u2019s query performance and efficiency without needing to modify the DBMS nor examine the application\u2019s queries and data.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Internal Database Automation\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"An internal ML approach is when the DBMS has automatic tuning components tightly integrated into its internal architecture. Such integration requires the system developers to add \u201Chooks\u201D in the DBMS\u2019s source code to retrieve telemetry data and modify its behavior. With the former, these changes could allow the tuning algorithms to collect information about the system\u2019s runtime behavior and low-level hardware measurements, such as the number of CPU cycles used to insert a single record into an index. \"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The algorithms could then control the system\u2019s behavior in ways that are not possible through existing APIs. For example, the tuning algorithm could make adjustments to the DBMS at the session-level to affect how the system executes individual transactions or queries. Such fine-grained control is not possible by humans and is not feasible with existing approaches today.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Which approach is better?\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In external tuning automation systems like OtterTune, the ML logic exists outside of the DBMS. Thus, one can adapt the service to support new databases or new database versions more easily than with internal ML approaches. For example, we extended OtterTune to support Oracle within a few weeks for our deployment at Societe Generale. External tuning is also usable when it is not feasible to modify or extend a database or modify application code. For example, Amazon does not allow users to change the database\u2019s system binary for their MySQL or PostgreSQL RDS instances. Instead, they only allow a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/about-aws/whats-new/2021/06/amazon-rds-for-postgresql-supports-extension-allowlists/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"limited number of extensions\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Internal tuning automation technology is still nascent. Developing ML-driven internal tuning requires deep knowledge of the system internals and source code, so DBMS users will have to wait for their vendors to add the capabilities to their database\u2013and then upgrade to the new version of the DBMS. It is going to take a long time for every DBMS to incorporate internal ML optimizations because these changes are custom code specific to the system; one cannot easily port them to a new database. Other than Oracle Autonomous Database, Oracle\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.oracle.com/news/announcement/mysql-autopilot-for-heatwave-2021-08-10/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"MySQL Heatwave Autopilot\"\n          })\n        }), \", Huawei\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://opengauss.org/en/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OpenGauss\"\n          })\n        }), \", and our work with CMU\u2019s NoisePage, internal DBMS automation tuning implementations are not common today.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How will these become part of your infrastructure?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"ML algorithms, whether external or internal to the database, automate the complex database tuning process. Automated tuning makes it easier to configure, optimize, and maintain a complex database deployment. This reduces the need to have developers and administrators \u201Cbabysit\u201D the database to make sure that it is performing its best. Those people can instead spend their time working on more fulfilling activities, like application development and other tasks that cannot be automated.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Automated tuning is an essential tool for anyone who cares about database price-performance, but does not have the time or expertise to keep multiple databases tuned for optimal performance.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"A Final Word\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Given today\u2019s extreme reliance on databases, everyone stands to benefit tremendously from advancements in the field of automated tuning using ML. Internal and external approaches have their trade-offs. It is exciting to see researchers and the industry as a whole are making advancements in creating autonomous databases, with ML doing the heavy lifting.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"In deployments of OtterTune, we have seen it achieve significant performance improvements and cost reductions for PostgreSQL and MySQL database instances versus both default configuration settings (\", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"rds-postgres-tuning-benchmark\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"view the benchmarks\"\n          })\n        }), \") and human-tuned configurations.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Summary of Pros & Cons\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"External ML approaches\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Pro: More generic solution (portable across DBMS systems, hardware).\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Pro: Simpler to design and build since you do not need to understand the DBMS internals.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Con: Lack of explainability on the ML algorithm\u2019s decision making.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Internal ML approaches\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Pro: Potentially need less data to achieve good results compared to black box approaches.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Pro: Fine-grained control over the DBMS\u2019s telemetry and runtime behavior.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Con: Higher engineering cost for DBMS developers.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Con: Lack of portability: ML algorithms are designed for only that system.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: /*#__PURE__*/e(\"br\", {\n          className: \"trailing-break\"\n        })\n      })]\n    })\n  }, {\n    id: \"W78Wmyg_v\",\n    [c]: \"VLDB 2021 video: Applying machine learning-based database tuning in production\",\n    [d]: \"vldb-autonomous-database-tuning-in-production\",\n    [u]: \"2021-08-18T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/MIJlwryKnoBFVMsUY6SzCGmYe4.jpg\",\n      srcSet: \"https://framerusercontent.com/images/MIJlwryKnoBFVMsUY6SzCGmYe4.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/MIJlwryKnoBFVMsUY6SzCGmYe4.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/MIJlwryKnoBFVMsUY6SzCGmYe4.jpg 1488w\"\n    }, \"otter otterune vldb 2021 video\"),\n    [m]: \"Autonomous database operation and tuning, driven by machine learning (ML), is becoming more prevalent. In this VLDB talk, I presented learnings that help DBMS users better understand how to benefit from ML more productively and safely.\",\n    [g]: \"Dana Van Aken\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"During yesterday\u2019s\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/2021/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"VLDB conference\"\n          })\n        }), \", I presented \u201CAn Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems.\u201D The paper was a collaborative effort among the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://db.cs.cmu.edu/projects/autotune/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Carnegie Mellon Database Group\"\n          })\n        }), \",\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.princeton.edu/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Princeton University\"\n          })\n        }), \",\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.societegenerale.com/en\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Societe Generale\"\n          })\n        }), \", and OtterTune.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Autonomous database operation and tuning, driven by machine learning (ML), is becoming more prevalent. In this VLDB talk, I presented learnings that help DBMS users better understand how to benefit from ML more productively and safely.\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          \"--aspect-ratio\": \"560 / 315\",\n          aspectRatio: \"var(--aspect-ratio)\",\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",\n          children: t => /*#__PURE__*/e(h, {\n            ...t,\n            play: \"Off\",\n            shouldMute: !0,\n            thumbnail: \"Medium Quality\",\n            url: \"https://www.youtube.com/watch?v=gt5J23gyQ2I\"\n          })\n        })\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"You can read the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/pvldb/vol14/p1241-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"research paper here\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Talk highlights\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Tuning configuration knobs for modern database management systems (DBMSs) is essential, especially for workload-intensive applications, yet tuning is a complex process that typically requires an experienced database administrator (DBA). There are past and current efforts to automate the process, starting with heuristics tools in the early 2000s and leading up to today\u2019s more advanced ML-based tools, including\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \". Evaluations have shown that ML-based tuners can achieve better performance compared to DBAs and other tuning tools, but what happens when ML-based tuning tools are used in real-world deployments?\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"This study discusses three \u201Cmismatches\u201D between previous research studies and real-world deployments:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Studies only consider open-source database systems.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"They use synthetic benchmarks that don\u2019t consider real workloads.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"They run their experiments on dedicated local storage.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Automatic DBMS tuning in production at Societe Generale\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Given these issues, my collaborators and I were eager to complete a field study of automatic knob configuration on a commercial DBMS (Oracle) with a real-world workload in a production environment at Societe Generale (SG).\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In 2020, SG agreed to work with our team to test out the OtterTune ML-based tuning framework. The goal was to see whether automated tuning could improve a DBMS\u2019s performance beyond what their DBAs achieve through manual tuning. In this talk, I discuss the set-up at SG, as well as the methodology for tuning using OtterTune. The OtterTune and SG teams ran into several unexpected hurdles along the way\u2014but in the end, the results were impressive. The ML algorithms generated knob configurations that improved performance by up to 45% over ones generated by a human expert.\"\n      })]\n    })\n  }, {\n    id: \"CQ4rbIEg1\",\n    [c]: \"OtterTune at VLDB 2021\",\n    [d]: \"ottertune-vldb-2021\",\n    [u]: \"2021-08-11T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Lb02OHmzvSt4mSuO70AhVG8.jpg\",\n      srcSet: \"https://framerusercontent.com/images/Lb02OHmzvSt4mSuO70AhVG8.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/Lb02OHmzvSt4mSuO70AhVG8.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/Lb02OHmzvSt4mSuO70AhVG8.jpg 1488w\"\n    }, \"otter ottertune at vldb 2021\"),\n    [m]: \"The OtterTune team will be participating in full force at VLDB 2021 with a research paper presentation, workshop keynote, award talk, and discussion panel.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"http://vldb.org/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"VLDB\"\n          })\n        }), \", one of the leading database management conferences\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/wiki/International_Conference_on_Very_Large_Data_Bases\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"since 1975\"\n          })\n        }), \", brings together data management and database researchers, vendors, practitioners, application developers, and users. At this year\u2019s conference, running in Copenhagen and online, leaders in the industry will cover issues in data management, database, and information systems research. The OtterTune team will be participating in full force with a research paper presentation, workshop keynote, award talk, and discussion panel.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here\u2019s how you can catch us at the conference talking about applying machine learning to the complex process of database performance optimization:\"\n      }), /*#__PURE__*/t(\"h5\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Tue Aug 17 @ 4:00pm EST\"\n        }), \"\\xa0\u2013\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://vldb.org/2021/?program-schedule-roundtable\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Magical Machine Learning for Database Tuning\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Roundtable panel hosted by Andy Pavlo. Panelists Weiwei Gong (Oracle), Sam Lightstone (Facebook), Surajit Chaudhuri (Microsoft Research), Dana Van Aken (OtterTune), Bailu Ding (Microsoft Research)\"\n      }), /*#__PURE__*/t(\"h5\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Wed Aug 18 @ 3:00am EST\"\n        }), \"\\xa0\u2013\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://vldb.org/2021/?program-schedule-roundtable\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Research paper talk by Dana Van Aken (\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/pvldb/vol14/p1241-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Read the paper\"\n          })\n        }), \")\"]\n      }), /*#__PURE__*/t(\"h5\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Thu Aug 19 @ 9:30am EST\"\n        }), \"\\xa0\u2013\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/2021/?program-structure\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Make Your Database System Dream of Electric Sheep: Towards Self-Driving Operation\"\n          })\n        })]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"VLDB Early Career Award talk by Andy Pavlo (\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/pvldb/vol14/p3211-pavlo.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Read the paper\"\n          })\n        }), \")\"]\n      }), /*#__PURE__*/t(\"h5\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Fri Aug 20 @ 10:00am EST\"\n        }), \"\\xa0\u2013\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://sites.google.com/view/aidb2021/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Lessons Learned from Using Machine Learning to Optimize Database Configurations\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"AIDB Workshop keynote talk by Andy Pavlo\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We look forward to sharing our research with the VLDB community and learning from others there as well. We hope you\u2019ll\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/2021/?info-registration\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"join the event\"\n          })\n        }), \", and we\u2019ll be sure to share thoughts and observations here, on our blog, after the conference.\"]\n      })]\n    })\n  }, {\n    id: \"f_1TJa6v1\",\n    [c]: \"Seven years of OtterTune R&D: Part 2 \u2013 Learnings in the wild\",\n    [d]: \"history-ottertune-research-part2\",\n    [u]: \"2021-07-28T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/WOd02BkvtByKaMCvnmyfCwQlk.jpg\",\n      srcSet: \"https://framerusercontent.com/images/WOd02BkvtByKaMCvnmyfCwQlk.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/WOd02BkvtByKaMCvnmyfCwQlk.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/WOd02BkvtByKaMCvnmyfCwQlk.jpg 1488w\"\n    }, \"otter ottertune seven years of r&d part two\"),\n    [m]: \"OtterTune started out in the academic world. We learned a lot to improve the product from our first real-world deployments.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"In our\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/blog/history-ottertune-research-part1\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"previous blog post\"\n          })\n        }), \", we detailed the seven years of intensive research and lessons we learned that led to the commercialization of the OtterTune database tuning service. Since then, we\u2019ve brought OtterTune into the real world at Soci\\xe9t\\xe9 G\\xe9n\\xe9rale (SocGen) and Booking.com. We keep learning about how to optimize database performance, and OtterTune keeps getting smarter. Here are a few details we\u2019ve learned so far.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Lessons from our first real-world deployment\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Our latest academic paper,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2021/p1241-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems\"\n          })\n        }), \", focuses on our 10-month study of OtterTune running in a production environment at SocGen. OtterTune co-founder Dr. Dana Van Aken will be presenting these results at\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://vldb.org/2021/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"VLDB 2021\"\n          })\n        }), \"\\xa0in August.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For this research, we deployed OtterTune on-site to tune a 1TB Oracle (v12.2) DBMS. We extended OtterTune to support multiple tuning algorithms. In addition to the original GPR algorithm from the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://dl.acm.org/doi/pdf/10.1145/3035918.3064029\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"SIGMOD 2017 paper\"\n          })\n        }), \", we added two additional algorithms:\"]\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Deep deterministic policy gradient (DDPG) from CDBTune and\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Deep neural network (DNN) by OtterTune co-founder Bohan Zhang.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Our results show that OtterTune\u2019s ML-generated configurations improved the DBMS\u2019s performance by up to 45% over a configuration hand-tuned by the bank\u2019s in-house expert DBAs. We found that there was no major difference in the quality of tuning among the three algorithms. But they all beat the human experts. GPR converges the fastest but DNN had slightly better results. DDPG might be better if we ran it for longer but a single trial already took 3-4 days (each bar in the chart is the average of nine trials). This was our first real-world implementation of OtterTune and we gained a lot of insights.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune improves oracle performance\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,W1jfze5pbc24hu409bp6hRzFJfQ.png?preferredSize=full\",\n        \"data-framer-height\": \"264\",\n        \"data-framer-width\": \"512\",\n        height: \"132\",\n        src: \"https://framerusercontent.com/images/W1jfze5pbc24hu409bp6hRzFJfQ.png\",\n        style: {\n          aspectRatio: \"512 / 264\"\n        },\n        width: \"256\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Key details and advancements\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"During the process of setting up and deploying OtterTune at SocGen for this study, several issues arose that we did not anticipate. Some of these were specific to SocGen\u2019s operating environment and cloud infrastructure. Several issues, however, are broadly related to the field of automated DBMS tuning with machine learning.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"strong\", {\n          children: \"Tune without accessing sensitive data\"\n        }), \"\\xa0\u2013 Because the bank has strict security requirements, the DBMS could not use locally attached storage. It had to store the database on a shared NAS for regulatory reasons. We also had to consider GDPR privacy regulations. This was not an issue because the metrics OtterTune gathers are benign. OtterTune\u2019s algorithms only use knobs and metrics, it does not retrieve sensitive queries or user data.\"]\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Machine learning needs safeguards\"\n            }), \"\\xa0\u2013 Automated database tuning is more than just generating new configurations. The service needs additional safeguards to make sure it correctly identifies invalid configurations that cause the DBMS to fail to start and poor configurations that cause the DBMS to run much slower than before. If the ML algorithms do not have prior training data, they will inevitably select poor configurations to install on the DBMS at the beginning of a tuning session because they will explore the possible configurations to learn how different settings impact the target objective.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Limit configuration testing times\"\n            }), \"\\xa0\u2013 We had to overcome issues with handling long-running and failed configurations. For example, the execution time of the workload in this instance depended on how long it took to replay the queries in the 10-minute trace we used in this study. We implemented an early abort feature that would stop executing long-running traces after a specified period of time (45 minutes by default) since some bad configurations would cause the execution time to take several hours.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Discerning maintenance tasks from regular DB workload\"\n            }), \"\\xa0\u2013 In real-world deployments, DBMS maintenance tasks have to be considered. Some DBMSs invoke these tasks at scheduled intervals, while other tasks are in response to the workload (e.g., PostgreSQL\u2019s autovacuum runs when a table is modified a certain number of times). It is best to be aware of these tasks in advance before starting a tuning session since they often cause performance to degrade.\"]\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/t(\"p\", {\n            children: [/*#__PURE__*/e(\"strong\", {\n              children: \"Auto-tuning benefits vs. costs\"\n            }), \"\\xa0\u2013 There are unexpected cost considerations to consider as well. Our results showed that ML-based algorithms generated configurations that improved performance by up to 45% over the configurations hand-tuned by expert DBAs. Although these gains are noteworthy, there is a trade-off between the time it takes to deploy OtterTune versus the benefit. But there are several non-obvious factors that organizations need to consider when making the decision to tune a DBMS. Such factors include the economic significance of the application, the administrative cost of tuning the database, and whether the organization has the tooling and infrastructure to run the tuning sessions.\"]\n          })\n        })]\n      })]\n    })\n  }, {\n    id: \"OEihFwoRD\",\n    [c]: \"Seven years of OtterTune R&D: Part 1 \u2013 The lab years\",\n    [d]: \"history-ottertune-research-part1\",\n    [u]: \"2021-07-19T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/PdDmTQrnzcOPthdJ5VMptfwHsY.jpg\",\n      srcSet: \"https://framerusercontent.com/images/PdDmTQrnzcOPthdJ5VMptfwHsY.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/PdDmTQrnzcOPthdJ5VMptfwHsY.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/PdDmTQrnzcOPthdJ5VMptfwHsY.jpg 1488w\"\n    }, \"otter ottertune seven years of r&d part one\"),\n    [m]: \"OtterTune's roots go back to 2014. We've run over 100,000 trials to build our training corpus and even challenged conference attendees to try and best OtterTune.\",\n    [g]: \"OtterTune Team\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"In 2013, Andy Pavlo started the OtterTune research project at Carnegie Mellon University (CMU) as an extension to the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/projects/oltp-bench/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OLTP-Bench project\"\n          })\n        }), \". Recognizing the importance and complexity of DBMS configuration tuning, The National Science Foundation (NSF) funded the project with a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.nsf.gov/awardsearch/showAward?AWD_ID=1423210\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"$500K grant\"\n          })\n        }), \"\\xa0in 2014. That same year,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.cs.cmu.edu/~dvanaken/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Dana Van Aken\"\n          })\n        }), \", who is now our co-founder and CTO, started as a new PhD student. She became the primary researcher for the project.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For the next seven years, we worked on the research that led to the commercial release of OtterTune this\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.zdnet.com/article/ottertune-sets-out-to-auto-tune-all-the-databases/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"past May\"\n          })\n        }), \". The insights of our work have been published in several peer-reviewed papers. In a pair of blog posts, we\u2019ll share an account of the research and findings that led us to where we are today. \"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here are some of the highlights and lessons we learned during the early years, developing OtterTune\u2019s machine learning algorithms and services architecture.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Reusing training data to improve the effficacy of tuning recommendations\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The first paper about the OtterTune service, presented at SIGMOD in 2017, was\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2017/p1009-van-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Automatic Database Management System Tuning Through Large-scale Machine Learning\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The paper covered our automated, machine learning-driven approach, leveraging past experience and collecting new information to tune DBMS configurations. In our research, we used a combination of supervised and unsupervised machine learning methods to:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Select the most impactful knobs,\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Map unseen database workloads to previous workloads so we can transfer experience, and\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Recommend knob settings.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We implemented our techniques in OtterTune and tested it on three DBMSs. Our evaluation showed that OtterTune recommends configurations that are as good as or better than ones generated by existing tools or a human expert.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We designed OtterTune to use a pipeline of different machine learning algorithms (purple shapes in the diagram below) to: 1) characterize the target database\u2019s workload, 2) identify which knobs to tune, and 3) recommend new configuration settings. The OtterTune service uses ML metrics to map a new database workload it\u2019s trying to optimize to a similar workload that the service has seen in the past. This is how OtterTune can reuse training data it has collected from tuning other databases to improve the efficacy of its recommendations.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OtterTune machine learning pipeline:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune machine learning pipeline\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,GSkJ3dyUZTAgMJtrG7Tu3UCRDOs.jpeg\",\n        \"data-framer-height\": \"449\",\n        \"data-framer-width\": \"1600\",\n        height: \"224\",\n        src: \"https://framerusercontent.com/images/GSkJ3dyUZTAgMJtrG7Tu3UCRDOs.jpeg\",\n        style: {\n          aspectRatio: \"1600 / 449\"\n        },\n        width: \"800\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Key learnings and advancements\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"For this research,\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"we ran 100,000 trials\"\n        }), \"\\xa0to build the initial training data corpus for OtterTune. Each trial was benchmarked using OLTP-Bench. As our ML algorithms improved, we found that we did not need to collect as much training data.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Among other ML algorithms, OtterTune uses a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://en.wikipedia.org/w/index.php?title=Gaussian_process_regression\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Gaussian Process Regression\"\n          })\n        }), \"\\xa0algorithm, a common approach for solving black-box optimization problems and hyperparameter tuning. We originally wrote the algorithm in MATLAB. During a summer internship at CMU, Bohan Zhang, one of OtterTune\u2019s co-founders, then\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"rewrote it in TensorFlow\"\n        }), \"\\xa0and improved its computing efficiency, resulting in a 5x performance increase.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The first version of\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"OtterTune supported MySQL, PostgreSQL, and Actian Vector\"\n        }), \". We evaluated both OLTP and OLAP workloads. We were using the latest versions of MySQL (v5.6) and PostgreSQL (v9.3) at the time, and we learned that the earlier DBMS versions had fewer knobs for improving performance of OLAP workloads than OLTP workloads.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune was well-received in academia after presenting it at SIGMOD 2017, but it wasn\u2019t until we were invited to write a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/machine-learning/tuning-your-dbms-automatically-with-machine-learning/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"guest post for the AWS Machine Learning blog\"\n          })\n        }), \"\\xa0that we started hearing from a lot of industry folks trying to solve similar problems.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Automatically selecting a configuration that improves DBMS performance\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"A year later, we presented a short paper,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://www.vldb.org/pvldb/vol11/p1910-zhang.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"A Demonstration of the OtterTune Automatic Database Management System Tuning Service\"\n          })\n        }), \", at the VLDB conference in Brazil.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The paper described OtterTune\u2019s microservice architecture. The tuning agent (now called the Driver) was used to collect the target DBMS\u2019s current configuration and metrics and then transmit them to the OtterTune tuning manager. The tuning manager stored this data in its internal repository of previous tuning sessions. The algorithm then trains models with the data from the target DBMS as well as previous tuning data from similar workloads to produce a new configuration recommendation. The tuning manager sent this new configuration back to the agent to install on the target DBMS.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Key learnings and advancements\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For the live demonstration at VLDB, we challenged conference attendees to tune PostgreSQL (v9.6) running the TPC-C benchmark and compared them against OtterTune\u2019s tuning algorithm. We gave them a web interface that allowed them to set the values for several knobs and then ran the workload.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune was able to get\\xa0\", /*#__PURE__*/e(\"strong\", {\n          children: \"20% better performance than the best configuration from a human\"\n        }), \".\"]\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"bohan zhang at vldb 2018\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,G2AEu4RjMhVHPPshRPGFIvDqE.jpeg\",\n        \"data-framer-height\": \"1920\",\n        \"data-framer-width\": \"2560\",\n        height: \"960\",\n        src: \"https://framerusercontent.com/images/G2AEu4RjMhVHPPshRPGFIvDqE.jpeg\",\n        style: {\n          aspectRatio: \"2560 / 1920\"\n        },\n        width: \"1280\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(\"em\", {\n          children: \"Bohan Zhang in action at VLDB 2018. View other \"\n        }), /*#__PURE__*/e(o, {\n          href: \"https://twitter.com/andy_pavlo/status/1035179003198488577\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: /*#__PURE__*/e(\"em\", {\n              children: \"VLDB 2018 photos\"\n            })\n          })\n        }), /*#__PURE__*/e(\"em\", {\n          children: \".\"\n        })]\n      })]\n    })\n  }, {\n    id: \"izxe4jnbh\",\n    [c]: \"How to prevent machine learning from wrecking your database \",\n    [d]: \"prevent-machine-learning-from-wrecking-your-database\",\n    [u]: \"2021-07-07T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/7rHIxwRAaIe03AdmRkVOedr6E.jpg\",\n      srcSet: \"https://framerusercontent.com/images/7rHIxwRAaIe03AdmRkVOedr6E.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/7rHIxwRAaIe03AdmRkVOedr6E.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/7rHIxwRAaIe03AdmRkVOedr6E.jpg 1488w\"\n    }, \"otter ottertune how use machine learning on databases\"),\n    [m]: \"OtterTune's algorithms make decisions based on training data, and sometimes these decisions can be unpredictable because the algorithms do not interpret the world the same way humans do. OtterTune has safeguards in place to protect your database.\",\n    [g]: \"Dana Van Aken\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Companies are moving their databases to hosted database services, such as Amazon RDS, to take advantage of the flexibility and scalability of cloud deployments. But what people do not often realize is that while these \u201Cfully managed\u201D services simplify database provisioning and maintenance, customers are still responsible for some critical administrative tasks that are not easily automated. Database configuration tuning is one of them.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Optimizing a database\u2019s configuration knobs for the workload speeds up performance and scales your systems, thereby lowering costs. Amazon already tweaks a few of MySQL and PostgreSQL out-of-the-box default settings for its RDS deployments based on the instance type. However, they do not tune them for any specific workload.\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune automates the process of optimizing a database\u2019s configuration knobs for its specific workload by using machine learning (ML). We showed in a\\xa0\", /*#__PURE__*/e(o, {\n          href: {\n            pathVariables: {\n              tcfKQ1IoL: \"rds-postgres-tuning-benchmark\"\n            },\n            webPageId: \"tPSFzK3kB\"\n          },\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"previous post\"\n          })\n        }), \"\\xa0that OtterTune achieves a 3x performance improvement for a PostgreSQL database by tuning its configuration for its workload versus using the default configuration from Amazon RDS.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The OtterTune ML algorithms make decisions based on their training data, and sometimes these decisions can be unpredictable because the algorithms do not interpret the world the same way humans do. For this reason, OtterTune has safeguards in place to ensure that ML does not harm your database.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We have learned a lot about how an ML-based DBMS tuner fits an organization\u2019s established database administration policies and practices. These experiences have led us to develop operational settings that allow humans to control aspects of the automated tuning process. This article discusses which configuration knobs OtterTune can tune and the features available to users for managing this.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Types of knobs\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"A DBMS has hundreds of configuration knobs that control aspects of its runtime operations. These knobs typically fall into one of the following categories:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Resources\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Policies\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Locations\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Resources\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"Knobs in this category specify how much of a resource the system uses for a task. These can be either for fixed components (e.g.,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-MAX-WORKERS\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"number of vacuum workers\"\n          })\n        }), \") or for dynamic activities (e.g.,\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"amount of memory to use per query\"\n          })\n        }), \").\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Examples of resource knobs for MySQL and PostgreSQL:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = MySQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"innodb_buffer_pool_size\"\n                  })\n                }), \"\\xa0(fixed component)\"]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = The size in bytes of the buffer pool, the memory area where InnoDB caches table and index data.\"\n              })\n            })]\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = PostgreSQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/runtime-config-resource.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"work_mem\"\n                  })\n                }), \"\\xa0(dynamic activity)\"]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files.\"\n              })\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Policies\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These configuration knobs control how the DBMS behaves for specific tasks. For example, a knob can control whether the DBMS flushes the write-ahead log to disk when a transaction commits.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Examples of policy knobs for MySQL and PostgreSQL:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = MySQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_method\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"innodb_flush_method\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = Defines the method used to flush data to InnoDB data files and log files, which can affect I/O throughput.\"\n              })\n            })]\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = PostgreSQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/runtime-config-wal.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"wal_compression\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = When this parameter is on, the PostgreSQL server compresses a full page image written to WAL.\"\n              })\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Locations\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Lastly, location knobs specify where the DBMS finds resources that it needs (e.g., file paths) and how it interacts with the outside world (e.g., network port number).\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Examples of location knobs for MySQL and PostgreSQL:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = MySQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_port\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"port\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = The number of the port on which the server listens for TCP/IP connections.\"\n              })\n            })]\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/e(\"p\", {\n            children: \"DBMS = PostgreSQL\"\n          }), /*#__PURE__*/t(\"ul\", {\n            children: [/*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/t(\"p\", {\n                children: [\"Knob = \", /*#__PURE__*/e(o, {\n                  href: \"https://www.postgresql.org/docs/13/runtime-config-file-locations.html\",\n                  openInNewTab: !0,\n                  smoothScroll: !1,\n                  children: /*#__PURE__*/e(\"a\", {\n                    children: \"config_file\"\n                  })\n                })]\n              })\n            }), /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Description = Specifies the main server configuration file (customarily called postgresql.conf).\"\n              })\n            })]\n          })]\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Paws off! Controlling which knobs OtterTune configures\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We allow OtterTune to tune most knobs that control resources and policies. However, there are a few knobs that can have negative consequences like potentially causing the DBMS to lose data. We do not let OtterTune tune these knobs.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"These restrictions are to avoid exogenous problems that are not readily measurable by the service. For example, the algorithms will learn that turning off disk writes for transaction commits makes the DBMS run faster. But now, if the system crashes, it might lose data because it no longer flushes data to the disk. The ML algorithm has no way of knowing whether that is a problem because that is an external cost that it cannot measure. A human has to make that value judgment. Thus, we disallow OtterTune from making those types of changes to a DBMS\u2019s configuration.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune will not try to tune your port number or any other location knob for obvious reasons.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Examples of disallowed knobs for MySQL:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/t(\"p\", {\n            children: [\"Knob = \", /*#__PURE__*/e(o, {\n              href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_doublewrite\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"innodb_doublewrite\"\n              })\n            })]\n          }), /*#__PURE__*/e(\"ul\", {\n            children: /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Why it's disallowed = Controls whether the doublewrite buffer is enabled. You might consider disabling the doublewrite buffer if you are more concerned with performance than data integrity, as may be the case when performing benchmarks, for example.\"\n              })\n            })\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/t(\"p\", {\n            children: [\"Knob = \", /*#__PURE__*/e(o, {\n              href: \"https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"innodb_flush_at_trx_commit\"\n              })\n            })]\n          }), /*#__PURE__*/e(\"ul\", {\n            children: /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Why it's disallowed = Controls the balance between strict ACID compliance for commit operations and higher performance that is possible when commit-related I/O operations are rearranged and done in batches. You can achieve better performance by changing the default value but then you can lose transactions in a crash.\"\n              })\n            })\n          })]\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Examples of disallowed knobs for PostgreSQL:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        children: [/*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/t(\"p\", {\n            children: [\"Knob = \", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/13/runtime-config-wal.html#GUC-FSYNC\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"fsync\"\n              })\n            })]\n          }), /*#__PURE__*/e(\"ul\", {\n            children: /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Why it's disallowed = If this parameter is on, the PostgreSQL server will try to make sure that updates are physically written to disk, by issuing fsync() system calls. While turning off fsync is often a performance benefit, this can result in unrecoverable data corruption in the event of a power failure or system crash\"\n              })\n            })\n          })]\n        }), /*#__PURE__*/t(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: [/*#__PURE__*/t(\"p\", {\n            children: [\"Knob = \", /*#__PURE__*/e(o, {\n              href: \"https://www.postgresql.org/docs/13/runtime-config-wal.html#GUC-FULL-PAGE-WRITES\",\n              openInNewTab: !0,\n              smoothScroll: !1,\n              children: /*#__PURE__*/e(\"a\", {\n                children: \"full_page_writes\"\n              })\n            })]\n          }), /*#__PURE__*/e(\"ul\", {\n            children: /*#__PURE__*/e(\"li\", {\n              \"data-preset-tag\": \"p\",\n              children: /*#__PURE__*/e(\"p\", {\n                children: \"Why it's disallowed = When this parameter is on, the PostgreSQL server writes the entire content of each disk page to WAL during the first modification of that page after a checkpoint. Turning this parameter off speeds normal operation, but might lead to either unrecoverable data corruption, or silent data corruption, after a system failure.\"\n              })\n            })\n          })]\n        })]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Knob value ranges are controlled, too\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune knob value ranges\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,bnXUVkmXmA0hl8a2npgW3yVJWQ.png\",\n        \"data-framer-height\": \"1382\",\n        \"data-framer-width\": \"3330\",\n        height: \"691\",\n        src: \"https://framerusercontent.com/images/bnXUVkmXmA0hl8a2npgW3yVJWQ.png\",\n        style: {\n          aspectRatio: \"3330 / 1382\"\n        },\n        width: \"1665\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune also suggests a permitted range of values for each knob. This range is important for knobs that allocate system resources since setting a knob larger than what\u2019s available can cause the database to crash. OtterTune collects hardware information from the user\u2019s deployment and computes the suggested ranges based on the amount of a resource available.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune limits the range of some policy knobs as well. For example, many knobs that specify timeouts are safe to tune but only within a specific range.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Users can configure which knobs to tune and their ranges when connecting a database to the service for the first time. Once setup is complete, users can modify their settings from the options panel.\"\n      })]\n    })\n  }, {\n    id: \"MBs4tMMsv\",\n    [c]: \"Benchmark: Using machine learning to optimize Amazon RDS PostgreSQL performance\",\n    [d]: \"rds-postgres-tuning-benchmark\",\n    [u]: \"2021-06-11T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/XjtuCo9gdatkmTMayg8sAy5o.jpg\",\n      srcSet: \"https://framerusercontent.com/images/XjtuCo9gdatkmTMayg8sAy5o.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/XjtuCo9gdatkmTMayg8sAy5o.jpg?scale-down-to=1024 1024w, https://framerusercontent.com/images/XjtuCo9gdatkmTMayg8sAy5o.jpg 1488w\"\n    }, \"otter ottertune vs amazon rds vs pgtune\"),\n    [m]: \"For Amazon RDS PostgreSQL, which runs better? Amazon's default settings, PGTune or OtterTune? The performance results and cost savings may surprise you.\",\n    [g]: \"Bohan Zhang\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [/*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/rds/postgresql/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Amazon RDS PostgreSQL\"\n          })\n        }), \"\\xa0makes deploying and operating a PostgreSQL database instance easy. When you provision an RDS PostgreSQL instance, Amazon launches it with their\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.Parameters\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"default configuration settings\"\n          })\n        }), \"\\xa0for dozens of tunable \u201Cknobs.\u201D These knob settings affect database performance, and the default settings are often not optimal for your database\u2019s specific workload.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Tuning the knob settings in order to optimize price-performance for your database requires:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Specialized knowledge of PostgreSQL internals\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Time to iteratively make changes and test the impact of the change on performance until it is optimized (i.e., trial-and-error)\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"If you run Amazon RDS PostgreSQL and you lack (1) or (2) above, or if your workload changes over time (thus requiring re-tuning), you\u2019ll likely pay higher cloud costs than you ought to for your database.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Putting Amazon RDS PostgreSQL knob settings to the test\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The question you\u2019re probably asking is \u201Chow far off the mark could my Amazon RDS knob settings be?\u201D\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The question you\u2019re probably not asking (yet) is \u201CCan machine learning auto-tune my database knob settings to optimize its performance?\u201D\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To help answer those questions, we ran an experiment to test Amazon RDS PostgreSQL performance with three database configurations: (a) Default Amazon RDS knob settings, (b) knob setting recommendations from\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://pgtune.leopard.in.ua/#/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"PGTune\"\n          })\n        }), \" and\\xa0(c) knob setting recommendations from OtterTune\u2019s\\xa0machine learning algorithms\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"To run the test, we used the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://github.com/oltpbenchmark/oltpbench\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OLTP-bench\"\n          })\n        }), \"\\xa0framework to run the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"http://www.tpc.org/tpcc/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"TPC-C benchmark\"\n          })\n        }), \", a well-known transactional workload. We collected runtime metrics from the database, and calculated the throughput based on those metrics. Specifically, for Amazon RDS PostgreSQL, we optimized for the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: /*#__PURE__*/e(\"strong\", {\n              children: \"xact_commit\"\n            })\n          })\n        }), \"\\xa0metric (the number of transaction commits in the database).\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We ran the tests on an Amazon db.m5.4xlarge RDS instance equipped with:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"16vCPUs,\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"64GB RAM, and\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"4000 provisioned IOPs.\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For PGTune, we applied the configuration recommended by PGTune to the database:\"\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",\n          children: t => /*#__PURE__*/e(l, {\n            ...t,\n            code: \"max_connections = 300\\nshared_buffers = 16GB\\neffective_cache_size = 48GB\\nmaintenance_work_mem = 2GB\\ncheckpoint_completion_target = 0.9\\nwal_buffers = 16MB\\ndefault_statistics_target = 100\\nrandom_page_cost = 1.1\\neffective_io_concurrency = 200\\nwork_mem = 13981kB\\nmin_wal_size = 2GB\\nmax_wal_size = 8GB\\nmax_worker_processes = 16\\nmax_parallel_workers_per_gather = 4\\nmax_parallel_workers = 16\\nmax_parallel_maintenance_workers = 4\",\n            language: \"SQL\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Result: OtterTune more than doubles performance (throughput)\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune double throughput postgresql rds\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,KRYthDBBCO01O4fopoCchVvIpkI.png?preferredSize=auto\",\n        \"data-framer-height\": \"280\",\n        \"data-framer-width\": \"338\",\n        height: \"140\",\n        src: \"https://framerusercontent.com/images/KRYthDBBCO01O4fopoCchVvIpkI.png\",\n        style: {\n          aspectRatio: \"338 / 280\"\n        },\n        width: \"169\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this test, the configuration changes that PGTune recommended increased throughput (transactions per second) by 41.9%.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\u2019s machine learning increased throughput over 3x more than PGTune\u2026146.7% greater than the default RDS settings.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Double the performance, or half the cost?\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In the previous test, we showed that using machine learning to find the optimal configuration knob settings more than doubled database performance. That\u2019s a nice outcome if you\u2019re seeking faster database performance.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"For people who are satisfied with database performance, but would like to lower costs, knob-tuning can also help. To demonstrate that, we re-ran the test on a smaller RDS instance costing half as much, a db.m5.2xlarge equipped with:\"\n      }), /*#__PURE__*/t(\"ul\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"8vCPUs\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"32GB RAM\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"2000 provisioned IOPs\"\n          })\n        })]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Optimizing Amazon RDS PostgreSQL on the db.m5.2xlarge instance enabled it to achieve the same performance as PostgreSQL (with the default settings) on the twice-as-large db.m5.4xlarge, but at half the instance cost:\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune postgresl rds cost savings\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,KMyAJx6UKivgUIQ3t5MOmIewac.png\",\n        \"data-framer-height\": \"338\",\n        \"data-framer-width\": \"699\",\n        height: \"169\",\n        src: \"https://framerusercontent.com/images/KMyAJx6UKivgUIQ3t5MOmIewac.png\",\n        style: {\n          aspectRatio: \"699 / 338\"\n        },\n        width: \"349\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"How long does it take OtterTune to find \u201Coptimal?\u201D\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune works by iterating through different knob setting configurations and observing the database\u2019s performance. Its machine learning models are trained to make educated decisions about new configuration changes for the observed workload and optimization goals. It\u2019s similar to the approach an expert DBA would take, but it performs it faster.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The iterations required to find optimal performance in the second test are shown below. From the first iteration to the final iteration it took 2 hours.\"\n      }), /*#__PURE__*/e(\"img\", {\n        alt: \"ottertune optimal speed postgresl rds\",\n        className: \"framer-image\",\n        \"data-framer-asset\": \"data:framer/asset-reference,VVQot4r7rSdy7l9EJocSh0j4qc.png\",\n        \"data-framer-height\": \"251\",\n        \"data-framer-width\": \"660\",\n        height: \"125\",\n        src: \"https://framerusercontent.com/images/VVQot4r7rSdy7l9EJocSh0j4qc.png\",\n        style: {\n          aspectRatio: \"660 / 251\"\n        },\n        width: \"330\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In addition, OtterTune will continue to monitor the database workload and automatically adjust knob settings if the workload changes.\"\n      })]\n    })\n  }, {\n    id: \"PM6yzCHjK\",\n    [c]: \"OtterTune explained in 5 minutes\",\n    [d]: \"ottertune-explained-in-five-minutes\",\n    [u]: \"2021-05-26T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/U8a1otF9gdp1d1d4KirvbHyfLUw.jpeg\",\n      srcSet: \"https://framerusercontent.com/images/U8a1otF9gdp1d1d4KirvbHyfLUw.jpeg?scale-down-to=512 512w, https://framerusercontent.com/images/U8a1otF9gdp1d1d4KirvbHyfLUw.jpeg?scale-down-to=1024 1024w, https://framerusercontent.com/images/U8a1otF9gdp1d1d4KirvbHyfLUw.jpeg 1488w\"\n    }, \"\"),\n    [m]: \"Give us five minutes and we'll show you how OtterTune optimizes databases.\",\n    [g]: \"Andy Pavlo\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/e(\"p\", {\n        children: \"Modern databases have hundreds of configuration \u201Cknobs\u201D that affect the performance of the database. It\u2019s becoming impractical for humans to know how to tune all these knobs for a single database let alone tens or hundreds of databases.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"OtterTune\\xa0solves this problem by using machine learning to automate database configuration tuning, which results in better database price-performance.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"OtterTune automatic database tuning explained\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"In this five-minute video, we explain how OtterTune works:\"\n      }), /*#__PURE__*/t(\"ol\", {\n        style: {\n          \"--framer-font-size\": \"18px\",\n          \"--framer-text-alignment\": \"start\",\n          \"--framer-text-color\": \"rgb(0, 0, 0)\",\n          \"--framer-text-transform\": \"none\"\n        },\n        children: [/*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Connecting OtterTune to your database \u2013 no special software or access to user data is required.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Monitoring your database\u2019s performance and collecting settings and metrics.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Training machine learning models to predict how your database\u2019s performance will change as its configuration knobs change.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Automatically installing the new configuration and monitoring its effect.\"\n          })\n        }), /*#__PURE__*/e(\"li\", {\n          \"data-preset-tag\": \"p\",\n          children: /*#__PURE__*/e(\"p\", {\n            children: \"Continually monitoring your database to make sure that it is always using the most optimal configuration.\"\n          })\n        })]\n      }), /*#__PURE__*/e(i.div, {\n        className: \"framer-text-module\",\n        style: {\n          \"--aspect-ratio\": \"560 / 315\",\n          aspectRatio: \"var(--aspect-ratio)\",\n          height: \"auto\",\n          width: \"100%\"\n        },\n        children: /*#__PURE__*/e(n, {\n          componentIdentifier: \"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",\n          children: t => /*#__PURE__*/e(h, {\n            ...t,\n            play: \"Off\",\n            shouldMute: !0,\n            thumbnail: \"High Quality\",\n            url: \"https://www.youtube.com/watch?v=SJdnpAMI_q4\"\n          })\n        })\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Watching OtterTune tune an Amazon RDS PostgreSQL database\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"The video also walks you through a demonstration in which OtterTune tunes an Amazon RDS PostgreSQL database configured with the default RDS settings and running a write-heavy transactional (TPC-C) workload.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"After several minutes you\u2019ll see that OtterTune has generated the first new configuration and installed it in the database. After several more iterations you\u2019ll see that the OtterTune-optimized database achieves 87% higher throughput than the original configuration.\"\n      }), /*#__PURE__*/e(\"h4\", {\n        children: \"Can OtterTune improve your DBMS performance? Try it out!\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019d like to try OtterTune on your database(s),\\xa0\", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"egEhCCRg_\"\n          },\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"let us know\"\n          })\n        }), \", and we\u2019ll help you get started.\"]\n      })]\n    })\n  }, {\n    id: \"S0AtBlTo1\",\n    [c]: \"Let's do this!\",\n    [d]: \"lets-do-this\",\n    [u]: \"2021-05-12T00:00:00.000Z\",\n    [p]: w({\n      src: \"https://framerusercontent.com/images/Ka5oSWe4LKzumK3Z9HaKUmjYYE.jpg\",\n      srcSet: \"https://framerusercontent.com/images/Ka5oSWe4LKzumK3Z9HaKUmjYYE.jpg?scale-down-to=512 512w, https://framerusercontent.com/images/Ka5oSWe4LKzumK3Z9HaKUmjYYE.jpg 1024w\"\n    }, \"\"),\n    [m]: \"We\u2019re happy to announce the first commercial release of OtterTune software-as-a-service (SaaS) and seed funding From Accel. Our mission is to make databases run better, with less effort, and at a lower cost.\",\n    [g]: \"Andy Pavlo | Dana Van Aken\",\n    [f]: /*#__PURE__*/t(s.Fragment, {\n      children: [/*#__PURE__*/t(\"p\", {\n        children: [\"Yo. Today is a banner day that follows years of research on autonomous database technology and machine learning at\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Carnegie Mellon University\"\n          })\n        }), \"\\xa0(CMU) and lessons learned from customer deployments. We\u2019re\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.prnewswire.com/news-releases/ottertune-launches-to-improve-database-performance-through-automated-database-configuration-tuning-301289311.html?tc=eml_cleartime\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"happy to announce\"\n          })\n        }), \"\\xa0the first commercial release of\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://ottertune.com/features\",\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"OtterTune\"\n          })\n        }), \"\\xa0software-as-a-service (SaaS) and seed funding From\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://accel.com/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Accel\"\n          })\n        }), \". Our mission is to make databases run better, with less effort, and at a lower cost.\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"With hundreds of configuration settings (\u201Cknobs\u201D), the work required to keep a database tuned, or more often, hundreds of databases, exceeds human abilities. Based on our research at CMU, we knew that, with the help of machine learning (ML), we could achieve better results with an automated tuning service that would learn from each database and become more efficient over time.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Here\u2019s a little bit of our history to help you learn how we got here today and where we\u2019re going next.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"University research\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"OtterTune started in 2014 as a research project in CMU\u2019s Computer Science Department led by OtterTune co-founders\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.cs.cmu.edu/~pavlo\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Andy Pavlo\"\n          })\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.cs.cmu.edu/~dvanaken/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Dana Van Aken\"\n          })\n        }), \". We were studying how to use ML to devise strategies to optimize DBMS knobs for any application automatically. We published the\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2017/p1009-van-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"first academic paper on OtterTune\"\n          })\n        }), \"\\xa0at the SIGMOD conference in 2017 and presented it in Chicago.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"With the development help of co-founder\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://bohanjason.github.io/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Bohan Zhang\"\n          })\n        }), \"\\xa0(first as a summer intern from PKU, then later a CMU MS student), we built the first versions of the OtterTune database tuning service, which uses ML to generate and install optimized DBMS configurations. OtterTune observes the DBMS\u2019s workload through its metrics and then trains recommendation models that select better knob values. It then reuses these models to tune other DBMSs faster.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Our First Customers\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"The first real-world application of OtterTune in a production environment was at\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.societegenerale.com/en\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Soci\\xe9t\\xe9 G\\xe9n\\xe9rale\"\n          })\n        }), \"\\xa0(SG). SG approached us to conduct a field study involving their fleet of Postgres databases. The first thing we discovered was that they had an Oracle database that was more problematic, so that became our first project. At that time, OtterTune had been built to work with MySQL and PostgreSQL. But we extended it to support Oracle and discovered that our ML models worked on Oracle well enough\u2013recommending a config that increased throughput by 45% and saved them the not-insignificant cost of several Oracle core licenses.\"]\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"[\", /*#__PURE__*/e(o, {\n          href: \"https://db.cs.cmu.edu/papers/2021/p1241-aken.pdf\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Read the research paper we published with Soci\\xe9t\\xe9 G\\xe9n\\xe9rale\"\n          })\n        }), \"]\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"We also worked with another customer and their large cluster of MySQL databases. OtterTune helped them reduce their CPU utilization and the number of running threads by more than 20%. At their scale, this reduction in utilization resulted in the ability to turn off multiple machines and save tons in server costs.\"\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"Besides refining our ML models with these experiences, we learned a lot about fitting in with database administration tasks and policies. This effort led to the development of new operational settings in the OtterTune service, which allow humans to control when and how frequently OtterTune runs, if and when it can restart databases with new configs, which knobs are off-limits and allowed value ranges.\"\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"A Group of Otters is Called a \u201CRaft\u201D\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"We are not doing this alone. Our raft is impressive. A few years ago, Amazon invited us to publish a\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://aws.amazon.com/blogs/machine-learning/tuning-your-dbms-automatically-with-machine-learning/\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"blog post\"\n          })\n        }), \"\\xa0about OtterTune. That caught peoples\u2019 attention, including early investors with valuable experience launching data management companies like Databricks, Snowflake, Cockroach Labs, SingleStore, Vertica, PingCap, and others. Eventually, we teamed up with Accel to fund the launch of OtterTune and our next phase of growth and development. Our friends at Accel (\", /*#__PURE__*/e(o, {\n          href: \"https://accel.com/people/ping-li\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Ping Li\"\n          })\n        }), \"\\xa0and\\xa0\", /*#__PURE__*/e(o, {\n          href: \"https://www.accel.com/people/daniel-levine\",\n          openInNewTab: !0,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"Daniel Levine\"\n          })\n        }), \") are guiding us through the early stages of our company and helping us realize our big ideas. Daniel notes that purple sea urchins are an invasive species that otters eat, and that helps keep kelp forests healthy. Needless to say, Accel gets otters.\"]\n      }), /*#__PURE__*/e(\"h3\", {\n        children: \"Join us \u2026 the water is fine, and the fish are tasty\"\n      }), /*#__PURE__*/t(\"p\", {\n        children: [\"If you\u2019ve got databases, we\u2019ve got a way to keep them tuned and always optimized for you. We work with PostgreSQL, MySQL running in the cloud (Amazon RDS and Aurora), or self-managed instances. The more databases OtterTune works with, the smarter it gets, so check out our \", /*#__PURE__*/e(o, {\n          href: {\n            webPageId: \"egEhCCRg_\"\n          },\n          openInNewTab: !1,\n          smoothScroll: !1,\n          children: /*#__PURE__*/e(\"a\", {\n            children: \"plans and pricing\"\n          })\n        }), \".\"]\n      }), /*#__PURE__*/e(\"p\", {\n        children: \"You\u2019ll also probably also learn more than you ever wanted to know about otters. Spoiler: Otters are vicious animals.\"\n      })]\n    })\n  }];\nfor (let e of b) Object.freeze(e);\na(b, {\n  EBxzs_2xh: {\n    defaultValue: \"\",\n    title: \"Title\",\n    type: r.String\n  },\n  tcfKQ1IoL: {\n    title: \"Slug\",\n    type: r.String\n  },\n  WiyRi0nIW: {\n    defaultValue: \"\",\n    title: \"Date\",\n    type: r.Date\n  },\n  FmlfgY9nf: {\n    title: \"Image\",\n    type: r.ResponsiveImage\n  },\n  pbymmDdoo: {\n    defaultValue: \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sollicitudin platea sed eget ipsum, purus eget. \",\n    displayTextArea: !0,\n    placeholder: \"\",\n    title: \"short description\",\n    type: r.String\n  },\n  k6SCBxvoj: {\n    defaultValue: \"Pierre Jacquel\",\n    title: \"Author Name\",\n    type: r.String\n  },\n  JLyijN6_N: {\n    defaultValue: \"\",\n    title: \"Content\",\n    type: r.RichText\n  }\n}), b.displayName = \"Blog\";\nexport default b;\nexport const enumToDisplayNameFunctions = {};\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"default\": {\n      \"type\": \"data\",\n      \"name\": \"data\",\n      \"annotations\": {\n        \"framerData\": \"\",\n        \"framerSlug\": \"tcfKQ1IoL\",\n        \"framerContractVersion\": \"1\",\n        \"framerRecordIdKey\": \"id\",\n        \"framerEnumToDisplayNameUtils\": \"2\"\n      }\n    },\n    \"enumToDisplayNameFunctions\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};"],
  "mappings": "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",
  "names": ["_checkPrivateRedeclaration", "obj", "privateCollection", "_classApplyDescriptorGet", "receiver", "descriptor", "_classApplyDescriptorSet", "value", "_classExtractFieldDescriptor", "privateMap", "action", "_classPrivateFieldGet", "_classPrivateFieldInit", "_classPrivateFieldSet", "_classPrivateMethodGet", "privateSet", "fn", "_classPrivateMethodInit", "_defineProperty", "key", "__create", "__defProp", "__getOwnPropDesc", "__getOwnPropNames", "__getProtoOf", "__hasOwnProp", "__defNormalProp", "__commonJS", "cb", "mod", "__copyProps", "to", "from", "except", "desc", "__toESM", "isNodeMode", "target", "__publicField", "__accessCheck", "member", "msg", "__privateGet", "getter", "__privateAdd", "__privateSet", "setter", "__privateMethod", "method", "require_pad", "exports", "module", "num", "size", "s", "require_fingerprint_browser", "require_getRandomValue_browser", "getRandomValue", "crypto", "window", "lim", "require_cuid", "fingerprint", "pad", "c", "blockSize", "base", "discreteValues", "randomBlock", "safeCounter", "cuid3", "letter", "timestamp", "counter", "print", "random", "date", "stringToCheck", "stringLength", "require_createDeferredExecutor", "createDeferredExecutor", "executor", "resolve", "reject", "data", "onFulfilled", "reason", "require_DeferredPromise", "_executor", "_decorate", "_class", "createDeferredExecutor_1", "DeferredPromise4", "onRejected", "decorate", "onfinally", "deferredExecutor", "originalResolve", "originalReject", "promise", "require_build", "__createBinding", "o", "m", "k", "k2", "__exportStar", "exports2", "p", "require_MemoryLeakError", "MemoryLeakError", "emitter", "type", "count", "require_Emitter", "MemoryLeakError_1", "_events", "_maxListeners", "_hasWarnedAboutPotentialMemortyLeak", "_getListeners", "getListeners_fn", "_removeListener", "removeListener_fn", "_wrapOnceListener", "wrapOnceListener_fn", "_internalEmit", "internalEmit_fn", "_Emitter", "eventName", "maxListeners", "listeners", "listener", "nextListeners", "memoryLeakWarning", "Emitter2", "index", "onceListener", "internalEventName", "require_lib", "import_cuid", "POSITIONALS_EXP", "serializePositional", "positional", "flag", "json", "format", "message", "positionals", "positionalIndex", "formattedMessage", "match", "isEscaped", "_", "STACK_FRAMES_TO_IGNORE", "cleanErrorStack", "error", "nextStack", "InvariantError", "invariant", "predicate", "ErrorConstructor", "import_deferred_promise", "FLAG", "DEFAULT", "GREEN", "RED", "BLUE", "YELLOW", "MAGENTA", "CYAN", "COLOR_SCOPE", "createDebug", "scope", "direction", "cleanMessage", "debug", "MessageSender", "handshakePromise", "import_deferred_promise", "debug", "rejectionTimeout", "event", "listener", "options", "message", "data", "operationPromise", "operationId", "import_cuid", "payload", "handleOperationDone", "doneEvent", "data2", "listenerPayload", "handleOperationFailed", "failEvent", "target", "receiverReadyPromise", "handshakeListener", "window", "evt", "import_deferred_promise3", "__toESM", "require_build", "import_cuid2", "require_cuid", "FileSystemApi", "files", "path", "encoding", "response", "error", "format", "content", "recursive", "force", "includes", "excludes", "watcherId", "channel", "import_strict_event_emitter", "require_lib", "ShellApi", "ShellProcess", "command", "args", "invariant", "shellInfo", "import_deferred_promise2", "TIMEOUT", "PreviewApi", "predicate", "timeout", "readyPromise", "rejectTimeout", "previewInformation", "foundPreview", "sourceShellId", "port", "DEFAULT_RUNTIME_URL", "debug2", "createDebug", "Nodebox", "iframe", "cdnUrl", "connectionPromise", "frameLoadPromise", "_defineProperty", "INJECT_MESSAGE_TYPE", "PREVIEW_LOADED_MESSAGE_TYPE", "__create", "__defProp", "__getOwnPropDesc", "__getOwnPropNames", "__getProtoOf", "__hasOwnProp", "__esm", "fn", "res", "__commonJS", "cb", "mod", "__export", "target", "all", "name", "__copyProps", "to", "from", "except", "desc", "key", "__toESM", "isNodeMode", "serializePositional", "positional", "flag", "json", "format", "message", "positionals", "positionalIndex", "formattedMessage", "POSITIONALS_EXP", "match", "isEscaped", "_", "value", "cleanErrorStack", "error", "nextStack", "STACK_FRAMES_TO_IGNORE", "InvariantError", "invariant", "init_lib", "predicate", "ErrorConstructor", "__extends", "d", "b", "extendStatics", "__", "__awaiter", "thisArg", "_arguments", "P", "generator", "adopt", "resolve", "reject", "fulfilled", "step", "e", "rejected", "result", "__generator", "body", "t", "f", "y", "g", "verb", "n", "v", "op", "__spreadArray", "pack", "i", "l", "ar", "nullthrows", "err", "createError", "createPackageJSON", "dependencies", "devDependencies", "entry", "addPackageJSONIfNeeded", "files", "_a2", "_b", "normalizedFilesPath", "normalizePath", "packageJsonFile", "DEPENDENCY_ERROR_MESSAGE", "ENTRY_ERROR_MESSAGE", "packageJsonContent", "__assign", "extractErrorDetails", "msg", "title", "path", "line", "column", "relevantStackFrame", "getRelevantStackFrame", "errorInCode", "getErrorInOriginalCode", "errorLocation", "getErrorLocation", "errorMessage", "formatErrorMessage", "frames", "frame", "errorFrame", "lastScriptLine", "numberOfLineNumberCharacters", "leadingCharacterOffset", "barSeparatorCharacterOffset", "extraLineLeadingSpaces", "scriptLine", "leadingChar", "lineNumber", "extraLine", "filePath", "location", "SandpackLogLevel", "init_types_36e5ec0d", "d2", "b2", "p", "s", "acc", "content", "fileName", "SandpackLogLevel2", "find", "iter", "tar", "dequal", "foo", "bar", "ctor", "len", "tmp", "has", "init_dist", "SandpackClient", "init_base_80a1f760", "SandpackClient2", "iframeSelector", "sandboxSetup", "options", "_sandboxSetup", "_isInitializationCompile", "_message", "_listener", "isCommand", "char", "isAlpha", "isWhitespace", "isOperator", "isArgument", "isString", "isEnvVar", "tokenize", "input", "current", "tokens", "parseCommand", "TokenType", "parseOperator", "operators", "parseArgument", "parseString", "openCloseQuote", "parseEnvVars", "parseSingleEnv", "pair", "currentChar", "generateRandomId", "now", "randomNumber", "count", "counter", "EventEmitter", "writeBuffer", "readBuffer", "fromBundlerFilesToFS", "findStartScriptPackageJson", "getMessageFromError", "init_client_utils_7a723432", "EventEmitter2", "listener", "_this", "listenerId", "TokenType2", "packageJson", "scripts2", "possibleKeys", "_loop_1", "index2", "script", "candidate", "env_1", "command_1", "args_1", "item", "commandNotFoundYet", "index", "state_1", "node_exports", "SandpackNode", "loadPreviewIframe", "iframe", "url", "contentWindow", "TIME_OUT", "MAX_MANY_TIRES", "tries", "timeout", "triesToSetUrl", "onLoadPage", "setupHistoryListeners", "scope", "origHistoryProto", "window", "historyList", "historyPosition", "dispatchMessage", "pushHistory", "state", "delta", "newPos", "_a3", "newURL", "handleMessage", "data", "setPreviewIframeProperties", "consoleHook", "scripts", "injectScriptToIframe", "init_node", "channelId", "code", "id", "INJECT_MESSAGE_TYPE", "_super", "SandpackNode2", "selector", "sandboxInfo", "Nodebox", "shellId", "err_1", "exitCode", "_b2", "element", "event", "PREVIEW_LOADED_MESSAGE_TYPE", "type", "newContent", "err_2", "setup", "modules", "_c", "_d", "require_main", "exports", "module", "__create2", "__defProp2", "__getOwnPropDesc2", "__getOwnPropNames2", "__getProtoOf2", "__hasOwnProp2", "__commonJS2", "__export2", "__copyProps2", "__toESM2", "__toCommonJS", "require_db", "exports2", "module2", "require_mime_db", "main_exports", "PreviewController2", "getExtension", "joinFilepath", "normalizeFilepath", "CHANNEL_NAME", "import_mime_db", "extensionMap", "entries", "mimetype", "extensions", "ext", "EXTENSIONS_MAP", "counter2", "generateRandomId2", "filepath", "addition", "parts", "request", "previewRoot", "port", "headers", "extension", "foundMimetype", "responseMessage", "responseMessage1", "previewUrl", "relayUrl", "channel", "iframeContentWindow", "evt", "initMsg", "val", "el", "_indexFiles", "index_bd1ff004_exports", "SandpackStatic", "import_static_browser_server", "insertHtmlAfterRegex", "readBuffer2", "validateHtml", "init_index_bd1ff004", "regex", "insertable", "offset", "prefix", "suffix", "contentString", "domParser", "doc", "html", "SandpackStatic2", "contentToInsert", "scriptToInsert", "externalResources", "tagsToInsert", "resource", "fileType", "runtime_exports", "SandpackRuntime", "getTemplate", "pkg", "totalDependencies", "moduleNames", "adonis", "dep", "nuxt", "apollo", "m", "parcel", "dojo", "nodeDeps", "MAX_CLIENT_DEPENDENCY_COUNT", "Protocol", "IFrameProtocol", "_a", "BUNDLER_URL", "init_runtime", "Protocol2", "protocol", "response", "IFrameProtocol2", "origin", "SandpackRuntime2", "unsubscribe", "mes", "urlSource", "isInitializationCompile", "prev", "next", "packageJSON", "normalizedModules", "paramFiles", "x", "loadSandpackClient", "template", "Client", "toggleComment", "target", "state", "line", "config", "getConfig", "toggleLineComment", "toggleBlockCommentByLine", "command", "f", "option", "dispatch", "tr", "changeLineComment", "toggleBlockComment", "command", "changeBlockComment", "toggleBlockCommentByLine", "command", "o", "s", "changeBlockComment", "selectedLineRanges", "getConfig", "state", "pos", "data", "SearchMargin", "findBlockComment", "open", "close", "from", "to", "textBefore", "textAfter", "spaceBefore", "spaceAfter", "beforeOff", "startText", "endText", "startSpace", "endSpace", "endOff", "ranges", "r", "fromLine", "toLine", "last", "option", "tokens", "c", "comments", "i", "range", "changes", "comment", "token", "changeLineComment", "lines", "prevLine", "startI", "minIndent", "line", "indent", "empty", "l", "line1", "token1", "indent1", "empty1", "single", "changeSet", "changes1", "line2", "comment1", "token2", "from1", "to1", "fromHistory", "Annotation", "isolateHistory", "invertedEffects", "Facet", "historyConfig", "configs", "combineConfig", "_t", "isAdjacent2", "b", "tr", "adj", "changeEnd", "end", "_", "historyField_", "StateField", "HistoryState", "config", "fromHist", "selection", "EditorSelection", "item", "HistEvent", "other", "updateBranch", "addSelection", "isolate", "Transaction", "event", "time", "userEvent", "value", "e", "json", "history", "EditorView", "view", "command2", "undo", "redo", "cmd", "side", "selection", "state", "dispatch", "historyState", "historyField_", "tr", "undo", "redo", "undoSelection", "redoSelection", "HistEvent", "after", "_a", "_b", "_c", "s", "json", "ChangeSet", "ChangeDesc", "EditorSelection", "tr", "selection", "effects", "none", "invert", "invertedEffects", "result", "selections", "changes", "mapped", "startSelection", "selectionsAfter", "updateBranch", "branch", "to", "maxLen", "newEvent", "start", "newBranch", "isAdjacent", "a", "b", "ranges", "isAdjacent2", "f", "t", "_f", "_t", "i", "from", "eqSelectionShape", "r", "conc", "MaxSelectionsPerEvent", "addSelection", "lastEvent", "sels", "popSelection", "last", "addMappingToBranch", "mapping", "length", "event", "mapEvent", "extraSelections", "mappedChanges", "before", "fullMapping", "StateEffect", "joinableUserEvent", "HistoryState", "time", "userEvent", "config", "done", "newGroupDelay", "side", "state", "fromHistory", "rest", "undone", "prevTime", "prevUserEvent", "historyKeymap", "undo", "redo", "undoSelection", "redoSelection", "updateSel", "sel", "by", "setSel", "moveSel", "dispatch", "how", "rangeEnd", "range", "forward", "cursorByChar", "view", "ltrAtCursor", "Direction", "cursorCharLeft", "cursorCharRight", "cursorByGroup", "view", "forward", "moveSel", "range", "rangeEnd", "cursorGroupLeft", "ltrAtCursor", "cursorGroupRight", "interestingNode", "state", "node", "bracketProp", "len", "moveBySyntax", "start", "forward", "pos", "syntaxTree", "NodeProp", "at", "next", "bracket", "match", "newPos", "matchBrackets", "EditorSelection", "cursorSyntaxLeft", "view", "moveSel", "range", "ltrAtCursor", "cursorSyntaxRight", "cursorByLine", "rangeEnd", "moved", "cursorLineUp", "cursorLineDown", "pageInfo", "selfScroll", "marginTop", "marginBottom", "height", "source", "EditorView", "margins", "window", "cursorByPage", "page", "selection", "updateSel", "effect", "startPos", "scrollRect", "scrollTop", "scrollBottom", "setSel", "cursorPageUp", "cursorPageDown", "moveByLineBoundary", "line", "space", "cursorLineBoundaryForward", "cursorLineBoundaryBackward", "cursorLineBoundaryLeft", "cursorLineBoundaryRight", "cursorLineStart", "cursorLineEnd", "toMatchingBracket", "dispatch", "extend", "found", "matching", "head", "cursorMatchingBracket", "extendSel", "view", "how", "selection", "updateSel", "range", "head", "EditorSelection", "setSel", "selectByChar", "forward", "selectCharLeft", "ltrAtCursor", "selectCharRight", "selectByGroup", "view", "forward", "extendSel", "range", "selectGroupLeft", "ltrAtCursor", "selectGroupRight", "selectSyntaxLeft", "view", "extendSel", "range", "moveBySyntax", "ltrAtCursor", "selectSyntaxRight", "selectByLine", "forward", "selectLineUp", "selectLineDown", "selectByPage", "pageInfo", "selectPageUp", "selectPageDown", "selectLineBoundaryForward", "moveByLineBoundary", "selectLineBoundaryBackward", "selectLineBoundaryLeft", "selectLineBoundaryRight", "selectLineStart", "EditorSelection", "selectLineEnd", "cursorDocStart", "state", "dispatch", "setSel", "cursorDocEnd", "selectDocStart", "selectDocEnd", "selectAll", "selectLine", "ranges", "selectedLineBlocks", "from", "to", "selectParentSyntax", "selection", "updateSel", "_a", "context", "syntaxTree", "simplifySelection", "cur", "deleteBy", "target", "by", "event", "changes", "towards", "skipAtomic", "EditorView", "pos", "f", "deleteByChar", "line", "before", "targetPos", "col", "countColumn", "drop", "getIndentUnit", "i", "findClusterBreak", "deleteCharBackward", "deleteCharForward", "deleteByGroup", "start", "categorize", "cat", "next", "nextChar", "nextCat", "deleteGroupBackward", "deleteGroupForward", "deleteToLineEnd", "lineEnd", "deleteToLineStart", "lineStart", "splitLine", "state", "dispatch", "changes", "range", "Text", "EditorSelection", "transposeChars", "pos", "line", "from", "findClusterBreak", "to", "selectedLineBlocks", "blocks", "upto", "startLine", "endLine", "prev", "moveLine", "forward", "ranges", "block", "nextLine", "size", "r", "r1", "moveLineUp", "moveLineDown", "copyLine", "copyLineUp", "copyLineDown", "deleteLine", "view", "selection", "updateSel", "isBetweenBrackets", "state", "pos", "context", "syntaxTree", "before", "after", "closedBy", "NodeProp", "insertNewlineAndIndent", "newlineAndIndent", "insertBlankLine", "atEof", "dispatch", "changes", "range", "from", "to", "line", "explode", "cx", "IndentContext", "indent", "getIndentation", "insert", "indentString", "Text", "EditorSelection", "changeBySelectedLine", "f", "atLine", "changeSet", "indentSelection", "updated", "start", "found", "changes2", "cur", "norm", "indentMore", "indentUnit", "indentLess", "space", "col", "countColumn", "keep", "getIndentUnit", "emacsStyleKeymap", "cursorCharLeft", "selectCharLeft", "cursorCharRight", "selectCharRight", "cursorLineUp", "selectLineUp", "cursorLineDown", "selectLineDown", "cursorLineStart", "selectLineStart", "cursorLineEnd", "selectLineEnd", "deleteCharForward", "deleteCharBackward", "deleteToLineEnd", "deleteGroupBackward", "splitLine", "transposeChars", "cursorPageDown", "standardKeymap", "cursorGroupLeft", "selectGroupLeft", "cursorLineBoundaryLeft", "selectLineBoundaryLeft", "cursorGroupRight", "selectGroupRight", "cursorLineBoundaryRight", "selectLineBoundaryRight", "cursorDocStart", "selectDocStart", "cursorPageUp", "selectPageUp", "cursorDocEnd", "selectDocEnd", "selectPageDown", "cursorLineBoundaryBackward", "selectLineBoundaryBackward", "cursorLineBoundaryForward", "selectLineBoundaryForward", "insertNewlineAndIndent", "selectAll", "deleteGroupForward", "deleteToLineStart", "b", "defaultKeymap", "cursorSyntaxLeft", "selectSyntaxLeft", "cursorSyntaxRight", "selectSyntaxRight", "moveLineUp", "copyLineUp", "moveLineDown", "copyLineDown", "simplifySelection", "insertBlankLine", "selectLine", "selectParentSyntax", "indentLess", "indentMore", "indentSelection", "deleteLine", "cursorMatchingBracket", "toggleComment", "toggleBlockComment", "__create", "__defProp", "__getOwnPropDesc", "__getOwnPropNames", "__getProtoOf", "__hasOwnProp", "__commonJS", "cb", "mod", "__copyProps", "to", "from", "except", "desc", "key", "__toESM", "isNodeMode", "target", "require_lib", "exports", "module", "_createClass", "defineProperties", "props", "i2", "descriptor", "Constructor", "protoProps", "staticProps", "_classCallCheck", "instance", "ANSI_COLORS", "Anser2", "Anser3", "txt", "options", "j2", "levels", "format", "r4", "g3", "b3", "r3", "g2", "b2", "_r", "_g", "_b2", "level", "_i", "str", "markup", "_this", "self", "raw_text_chunks", "first_chunk", "color_chunks", "chunk", "first", "c2", "text", "use_classes", "result", "matches", "orig_txt", "nums", "num_str", "num", "is_foreground", "mode", "palette_index", "klass", "color2", "styles", "classes", "data", "_this2", "jsonChunk", "decoration", "tmpFg", "tmpFgTrue", "colors", "decorations", "textDecorations", "render_data", "data2", "fragments", "index", "require_escape_carriage", "escapeCarriageReturn2", "_", "base", "insert", "findLongestString", "arr", "longest", "escapeSingleLineSafe", "res", "escapeCarriageReturnSafe", "idx", "require_lz_string", "LZString2", "f2", "keyStrBase64", "keyStrUriSafe", "baseReverseDic", "getBaseValue", "alphabet", "character", "LZString3", "input", "a2", "compressed", "uncompressed", "buf", "TotalLen", "current_value", "bitsPerChar", "getCharFromInt", "value", "context_dictionary", "context_dictionaryToCreate", "context_c", "context_wc", "context_w", "context_enlargeIn", "context_dictSize", "context_numBits", "context_data", "context_data_val", "context_data_position", "ii", "length", "resetValue", "getNextValue", "dictionary", "next", "enlargeIn", "dictSize", "numBits", "entry", "w2", "bits", "resb", "maxpower", "power", "t", "n", "r", "i", "o", "e", "t2", "l", "n2", "e2", "s", "a", "c", "d", "g", "p", "u", "h", "f", "m", "e3", "b", "S", "t3", "k", "y", "o2", "l2", "B", "$", "x", "s2", "n3", "d2", "p2", "x2", "z2", "e4", "S2", "e5", "z3", "t4", "t41", "u2", "n4", "i3", "o3", "l3", "s3", "a3", "c3", "e6", "t5", "r5", "n5", "I", "R", "z", "W", "j", "E", "T", "e21", "i31", "e22", "t31", "n31", "v", "M", "w", "C", "P", "L", "r41", "O", "D", "p3", "h2", "A", "i4", "o4", "l4", "i5", "s4", "i41", "o41", "t32", "H", "N", "V", "G", "F", "J", "U", "Z", "X", "has", "find", "iter", "tar", "dequal", "foo", "bar", "ctor", "len", "tmp", "window", "document2", "registry", "crossOriginUpdater", "crossOriginRect", "IntersectionObserverEntry", "ensureDOMRect", "getEmptyRect", "targetRect", "targetArea", "intersectionRect", "intersectionArea", "IntersectionObserver2", "callback", "opt_options", "throttle", "margin", "boundingClientRect", "convertFromParentRect", "observer", "isTargetAlreadyObserved", "item", "records", "opt_threshold", "threshold", "opt_rootMargin", "marginString", "margins", "parts", "doc", "win", "monitoringInterval", "domObserver", "addEvent", "win2", "removeEvent", "frame", "getFrameElement", "rootDoc", "hasDependentTargets", "itemDoc", "frame2", "unsubscribe", "unsubscribes", "rootIsInDom", "rootRect", "getBoundingClientRect", "rootContainsTarget", "oldEntry", "newEntry", "now", "parent", "getParentNode", "atRoot", "parentRect", "parentComputedStyle", "frameRect", "frameIntersect", "computeRectIntersection", "html2", "body", "rect", "newRect", "oldRatio", "newRatio", "containsDeep", "fn", "timeout", "timer", "node", "event", "opt_useCapture", "rect1", "rect2", "top", "bottom", "left", "right", "width", "height", "el", "parentBoundingRect", "parentIntersectionRect", "child", "usePassiveLayoutEffect", "module_default", "useIntersectionObserver", "root", "pollInterval", "useMutationObserver", "rootMargin", "initialIsIntersecting", "setEntry", "ye", "setObserver", "getIntersectionObserver", "ue", "observer2", "targetEl", "didUnsubscribe", "entries", "entry2", "createIntersectionObserver", "callbacks", "_intersectionObserver", "keys", "module_default2", "import_anser", "import_escape_carriage", "import_lz_string", "__assign", "t2", "s2", "i2", "n2", "p2", "__rest", "e", "__awaiter", "thisArg", "_arguments", "P2", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "__generator", "body", "_", "f2", "y2", "g2", "verb", "v2", "op", "__spreadArray", "to", "from", "pack", "l2", "ar", "SVG", "props", "p", "RunIcon", "u", "SVG", "p", "CloseIcon", "u", "SVG", "__assign", "p", "_a$a", "defaultLight", "defaultDark", "SANDPACK_THEMES", "window", "getFileName", "filePath", "lastIndexOfSlash", "calculateNearestUniquePath", "currentPath", "otherPaths", "currentPathParts", "resultPathParts", "fileIndex", "otherPathParts", "partsFromEnd", "currentPathPart", "otherPathPart", "isDarkColor", "color2", "r3", "g2", "b2", "rgbValues", "yiq", "lastCount", "generateRandomId", "random", "toString", "defineProperty", "_a$9", "THEME_PREFIX", "createTheme", "X", "css", "getCssText", "keyframes", "defaultVariables", "acc", "_", "index", "_a2", "__assign", "standardizeStitchesTheme", "theme", "syntaxEntries", "syntax", "tokenAcc", "_b2", "tokenName", "tokenValue", "newValues", "valueAcc", "_a3", "_b3", "styleProp", "styleValue", "standardizeTheme", "inputTheme", "_c2", "_d", "_e", "defaultLightThemeKey", "predefinedTheme", "mode", "baseTheme", "colorsByMode", "syntaxByMode", "fontByMode", "id", "simpleHashFunction", "str", "hash", "i2", "fakeCss", "ClassNamesContext", "z", "ClassNamesProvider", "children", "classes", "p", "useClassNames", "contextClassNames", "re", "customClassName", "allClassNames", "custom", "joinClassNames", "__spreadArray", "args", "_i", "wrapperClassName$3", "SandpackThemeContext", "SandpackThemeProvider", "themeFromProps", "className", "props", "__rest", "classNames", "themeClassName", "se", "SandpackThemeConsumer", "commonFiles", "ASTRO_TEMPLATE", "NEXTJS_TEMPLATE", "NODE_TEMPLATE", "VITE_TEMPLATE", "VITE_REACT_TEMPLATE", "VITE_REACT_TS_TEMPLATE", "VITE_SVELTE_TEMPLATE", "VITE_SVELTE_TS_TEMPLATE", "VITE_VUE_TEMPLATE", "VITE_VUE_TS_TEMPLATE", "ANGULAR_TEMPLATE", "REACT_TEMPLATE", "REACT_TYPESCRIPT_TEMPLATE", "SOLID_TEMPLATE", "SVELTE_TEMPLATE", "TEST_TYPESCRIPT_TEMPLATE", "VANILLA_TEMPLATE", "VANILLA_TYPESCRIPT_TEMPLATE", "VUE_TEMPLATE", "VUE_TS_TEMPLATE", "STATIC_TEMPLATE", "SANDBOX_TEMPLATES", "getSandpackStateFromProps", "_f", "normalizedFilesPath", "normalizePath", "projectSetup", "combineTemplateFilesToSetup", "visibleFiles", "activeFile", "resolveFile", "file", "files", "addPackageJSONIfNeeded", "existOpenPath", "path", "normalizedPath", "resolvedPath", "strategies", "removeExtension", "attemptPath", "template", "customSetup", "defaultTemplate", "convertedFilesToBundlerFiles", "baseTemplate", "key", "useAppState", "ye", "state", "setState", "originalStateFromProps", "editorState", "dequal", "prev", "BUNDLER_TIMEOUT", "useClient", "filesState", "options", "teamId", "initModeFromProps", "intersectionObserver", "pe", "lazyAnchorRef", "registeredIframes", "clients", "timeoutHook", "unsubscribeClientListeners", "unsubscribe", "queuedListeners", "debounceHook", "prevEnvironment", "createClient", "te", "iframe", "clientId", "clientPropsOverride", "__awaiter", "timeOut", "shouldSetTimeout", "client", "globalListeners", "_c3", "__generator", "_d2", "unregisterAllClients", "loadSandpackClient", "handleMessage", "listenerId", "listener", "unsubscribe2", "_a4", "unregisterBundler", "runSandpack", "initializeSandpackIframe", "autorun", "observerOptions", "entries", "entry", "registerBundler", "unsubscribeQueuedClients", "listenerOfClient", "listenerFunctions", "status", "msg", "extractErrorDetails", "registerReactDevTools", "value", "recompileMode", "recompileDelay", "dispatchMessage", "message", "addListener", "unsubscribeListener", "listenerId_1", "listenerId_2", "clientsList", "currentClientUnsubscribeListeners_1", "ue", "useFiles", "isMountedRef", "updateFile", "pathOrFiles", "code", "shouldUpdatePreview", "operations", "rest", "newPaths", "prevState", "indexOfRemovedPath", "openPath", "newFiles", "remainingVisibleFiles", "deletedLastVisibleFile", "nextFile", "Sandpack$1", "SandpackProvider", "style", "fileState", "fileOperations", "clientState", "clientOperations", "appState", "SandpackConsumer", "useSandpack", "sandpack", "dispatch", "listen", "useActiveCode", "_a$8", "_b$2", "_c", "iconStandaloneClassName", "buttonClassName", "roundedButtonClassName", "iconClassName", "fadeIn", "absoluteClassName", "errorClassName", "errorBundlerClassName", "errorMessageClassName", "_a$7", "tabsClassName", "tabsScrollableClassName", "closeButtonClassName", "tabButton", "FileTabs", "closableTabs", "setActiveFile", "handleCloseFile", "ev", "tabElm", "pathToClose", "getTriggerText", "documentFileName", "pathsWithDuplicateFileNames", "curr", "fileName", "u", "CloseIcon", "RoundedButton", "onClick", "runButtonClassName", "RunButton$1", "event", "RunIcon", "_a$6", "stackClassName", "SandpackStack", "useSandpackTheme", "shallowEqual", "a2", "result", "getCodeMirrorPosition", "doc", "line", "column", "getEditorTheme", "EditorView", "classNameToken", "name", "styleTokens", "syntaxHighLightTokens", "token", "getSyntaxHighlight", "HighlightStyle", "tags", "getLanguageFromFile", "fileType", "additionalLanguages", "extension", "extensionDotIndex", "additionalLanguages_1", "additionalLanguage", "getCodeMirrorLanguage", "javascript", "html", "additionalLanguages_2", "useCombinedRefs", "refs", "element", "ref", "highlightDecorators", "positions", "ViewPlugin", "class_1", "view", "update", "Decoration", "rangesDecorators", "item", "lineDeco2", "markDeco", "positionLineStart", "positionLineEnd", "v2", "highlightInlineError", "activeLineHighlighter", "lineDeco", "_this", "trans", "errorValue", "position", "_a$5", "_b$1", "placeholderClassName", "tokensClassName", "editorClassName", "cmClassName", "readOnlyClassName", "useSyntaxHighlight", "langSupport", "highlightTheme", "tree", "offSet", "codeElementsRender", "addElement", "to", "B", "highlightTree", "from", "CodeMirror", "Y", "onCodeUpdate", "showLineNumbers", "showInlineErrors", "wrapContent", "_g", "readOnly", "_h", "showReadOnly", "decorators", "_j", "initMode", "_k", "extensions", "_l", "extensionsKeymap", "_m", "wrapper", "combinedRef", "cmView", "_o", "themeId", "_p", "internalCode", "setInternalCode", "_q", "shouldInitEditor", "setShouldInitEditor", "prevExtension", "prevExtensionKeymap", "isIntersecting", "module_default2", "ce", "languageExtension", "syntaxHighlightRender", "sortedDecorators", "d1", "d2", "customCommandsKeymap", "view2", "indentMore", "customKey", "indentLess", "deleteGroupBackward", "extensionList", "highlightSpecialChars", "history", "closeBrackets", "keymap", "closeBracketsKeymap", "defaultKeymap", "historyKeymap", "syntaxHighlighting", "EditorState", "bracketMatching", "highlightActiveLine", "lineNumbers", "parentDiv", "existingPlaceholder", "tr", "newCode", "dependenciesAreDiff", "StateEffect", "selection", "EditorSelection", "changes", "Annotation", "handleContainerKeyDown", "evt", "gutterLineOffset", "offset", "l", "SandpackCodeEditor", "showTabs", "showRunButton", "updateCode", "readOnlyFile", "shouldShowTabs", "handleCodeUpdate", "_a$4", "_b", "layoutClassName", "css", "stackClassName", "THEME_PREFIX", "SandpackLayout", "Y", "_a2", "ref", "children", "className", "props", "__rest", "sandpack", "useSandpack", "classNames", "useClassNames", "combinedRef", "useCombinedRefs", "p", "__assign", "MAX_MESSAGE_COUNT$1", "consoleItemClassName$1", "css", "_a$3", "cubeClassName", "css", "wrapperClassName$2", "buttonClassName", "cubeRotate", "keyframes", "sidesClassNames", "loadingClassName", "css", "stdoutPreview", "css", "progressClassName$1", "fadeIn", "progressClassName", "css", "fadeIn", "explorerClassName", "fileExplorerClassName", "css", "navigatorClassName", "css", "inputClassName", "_a$2", "previewClassName", "css", "THEME_PREFIX", "previewIframe", "previewActionsClassName$1", "_a$1", "transpiledCodeClassName", "css", "THEME_PREFIX", "wrapperClassName$1", "css", "flexClassName$1", "color", "css", "passTextClassName", "failTextClassName", "skipTextClassName", "titleTextClassName", "background", "runBackgroundClassName", "passBackgroundClassName", "failBackgroundClassName", "testContainerClassName", "containerClassName$4", "testClassName", "durationClassName", "gapRightClassName", "nameClassName", "css", "containerClassName$3", "containerClassName$2", "css", "fileContainer", "css", "gapBottomClassName$1", "failTestClassName", "labelClassName$1", "specLabelClassName", "filePathButtonClassName", "filePathClassName", "fileNameClassName", "gapBottomClassName", "css", "labelClassName", "containerClassName$1", "previewActionsClassName", "css", "containerClassName", "css", "fileErrorContainerClassName", "MAX_KEYS", "MAX_MESSAGE_COUNT", "GLOBAL", "savedEval", "Arithmetic", "Arithmetic2", "_a", "consoleItemClassName", "css", "_a", "THEME_PREFIX", "wrapperClassName", "flexClassName", "dragHandler", "css", "buttonCounter", "css", "consoleWrapper", "rtlLayoutClassName", "Browser", "isBrowser", "window", "isTouch", "navigator", "isChrome", "isWebKit", "isSafari", "isSafariDesktop", "isWindows", "isMacOS", "supportedLanguages", "SuspenseValue", "status", "promise", "value", "reason", "resolver", "getFileExtensions", "language", "useBorder", "props", "collapseEqualBorders", "style", "borderWidth", "borderColor", "borderStyle", "isMixedBorderWidth", "borderWidthBottom", "borderWidthLeft", "borderWidthRight", "borderWidthTop", "borderTop", "borderBottom", "borderLeft", "borderRight", "groupsRegex", "capitalizeFirstLetter", "value", "titleCase", "useRadius", "borderRadius", "isMixedBorderRadius", "topLeftRadius", "topRightRadius", "bottomRightRadius", "bottomLeftRadius", "se", "usePadding", "padding", "paddingBottom", "paddingLeft", "paddingPerSide", "paddingRight", "paddingTop", "useIsOnCanvas", "onCanvas", "ye", "RenderTarget", "isObject", "isDarkColor", "color", "r", "g", "b", "rgbValues", "angular", "SuspenseValue", "cpp", "java", "markdown", "php", "python", "rust", "sql", "vue", "scala", "language", "LanguageSupport", "StreamLanguage", "c", "csharp", "kotlin", "objectiveC", "go", "haskell", "julia", "lua", "nginx", "octave", "perl", "ruby", "shell", "swift", "yaml", "useLanguageAsync", "name", "getFileExtensions", "amethyst", "aquaBlue", "atomDark", "cobalt2", "cyberpunk", "dracula", "freeCodeCampDark", "githubLight", "levelUp", "monokaiPro", "neoCyan", "nightOwl", "sandpackDark", "magic", "atomLight", "framerLight", "framerDark", "ayuLight", "ayuDark", "sandpackLight", "githubDark", "themeKeys", "themes", "amethyst", "aquaBlue", "atomDark", "cobalt2", "cyberpunk", "dracula", "freeCodeCampDark", "githubLight", "levelUp", "monokaiPro", "neoCyan", "nightOwl", "sandpackDark", "lightThemeVariables", "darkThemeVariables", "getVariableTheme", "font", "_fontFamily", "getVariablesForTheme", "theme", "background", "mode", "result", "colors", "syntax", "isObject", "name", "value", "name1", "value1", "style", "isDarkColor", "DEFAULT_CODE", "wrapperClassName", "css", "lightThemeVariables", "darkThemeVariables", "rule", "CodeBlock", "withCSS", "props", "code", "themeMode", "theme", "lightTheme", "darkTheme", "style", "language", "font", "border", "background", "variableTheme", "getVariableTheme", "getVariablesForTheme", "additionalLanguage", "useLanguageAsync", "extension", "getFileExtensions", "onCanvas", "useIsOnCanvas", "borderStyles", "useBorder", "borderRadius", "useRadius", "hasBorderRadius", "fileName", "padding", "usePadding", "u", "motion", "p", "SandpackProvider", "SandpackLayout", "SandpackCodeEditor", "SandpackStyles", "CodeBlock_default", "l", "Browser", "getCssText", "themeNames", "themeKeys", "titleCase", "addPropertyControls", "ControlType", "supportedLanguages", "c", "d", "u", "p", "m", "g", "f", "w", "e", "t", "b", "x", "Link", "motion", "ComponentPresetsConsumer", "CodeBlock_default", "Youtube", "addPropertyControls", "ControlType", "qfddknsE_default", "enumToDisplayNameFunctions", "__FramerMetadata__"]
}
