remove from ngix /pi block


bash

pwd && ls -la && grep -RIn "location /pi\|/pi" /etc/nginx /mnt/rpi /home/sebas 2>/dev/null | head -200


/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:30:    {"offset": {"line": 4437, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/lib/picocolors.ts"],"sourcesContent":["// ISC License\n\n// Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n//\n// https://github.com/alexeyraspopov/picocolors/blob/b6261487e7b81aaab2440e397a356732cad9e342/picocolors.js#L1\n\nconst { env, stdout } = globalThis?.process ?? {}\n\nconst enabled =\n  env &&\n  !env.NO_COLOR &&\n  (env.FORCE_COLOR || (stdout?.isTTY && !env.CI && env.TERM !== 'dumb'))\n\nconst replaceClose = (\n  str: string,\n  close: string,\n  replace: string,\n  index: number\n): string => {\n  const start = str.substring(0, index) + replace\n  const end = str.substring(index + close.length)\n  const nextIndex = end.indexOf(close)\n  return ~nextIndex\n    ? start + replaceClose(end, close, replace, nextIndex)\n    : start + end\n}\n\nconst formatter = (open: string, close: string, replace = open) => {\n  if (!enabled) return String\n  return (input: string) => {\n    const string = '' + input\n    const index = string.indexOf(close, open.length)\n    return ~index\n      ? open + replaceClose(string, close, replace, index) + close\n      : open + string + close\n  }\n}\n\nexport const reset = enabled ? (s: string) => `\\x1b[0m${s}\\x1b[0m` : String\nexport const bold = formatter('\\x1b[1m', '\\x1b[22m', '\\x1b[22m\\x1b[1m')\nexport const dim = formatter('\\x1b[2m', '\\x1b[22m', '\\x1b[22m\\x1b[2m')\nexport const italic = formatter('\\x1b[3m', '\\x1b[23m')\nexport const underline = formatter('\\x1b[4m', '\\x1b[24m')\nexport const inverse = formatter('\\x1b[7m', '\\x1b[27m')\nexport const hidden = formatter('\\x1b[8m', '\\x1b[28m')\nexport const strikethrough = formatter('\\x1b[9m', '\\x1b[29m')\nexport const black = formatter('\\x1b[30m', '\\x1b[39m')\nexport const red = formatter('\\x1b[31m', '\\x1b[39m')\nexport const green = formatter('\\x1b[32m', '\\x1b[39m')\nexport const yellow = formatter('\\x1b[33m', '\\x1b[39m')\nexport const blue = formatter('\\x1b[34m', '\\x1b[39m')\nexport const magenta = formatter('\\x1b[35m', '\\x1b[39m')\nexport const purple = formatter('\\x1b[38;2;173;127;168m', '\\x1b[39m')\nexport const cyan = formatter('\\x1b[36m', '\\x1b[39m')\nexport const white = formatter('\\x1b[37m', '\\x1b[39m')\nexport const gray = formatter('\\x1b[90m', '\\x1b[39m')\nexport const bgBlack = formatter('\\x1b[40m', '\\x1b[49m')\nexport const bgRed = formatter('\\x1b[41m', '\\x1b[49m')\nexport const bgGreen = formatter('\\x1b[42m', '\\x1b[49m')\nexport const bgYellow = formatter('\\x1b[43m', '\\x1b[49m')\nexport const bgBlue = formatter('\\x1b[44m', '\\x1b[49m')\nexport const bgMagenta = formatter('\\x1b[45m', '\\x1b[49m')\nexport const bgCyan = formatter('\\x1b[46m', '\\x1b[49m')\nexport const bgWhite = formatter('\\x1b[47m', '\\x1b[49m')\n"],"names":["globalThis","env","stdout","process","enabled","NO_COLOR","FORCE_COLOR","isTTY","CI","TERM","replaceClose","str","close","replace","index","start","substring","end","length","nextIndex","indexOf","formatter","open","String","input","string","reset","s","bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","purple","cyan","white","gray","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,cAAc;AAEd,wEAAwE;AAExE,2EAA2E;AAC3E,yEAAyE;AACzE,oEAAoE;AAEpE,2EAA2E;AAC3E,mEAAmE;AACnE,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,0EAA0E;AAC1E,iEAAiE;AACjE,EAAE;AACF,8GAA8G;IAEtFA;AAAxB,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGF,CAAAA,CAAAA,cAAAA,UAAAA,KAAAA,OAAAA,KAAAA,IAAAA,YAAYG,OAAO,KAAI,CAAC;AAEhD,MAAMC,UACJH,OACA,CAACA,IAAII,QAAQ,IACZJ,CAAAA,IAAIK,WAAW,IAAKJ,CAAAA,UAAAA,OAAAA,KAAAA,IAAAA,OAAQK,KAAK,KAAI,CAACN,IAAIO,EAAE,IAAIP,IAAIQ,IAAI,KAAK,MAAM;AAEtE,MAAMC,eAAe,CACnBC,KACAC,OACAC,SACAC;IAEA,MAAMC,QAAQJ,IAAIK,SAAS,CAAC,GAAGF,SAASD;IACxC,MAAMI,MAAMN,IAAIK,SAAS,CAACF,QAAQF,MAAMM,MAAM;IAC9C,MAAMC,YAAYF,IAAIG,OAAO,CAACR;IAC9B,OAAO,CAACO,YACJJ,QAAQL,aAAaO,KAAKL,OAAOC,SAASM,aAC1CJ,QAAQE;AACd;AAEA,MAAMI,YAAY,CAACC,MAAcV,OAAeC,UAAUS,IAAI;IAC5D,IAAI,CAAClB,SAAS,OAAOmB;IACrB,OAAO,CAACC;QACN,MAAMC,SAAS,KAAKD;QACpB,MAAMV,QAAQW,OAAOL,OAAO,CAACR,OAAOU,KAAKJ,MAAM;QAC/C,OAAO,CAACJ,QACJQ,OAAOZ,aAAae,QAAQb,OAAOC,SAASC,SAASF,QACrDU,OAAOG,SAASb;IACtB;AACF;AAEO,MAAMc,QAAQtB,UAAU,CAACuB,IAAc,CAAC,OAAO,EAAEA,EAAE,OAAO,CAAC,GAAGJ,OAAM;AACpE,MAAMK,OAAOP,UAAU,WAAW,YAAY,mBAAkB;AAChE,MAAMQ,MAAMR,UAAU,WAAW,YAAY,mBAAkB;AAC/D,MAAMS,SAAST,UAAU,WAAW,YAAW;AAC/C,MAAMU,YAAYV,UAAU,WAAW,YAAW;AAClD,MAAMW,UAAUX,UAAU,WAAW,YAAW;AAChD,MAAMY,SAASZ,UAAU,WAAW,YAAW;AAC/C,MAAMa,gBAAgBb,UAAU,WAAW,YAAW;AACtD,MAAMc,QAAQd,UAAU,YAAY,YAAW;AAC/C,MAAMe,MAAMf,UAAU,YAAY,YAAW;AAC7C,MAAMgB,QAAQhB,UAAU,YAAY,YAAW;AAC/C,MAAMiB,SAASjB,UAAU,YAAY,YAAW;AAChD,MAAMkB,OAAOlB,UAAU,YAAY,YAAW;AAC9C,MAAMmB,UAAUnB,UAAU,YAAY,YAAW;AACjD,MAAMoB,SAASpB,UAAU,0BAA0B,YAAW;AAC9D,MAAMqB,OAAOrB,UAAU,YAAY,YAAW;AAC9C,MAAMsB,QAAQtB,UAAU,YAAY,YAAW;AAC/C,MAAMuB,OAAOvB,UAAU,YAAY,YAAW;AAC9C,MAAMwB,UAAUxB,UAAU,YAAY,YAAW;AACjD,MAAMyB,QAAQzB,UAAU,YAAY,YAAW;AAC/C,MAAM0B,UAAU1B,UAAU,YAAY,YAAW;AACjD,MAAM2B,WAAW3B,UAAU,YAAY,YAAW;AAClD,MAAM4B,SAAS5B,UAAU,YAAY,YAAW;AAChD,MAAM6B,YAAY7B,UAAU,YAAY,YAAW;AACnD,MAAM8B,SAAS9B,UAAU,YAAY,YAAW;AAChD,MAAM+B,UAAU/B,UAAU,YAAY,YAAW","ignoreList":[0]}},
/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:31:    {"offset": {"line": 4552, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/build/output/log.ts"],"sourcesContent":["import { bold, green, magenta, red, yellow, white } from '../../lib/picocolors'\nimport { LRUCache } from '../../server/lib/lru-cache'\n\nexport const prefixes = {\n  wait: white(bold('○')),\n  error: red(bold('⨯')),\n  warn: yellow(bold('⚠')),\n  ready: '▲', // no color\n  info: white(bold(' ')),\n  event: green(bold('✓')),\n  trace: magenta(bold('»')),\n} as const\n\nconst LOGGING_METHOD = {\n  log: 'log',\n  warn: 'warn',\n  error: 'error',\n} as const\n\nfunction prefixedLog(prefixType: keyof typeof prefixes, ...message: any[]) {\n  if ((message[0] === '' || message[0] === undefined) && message.length === 1) {\n    message.shift()\n  }\n\n  const consoleMethod: keyof typeof LOGGING_METHOD =\n    prefixType in LOGGING_METHOD\n      ? LOGGING_METHOD[prefixType as keyof typeof LOGGING_METHOD]\n      : 'log'\n\n  const prefix = prefixes[prefixType]\n  // If there's no message, don't print the prefix but a new line\n  if (message.length === 0) {\n    console[consoleMethod]('')\n  } else {\n    // Ensure if there's ANSI escape codes it's concatenated into one string.\n    // Chrome DevTool can only handle color if it's in one string.\n    if (message.length === 1 && typeof message[0] === 'string') {\n      console[consoleMethod](prefix + ' ' + message[0])\n    } else {\n      console[consoleMethod](prefix, ...message)\n    }\n  }\n}\n\nexport function bootstrap(message: string) {\n  console.log(message)\n}\n\nexport function wait(...message: any[]) {\n  prefixedLog('wait', ...message)\n}\n\nexport function error(...message: any[]) {\n  prefixedLog('error', ...message)\n}\n\nexport function warn(...message: any[]) {\n  prefixedLog('warn', ...message)\n}\n\nexport function ready(...message: any[]) {\n  prefixedLog('ready', ...message)\n}\n\nexport function info(...message: any[]) {\n  prefixedLog('info', ...message)\n}\n\nexport function event(...message: any[]) {\n  prefixedLog('event', ...message)\n}\n\nexport function trace(...message: any[]) {\n  prefixedLog('trace', ...message)\n}\n\nconst warnOnceCache = new LRUCache<string>(10_000, (value) => value.length)\nexport function warnOnce(...message: any[]) {\n  const key = message.join(' ')\n  if (!warnOnceCache.has(key)) {\n    warnOnceCache.set(key, key)\n    warn(...message)\n  }\n}\n\nconst errorOnceCache = new LRUCache<string>(10_000, (value) => value.length)\nexport function errorOnce(...message: any[]) {\n  const key = message.join(' ')\n  if (!errorOnceCache.has(key)) {\n    errorOnceCache.set(key, key)\n    error(...message)\n  }\n}\n"],"names":["bold","green","magenta","red","yellow","white","LRUCache","prefixes","wait","error","warn","ready","info","event","trace","LOGGING_METHOD","log","prefixedLog","prefixType","message","undefined","length","shift","consoleMethod","prefix","console","bootstrap","warnOnceCache","value","warnOnce","key","join","has","set","errorOnceCache","errorOnce"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,IAAI,EAAEC,KAAK,EAAEC,OAAO,EAAEC,GAAG,EAAEC,MAAM,EAAEC,KAAK,QAAQ,uBAAsB;AAC/E,SAASC,QAAQ,QAAQ,6BAA4B;;;AAE9C,MAAMC,WAAW;IACtBC,UAAMH,2WAAAA,MAAML,0WAAAA,EAAK;IACjBS,WAAON,yWAAAA,MAAIH,0WAAAA,EAAK;IAChBU,UAAMN,4WAAAA,MAAOJ,0WAAAA,EAAK;IAClBW,OAAO;IACPC,UAAMP,2WAAAA,MAAML,0WAAAA,EAAK;IACjBa,WAAOZ,2WAAAA,MAAMD,0WAAAA,EAAK;IAClBc,WAAOZ,6WAAAA,MAAQF,0WAAAA,EAAK;AACtB,EAAU;AAEV,MAAMe,iBAAiB;IACrBC,KAAK;IACLN,MAAM;IACND,OAAO;AACT;AAEA,SAASQ,YAAYC,UAAiC,EAAE,GAAGC,OAAc;IACvE,IAAKA,CAAAA,OAAO,CAAC,EAAE,KAAK,MAAMA,OAAO,CAAC,EAAE,KAAKC,SAAQ,KAAMD,QAAQE,MAAM,KAAK,GAAG;QAC3EF,QAAQG,KAAK;IACf;IAEA,MAAMC,gBACJL,cAAcH,iBACVA,cAAc,CAACG,WAA0C,GACzD;IAEN,MAAMM,SAASjB,QAAQ,CAACW,WAAW;IACnC,+DAA+D;IAC/D,IAAIC,QAAQE,MAAM,KAAK,GAAG;QACxBI,OAAO,CAACF,cAAc,CAAC;IACzB,OAAO;QACL,yEAAyE;QACzE,8DAA8D;QAC9D,IAAIJ,QAAQE,MAAM,KAAK,KAAK,OAAOF,OAAO,CAAC,EAAE,KAAK,UAAU;YAC1DM,OAAO,CAACF,cAAc,CAACC,SAAS,MAAML,OAAO,CAAC,EAAE;QAClD,OAAO;YACLM,OAAO,CAACF,cAAc,CAACC,WAAWL;QACpC;IACF;AACF;AAEO,SAASO,UAAUP,OAAe;IACvCM,QAAQT,GAAG,CAACG;AACd;AAEO,SAASX,KAAK,GAAGW,OAAc;IACpCF,YAAY,WAAWE;AACzB;AAEO,SAASV,MAAM,GAAGU,OAAc;IACrCF,YAAY,YAAYE;AAC1B;AAEO,SAAST,KAAK,GAAGS,OAAc;IACpCF,YAAY,WAAWE;AACzB;AAEO,SAASR,MAAM,GAAGQ,OAAc;IACrCF,YAAY,YAAYE;AAC1B;AAEO,SAASP,KAAK,GAAGO,OAAc;IACpCF,YAAY,WAAWE;AACzB;AAEO,SAASN,MAAM,GAAGM,OAAc;IACrCF,YAAY,YAAYE;AAC1B;AAEO,SAASL,MAAM,GAAGK,OAAc;IACrCF,YAAY,YAAYE;AAC1B;AAEA,MAAMQ,gBAAgB,IAAIrB,0XAAAA,CAAiB,OAAQ,CAACsB,QAAUA,MAAMP,MAAM;AACnE,SAASQ,SAAS,GAAGV,OAAc;IACxC,MAAMW,MAAMX,QAAQY,IAAI,CAAC;IACzB,IAAI,CAACJ,cAAcK,GAAG,CAACF,MAAM;QAC3BH,cAAcM,GAAG,CAACH,KAAKA;QACvBpB,QAAQS;IACV;AACF;AAEA,MAAMe,iBAAiB,IAAI5B,0XAAAA,CAAiB,OAAQ,CAACsB,QAAUA,MAAMP,MAAM;AACpE,SAASc,UAAU,GAAGhB,OAAc;IACzC,MAAMW,MAAMX,QAAQY,IAAI,CAAC;IACzB,IAAI,CAACG,eAAeF,GAAG,CAACF,MAAM;QAC5BI,eAAeD,GAAG,CAACH,KAAKA;QACxBrB,SAASU;IACX;AACF","ignoreList":[0]}},
/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:62:    {"offset": {"line": 7291, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/server/pipe-readable.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http'\n\nimport {\n  ResponseAbortedName,\n  createAbortController,\n} from './web/spec-extension/adapters/next-request'\nimport { DetachedPromise } from '../lib/detached-promise'\nimport { getTracer } from './lib/trace/tracer'\nimport { NextNodeServerSpan } from './lib/trace/constants'\nimport { getClientComponentLoaderMetrics } from './client-component-renderer-logger'\n\nexport function isAbortError(e: any): e is Error & { name: 'AbortError' } {\n  return e?.name === 'AbortError' || e?.name === ResponseAbortedName\n}\n\nfunction createWriterFromResponse(\n  res: ServerResponse,\n  waitUntilForEnd?: Promise<unknown>\n): WritableStream<Uint8Array> {\n  let started = false\n\n  // Create a promise that will resolve once the response has drained. See\n  // https://nodejs.org/api/stream.html#stream_event_drain\n  let drained = new DetachedPromise<void>()\n  function onDrain() {\n    drained.resolve()\n  }\n  res.on('drain', onDrain)\n\n  // If the finish event fires, it means we shouldn't block and wait for the\n  // drain event.\n  res.once('close', () => {\n    res.off('drain', onDrain)\n    drained.resolve()\n  })\n\n  // Create a promise that will resolve once the response has finished. See\n  // https://nodejs.org/api/http.html#event-finish_1\n  const finished = new DetachedPromise<void>()\n  res.once('finish', () => {\n    finished.resolve()\n  })\n\n  // Create a writable stream that will write to the response.\n  return new WritableStream<Uint8Array>({\n    write: async (chunk) => {\n      // You'd think we'd want to use `start` instead of placing this in `write`\n      // but this ensures that we don't actually flush the headers until we've\n      // started writing chunks.\n      if (!started) {\n        started = true\n\n        if (\n          'performance' in globalThis &&\n          process.env.NEXT_OTEL_PERFORMANCE_PREFIX\n        ) {\n          const metrics = getClientComponentLoaderMetrics()\n          if (metrics) {\n            performance.measure(\n              `${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-client-component-loading`,\n              {\n                start: metrics.clientComponentLoadStart,\n                end:\n                  metrics.clientComponentLoadStart +\n                  metrics.clientComponentLoadTimes,\n              }\n            )\n          }\n        }\n\n        res.flushHeaders()\n        getTracer().trace(\n          NextNodeServerSpan.startResponse,\n          {\n            spanName: 'start response',\n          },\n          () => undefined\n        )\n      }\n\n      try {\n        const ok = res.write(chunk)\n\n        // Added by the `compression` middleware, this is a function that will\n        // flush the partially-compressed response to the client.\n        if ('flush' in res && typeof res.flush === 'function') {\n          res.flush()\n        }\n\n        // If the write returns false, it means there's some backpressure, so\n        // wait until it's streamed before continuing.\n        if (!ok) {\n          await drained.promise\n\n          // Reset the drained promise so that we can wait for the next drain event.\n          drained = new DetachedPromise<void>()\n        }\n      } catch (err) {\n        res.end()\n        throw new Error('failed to write chunk to response', { cause: err })\n      }\n    },\n    abort: (err) => {\n      if (res.writableFinished) return\n\n      res.destroy(err)\n    },\n    close: async () => {\n      // if a waitUntil promise was passed, wait for it to resolve before\n      // ending the response.\n      if (waitUntilForEnd) {\n        await waitUntilForEnd\n      }\n\n      if (res.writableFinished) return\n\n      res.end()\n      return finished.promise\n    },\n  })\n}\n\nexport async function pipeToNodeResponse(\n  readable: ReadableStream<Uint8Array>,\n  res: ServerResponse,\n  waitUntilForEnd?: Promise<unknown>\n) {\n  try {\n    // If the response has already errored, then just return now.\n    const { errored, destroyed } = res\n    if (errored || destroyed) return\n\n    // Create a new AbortController so that we can abort the readable if the\n    // client disconnects.\n    const controller = createAbortController(res)\n\n    const writer = createWriterFromResponse(res, waitUntilForEnd)\n\n    await readable.pipeTo(writer, { signal: controller.signal })\n  } catch (err: any) {\n    // If this isn't related to an abort error, re-throw it.\n    if (isAbortError(err)) return\n\n    throw new Error('failed to pipe response', { cause: err })\n  }\n}\n"],"names":["ResponseAbortedName","createAbortController","DetachedPromise","getTracer","NextNodeServerSpan","getClientComponentLoaderMetrics","isAbortError","e","name","createWriterFromResponse","res","waitUntilForEnd","started","drained","onDrain","resolve","on","once","off","finished","WritableStream","write","chunk","globalThis","process","env","NEXT_OTEL_PERFORMANCE_PREFIX","metrics","performance","measure","start","clientComponentLoadStart","end","clientComponentLoadTimes","flushHeaders","trace","startResponse","spanName","undefined","ok","flush","promise","err","Error","cause","abort","writableFinished","destroy","close","pipeToNodeResponse","readable","errored","destroyed","controller","writer","pipeTo","signal"],"mappings":";;;;;;AAEA,SACEA,mBAAmB,EACnBC,qBAAqB,QAChB,6CAA4C;AACnD,SAASC,eAAe,QAAQ,0BAAyB;AACzD,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,kBAAkB,QAAQ,wBAAuB;AAC1D,SAASC,+BAA+B,QAAQ,qCAAoC;;;;;;AAE7E,SAASC,aAAaC,CAAM;IACjC,OAAOA,CAAAA,KAAAA,OAAAA,KAAAA,IAAAA,EAAGC,IAAI,MAAK,gBAAgBD,CAAAA,KAAAA,OAAAA,KAAAA,IAAAA,EAAGC,IAAI,MAAKR,yaAAAA;AACjD;AAEA,SAASS,yBACPC,GAAmB,EACnBC,eAAkC;IAElC,IAAIC,UAAU;IAEd,wEAAwE;IACxE,wDAAwD;IACxD,IAAIC,UAAU,IAAIX,8XAAAA;IAClB,SAASY;QACPD,QAAQE,OAAO;IACjB;IACAL,IAAIM,EAAE,CAAC,SAASF;IAEhB,0EAA0E;IAC1E,eAAe;IACfJ,IAAIO,IAAI,CAAC,SAAS;QAChBP,IAAIQ,GAAG,CAAC,SAASJ;QACjBD,QAAQE,OAAO;IACjB;IAEA,yEAAyE;IACzE,kDAAkD;IAClD,MAAMI,WAAW,IAAIjB,8XAAAA;IACrBQ,IAAIO,IAAI,CAAC,UAAU;QACjBE,SAASJ,OAAO;IAClB;IAEA,4DAA4D;IAC5D,OAAO,IAAIK,eAA2B;QACpCC,OAAO,OAAOC;YACZ,0EAA0E;YAC1E,wEAAwE;YACxE,0BAA0B;YAC1B,IAAI,CAACV,SAAS;gBACZA,UAAU;gBAEV,IACE,iBAAiBW,cACjBC,QAAQC,GAAG,CAACC,4BAA4B,EACxC;oBACA,MAAMC,cAAUtB,uaAAAA;oBAChB,IAAIsB,SAAS;wBACXC,YAAYC,OAAO,CACjB,GAAGL,QAAQC,GAAG,CAACC,4BAA4B,CAAC,8BAA8B,CAAC,EAC3E;4BACEI,OAAOH,QAAQI,wBAAwB;4BACvCC,KACEL,QAAQI,wBAAwB,GAChCJ,QAAQM,wBAAwB;wBACpC;oBAEJ;gBACF;gBAEAvB,IAAIwB,YAAY;oBAChB/B,8XAAAA,IAAYgC,KAAK,CACf/B,0YAAAA,CAAmBgC,aAAa,EAChC;oBACEC,UAAU;gBACZ,GACA,IAAMC;YAEV;YAEA,IAAI;gBACF,MAAMC,KAAK7B,IAAIW,KAAK,CAACC;gBAErB,sEAAsE;gBACtE,yDAAyD;gBACzD,IAAI,WAAWZ,OAAO,OAAOA,IAAI8B,KAAK,KAAK,YAAY;oBACrD9B,IAAI8B,KAAK;gBACX;gBAEA,qEAAqE;gBACrE,8CAA8C;gBAC9C,IAAI,CAACD,IAAI;oBACP,MAAM1B,QAAQ4B,OAAO;oBAErB,0EAA0E;oBAC1E5B,UAAU,IAAIX,8XAAAA;gBAChB;YACF,EAAE,OAAOwC,KAAK;gBACZhC,IAAIsB,GAAG;gBACP,MAAM,OAAA,cAA8D,CAA9D,IAAIW,MAAM,qCAAqC;oBAAEC,OAAOF;gBAAI,IAA5D,qBAAA;2BAAA;gCAAA;kCAAA;gBAA6D;YACrE;QACF;QACAG,OAAO,CAACH;YACN,IAAIhC,IAAIoC,gBAAgB,EAAE;YAE1BpC,IAAIqC,OAAO,CAACL;QACd;QACAM,OAAO;YACL,mEAAmE;YACnE,uBAAuB;YACvB,IAAIrC,iBAAiB;gBACnB,MAAMA;YACR;YAEA,IAAID,IAAIoC,gBAAgB,EAAE;YAE1BpC,IAAIsB,GAAG;YACP,OAAOb,SAASsB,OAAO;QACzB;IACF;AACF;AAEO,eAAeQ,mBACpBC,QAAoC,EACpCxC,GAAmB,EACnBC,eAAkC;IAElC,IAAI;QACF,6DAA6D;QAC7D,MAAM,EAAEwC,OAAO,EAAEC,SAAS,EAAE,GAAG1C;QAC/B,IAAIyC,WAAWC,WAAW;QAE1B,wEAAwE;QACxE,sBAAsB;QACtB,MAAMC,iBAAapD,2aAAAA,EAAsBS;QAEzC,MAAM4C,SAAS7C,yBAAyBC,KAAKC;QAE7C,MAAMuC,SAASK,MAAM,CAACD,QAAQ;YAAEE,QAAQH,WAAWG,MAAM;QAAC;IAC5D,EAAE,OAAOd,KAAU;QACjB,wDAAwD;QACxD,IAAIpC,aAAaoC,MAAM;QAEvB,MAAM,OAAA,cAAoD,CAApD,IAAIC,MAAM,2BAA2B;YAAEC,OAAOF;QAAI,IAAlD,qBAAA;mBAAA;wBAAA;0BAAA;QAAmD;IAC3D;AACF","ignoreList":[0]}},
/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:63:    {"offset": {"line": 7422, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/server/render-result.ts"],"sourcesContent":["import type { OutgoingHttpHeaders, ServerResponse } from 'http'\nimport type { CacheControl } from './lib/cache-control'\nimport type { FetchMetrics } from './base-http'\nimport type { PrefetchHints } from '../shared/lib/app-router-types'\n\nimport {\n  chainStreams,\n  streamFromBuffer,\n  streamFromString,\n  streamToString,\n} from './stream-utils/node-web-streams-helper'\nimport { isAbortError, pipeToNodeResponse } from './pipe-readable'\nimport type { RenderResumeDataCache } from './resume-data-cache/resume-data-cache'\nimport { InvariantError } from '../shared/lib/invariant-error'\nimport type {\n  HTML_CONTENT_TYPE_HEADER,\n  JSON_CONTENT_TYPE_HEADER,\n  TEXT_PLAIN_CONTENT_TYPE_HEADER,\n} from '../lib/constants'\nimport type { RSC_CONTENT_TYPE_HEADER } from '../client/components/app-router-headers'\n\ntype ContentTypeOption =\n  | typeof RSC_CONTENT_TYPE_HEADER // For App Page RSC responses\n  | typeof HTML_CONTENT_TYPE_HEADER // For App Page, Pages HTML responses\n  | typeof JSON_CONTENT_TYPE_HEADER // For API routes, Next.js data requests\n  | typeof TEXT_PLAIN_CONTENT_TYPE_HEADER // For simplified errors\n\nexport type AppPageRenderResultMetadata = {\n  flightData?: Buffer\n  cacheControl?: CacheControl\n  staticBailoutInfo?: {\n    stack?: string\n    description?: string\n  }\n\n  /**\n   * The postponed state if the render had postponed and needs to be resumed.\n   */\n  postponed?: string\n\n  /**\n   * The headers to set on the response that were added by the render.\n   */\n  headers?: OutgoingHttpHeaders\n  statusCode?: number\n  fetchTags?: string\n  fetchMetrics?: FetchMetrics\n\n  segmentData?: Map<string, Buffer>\n\n  /**\n   * Per-route prefetch hints computed at build time (e.g. segment inlining\n   * decisions based on gzip sizes). Written to prefetch-hints.json by the\n   * build pipeline.\n   */\n  prefetchHints?: PrefetchHints\n\n  /**\n   * In development, the resume data cache is warmed up before the render. This\n   * is attached to the metadata so that it can be used during the render. When\n   * prerendering, the filled resume data cache is also attached to the metadata\n   * so that it can be used when prerendering matching fallback shells.\n   */\n  renderResumeDataCache?: RenderResumeDataCache\n}\n\nexport type PagesRenderResultMetadata = {\n  pageData?: any\n  cacheControl?: CacheControl\n  assetQueryString?: string\n  mutableAssetQueryString?: string\n  isNotFound?: boolean\n  isRedirect?: boolean\n}\n\nexport type StaticRenderResultMetadata = {}\n\nexport type RenderResultMetadata = AppPageRenderResultMetadata &\n  PagesRenderResultMetadata &\n  StaticRenderResultMetadata\n\nexport type RenderResultResponse =\n  | ReadableStream<Uint8Array>[]\n  | ReadableStream<Uint8Array>\n  | string\n  | Buffer\n  | null\n\nexport type RenderResultOptions<\n  Metadata extends RenderResultMetadata = RenderResultMetadata,\n> = {\n  contentType: ContentTypeOption | null\n  waitUntil?: Promise<unknown>\n  metadata: Metadata\n}\n\nexport default class RenderResult<\n  Metadata extends RenderResultMetadata = RenderResultMetadata,\n> {\n  /**\n   * The detected content type for the response. This is used to set the\n   * `Content-Type` header.\n   */\n  public readonly contentType: ContentTypeOption | null\n\n  /**\n   * The metadata for the response. This is used to set the revalidation times\n   * and other metadata.\n   */\n  public readonly metadata: Readonly<Metadata>\n\n  /**\n   * The response itself. This can be a string, a stream, or null. If it's a\n   * string, then it's a static response. If it's a stream, then it's a\n   * dynamic response. If it's null, then the response was not found or was\n   * already sent.\n   */\n  private response: RenderResultResponse\n\n  /**\n   * A render result that represents an empty response. This is used to\n   * represent a response that was not found or was already sent.\n   */\n  public static readonly EMPTY = new RenderResult<StaticRenderResultMetadata>(\n    null,\n    { metadata: {}, contentType: null }\n  )\n\n  /**\n   * Creates a new RenderResult instance from a static response.\n   *\n   * @param value the static response value\n   * @param contentType the content type of the response\n   * @returns a new RenderResult instance\n   */\n  public static fromStatic(\n    value: string | Buffer,\n    contentType: ContentTypeOption\n  ) {\n    return new RenderResult<StaticRenderResultMetadata>(value, {\n      metadata: {},\n      contentType,\n    })\n  }\n\n  private readonly waitUntil?: Promise<unknown>\n\n  constructor(\n    response: RenderResultResponse,\n    { contentType, waitUntil, metadata }: RenderResultOptions<Metadata>\n  ) {\n    this.response = response\n    this.contentType = contentType\n    this.metadata = metadata\n    this.waitUntil = waitUntil\n  }\n\n  public assignMetadata(metadata: Metadata) {\n    Object.assign(this.metadata, metadata)\n  }\n\n  /**\n   * Returns true if the response is null. It can be null if the response was\n   * not found or was already sent.\n   */\n  public get isNull(): boolean {\n    return this.response === null\n  }\n\n  /**\n   * Returns false if the response is a string. It can be a string if the page\n   * was prerendered. If it's not, then it was generated dynamically.\n   */\n  public get isDynamic(): boolean {\n    return typeof this.response !== 'string'\n  }\n\n  /**\n   * Returns the response if it is a string. If the page was dynamic, this will\n   * return a promise if the `stream` option is true, or it will throw an error.\n   *\n   * @param stream Whether or not to return a promise if the response is dynamic\n   * @returns The response as a string\n   */\n  public toUnchunkedString(stream?: false): string\n  public toUnchunkedString(stream: true): Promise<string>\n  public toUnchunkedString(stream = false): Promise<string> | string {\n    if (this.response === null) {\n      // If the response is null, return an empty string. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return ''\n    }\n\n    if (typeof this.response !== 'string') {\n      if (!stream) {\n        throw new InvariantError(\n          'dynamic responses cannot be unchunked. This is a bug in Next.js'\n        )\n      }\n\n      return streamToString(this.readable)\n    }\n\n    return this.response\n  }\n\n  /**\n   * Returns a readable stream of the response.\n   */\n  private get readable(): ReadableStream<Uint8Array> {\n    if (this.response === null) {\n      // If the response is null, return an empty stream. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return new ReadableStream<Uint8Array>({\n        start(controller) {\n          controller.close()\n        },\n      })\n    }\n\n    if (typeof this.response === 'string') {\n      return streamFromString(this.response)\n    }\n\n    if (Buffer.isBuffer(this.response)) {\n      return streamFromBuffer(this.response)\n    }\n\n    // If the response is an array of streams, then chain them together.\n    if (Array.isArray(this.response)) {\n      return chainStreams(...this.response)\n    }\n\n    return this.response\n  }\n\n  /**\n   * Coerces the response to an array of streams. This will convert the response\n   * to an array of streams if it is not already one.\n   *\n   * @returns An array of streams\n   */\n  private coerce(): ReadableStream<Uint8Array>[] {\n    if (this.response === null) {\n      // If the response is null, return an empty stream. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return []\n    }\n\n    if (typeof this.response === 'string') {\n      return [streamFromString(this.response)]\n    } else if (Array.isArray(this.response)) {\n      return this.response\n    } else if (Buffer.isBuffer(this.response)) {\n      return [streamFromBuffer(this.response)]\n    } else {\n      return [this.response]\n    }\n  }\n\n  /**\n   * Pipes the response through a transform stream. This converts the response\n   * to a single readable stream (chaining if needed) and pipes it through the\n   * provided transform.\n   *\n   * @param transform The transform stream to pipe through\n   */\n  public pipeThrough(transform: TransformStream<Uint8Array, Uint8Array>): void {\n    this.response = this.readable.pipeThrough(transform)\n  }\n\n  /**\n   * Unshifts a new stream to the response. This will convert the response to an\n   * array of streams if it is not already one and will add the new stream to\n   * the start of the array. When this response is piped, all of the streams\n   * will be piped one after the other.\n   *\n   * @param readable The new stream to unshift\n   */\n  public unshift(readable: ReadableStream<Uint8Array>): void {\n    // Coerce the response to an array of streams.\n    this.response = this.coerce()\n\n    // Add the new stream to the start of the array.\n    this.response.unshift(readable)\n  }\n\n  /**\n   * Chains a new stream to the response. This will convert the response to an\n   * array of streams if it is not already one and will add the new stream to\n   * the end. When this response is piped, all of the streams will be piped\n   * one after the other.\n   *\n   * @param readable The new stream to chain\n   */\n  public push(readable: ReadableStream<Uint8Array>): void {\n    // Coerce the response to an array of streams.\n    this.response = this.coerce()\n\n    // Add the new stream to the end of the array.\n    this.response.push(readable)\n  }\n\n  /**\n   * Pipes the response to a writable stream. This will close/cancel the\n   * writable stream if an error is encountered. If this doesn't throw, then\n   * the writable stream will be closed or aborted.\n   *\n   * @param writable Writable stream to pipe the response to\n   */\n  public async pipeTo(writable: WritableStream<Uint8Array>): Promise<void> {\n    try {\n      await this.readable.pipeTo(writable, {\n        // We want to close the writable stream ourselves so that we can wait\n        // for the waitUntil promise to resolve before closing it. If an error\n        // is encountered, we'll abort the writable stream if we swallowed the\n        // error.\n        preventClose: true,\n      })\n\n      // If there is a waitUntil promise, wait for it to resolve before\n      // closing the writable stream.\n      if (this.waitUntil) await this.waitUntil\n\n      // Close the writable stream.\n      await writable.close()\n    } catch (err) {\n      // If this is an abort error, we should abort the writable stream (as we\n      // took ownership of it when we started piping). We don't need to re-throw\n      // because we handled the error.\n      if (isAbortError(err)) {\n        // Abort the writable stream if an error is encountered.\n        await writable.abort(err)\n\n        return\n      }\n\n      // We're not aborting the writer here as when this method throws it's not\n      // clear as to how so the caller should assume it's their responsibility\n      // to clean up the writer.\n      throw err\n    }\n  }\n\n  /**\n   * Pipes the response to a node response. This will close/cancel the node\n   * response if an error is encountered.\n   *\n   * @param res\n   */\n  public async pipeToNodeResponse(res: ServerResponse) {\n    await pipeToNodeResponse(this.readable, res, this.waitUntil)\n  }\n}\n"],"names":["chainStreams","streamFromBuffer","streamFromString","streamToString","isAbortError","pipeToNodeResponse","InvariantError","RenderResult","EMPTY","metadata","contentType","fromStatic","value","constructor","response","waitUntil","assignMetadata","Object","assign","isNull","isDynamic","toUnchunkedString","stream","readable","ReadableStream","start","controller","close","Buffer","isBuffer","Array","isArray","coerce","pipeThrough","transform","unshift","push","pipeTo","writable","preventClose","err","abort","res"],"mappings":"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","ignoreList":[0]}},
/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:80:    {"offset": {"line": 10084, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/server/send-response.ts"],"sourcesContent":["import type { BaseNextRequest, BaseNextResponse } from './base-http'\nimport { isNodeNextResponse } from './base-http/helpers'\n\nimport { pipeToNodeResponse } from './pipe-readable'\nimport { splitCookiesString } from './web/utils'\n\n/**\n * Sends the response on the underlying next response object.\n *\n * @param req the underlying request object\n * @param res the underlying response object\n * @param response the response to send\n */\nexport async function sendResponse(\n  req: BaseNextRequest,\n  res: BaseNextResponse,\n  response: Response,\n  waitUntil?: Promise<unknown>\n): Promise<void> {\n  if (\n    // The type check here ensures that `req` is correctly typed, and the\n    // environment variable check provides dead code elimination.\n    process.env.NEXT_RUNTIME !== 'edge' &&\n    isNodeNextResponse(res)\n  ) {\n    // Copy over the response status.\n    res.statusCode = response.status\n    res.statusMessage = response.statusText\n\n    // TODO: this is not spec-compliant behavior and we should not restrict\n    // headers that are allowed to appear many times.\n    //\n    // See:\n    // https://github.com/vercel/next.js/pull/70127\n    const headersWithMultipleValuesAllowed = [\n      // can add more headers to this list if needed\n      'set-cookie',\n      'www-authenticate',\n      'proxy-authenticate',\n      'vary',\n    ]\n\n    // Copy over the response headers.\n    response.headers?.forEach((value, name) => {\n      // `x-middleware-set-cookie` is an internal header not needed for the response\n      if (name.toLowerCase() === 'x-middleware-set-cookie') {\n        return\n      }\n\n      // The append handling is special cased for `set-cookie`.\n      if (name.toLowerCase() === 'set-cookie') {\n        // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici\n        for (const cookie of splitCookiesString(value)) {\n          res.appendHeader(name, cookie)\n        }\n      } else {\n        // only append the header if it is either not present in the outbound response\n        // or if the header supports multiple values\n        const isHeaderPresent = typeof res.getHeader(name) !== 'undefined'\n        if (\n          headersWithMultipleValuesAllowed.includes(name.toLowerCase()) ||\n          !isHeaderPresent\n        ) {\n          res.appendHeader(name, value)\n        }\n      }\n    })\n\n    /**\n     * The response can't be directly piped to the underlying response. The\n     * following is duplicated from the edge runtime handler.\n     *\n     * See packages/next/server/next-server.ts\n     */\n\n    const { originalResponse } = res\n\n    // A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD\n    if (response.body && req.method !== 'HEAD') {\n      await pipeToNodeResponse(response.body, originalResponse, waitUntil)\n    } else {\n      originalResponse.end()\n    }\n  }\n}\n"],"names":["isNodeNextResponse","pipeToNodeResponse","splitCookiesString","sendResponse","req","res","response","waitUntil","process","env","NEXT_RUNTIME","statusCode","status","statusMessage","statusText","headersWithMultipleValuesAllowed","headers","forEach","value","name","toLowerCase","cookie","appendHeader","isHeaderPresent","getHeader","includes","originalResponse","body","method","end"],"mappings":";;;;AACA,SAASA,kBAAkB,QAAQ,sBAAqB;AAExD,SAASC,kBAAkB,QAAQ,kBAAiB;AACpD,SAASC,kBAAkB,QAAQ,cAAa;;;;AASzC,eAAeC,aACpBC,GAAoB,EACpBC,GAAqB,EACrBC,QAAkB,EAClBC,SAA4B;IAE5B,IACE,AACA,6DAA6D,QADQ;IAErEC,QAAQC,GAAG,CAACC,YAAY,uBAAK,cAC7BV,wYAAAA,EAAmBK,MACnB;YAkBA,AACAC,kCADkC;QAjBlC,iCAAiC;QACjCD,IAAIM,UAAU,GAAGL,SAASM,MAAM;QAChCP,IAAIQ,aAAa,GAAGP,SAASQ,UAAU;QAEvC,uEAAuE;QACvE,iDAAiD;QACjD,EAAE;QACF,OAAO;QACP,+CAA+C;QAC/C,MAAMC,mCAAmC;YACvC,8CAA8C;YAC9C;YACA;YACA;YACA;SACD;SAGDT,oBAAAA,SAASU,OAAO,KAAA,OAAA,KAAA,IAAhBV,kBAAkBW,OAAO,CAAC,CAACC,OAAOC;YAChC,8EAA8E;YAC9E,IAAIA,KAAKC,WAAW,OAAO,2BAA2B;gBACpD;YACF;YAEA,yDAAyD;YACzD,IAAID,KAAKC,WAAW,OAAO,cAAc;gBACvC,qFAAqF;gBACrF,KAAK,MAAMC,cAAUnB,6XAAAA,EAAmBgB,OAAQ;oBAC9Cb,IAAIiB,YAAY,CAACH,MAAME;gBACzB;YACF,OAAO;gBACL,8EAA8E;gBAC9E,4CAA4C;gBAC5C,MAAME,kBAAkB,OAAOlB,IAAImB,SAAS,CAACL,UAAU;gBACvD,IACEJ,iCAAiCU,QAAQ,CAACN,KAAKC,WAAW,OAC1D,CAACG,iBACD;oBACAlB,IAAIiB,YAAY,CAACH,MAAMD;gBACzB;YACF;QACF;QAEA;;;;;KAKC,GAED,MAAM,EAAEQ,gBAAgB,EAAE,GAAGrB;QAE7B,qGAAqG;QACrG,IAAIC,SAASqB,IAAI,IAAIvB,IAAIwB,MAAM,KAAK,QAAQ;YAC1C,UAAM3B,iYAAAA,EAAmBK,SAASqB,IAAI,EAAED,kBAAkBnB;QAC5D,OAAO;YACLmB,iBAAiBG,GAAG;QACtB;IACF;AACF","ignoreList":[0]}},
/mnt/rpi/.pnpm-store/v10/projects/1450163035b4b77953d9e39107a51f88/.next/dev/server/chunks/06-._next_0sj_wm~._.js.map:103:    {"offset": {"line": 13553, "column": 0}, "map": {"version":3,"sources":["file:///home/sebas/ballbox/node_modules/.pnpm/next%4016.2.1_%40babel%2Bcore%407.29.0_%40playwright%2Btest%401.58.2_react-dom%4019.2.0_react%4019.2.0__react%4019.2.0/node_modules/next/src/lib/picocolors.ts"],"sourcesContent":["// ISC License\n\n// Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n//\n// https://github.com/alexeyraspopov/picocolors/blob/b6261487e7b81aaab2440e397a356732cad9e342/picocolors.js#L1\n\nconst { env, stdout } = globalThis?.process ?? {}\n\nconst enabled =\n  env &&\n  !env.NO_COLOR &&\n  (env.FORCE_COLOR || (stdout?.isTTY && !env.CI && env.TERM !== 'dumb'))\n\nconst replaceClose = (\n  str: string,\n  close: string,\n  replace: string,\n  index: number\n): string => {\n  const start = str.substring(0, index) + replace\n  const end = str.substring(index + close.length)\n  const nextIndex = end.indexOf(close)\n  return ~nextIndex\n    ? start + replaceClose(end, close, replace, nextIndex)\n    : start + end\n}\n\nconst formatter = (open: string, close: string, replace = open) => {\n  if (!enabled) return String\n  return (input: string) => {\n    const string = '' + input\n    const index = string.indexOf(close, open.length)\n    return ~index\n      ? open + replaceClose(string, close, replace, index) + close\n      : open + string + close\n  }\n}\n\nexport const reset = enabled ? (s: string) => `\\x1b[0m${s}\\x1b[0m` : String\nexport const bold = formatter('\\x1b[1m', '\\x1b[22m', '\\x1b[22m\\x1b[1m')\nexport const dim = formatter('\\x1b[2m', '\\x1b[22m', '\\x1b[22m\\x1b[2m')\nexport const italic = formatter('\\x1b[3m', '\\x1b[23m')\nexport const underline = formatter('\\x1b[4m', '\\x1b[24m')\nexport const inverse = formatter('\\x1b[7m', '\\x1b[27m')\nexport const hidden = formatter('\\x1b[8m', '\\x1b[28m')\nexport const strikethrough = formatter('\\x1b[9m', '\\x1b[29m')\nexport const black = formatter('\\x1b[30m', '\\x1b[39m')\nexport const red = formatter('\\x1b[31m', '\\x1b[39m')\nexport const green = formatter('\\x1b[32m', '\\x1b[39m')\nexport const yellow = formatter('\\x1b[33m', '\\x1b[39m')\nexport const blue = formatter('\\x1b[34m', '\\x1b[39m')\nexport const magenta = formatter('\\x1b[35m', '\\x1b[39m')\nexport const purple = formatter('\\x1b[38;2;173;127;168m', '\\x1b[39m')\nexport const cyan = formatter('\\x1b[36m', '\\x1b[39m')\nexport const white = formatter('\\x1b[37m', '\\x1b[39m')\nexport const gray = formatter('\\x1b[90m', '\\x1b[39m')\nexport const bgBlack = formatter('\\x1b[40m', '\\x1b[49m')\nexport const bgRed = formatter('\\x1b[41m', '\\x1b[49m')\nexport const bgGreen = formatter('\\x1b[42m', '\\x1b[49m')\nexport const bgYellow = formatter('\\x1b[43m', '\\x1b[49m')\nexport const bgBlue = formatter('\\x1b[44m', '\\x1b[49m')\nexport const bgMagenta = formatter('\\x1b[45m', '\\x1b[49m')\nexport const bgCyan = formatter('\\x1b[46m', '\\x1b[49m')\nexport const bgWhite = formatter('\\x1b[47m', '\\x1b[49m')\n"],"names":["bgBlack","bgBlue","bgCyan","bgGreen","bgMagenta","bgRed","bgWhite","bgYellow","black","blue","bold","cyan","dim","gray","green","hidden","inverse","italic","magenta","purple","red","reset","strikethrough","underline","white","yellow","globalThis","env","stdout","process","enabled","NO_COLOR","FORCE_COLOR","isTTY","CI","TERM","replaceClose","str","close","replace","index","start","substring","end","length","nextIndex","indexOf","formatter","open","String","input","string","s"],"mappings":"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","ignoreList":[0]}},

[Showing lines 3-9 of 9 (50.0KB limit). Full output: /tmp/pi-bash-b2c590bd6ccc5ce0.log]


# Agente Personal

## Comunicación

- Seguí la configuración de comunicación definida por el sistema.
- Respetá la intención del usuario y la precisión técnica.
- Mantené las respuestas breves, claras y orientadas a la acción, salvo que el usuario pida más detalle.
- **Pendiente de validar:** confirmar que este modo de comunicación se carga automáticamente en cada nueva sesión del Pi.

## Intención

- Priorizá el impacto de negocio.
- Reencuadrá el trabajo técnico hacia el objetivo real.
- Hacé solo preguntas que cambien alcance, riesgo o criterio de éxito.
- Avanzá sin input humano tanto como sea posible cuando la intención y el objetivo ya estén claros.
- Ejecutá completo una vez aclarado.
- Si la intención está clara, escribí solo lo necesario para destrabar o informar el siguiente paso útil.
- Mantené enfocado el hilo principal.
- Usá subagentes para reconocimiento, trabajo en paralelo o aislamiento de contexto cuando sirva.
- Usá Agents Database como memoria compartida durable, no solo como buscador.
- Guardá preferencias de alta señal, decisiones, hechos del proyecto, artefactos reutilizables y contexto breve de handoff cuando probablemente sirvan más allá de este chat.
- Preferí pocas memorias fuertes antes que muchas ruidosas.
- Este repo de configuración del Pi es el lugar principal para seguir evolucionando estas reglas.

## Reglas

- Las acciones irreversibles requieren confirmación explícita.
- Nunca hagas merge ni push a main sin confirmación del usuario.
- Mantené las respuestas directas y con poco ruido.
- Mantené bloques de código, comandos, commits y texto de PR en formato técnico normal, salvo que el usuario pida otra cosa.
- Marcá contradicciones cuando importen.

## Contexto de la máquina

- **Esta máquina es `ballbox-first`.**
- **No** hagas SSH a `ballbox-first` para trabajo local normal. Ya estás ahí.
- Esta Raspberry Pi funciona en la práctica como estación de trabajo y servidor para el trabajo diario de Sebas.
- "el servidor" normalmente se refiere a esta misma máquina, salvo que el usuario claramente hable de otra.

## Detalles del servidor

- Hostname: `ballbox-first.emperor-ratio.ts.net`
- IP de Tailscale: `100.116.176.16`
- Máquina 24/7
- Nginx en `:80` enruta a otros servicios locales
- API de `personal-agent`: `http://100.116.176.16:8082/api/status`
- API de `agents-database`: `http://100.116.176.16:8091/api/status`

## Playwright

- El CLI `playwright-mcp` está disponible.
- Preferí Chromium en modo headless.
- Evitá Firefox/WebKit salvo que haga falta.
- Cuando un repo soporte tanto rutas e2e con dev-server como rutas estilo producción, preferí la ruta estilo producción más estable en `ballbox-first` si la orquestación de Playwright `webServer` falla o se pone inestable con el dev server.

## Almacenamiento / tooling compartido

- Para herramientas locales durables de la máquina, harnesses, cachés o artefactos compartidos que puedan crecer, preferí ubicarlos bajo `/mnt/rpi` en vez de `/home/sebas`, salvo que haya una razón fuerte para no hacerlo.

## SSH / tmux

- Las shells SSH interactivas en `ballbox-first` ejecutan automáticamente un selector de sesiones tmux desde `/home/sebas/.bashrc` mediante la función `tmux_pick()`.
- Si existe `fzf`, el selector lo usa. Si no, cae a un prompt de texto que empieza con `tmux sessions:`.
- Elegir `n` o `+ new session` crea automáticamente una sesión tmux nombrada con `date +%Y-%m-%d-%H-%M-%S`.
- Escribir el nombre de una sesión existente se adjunta a esa sesión.
- Escribir cualquier otro nombre no vacío crea o adjunta esa sesión tmux después de sanitizarlo a `[[:alnum:]_.-]`.
- `/home/sebas/.tmux.conf` está configurado intencionalmente con prioridad en persistencia, no como una UI interactiva cargada:
  - prefijo poco común: `C-\\`
  - barra de estado desactivada
  - defaults riesgosos para panes/ventanas/ciclado de sesiones desasignados
  - se mantienen escapes explícitos para recargar y detach
- El mejor manejo de terminal SSH para tmux también vive en `/home/sebas/.tmux.conf`.
- Si te piden cambiar el selector tmux de SSH, revisá primero `/home/sebas/.bashrc`.
- Si te piden simplificar el comportamiento de tmux, revisá primero `/home/sebas/.tmux.conf`.

## Helpers de laptop

- Existen helpers CLI para acceder a la laptop de Sebas por Tailscale SSH sin tener que recordar el host manualmente.
- Default host actual de esos helpers: `sebastians-macbook-pro-2`.
- Helpers disponibles:

[18 more lines in file. Use offset=81 to continue.]


grep -RIn --include='*.conf' --include='*.nginx' --include='nginx.conf' "location /pi\|location = /pi\|/pi/" /etc/nginx /mnt/rpi /home/sebas 2>/dev/null | head -200


Command timed out after 10 seconds


find /etc/nginx -type f | sed -n '1,200p'

find /mnt/rpi -maxdepth 4 \( -name '*.conf' -o -name 'nginx.conf' -o -name '*.nginx' \) 2>/dev/null | sed -n '1,200p'


/etc/nginx/proxy_params
/etc/nginx/mime.types
/etc/nginx/koi-utf
/etc/nginx/uwsgi_params
/etc/nginx/snippets/snakeoil.conf
/etc/nginx/snippets/fastcgi-php.conf
/etc/nginx/win-utf
/etc/nginx/koi-win
/etc/nginx/conf.d/opencode.conf
/etc/nginx/scgi_params
/etc/nginx/sites-available/kiosk.bak
/etc/nginx/sites-available/kiosk.portal
/etc/nginx/sites-available/default
/etc/nginx/sites-available/kiosk
/etc/nginx/fastcgi_params
/etc/nginx/fastcgi.conf
/etc/nginx/nginx.conf


(no output)


##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
}

# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}


server {
    listen 127.0.0.1:8443;
    listen [::1]:8443;

    location / {
        proxy_pass http://127.0.0.1:3967/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    access_log /var/log/nginx/opencode-access.log;
    error_log /var/log/nginx/opencode-error.log;
}


user www-data;
worker_processes auto;
worker_cpu_affinity auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	server_tokens off; # Recommended practice is to turn this off

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3 (POODLE), TLS 1.0, 1.1
	ssl_prefer_server_ciphers off; # Don't force server cipher order.

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}


ls -la /etc/nginx/sites-enabled && for f in /etc/nginx/sites-enabled/*; do echo '---' $f; sed -n '1,220p' "$f"; done


total 8
drwxr-xr-x 2 root root 4096 Apr 20 10:47 .
drwxr-xr-x 8 root root 4096 Jan 17 10:45 ..
lrwxrwxrwx 1 root root   32 Apr 20 10:47 kiosk -> /etc/nginx/sites-available/kiosk
--- /etc/nginx/sites-enabled/kiosk
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/portal;
    index index.html;

    location = /portal {
        return 302 /portal/;
    }

    location = /opencode {
        return 302 http://ballbox-first.emperor-ratio.ts.net:8443/;
    }

    location = /opencode/ {
        return 302 http://ballbox-first.emperor-ratio.ts.net:8443/;
    }

    location ^~ /portal/ {
        proxy_pass http://127.0.0.1:18789/portal/;
        proxy_http_version 1.1;
        proxy_set_header Accept-Encoding "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Calistenia static repo
    location ^~ /calistenia/ {
        alias /home/sebas/clawd/web/calistenia/;
        try_files $uri $uri/ /calistenia/index.html;
    }

    location = /mp3-share {
        return 302 /mp3-share/;
    }

    location = /mp3-share-link {
        return 302 /mp3-share/;
    }

    location ^~ /mp3-share/ {
        alias /home/sebas/downloads/mp3-share/;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }

    location = /shell {
        return 302 /shell/;
    }

    location = /shell/ {
        proxy_pass http://127.0.0.1:7681/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location = /shell/ws {
        proxy_pass http://127.0.0.1:7681/ws;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location = /pi {
        return 302 /pi/;
    }

    location ^~ /pi/ {
        proxy_pass http://127.0.0.1:8787/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;
        sub_filter_once off;
        sub_filter_types text/html text/css application/javascript application/json;
        sub_filter 'href="/' 'href="/pi/';
        sub_filter 'src="/' 'src="/pi/';
        sub_filter 'content="/' 'content="/pi/';
        sub_filter 'url(/' 'url(/pi/';
        sub_filter 'fetch("/' 'fetch("/pi/';
        sub_filter "fetch('/" "fetch('/pi/";
        sub_filter '"/manifest.webmanifest' '"/pi/manifest.webmanifest';
        sub_filter '"/icon.svg' '"/pi/icon.svg';
        sub_filter '"/styles.css' '"/pi/styles.css';
    }

    location = /tmux {
        return 301 /shell/;
    }

    location ^~ /tmux/ {
        return 301 /shell/;
    }

    # Main portal SPA
    location / {
        try_files $uri $uri/ /index.html;
    }

    access_log off;
    error_log /var/log/nginx/portal-error.log warn;

    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ {
        expires 1d;
        add_header Cache-Control "public, immutable";
    }
}


make gemini-3-flash-preview • medium the pi default


grep -RIn "gemini-3-flash-preview\|medium\|model.*gemini\|effort.*medium\|reasoning.*medium" /home/sebas /mnt/rpi /etc 2>/dev/null | head -200


I)&&_(I)}function Q(I){var Y=I.getWrapperElement(),ne=k(I);Y.className=Y.className.replace(" CodeMirror-empty","")+(ne?" CodeMirror-empty":""),ne?_(I):pe(I)}function k(I){return I.lineCount()===1&&I.getLine(0)===""}})})()),Na.exports}of();var Oa={exports:{}},Pa;function lf(){return Pa||(Pa=1,(function(ct,xt){(function(b){b(mt())})(function(b){b.defineSimpleMode=function(S,R){b.defineMode(S,function(A){return b.simpleMode(A,R)})},b.simpleMode=function(S,R){pe(R,"start");var A={},V=R.meta||{},ue=!1;for(var O in R)if(O!=V&&R.hasOwnProperty(O))for(var w=A[O]=[],M=R[O],N=0;N<M.length;N++){var z=M[N];w.push(new oe(z,R)),(z.indent||z.dedent)&&(ue=!0)}var X={startState:function(){return{state:"start",pending:null,local:null,localState:null,indent:ue?[]:null}},copyState:function(p){var W={state:p.state,pending:p.pending,local:p.local,localState:null,indent:p.indent&&p.indent.slice(0)};p.localState&&(W.localState=b.copyState(p.local.mode,p.localState)),p.stack&&(W.stack=p.stack.slice(0));for(var J=p.persistentStates;J;J=J.next)W.persistentStates={mode:J.mode,spec:J.spec,state:J.state==p.localState?W.localState:b.copyState(J.mode,J.state),next:W.persistentStates};return W},token:Q(A,S),innerMode:function(p){return p.local&&{mode:p.local.mode,state:p.localState}},indent:ne(A,V)};if(V)for(var q in V)V.hasOwnProperty(q)&&(X[q]=V[q]);return X};function pe(S,R){if(!S.hasOwnProperty(R))throw new Error("Undefined state "+R+" in simple mode")}function _(S,R){if(!S)return/(?:)/;var A="";return S instanceof RegExp?(S.ignoreCase&&(A="i"),S.unicode&&(A+="u"),S=S.source):S=String(S),new RegExp((R===!1?"":"^")+"(?:"+S+")",A)}function te(S){if(!S)return null;if(S.apply)return S;if(typeof S=="string")return S.replace(/\./g," ");for(var R=[],A=0;A<S.length;A++)R.push(S[A]&&S[A].replace(/\./g," "));return R}function oe(S,R){(S.next||S.push)&&pe(R,S.next||S.push),this.regex=_(S.regex),this.token=te(S.token),this.data=S}function Q(S,R){return function(A,V){if(V.pending){var ue=V.pending.shift();return V.pending.length==0&&(V.pending=null),A.pos+=ue.text.length,ue.token}if(V.local)if(V.local.end&&A.match(V.local.end)){var O=V.local.endToken||null;return V.local=V.localState=null,O}else{var O=V.local.mode.token(A,V.localState),w;return V.local.endScan&&(w=V.local.endScan.exec(A.current()))&&(A.pos=A.start+w.index),O}for(var M=S[V.state],N=0;N<M.length;N++){var z=M[N],X=(!z.data.sol||A.sol())&&A.match(z.regex);if(X){z.data.next?V.state=z.data.next:z.data.push?((V.stack||(V.stack=[])).push(V.state),V.state=z.data.push):z.data.pop&&V.stack&&V.stack.length&&(V.state=V.stack.pop()),z.data.mode&&I(R,V,z.data.mode,z.token),z.data.indent&&V.indent.push(A.indentation()+R.indentUnit),z.data.dedent&&V.indent.pop();var q=z.token;if(q&&q.apply&&(q=q(X)),X.length>2&&z.token&&typeof z.token!="string"){for(var p=2;p<X.length;p++)X[p]&&(V.pending||(V.pending=[])).push({text:X[p],token:z.token[p-1]});return A.backUp(X[0].length-(X[1]?X[1].length:0)),q[0]}else return q&&q.join?q[0]:q}}return A.next(),null}}function k(S,R){if(S===R)return!0;if(!S||typeof S!="object"||!R||typeof R!="object")return!1;var A=0;for(var V in S)if(S.hasOwnProperty(V)){if(!R.hasOwnProperty(V)||!k(S[V],R[V]))return!1;A++}for(var V in R)R.hasOwnProperty(V)&&A--;return A==0}function I(S,R,A,V){var ue;if(A.persistent)for(var O=R.persistentStates;O&&!ue;O=O.next)(A.spec?k(A.spec,O.spec):A.mode==O.mode)&&(ue=O);var w=ue?ue.mode:A.mode||b.getMode(S,A.spec),M=ue?ue.state:b.startState(w);A.persistent&&!ue&&(R.persistentStates={mode:w,spec:A.spec,state:M,next:R.persistentStates}),R.localState=M,R.local={mode:w,end:A.end&&_(A.end),endScan:A.end&&A.forceEnd!==!1&&_(A.end,!1),endToken:V&&V.join?V[V.length-1]:V}}function Y(S,R){for(var A=0;A<R.length;A++)if(R[A]===S)return!0}function ne(S,R){return function(A,V,ue){if(A.local&&A.local.mode.indent)return A.local.mode.indent(A.localState,V,ue);if(A.indent==null||A.local||R.dontIndentStates&&Y(A.state,R.dontIndentStates)>-1)return b.Pass;var O=A.indent.length-1,w=S[A.state];e:for(;;){for(var M=0;M<w.length;M++){var N=w[M];if(N.data.dedent&&N.data.dedentIfLineStart!==!1){var z=N.regex.exec(V);if(z&&z[0]){O--,(N.next||N.push)&&(w=S[N.next||N.push]),V=V.slice(z[0].length);continue e}}}break}return O<0?0:A.indent[O]}}})})()),Oa.exports}lf();var Ia={exports:{}},za;function af(){return za||(za=1,(function(ct,xt){(function(b){b(mt())})(function(b){var pe=/MSIE \d/.test(navigator.userAgent)&&(document.documentMode==null||document.documentMode<8),_=b.Pos,te={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<","<":">>",">":"<<"};function oe(S){return S&&S.bracketRegex||/[(){}[\]]/}function Q(S,R,A){var V=S.getLineHandle(R.line),ue=R.ch-1,O=A&&A.afterCursor;O==null&&(O=/(^| )cm-fat-cursor($| )/.test(S.getWrapperElement().className));var w=oe(A),M=!O&&ue>=0&&w.test(V.text.charAt(ue))&&te[V.text.charAt(ue)]||w.test(V.text.charAt(ue+1))&&te[V.text.charAt(++ue)];if(!M)return null;var N=M.charAt(1)==">"?1:-1;if(A&&A.strict&&N>0!=(ue==R.ch))return null;var z=S.getTokenTypeAt(_(R.line,ue+1)),X=k(S,_(R.line,ue+(N>0?1:0)),N,z,A);return X==null?null:{from:_(R.line,ue),to:X&&X.pos,match:X&&X.ch==M.charAt(0),forward:N>0}}function k(S,R,A,V,ue){for(var O=ue&&ue.maxScanLineLength||1e4,w=ue&&ue.maxScanLines||1e3,M=[],N=oe(ue),z=A>0?Math.min(R.line+w,S.lastLine()+1):Math.max(S.firstLine()-1,R.line-w),X=R.line;X!=z;X+=A){var q=S.getLine(X);if(q){var p=A>0?0:q.length-1,W=A>0?q.length:-1;if(!(q.length>O))for(X==R.line&&(p=R.ch-(A<0?1:0));p!=W;p+=A){var J=q.charAt(p);if(N.test(J)&&(V===void 0||(S.getTokenTypeAt(_(X,p+1))||"")==(V||""))){var P=te[J];if(P&&P.charAt(1)==">"==A>0)M.push(J);else if(M.length)M.pop();else return{pos:_(X,p),ch:J}}}}}return X-A==(A>0?S.lastLine():S.firstLine())?!1:null}function I(S,R,A){for(var V=S.state.matchBrackets.maxHighlightLineLength||1e3,ue=A&&A.highlightNonMatching,O=[],w=S.listSelections(),M=0;M<w.length;M++){var N=w[M].empty()&&Q(S,w[M].head,A);if(N&&(N.match||ue!==!1)&&S.getLine(N.from.line).length<=V){var z=N.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";O.push(S.markText(N.from,_(N.from.line,N.from.ch+1),{className:z})),N.to&&S.getLine(N.to.line).length<=V&&O.push(S.markText(N.to,_(N.to.line,N.to.ch+1),{className:z}))}}if(O.length){pe&&S.state.focused&&S.focus();var X=function(){S.operation(function(){for(var q=0;q<O.length;q++)O[q].clear()})};if(R)setTimeout(X,800);else return X}}function Y(S){S.operation(function(){S.state.matchBrackets.currentlyHighlighted&&(S.state.matchBrackets.currentlyHighlighted(),S.state.matchBrackets.currentlyHighlighted=null),S.state.matchBrackets.currentlyHighlighted=I(S,!1,S.state.matchBrackets)})}function ne(S){S.state.matchBrackets&&S.state.matchBrackets.currentlyHighlighted&&(S.state.matchBrackets.currentlyHighlighted(),S.state.matchBrackets.currentlyHighlighted=null)}b.defineOption("matchBrackets",!1,function(S,R,A){A&&A!=b.Init&&(S.off("cursorActivity",Y),S.off("focus",Y),S.off("blur",ne),ne(S)),R&&(S.state.matchBrackets=typeof R=="object"?R:{},S.on("cursorActivity",Y),S.on("focus",Y),S.on("blur",ne))}),b.defineExtension("matchBrackets",function(){I(this,!0)}),b.defineExtension("findMatchingBracket",function(S,R,A){return(A||typeof R=="boolean")&&(A?(A.strict=R,R=A):R=R?{strict:!0}:null),Q(this,S,R)}),b.defineExtension("scanForBracket",function(S,R,A,V){return k(this,S,R,A,V)})})})()),Ia.exports}af();var Ba={exports:{}},Ra;function sf(){return Ra||(Ra=1,(function(ct,xt){(function(b){b(mt())})(function(b){var pe={pairs:`()[]{}''""`,closeBefore:`)]}'":;>`,triples:"",explode:"[]{}"},_=b.Pos;b.defineOption("autoCloseBrackets",!1,function(O,w,M){M&&M!=b.Init&&(O.removeKeyMap(oe),O.state.closeBrackets=null),w&&(Q(te(w,"pairs")),O.state.closeBrackets=w,O.addKeyMap(oe))});function te(O,w){return w=="pairs"&&typeof O=="string"?O:typeof O=="object"&&O[w]!=null?O[w]:pe[w]}var oe={Backspace:Y,Enter:ne};function Q(O){for(var w=0;w<O.length;w++){var M=O.charAt(w),N="'"+M+"'";oe[N]||(oe[N]=k(M))}}Q(pe.pairs+"`");function k(O){return function(w){return A(w,O)}}function I(O){var w=O.state.closeBrackets;if(!w||w.override)return w;var M=O.getModeAt(O.getCursor());return M.closeBrackets||w}function Y(O){var w=I(O);if(!w||O.getOption("disableInput"))return b.Pass;for(var M=te(w,"pairs"),N=O.listSelections(),z=0;z<N.length;z++){if(!N[z].empty())return b.Pass;var X=V(O,N[z].head);if(!X||M.indexOf(X)%2!=0)return b.Pass}for(var z=N.length-1;z>=0;z--){var q=N[z].head;O.replaceRange("",_(q.line,q.ch-1),_(q.line,q.ch+1),"+delete")}}function ne(O){var w=I(O),M=w&&te(w,"explode");if(!M||O.getOption("disableInput"))return b.Pass;for(var N=O.listSelections(),z=0;z<N.length;z++){if(!N[z].empty())return b.Pass;var X=V(O,N[z].head);if(!X||M.indexOf(X)%2!=0)return b.Pass}O.operation(function(){var q=O.lineSeparator()||`
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:204:    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:205:    "mrs._claus_medium-light_skin_tone": "🤶🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:206:    "mrs._claus_medium_skin_tone": "🤶🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:228:    "ok_hand_medium-dark_skin_tone": "👌🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:229:    "ok_hand_medium-light_skin_tone": "👌🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:230:    "ok_hand_medium_skin_tone": "👌🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:262:    "santa_claus_medium-dark_skin_tone": "🎅🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:263:    "santa_claus_medium-light_skin_tone": "🎅🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:264:    "santa_claus_medium_skin_tone": "🎅🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:348:    "adult_medium-dark_skin_tone": "🧑🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:349:    "adult_medium-light_skin_tone": "🧑🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:350:    "adult_medium_skin_tone": "🧑🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:382:    "baby_angel_medium-dark_skin_tone": "👼🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:383:    "baby_angel_medium-light_skin_tone": "👼🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:384:    "baby_angel_medium_skin_tone": "👼🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:389:    "baby_medium-dark_skin_tone": "👶🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:390:    "baby_medium-light_skin_tone": "👶🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:391:    "baby_medium_skin_tone": "👶🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:396:    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:397:    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:398:    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:402:    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:403:    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:404:    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:408:    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:409:    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:410:    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:414:    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:415:    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:416:    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:448:    "bearded_person_medium-dark_skin_tone": "🧔🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:449:    "bearded_person_medium-light_skin_tone": "🧔🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:450:    "bearded_person_medium_skin_tone": "🧔🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:469:    "black_medium-small_square": "◾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:470:    "black_medium_square": "◼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:477:    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:478:    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:479:    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:483:    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:484:    "blond-haired_person_medium-light_skin_tone": "👱🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:485:    "blond-haired_person_medium_skin_tone": "👱🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:489:    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:490:    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:491:    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:513:    "boy_medium-dark_skin_tone": "👦🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:514:    "boy_medium-light_skin_tone": "👦🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:515:    "boy_medium_skin_tone": "👦🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:521:    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:522:    "breast-feeding_medium-light_skin_tone": "🤱🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:523:    "breast-feeding_medium_skin_tone": "🤱🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:528:    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:529:    "bride_with_veil_medium-light_skin_tone": "👰🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:530:    "bride_with_veil_medium_skin_tone": "👰🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:556:    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:557:    "call_me_hand_medium-light_skin_tone": "🤙🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:558:    "call_me_hand_medium_skin_tone": "🤙🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:593:    "child_medium-dark_skin_tone": "🧒🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:594:    "child_medium-light_skin_tone": "🧒🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:595:    "child_medium_skin_tone": "🧒🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:612:    "clapping_hands_medium-dark_skin_tone": "👏🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:613:    "clapping_hands_medium-light_skin_tone": "👏🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:614:    "clapping_hands_medium_skin_tone": "👏🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:649:    "construction_worker_medium-dark_skin_tone": "👷🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:650:    "construction_worker_medium-light_skin_tone": "👷🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:651:    "construction_worker_medium_skin_tone": "👷🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:680:    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:681:    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:682:    "crossed_fingers_medium_skin_tone": "🤞🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:718:    "detective_medium-dark_skin_tone": "🕵🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:719:    "detective_medium-light_skin_tone": "🕵🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:720:    "detective_medium_skin_tone": "🕵🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:761:    "ear_medium-dark_skin_tone": "👂🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:762:    "ear_medium-light_skin_tone": "👂🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:763:    "ear_medium_skin_tone": "👂🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:780:    "elf_medium-dark_skin_tone": "🧝🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:781:    "elf_medium-light_skin_tone": "🧝🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:782:    "elf_medium_skin_tone": "🧝🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:816:    "fairy_medium-dark_skin_tone": "🧚🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:817:    "fairy_medium-light_skin_tone": "🧚🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:818:    "fairy_medium_skin_tone": "🧚🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:881:    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:882:    "flexed_biceps_medium-light_skin_tone": "💪🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:883:    "flexed_biceps_medium_skin_tone": "💪🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:894:    "folded_hands_medium-dark_skin_tone": "🙏🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:895:    "folded_hands_medium-light_skin_tone": "🙏🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:896:    "folded_hands_medium_skin_tone": "🙏🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:929:    "girl_medium-dark_skin_tone": "👧🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:930:    "girl_medium-light_skin_tone": "👧🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:931:    "girl_medium_skin_tone": "👧🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:965:    "guard_medium-dark_skin_tone": "💂🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:966:    "guard_medium-light_skin_tone": "💂🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:967:    "guard_medium_skin_tone": "💂🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:978:    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:979:    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:980:    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1017:    "horse_racing_medium-dark_skin_tone": "🏇🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1018:    "horse_racing_medium-light_skin_tone": "🏇🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1019:    "horse_racing_medium_skin_tone": "🏇🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1044:    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1045:    "index_pointing_up_medium-light_skin_tone": "☝🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1046:    "index_pointing_up_medium_skin_tone": "☝🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1108:    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1109:    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1110:    "left-facing_fist_medium_skin_tone": "🤛🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1141:    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1142:    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1143:    "love-you_gesture_medium_skin_tone": "🤟🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1151:    "mage_medium-dark_skin_tone": "🧙🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1152:    "mage_medium-light_skin_tone": "🧙🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1153:    "mage_medium_skin_tone": "🧙🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1164:    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1165:    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1166:    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1170:    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1171:    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1172:    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1176:    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1177:    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1178:    "man_biking_medium_skin_tone": "🚴🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1182:    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1183:    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1184:    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1188:    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1189:    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1190:    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1194:    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1195:    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1196:    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1200:    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1201:    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1202:    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1206:    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1207:    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1208:    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1212:    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1213:    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1214:    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1218:    "man_dancing_medium-dark_skin_tone": "🕺🏾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1219:    "man_dancing_medium-light_skin_tone": "🕺🏼",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1220:    "man_dancing_medium_skin_tone": "🕺🏽",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1225:    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1226:    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1227:    "man_detective_medium_skin_tone": "🕵🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1231:    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1232:    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1233:    "man_elf_medium_skin_tone": "🧝🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1237:    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1238:    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1239:    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1243:    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1244:    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1245:    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1249:    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1250:    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1251:    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1255:    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1256:    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1257:    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1261:    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1262:    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1263:    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1267:    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1268:    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1269:    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1274:    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1275:    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1276:    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1280:    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1281:    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1282:    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1286:    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1287:    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1288:    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1292:    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1293:    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1294:    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1298:    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1299:    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1300:    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1304:    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1305:    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1306:    "man_guard_medium_skin_tone": "💂🏽\u200d♂",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1310:    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1311:    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1312:    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕",
/home/sebas/eiffel-monitor/venv/lib64/python3.13/site-packages/pip/_vendor/rich/_emoji_codes.py:1316:    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂",


find /home/sebas -maxdepth 4 \( -name '*.json' -o -name '*.yaml' -o -name '*.yml' -o -name '*.toml' -o -name '*.env' -o -name 'config.*' \) 2>/dev/null | grep -E '/(\.config|\.claude|\.gemini|\.pi|agents|opencode|aider|codex|cursor|zed|config)/|(^/home/sebas/\.[^/]+)' | sed -n '1,300p'

find /mnt/rpi -maxdepth 4 \( -name '*.json' -o -name '*.yaml' -o -name '*.yml' -o -name '*.toml' \) 2>/dev/null | sed -n '1,200p'