@nac3/forge-cli 1.0.51 → 1.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA6yWxD"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA0gXxD"}
@@ -46,6 +46,16 @@ export function renderPanelHtml(cfg) {
46
46
  projectTitle: tForLang(lang, 'panel.project.title'),
47
47
  projectAdd: tForLang(lang, 'panel.project.add'),
48
48
  projectAddPrompt: tForLang(lang, 'panel.project.addPrompt'),
49
+ projectRemove: tForLang(lang, 'panel.project.remove'),
50
+ projectRemoveConfirm: tForLang(lang, 'panel.project.removeConfirm'),
51
+ projectRemoved: tForLang(lang, 'panel.project.removed'),
52
+ filesRefresh: tForLang(lang, 'panel.files.refresh'),
53
+ filesLoading: tForLang(lang, 'panel.files.loading'),
54
+ filesError: tForLang(lang, 'panel.files.error'),
55
+ filesEmpty: tForLang(lang, 'panel.files.empty'),
56
+ filesTruncated: tForLang(lang, 'panel.files.truncated'),
57
+ filesOpened: tForLang(lang, 'panel.files.opened'),
58
+ filesOpenFailed: tForLang(lang, 'panel.files.openFailed'),
49
59
  projectSwitching: tForLang(lang, 'panel.project.switching'),
50
60
  micButton: tForLang(lang, 'panel.button.mic'),
51
61
  micButtonRec: tForLang(lang, 'panel.button.mic.recording'),
@@ -474,6 +484,26 @@ body {
474
484
  font-family: ui-monospace, monospace;
475
485
  line-height: 1.45;
476
486
  }
487
+ /* File explorer tab (kind 'files'). */
488
+ .pz-files-wrap { display: flex; flex-direction: column; height: 100%; overflow: hidden; }
489
+ .pz-files-bar { display: flex; align-items: center; gap: 10px; padding: 6px 10px;
490
+ border-bottom: 1px solid var(--border-subtle, #e3ddcf); flex: 0 0 auto; }
491
+ .pz-files-bar .pz-files-refresh { font: inherit; font-size: 11px; cursor: pointer;
492
+ border: 1px solid var(--border-subtle, #d9d2c4); background: #fff; color: #3a3a3a;
493
+ border-radius: 6px; padding: 3px 10px; }
494
+ .pz-files-bar .pz-files-refresh:hover { background: var(--bg2, #f1efe7); }
495
+ .pz-files-bar .pz-files-status { font-size: 11px; color: var(--ink-muted, #8a8275); }
496
+ .pz-files-tree { flex: 1; overflow: auto; padding: 8px 10px; font-size: 12.5px; line-height: 1.5; }
497
+ .pz-files-tree ul.pz-files-ul { list-style: none; margin: 0; padding: 0 0 0 16px; }
498
+ .pz-files-tree ul.pz-files-root { padding-left: 0; }
499
+ .pz-files-tree .pz-file-li { margin: 0; }
500
+ .pz-files-tree .pz-file-row { display: flex; align-items: center; gap: 6px;
501
+ padding: 2px 6px; border-radius: 5px; cursor: pointer; white-space: nowrap; }
502
+ .pz-files-tree .pz-file-row:hover { background: var(--bg2, #f1efe7); }
503
+ .pz-files-tree .pz-file-caret { width: 12px; flex: 0 0 auto; color: var(--ink-muted, #8a8275); font-size: 10px; }
504
+ .pz-files-tree .pz-file-ic { flex: 0 0 auto; }
505
+ .pz-files-tree .pz-file-name { overflow: hidden; text-overflow: ellipsis; }
506
+ .pz-files-tree .pz-file-dir > .pz-file-name { font-weight: 600; }
477
507
  /* PIZ-3 (PND-073) -- grafo de nodos dinamico, estetica sumi-e. */
478
508
  #yf-full .pz-graph-wrap {
479
509
  display: flex; gap: 0; height: 100%; min-height: 360px; padding: 0;
@@ -516,6 +546,13 @@ body {
516
546
  background-repeat: no-repeat; background-position: 0 100%; background-size: 100% 1.5px;
517
547
  padding-bottom: 6px; margin-bottom: 8px; word-break: break-word;
518
548
  }
549
+ #yf-full .pz-graph-detail-path { margin: 4px 0 8px; }
550
+ #yf-full .pz-graph-detail-path a {
551
+ font-family: ui-monospace, monospace; font-size: 11px; color: var(--indigo, #4f5b87);
552
+ cursor: pointer; text-decoration: none; border-bottom: 1px dotted var(--indigo, #4f5b87);
553
+ word-break: break-all;
554
+ }
555
+ #yf-full .pz-graph-detail-path a:hover { color: var(--shu, #b7410e); border-bottom-color: var(--shu, #b7410e); }
519
556
  #yf-full .pz-graph-detail-kind {
520
557
  display: inline-block; font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px;
521
558
  color: var(--indigo, #4f5b87); border: 1px solid var(--indigo, #4f5b87);
@@ -885,13 +922,19 @@ body {
885
922
  box-shadow: 0 6px 24px rgba(0,0,0,0.18); padding: 4px; }
886
923
  .proj-menu .proj-menu-title { font-size: 10px; text-transform: uppercase; letter-spacing: .06em;
887
924
  color: var(--ink-muted); padding: 6px 8px 2px; }
888
- .proj-menu .proj-row { display: flex; flex-direction: column; gap: 1px;
925
+ .proj-menu .proj-row { display: flex; flex-direction: row; align-items: center; gap: 6px;
889
926
  padding: 6px 8px; border-radius: 6px; cursor: pointer; }
927
+ .proj-menu .proj-row .proj-row-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; flex: 1; }
890
928
  .proj-menu .proj-row:hover { background: var(--bg2, #f1efe7); }
891
929
  .proj-menu .proj-row.on { background: rgba(80,90,160,0.08); }
892
930
  .proj-menu .proj-row .proj-row-name { font-size: 13px; font-weight: 600; }
893
931
  .proj-menu .proj-row .proj-row-path { font-size: 10px; color: var(--ink-muted);
894
932
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
933
+ .proj-menu .proj-row .proj-row-x { flex: 0 0 auto; width: 22px; height: 22px; line-height: 1;
934
+ border: none; background: transparent; color: var(--ink-muted); font-size: 17px; cursor: pointer;
935
+ border-radius: 5px; opacity: 0; transition: opacity .12s, background .12s, color .12s; }
936
+ .proj-menu .proj-row:hover .proj-row-x, .proj-menu .proj-row:focus-within .proj-row-x { opacity: 1; }
937
+ .proj-menu .proj-row .proj-row-x:hover { background: rgba(183,65,14,0.12); color: #b7410e; }
895
938
  .proj-menu .proj-add { color: var(--indigo); font-weight: 600; border-top: 1px solid var(--border-subtle); margin-top: 2px; }
896
939
  .header .actions { display: flex; gap: 4px; }
897
940
  .header .actions button {
@@ -2893,9 +2936,13 @@ async function openProjectMenu(anchor) {
2893
2936
  return String(b.last_active_at || '').localeCompare(String(a.last_active_at || ''));
2894
2937
  }).map(function (p) {
2895
2938
  const active = p.slug === reg.active_slug;
2939
+ const rmLabel = escapeHtml((CONFIG.i18n && CONFIG.i18n.projectRemove) || 'Quitar de la lista');
2896
2940
  return '<div class="proj-row' + (active ? ' on' : '') + '" data-proj-slug="' + escapeHtml(p.slug) + '" role="button" tabindex="0">'
2941
+ + '<span class="proj-row-main">'
2897
2942
  + '<span class="proj-row-name">' + (active ? '&#9679; ' : '') + escapeHtml(p.slug) + '</span>'
2898
2943
  + '<span class="proj-row-path">' + escapeHtml(String(p.path || '')) + '</span>'
2944
+ + '</span>'
2945
+ + '<button type="button" class="proj-row-x" data-proj-remove="' + escapeHtml(p.slug) + '" title="' + rmLabel + '" aria-label="' + rmLabel + '">&times;</button>'
2899
2946
  + '</div>';
2900
2947
  }).join('');
2901
2948
  menu.innerHTML = '<div class="proj-menu-title">' + escapeHtml(CONFIG.i18n.projectTitle) + '</div>'
@@ -2911,6 +2958,14 @@ async function openProjectMenu(anchor) {
2911
2958
  menu.querySelectorAll('[data-proj-slug]').forEach(function (row) {
2912
2959
  row.addEventListener('click', function () { switchProject(row.getAttribute('data-proj-slug')); });
2913
2960
  });
2961
+ /* The "X" removes the project from the list (never from disk). stopPropagation
2962
+ * so the click does NOT also trigger the row's switch handler. */
2963
+ menu.querySelectorAll('[data-proj-remove]').forEach(function (x) {
2964
+ x.addEventListener('click', function (e) {
2965
+ e.stopPropagation();
2966
+ removeProjectViaClick(x.getAttribute('data-proj-remove'), x.closest('.proj-row'));
2967
+ });
2968
+ });
2914
2969
  const addRow = menu.querySelector('[data-proj-add]');
2915
2970
  if (addRow) addRow.addEventListener('click', addProjectViaPrompt);
2916
2971
  setTimeout(function () { document.addEventListener('click', onProjMenuOutside, true); }, 0);
@@ -2938,6 +2993,30 @@ async function switchProject(slug) {
2938
2993
  setStatus('No se pudo cambiar de proyecto.', true);
2939
2994
  }
2940
2995
  }
2996
+ /* Remove a project from the list (the "X"). Confirms first; on success drops
2997
+ * the row from the open menu. Server-side this only edits projects.json --
2998
+ * the repo on disk is never touched. */
2999
+ async function removeProjectViaClick(slug, rowEl) {
3000
+ if (!slug) return;
3001
+ const msg = ((CONFIG.i18n && CONFIG.i18n.projectRemoveConfirm) || 'Quitar este proyecto de la lista? (no borra los archivos del disco)') + '\\n\\n' + slug;
3002
+ if (!window.confirm(msg)) return;
3003
+ try {
3004
+ const r = await fetch('/api/forge/projects/remove', {
3005
+ method: 'POST', headers: { 'content-type': 'application/json' },
3006
+ body: JSON.stringify({ slug: slug }),
3007
+ });
3008
+ const j = await r.json();
3009
+ if (j && j.ok) {
3010
+ if (rowEl && rowEl.parentNode) rowEl.parentNode.removeChild(rowEl);
3011
+ setStatus(((CONFIG.i18n && CONFIG.i18n.projectRemoved) || 'Proyecto quitado de la lista') + ': ' + slug);
3012
+ setTimeout(function () { setStatus(''); }, 2500);
3013
+ } else {
3014
+ setStatus((j && j.error) || 'No se pudo quitar el proyecto.', true);
3015
+ }
3016
+ } catch (e) {
3017
+ setStatus('No se pudo quitar el proyecto.', true);
3018
+ }
3019
+ }
2941
3020
  async function addProjectViaPrompt() {
2942
3021
  closeProjectMenu();
2943
3022
  const path = prompt(CONFIG.i18n.projectAddPrompt, '');
@@ -5209,6 +5288,18 @@ function renderPizarronCardBody(it) {
5209
5288
  if (it.kind === 'tree') {
5210
5289
  return bodyOpen + '<pre class="pz-tree">' + escapeHtml(it.content) + '</pre></div>';
5211
5290
  }
5291
+ if (it.kind === 'files') {
5292
+ /* File explorer of the local repo. The tree is fetched live by
5293
+ * initFilesTab from /api/forge/files-tree; clicking a file opens it
5294
+ * with the OS-associated app via /api/forge/open-native. */
5295
+ return '<div class="pz-body pz-files-wrap" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
5296
+ + '<div class="pz-files-bar">'
5297
+ + '<button type="button" class="pz-files-refresh" data-pz-files-refresh>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesRefresh) || 'Actualizar') + '</button>'
5298
+ + '<span class="pz-files-status" data-pz-files-status></span>'
5299
+ + '</div>'
5300
+ + '<div class="pz-files-tree" data-pz-files-tree>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...') + '</div>'
5301
+ + '</div>';
5302
+ }
5212
5303
  if (it.kind === 'bpmn' || it.kind === 'flow') {
5213
5304
  const trimmed = it.content.trim();
5214
5305
  /* SVG crudo -> passthrough (compat). */
@@ -5318,6 +5409,9 @@ function renderPizarron() {
5318
5409
  if (it.kind === 'workflow') {
5319
5410
  try { initWorkflowTab(it); } catch (e) { /* render best-effort */ }
5320
5411
  }
5412
+ if (it.kind === 'files') {
5413
+ try { initFilesTab(it); } catch (e) { /* render best-effort */ }
5414
+ }
5321
5415
  }
5322
5416
 
5323
5417
  /* Selector multi-workflow: persiste el indice elegido por tab id (igual
@@ -6170,12 +6264,11 @@ function unmarkStartupTabClosed(key) {
6170
6264
  * titulo real lo recordamos del ultimo fetch; el fallback cubre las que
6171
6265
  * nunca se vieron. */
6172
6266
  var yfStartupTitles = {};
6173
- var NATIVE_TAB_KEYS = ['startup_graph', 'startup_graph_func', 'startup_graph_sem', 'startup_pendings', 'startup_workflow', 'startup_tasks', 'coding_canvas'];
6267
+ var NATIVE_TAB_KEYS = ['startup_graph', 'startup_graph_sem', 'startup_pendings', 'startup_workflow', 'startup_tasks', 'startup_files', 'coding_canvas'];
6174
6268
  var NATIVE_TAB_FALLBACK = {
6175
- startup_graph: 'Grafo', startup_graph_func: 'Grafo funcional',
6176
- startup_graph_sem: 'Grafo semantico',
6269
+ startup_graph: 'Grafo', startup_graph_sem: 'Grafo semantico',
6177
6270
  startup_pendings: 'Pendientes', startup_workflow: 'Workflow',
6178
- startup_tasks: 'Tareas', coding_canvas: 'Coding',
6271
+ startup_tasks: 'Tareas', startup_files: 'Archivos', coding_canvas: 'Coding',
6179
6272
  };
6180
6273
  function nativeTabLabel(key) { return yfStartupTitles[key] || NATIVE_TAB_FALLBACK[key] || key; }
6181
6274
 
@@ -6307,11 +6400,6 @@ const PZ_GROUP_COLORS = {
6307
6400
  * entre re-renders para que un refresh con datos nuevos NO reinicie la
6308
6401
  * seleccion del usuario. */
6309
6402
  const _graphFilterByTab = {};
6310
- /* Vista funcional (startup_graph_func): funcionalidad de front-end
6311
- * seleccionada por tab (id de tab -> id de nodo ancla, o null=todas).
6312
- * Se conserva entre re-renders por la misma razon que el filtro de
6313
- * grupos: un refresh con datos nuevos NO debe perder la seleccion. */
6314
- const _graphFuncByTab = {};
6315
6403
  function graphNodeGroup(n) {
6316
6404
  const id = String((n && n.id) || '');
6317
6405
  const s = (id + ' ' + String((n && (n.label || n.name)) || '')).toLowerCase();
@@ -6328,6 +6416,165 @@ function graphNodeGroup(n) {
6328
6416
  return 'backend';
6329
6417
  }
6330
6418
 
6419
+ /* Best-effort project-relative path of a graph node, recovered from its
6420
+ * detail/purpose: derive.ts writes loose files as "Archivo X (src/foo.py)."
6421
+ * and directory modules as "... (src/foo).". We pick the last parenthetical
6422
+ * that looks like a path (has a separator or a file extension). Returns ''
6423
+ * when none -- libraries/protocols have no file. Used to make the node's
6424
+ * path clickable so it opens with the OS-associated app. */
6425
+ function graphNodePath(n) {
6426
+ if (n && n.path) return String(n.path);
6427
+ const d = String((n && n.detail) || '');
6428
+ /* No literal backslashes here: the panel lives inside a template literal,
6429
+ * which eats them. We extract parentheticals with indexOf and detect a
6430
+ * backslash via char code 92. */
6431
+ const BSLASH = String.fromCharCode(92);
6432
+ const candidates = [];
6433
+ let i = 0;
6434
+ while (i < d.length) {
6435
+ const open = d.indexOf('(', i);
6436
+ if (open < 0) break;
6437
+ const close = d.indexOf(')', open + 1);
6438
+ if (close < 0) break;
6439
+ candidates.push(d.slice(open + 1, close).trim());
6440
+ i = close + 1;
6441
+ }
6442
+ for (let k = candidates.length - 1; k >= 0; k--) {
6443
+ let inner = candidates[k];
6444
+ if (!inner || inner.length > 240) continue;
6445
+ while (inner.length && '.,;'.indexOf(inner[inner.length - 1]) >= 0) inner = inner.slice(0, -1);
6446
+ const hasSep = inner.indexOf('/') >= 0 || inner.indexOf(BSLASH) >= 0;
6447
+ let hasExt = false;
6448
+ const dot = inner.lastIndexOf('.');
6449
+ if (dot > 0 && dot < inner.length - 1) {
6450
+ const ext = inner.slice(dot + 1);
6451
+ hasExt = ext.length <= 8 && /^[a-z0-9]+$/i.test(ext);
6452
+ }
6453
+ if (!hasSep && !hasExt) continue;
6454
+ /* skip prose: spaces are only OK when it clearly has a path separator */
6455
+ if (inner.indexOf(' ') >= 0 && !hasSep) continue;
6456
+ return inner;
6457
+ }
6458
+ return '';
6459
+ }
6460
+
6461
+ /* ====================================================================
6462
+ * File explorer tab (startup_files / kind 'files', Pablo 2026-06-29).
6463
+ * Fetches the repo tree from /api/forge/files-tree, renders a collapsible
6464
+ * tree, and on a file click opens it with the OS-associated app via
6465
+ * /api/forge/open-native. Expand state is preserved per tab across the
6466
+ * 12s startup-tabs refresh.
6467
+ * ================================================================== */
6468
+ const _filesExpandByTab = {};
6469
+
6470
+ function fmtFileSize(n) {
6471
+ if (typeof n !== 'number' || !isFinite(n)) return '';
6472
+ if (n < 1024) return n + ' B';
6473
+ if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB';
6474
+ return (n / (1024 * 1024)).toFixed(1) + ' MB';
6475
+ }
6476
+
6477
+ function initFilesTab(it) {
6478
+ const wrap = document.querySelector('[data-pz-files-tree]');
6479
+ if (!wrap) return;
6480
+ const statusEl = document.querySelector('[data-pz-files-status]');
6481
+ const refreshBtn = document.querySelector('[data-pz-files-refresh]');
6482
+ const expanded = _filesExpandByTab[it.id] || (_filesExpandByTab[it.id] = new Set());
6483
+
6484
+ function setFilesStatus(msg) { if (statusEl) statusEl.textContent = msg || ''; }
6485
+
6486
+ function renderNode(node) {
6487
+ const li = document.createElement('li');
6488
+ li.className = 'pz-file-li';
6489
+ const row = document.createElement('div');
6490
+ row.className = 'pz-file-row pz-file-' + (node.kind === 'dir' ? 'dir' : 'file');
6491
+ row.setAttribute('role', 'button');
6492
+ row.setAttribute('tabindex', '0');
6493
+ if (node.kind === 'dir') {
6494
+ const isOpen = expanded.has(node.path);
6495
+ row.innerHTML = '<span class="pz-file-caret">' + (isOpen ? '&#9662;' : '&#9656;') + '</span>'
6496
+ + '<span class="pz-file-ic">&#128193;</span>'
6497
+ + '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>';
6498
+ li.appendChild(row);
6499
+ const childUl = document.createElement('ul');
6500
+ childUl.className = 'pz-files-ul';
6501
+ childUl.style.display = isOpen ? '' : 'none';
6502
+ (node.children || []).forEach(function (c) { childUl.appendChild(renderNode(c)); });
6503
+ li.appendChild(childUl);
6504
+ row.addEventListener('click', function () {
6505
+ const nowOpen = childUl.style.display === 'none';
6506
+ childUl.style.display = nowOpen ? '' : 'none';
6507
+ const caret = row.querySelector('.pz-file-caret');
6508
+ if (caret) caret.innerHTML = nowOpen ? '&#9662;' : '&#9656;';
6509
+ if (nowOpen) expanded.add(node.path); else expanded.delete(node.path);
6510
+ });
6511
+ } else {
6512
+ row.setAttribute('data-pz-file-path', node.path);
6513
+ const sz = fmtFileSize(node.size);
6514
+ row.title = node.path + (sz ? ' (' + sz + ')' : '');
6515
+ row.innerHTML = '<span class="pz-file-caret"></span>'
6516
+ + '<span class="pz-file-ic">&#128196;</span>'
6517
+ + '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>';
6518
+ li.appendChild(row);
6519
+ row.addEventListener('click', function () { openFileWithOS(node.path, setFilesStatus); });
6520
+ }
6521
+ return li;
6522
+ }
6523
+
6524
+ async function load() {
6525
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...';
6526
+ setFilesStatus('');
6527
+ try {
6528
+ const r = await fetch('/api/forge/files-tree');
6529
+ const j = await r.json();
6530
+ if (!j || !j.ok || !j.tree) {
6531
+ wrap.textContent = (j && j.error) || ((CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.');
6532
+ return;
6533
+ }
6534
+ wrap.innerHTML = '';
6535
+ const rootUl = document.createElement('ul');
6536
+ rootUl.className = 'pz-files-ul pz-files-root';
6537
+ (j.tree.children || []).forEach(function (c) { rootUl.appendChild(renderNode(c)); });
6538
+ if (!j.tree.children || j.tree.children.length === 0) {
6539
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesEmpty) || '(sin archivos)';
6540
+ return;
6541
+ }
6542
+ wrap.appendChild(rootUl);
6543
+ if (j.truncated) setFilesStatus((CONFIG.i18n && CONFIG.i18n.filesTruncated) || '(lista truncada)');
6544
+ } catch (e) {
6545
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.';
6546
+ }
6547
+ }
6548
+
6549
+ if (refreshBtn && !refreshBtn._wired) {
6550
+ refreshBtn._wired = true;
6551
+ refreshBtn.addEventListener('click', load);
6552
+ }
6553
+ load();
6554
+ }
6555
+
6556
+ async function openFileWithOS(relPath, setFilesStatus) {
6557
+ try {
6558
+ const r = await fetch('/api/forge/open-native', {
6559
+ method: 'POST', headers: { 'content-type': 'application/json' },
6560
+ body: JSON.stringify({ path: relPath }),
6561
+ });
6562
+ const j = await r.json();
6563
+ if (j && j.ok) {
6564
+ const msg = ((CONFIG.i18n && CONFIG.i18n.filesOpened) || 'Abierto') + ': ' + (j.opened || relPath)
6565
+ + (j.app_hint ? ' (' + j.app_hint + ')' : '');
6566
+ if (setFilesStatus) setFilesStatus(msg);
6567
+ setStatus(msg);
6568
+ } else {
6569
+ const m = (j && j.error) || ((CONFIG.i18n && CONFIG.i18n.filesOpenFailed) || 'No se pudo abrir el archivo.');
6570
+ if (setFilesStatus) setFilesStatus(m);
6571
+ setStatus(m, true);
6572
+ }
6573
+ } catch (e) {
6574
+ setStatus((CONFIG.i18n && CONFIG.i18n.filesOpenFailed) || 'No se pudo abrir el archivo.', true);
6575
+ }
6576
+ }
6577
+
6331
6578
  function initGraphTab(it) {
6332
6579
  const canvas = document.querySelector('[data-pz-graph-canvas]');
6333
6580
  const detail = document.querySelector('[data-pz-graph-detail]');
@@ -6365,6 +6612,12 @@ function initGraphTab(it) {
6365
6612
  * abajo, izq y der). Se topa para no colapsar en canvases pequenos. */
6366
6613
  const _maxR = nodes.reduce((m, n) => Math.max(m, 9 + (n.weight || 0) * 11), 9);
6367
6614
  const MARGIN = Math.max(28, Math.min(2 * _maxR, Math.min(W, H) * 0.42 - 8));
6615
+ /* Circular containment (Pablo 2026-06-29): keep the cluster inside a
6616
+ * CIRCLE (not the rectangle), so the graph reads round instead of
6617
+ * filling the corners. BOUND_R is the disc radius the node CENTERS live
6618
+ * in; each node is further pulled in by its own radius so it fits whole. */
6619
+ const CX = W / 2, CY = H / 2;
6620
+ const BOUND_R = Math.max(_maxR + 4, Math.min(W, H) / 2 - MARGIN);
6368
6621
 
6369
6622
  const idIndex = {};
6370
6623
  nodes.forEach((n, i) => { idIndex[n.id] = i; });
@@ -6436,36 +6689,6 @@ function initGraphTab(it) {
6436
6689
  return g;
6437
6690
  });
6438
6691
 
6439
- /* ---- Vista funcional (startup_graph_func) ----
6440
- * Centrada en las funcionalidades de front-end (nodos del grupo
6441
- * 'frontend') y como conectan con TODO lo demas. Permite elegir una
6442
- * funcionalidad y ver solo su subgrafo alcanzable (lo que esa
6443
- * funcionalidad toca, directa o transitivamente). El filtro de grupos
6444
- * de abajo sigue aplicando ENCIMA de la funcionalidad elegida. */
6445
- const functional = data.mode === 'functional';
6446
- /* Adyacencia DIRIGIDA (from->to) para el alcance. Convencion del grafo
6447
- * (semantic_graph/derive.ts): la arista va del consumidor a lo que usa
6448
- * (owner --uses--> target, owner --depends_on--> lib). Asi, partir de
6449
- * una funcionalidad de front-end y seguir las salientes da su CONO de
6450
- * dependencias: exactamente los componentes con los que conecta. (No
6451
- * dirigido daria todo el grafo cuando es un unico componente conexo.) */
6452
- const adj = nodes.map(() => []);
6453
- edges.forEach((e) => { adj[e.from].push(e.to); });
6454
- function computeReach(startIdx) {
6455
- const seen = new Set([startIdx]);
6456
- const stack = [startIdx];
6457
- while (stack.length) {
6458
- const u = stack.pop();
6459
- const ns = adj[u];
6460
- for (let i = 0; i < ns.length; i++) { if (!seen.has(ns[i])) { seen.add(ns[i]); stack.push(ns[i]); } }
6461
- }
6462
- return seen;
6463
- }
6464
- /* Funcionalidad seleccionada (id de nodo) restaurada de un render
6465
- * previo; null = todas. funcReach = set de indices visibles, o null. */
6466
- const savedFunc = functional ? (_graphFuncByTab[it.id] || null) : null;
6467
- let funcReach = (savedFunc != null && idIndex[savedFunc] != null) ? computeReach(idIndex[savedFunc]) : null;
6468
-
6469
6692
  /* ---- Filtro por grupo (legend toggleable) -- desktop a la par del
6470
6693
  * mobile. Colorea por backend/frontend/mobile/tests/tools/scripts/
6471
6694
  * libs/protocol y permite mostrar/ocultar cada grupo. ---- */
@@ -6479,9 +6702,7 @@ function initGraphTab(it) {
6479
6702
  counts[n.group] = (counts[n.group] || 0) + 1;
6480
6703
  });
6481
6704
  _graphFilterByTab[it.id] = vis; /* el toggle muta este mismo objeto */
6482
- /* En modo funcional la barra de funcionalidades ocupa la fila de
6483
- * arriba; la leyenda de grupos baja una fila para no solaparse. */
6484
- const legendTop = functional ? 36 : 6;
6705
+ const legendTop = 6;
6485
6706
  const legend = document.createElement('div');
6486
6707
  legend.setAttribute('style', 'position:absolute;top:' + legendTop + 'px;left:6px;right:6px;display:flex;flex-wrap:wrap;gap:5px;z-index:6;pointer-events:auto;');
6487
6708
  Object.keys(counts).sort().forEach((k) => {
@@ -6503,56 +6724,8 @@ function initGraphTab(it) {
6503
6724
  canvas.style.position = canvas.style.position || 'relative';
6504
6725
  canvas.appendChild(legend);
6505
6726
 
6506
- /* ---- Barra de funcionalidades de front-end (solo modo funcional) ---- */
6507
- if (functional) {
6508
- const en = !!(CONFIG && CONFIG.lang === 'en');
6509
- const anchors = nodes
6510
- .map((n, i) => ({ n, i }))
6511
- .filter((x) => x.n.group === 'frontend')
6512
- .sort((a, b) => String(a.n.label).localeCompare(String(b.n.label)));
6513
- const bar = document.createElement('div');
6514
- bar.setAttribute('style', 'position:absolute;top:6px;left:6px;right:6px;display:flex;align-items:center;gap:6px;z-index:7;pointer-events:auto;');
6515
- const lab = document.createElement('span');
6516
- lab.setAttribute('style', 'font:inherit;font-size:11px;color:#3a3a3a;white-space:nowrap;');
6517
- lab.textContent = en ? 'Front-end feature:' : 'Funcionalidad front-end:';
6518
- const sel = document.createElement('select');
6519
- sel.setAttribute('style', 'font:inherit;font-size:11px;color:#3a3a3a;border:1px solid #d9d2c4;'
6520
- + 'border-radius:14px;padding:3px 9px;background:#fff;cursor:pointer;max-width:60%;');
6521
- const optAll = document.createElement('option');
6522
- optAll.value = '';
6523
- optAll.textContent = (en ? 'All features' : 'Todas las funcionalidades') + ' (' + anchors.length + ')';
6524
- sel.appendChild(optAll);
6525
- anchors.forEach((x) => {
6526
- const o = document.createElement('option');
6527
- o.value = x.n.id;
6528
- o.textContent = x.n.label.length > 40 ? x.n.label.slice(0, 39) + '…' : x.n.label;
6529
- if (savedFunc != null && x.n.id === savedFunc) o.selected = true;
6530
- sel.appendChild(o);
6531
- });
6532
- sel.addEventListener('change', () => {
6533
- const v = sel.value;
6534
- funcReach = (v && idIndex[v] != null) ? computeReach(idIndex[v]) : null;
6535
- _graphFuncByTab[it.id] = v || null;
6536
- if (v && idIndex[v] != null) { try { showDetail(nodes[idIndex[v]]); } catch (e) { /* */ } }
6537
- applyGraphFilter();
6538
- });
6539
- bar.appendChild(lab);
6540
- bar.appendChild(sel);
6541
- if (anchors.length === 0) {
6542
- const hint = document.createElement('span');
6543
- hint.setAttribute('style', 'font:inherit;font-size:11px;color:#9a8f7a;');
6544
- hint.textContent = en ? '(no front-end nodes detected)' : '(sin nodos de front-end detectados)';
6545
- bar.appendChild(hint);
6546
- }
6547
- canvas.appendChild(bar);
6548
- /* Si habia una funcionalidad recordada, reflejarla en el detalle. */
6549
- if (savedFunc != null && idIndex[savedFunc] != null) { try { showDetail(nodes[idIndex[savedFunc]]); } catch (e) { /* */ } }
6550
- }
6551
-
6552
6727
  function nodeVisible(i) {
6553
- if (!vis[nodes[i].group]) return false;
6554
- if (funcReach && !funcReach.has(i)) return false;
6555
- return true;
6728
+ return !!vis[nodes[i].group];
6556
6729
  }
6557
6730
  function applyGraphFilter() {
6558
6731
  for (let i = 0; i < nodeEls.length; i++) nodeEls[i].style.display = nodeVisible(i) ? '' : 'none';
@@ -6566,13 +6739,25 @@ function initGraphTab(it) {
6566
6739
  function showDetail(n) {
6567
6740
  if (!detail) return;
6568
6741
  nodeEls.forEach((g) => g.classList.toggle('selected', g._node === n));
6742
+ const npath = graphNodePath(n);
6569
6743
  detail.innerHTML =
6570
6744
  '<div class="pz-graph-detail-title">' + escapeHtml(n.label) + '</div>'
6571
6745
  + (n.kind ? '<div class="pz-graph-detail-kind">' + escapeHtml(String(n.kind)) + '</div>' : '')
6572
6746
  + '<div class="pz-graph-detail-meta">' + escapeHtml(CONFIG.i18n.pzGraphWeight) + ' ' + (Math.round(n.weight * 100) / 100)
6573
6747
  + ' &middot; id ' + escapeHtml(n.id) + '</div>'
6748
+ + (npath ? '<div class="pz-graph-detail-path"><a href="#" data-graph-open-path role="button" title="'
6749
+ + escapeHtml(((CONFIG.i18n && CONFIG.i18n.filesOpened) || 'Abrir') + ': ' + npath) + '">'
6750
+ + escapeHtml(npath) + '</a></div>' : '')
6574
6751
  + (n.detail ? '<div class="pz-graph-detail-body">' + renderMdRich(String(n.detail)) + '</div>'
6575
6752
  : '<div class="pz-graph-detail-hint">' + escapeHtml(CONFIG.i18n.pzGraphEmpty) + '</div>');
6753
+ if (npath) {
6754
+ const link = detail.querySelector('[data-graph-open-path]');
6755
+ if (link) link.addEventListener('click', (ev) => {
6756
+ ev.preventDefault();
6757
+ /* relative path -> the open-native endpoint prepends the project root */
6758
+ openFileWithOS(npath);
6759
+ });
6760
+ }
6576
6761
  }
6577
6762
 
6578
6763
  /* ---- Simulacion force-directed ---- */
@@ -6603,13 +6788,49 @@ function initGraphTab(it) {
6603
6788
  if (!a.fixed) { a._fx += ox; a._fy += oy; }
6604
6789
  if (!b.fixed) { b._fx -= ox; b._fy -= oy; }
6605
6790
  }
6791
+ /* integrate velocities -- containment + collision handled below. */
6606
6792
  for (const n of nodes) {
6607
6793
  if (n.fixed) continue;
6608
6794
  n.vx = (n.vx + n._fx * alpha) * DAMP;
6609
6795
  n.vy = (n.vy + n._fy * alpha) * DAMP;
6610
6796
  n.x += n.vx; n.y += n.vy;
6611
- n.x = Math.max(MARGIN, Math.min(W - MARGIN, n.x));
6612
- n.y = Math.max(MARGIN, Math.min(H - MARGIN, n.y));
6797
+ }
6798
+ /* Anti-overlap: separate node circles by their radii (a couple of
6799
+ * position passes; O(n^2) but the graph is small). The plain 1/d^2
6800
+ * repulse ignores radii, so big nodes overlapped without this. */
6801
+ const COL_PAD = 4;
6802
+ for (let pass = 0; pass < 2; pass++) {
6803
+ for (let i = 0; i < nodes.length; i++) {
6804
+ const a = nodes[i]; const ra = 9 + a.weight * 11;
6805
+ for (let j = i + 1; j < nodes.length; j++) {
6806
+ const b = nodes[j]; const rb = 9 + b.weight * 11;
6807
+ let dx = b.x - a.x, dy = b.y - a.y;
6808
+ const minD = ra + rb + COL_PAD;
6809
+ const d2 = dx * dx + dy * dy;
6810
+ if (d2 >= minD * minD) continue;
6811
+ let d = Math.sqrt(d2);
6812
+ if (d < 0.01) { dx = 1; dy = 0; d = 1; } /* coincident -> split on x */
6813
+ const push = (minD - d) / 2;
6814
+ const ox = (dx / d) * push, oy = (dy / d) * push;
6815
+ if (!a.fixed) { a.x -= ox; a.y -= oy; }
6816
+ if (!b.fixed) { b.x += ox; b.y += oy; }
6817
+ }
6818
+ }
6819
+ }
6820
+ /* Circular containment: clamp each node CENTER inside the disc, leaving
6821
+ * room for its own radius so the whole node stays in -- the cluster
6822
+ * reads round, not a rectangle filling the corners. */
6823
+ for (const n of nodes) {
6824
+ if (n.fixed) continue;
6825
+ const r = 9 + n.weight * 11;
6826
+ const dxc = n.x - CX, dyc = n.y - CY;
6827
+ const dist = Math.sqrt(dxc * dxc + dyc * dyc);
6828
+ const limit = Math.max(0, BOUND_R - r);
6829
+ if (dist > limit && dist > 0.001) {
6830
+ n.x = CX + (dxc / dist) * limit;
6831
+ n.y = CY + (dyc / dist) * limit;
6832
+ n.vx *= 0.5; n.vy *= 0.5;
6833
+ }
6613
6834
  }
6614
6835
  alpha *= 0.985; if (alpha < 0.02) alpha = 0.02;
6615
6836
  }
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAolRpB,kBAAkB;;QAEpB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAswRpB,kBAAkB;;QAEpB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}