Javier Real commited on
Commit
ee84cd3
·
1 Parent(s): 9d07038
.dockerignore ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .env
2
+ __pycache__
3
+ *.pyc
4
+ *.pyo
5
+ *.pyd
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+ MANIFEST
.env.example ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ API_URL = https://api.openai.com/v1
2
+ API_KEY= <HERE_GOES_YOUR_OPENAI_API_KEY>
3
+ OMDB_API_KEY= <HERE_GOES_YOUR_OMDB_API_KEY>
4
+ OPENAI_ASSISTANT_ID=<HERE_GOES_YOUR_OPENAI_ASSISTANT_ID>
5
+ OMDB_URL = https://www.omdbapi.com/
6
+ X-RapidAPI-Key = <HERE_GOES_YOUR_X_RAPID_API_KEY>
7
+ X-RapidAPI-Host = coinranking1.p.rapidapi.com
8
+ COIN_RANKING_HOST = https://coinranking1.p.rapidapi.com/
9
+ DB_USER = <HERE_GOES_YOUR_DB_USERNAME>
10
+ DB_PASS = <HERE_GOES_YOUR_DB_PASSWORD>
11
+ DB_HOST = <HERE_GOES_YOUR_DB_HOST_NAME>
12
+ DATABASE = <HERE_GOES_YOUR_DATABASE_NAME>
.gitignore ADDED
@@ -0,0 +1,420 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### dotenv ###
2
+ .env
3
+
4
+ ### Flask ###
5
+ instance/*
6
+ !instance/.gitignore
7
+ .webassets-cache
8
+
9
+ ### Flask.Python Stack ###
10
+ # Byte-compiled / optimized / DLL files
11
+ __pycache__/
12
+ *.py[cod]
13
+ *$py.class
14
+
15
+ # C extensions
16
+ *.so
17
+
18
+ # Distribution / packaging
19
+ .Python
20
+ build/
21
+ develop-eggs/
22
+ dist/
23
+ downloads/
24
+ eggs/
25
+ .eggs/
26
+ lib/
27
+ lib64/
28
+ parts/
29
+ sdist/
30
+ var/
31
+ wheels/
32
+ share/python-wheels/
33
+ *.egg-info/
34
+ .installed.cfg
35
+ *.egg
36
+ MANIFEST
37
+
38
+ # PyInstaller
39
+ # Usually these files are written by a python script from a template
40
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
41
+ *.manifest
42
+ *.spec
43
+
44
+ # Installer logs
45
+ pip-log.txt
46
+ pip-delete-this-directory.txt
47
+
48
+ # Unit test / coverage reports
49
+ htmlcov/
50
+ .tox/
51
+ .nox/
52
+ .coverage
53
+ .coverage.*
54
+ .cache
55
+ nosetests.xml
56
+ coverage.xml
57
+ *.cover
58
+ *.py,cover
59
+ .hypothesis/
60
+ .pytest_cache/
61
+ cover/
62
+
63
+ # Translations
64
+ *.mo
65
+ *.pot
66
+
67
+ # Django stuff:
68
+ *.log
69
+ local_settings.py
70
+ db.sqlite3
71
+ db.sqlite3-journal
72
+
73
+ # Flask stuff:
74
+ instance/
75
+
76
+ # Scrapy stuff:
77
+ .scrapy
78
+
79
+ # Sphinx documentation
80
+ docs/_build/
81
+
82
+ # PyBuilder
83
+ .pybuilder/
84
+ target/
85
+
86
+ # Jupyter Notebook
87
+ .ipynb_checkpoints
88
+
89
+ # IPython
90
+ profile_default/
91
+ ipython_config.py
92
+
93
+ # pyenv
94
+ # For a library or package, you might want to ignore these files since the code is
95
+ # intended to run in multiple environments; otherwise, check them in:
96
+ # .python-version
97
+
98
+ # pipenv
99
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
100
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
101
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
102
+ # install all needed dependencies.
103
+ #Pipfile.lock
104
+
105
+ # poetry
106
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
107
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
108
+ # commonly ignored for libraries.
109
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
110
+ #poetry.lock
111
+
112
+ # pdm
113
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114
+ #pdm.lock
115
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
116
+ # in version control.
117
+ # https://pdm.fming.dev/#use-with-ide
118
+ .pdm.toml
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .venv
132
+ env/
133
+ venv/
134
+ ENV/
135
+ env.bak/
136
+ venv.bak/
137
+
138
+ # Spyder project settings
139
+ .spyderproject
140
+ .spyproject
141
+
142
+ # Rope project settings
143
+ .ropeproject
144
+
145
+ # mkdocs documentation
146
+ /site
147
+
148
+ # mypy
149
+ .mypy_cache/
150
+ .dmypy.json
151
+ dmypy.json
152
+
153
+ # Pyre type checker
154
+ .pyre/
155
+
156
+ # pytype static type analyzer
157
+ .pytype/
158
+
159
+ # Cython debug symbols
160
+ cython_debug/
161
+
162
+ # PyCharm
163
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
164
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
165
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
166
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
167
+ #.idea/
168
+
169
+ ### Node ###
170
+ # Logs
171
+ logs
172
+ npm-debug.log*
173
+ yarn-debug.log*
174
+ yarn-error.log*
175
+ lerna-debug.log*
176
+ .pnpm-debug.log*
177
+
178
+ # Diagnostic reports (https://nodejs.org/api/report.html)
179
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
180
+
181
+ # Runtime data
182
+ pids
183
+ *.pid
184
+ *.seed
185
+ *.pid.lock
186
+
187
+ # Directory for instrumented libs generated by jscoverage/JSCover
188
+ lib-cov
189
+
190
+ # Coverage directory used by tools like istanbul
191
+ coverage
192
+ *.lcov
193
+
194
+ # nyc test coverage
195
+ .nyc_output
196
+
197
+ # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
198
+ .grunt
199
+
200
+ # Bower dependency directory (https://bower.io/)
201
+ bower_components
202
+
203
+ # node-waf configuration
204
+ .lock-wscript
205
+
206
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
207
+ build/Release
208
+
209
+ # Dependency directories
210
+ node_modules/
211
+ jspm_packages/
212
+
213
+ # Snowpack dependency directory (https://snowpack.dev/)
214
+ web_modules/
215
+
216
+ # TypeScript cache
217
+ *.tsbuildinfo
218
+
219
+ # Optional npm cache directory
220
+ .npm
221
+
222
+ # Optional eslint cache
223
+ .eslintcache
224
+
225
+ # Optional stylelint cache
226
+ .stylelintcache
227
+
228
+ # Microbundle cache
229
+ .rpt2_cache/
230
+ .rts2_cache_cjs/
231
+ .rts2_cache_es/
232
+ .rts2_cache_umd/
233
+
234
+ # Optional REPL history
235
+ .node_repl_history
236
+
237
+ # Output of 'npm pack'
238
+ *.tgz
239
+
240
+ # Yarn Integrity file
241
+ .yarn-integrity
242
+
243
+ # dotenv environment variable files
244
+ .env.development.local
245
+ .env.test.local
246
+ .env.production.local
247
+ .env.local
248
+
249
+ # parcel-bundler cache (https://parceljs.org/)
250
+ .parcel-cache
251
+
252
+ # Next.js build output
253
+ .next
254
+ out
255
+
256
+ # Nuxt.js build / generate output
257
+ .nuxt
258
+ dist
259
+
260
+ # Gatsby files
261
+ .cache/
262
+ # Comment in the public line in if your project uses Gatsby and not Next.js
263
+ # https://nextjs.org/blog/next-9-1#public-directory-support
264
+ # public
265
+
266
+ # vuepress build output
267
+ .vuepress/dist
268
+
269
+ # vuepress v2.x temp and cache directory
270
+ .temp
271
+
272
+ # Docusaurus cache and generated files
273
+ .docusaurus
274
+
275
+ # Serverless directories
276
+ .serverless/
277
+
278
+ # FuseBox cache
279
+ .fusebox/
280
+
281
+ # DynamoDB Local files
282
+ .dynamodb/
283
+
284
+ # TernJS port file
285
+ .tern-port
286
+
287
+ # Stores VSCode versions used for testing VSCode extensions
288
+ .vscode-test
289
+
290
+ # yarn v2
291
+ .yarn/cache
292
+ .yarn/unplugged
293
+ .yarn/build-state.yml
294
+ .yarn/install-state.gz
295
+ .pnp.*
296
+
297
+ ### Node Patch ###
298
+ # Serverless Webpack directories
299
+ .webpack/
300
+
301
+ # Optional stylelint cache
302
+
303
+ # SvelteKit build / generate output
304
+ .svelte-kit
305
+
306
+ ### Python ###
307
+ # Byte-compiled / optimized / DLL files
308
+
309
+ # C extensions
310
+
311
+ # Distribution / packaging
312
+
313
+ # PyInstaller
314
+ # Usually these files are written by a python script from a template
315
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
316
+
317
+ # Installer logs
318
+
319
+ # Unit test / coverage reports
320
+
321
+ # Translations
322
+
323
+ # Django stuff:
324
+
325
+ # Flask stuff:
326
+
327
+ # Scrapy stuff:
328
+
329
+ # Sphinx documentation
330
+
331
+ # PyBuilder
332
+
333
+ # Jupyter Notebook
334
+
335
+ # IPython
336
+
337
+ # pyenv
338
+ # For a library or package, you might want to ignore these files since the code is
339
+ # intended to run in multiple environments; otherwise, check them in:
340
+ # .python-version
341
+
342
+ # pipenv
343
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
344
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
345
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
346
+ # install all needed dependencies.
347
+
348
+ # poetry
349
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
350
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
351
+ # commonly ignored for libraries.
352
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
353
+
354
+ # pdm
355
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
356
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
357
+ # in version control.
358
+ # https://pdm.fming.dev/#use-with-ide
359
+
360
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
361
+
362
+ # Celery stuff
363
+
364
+ # SageMath parsed files
365
+
366
+ # Environments
367
+
368
+ # Spyder project settings
369
+
370
+ # Rope project settings
371
+
372
+ # mkdocs documentation
373
+
374
+ # mypy
375
+
376
+ # Pyre type checker
377
+
378
+ # pytype static type analyzer
379
+
380
+ # Cython debug symbols
381
+
382
+ # PyCharm
383
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
384
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
385
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
386
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
387
+
388
+ ### Python Patch ###
389
+ # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
390
+ poetry.toml
391
+
392
+ # ruff
393
+ .ruff_cache/
394
+
395
+ # LSP config files
396
+ pyrightconfig.json
397
+
398
+ ### PythonVanilla ###
399
+ # Byte-compiled / optimized / DLL files
400
+
401
+ # C extensions
402
+
403
+ # Distribution / packaging
404
+
405
+ # Installer logs
406
+
407
+ # Unit test / coverage reports
408
+
409
+ # Translations
410
+
411
+ # pyenv
412
+ # For a library or package, you might want to ignore these files since the code is
413
+ # intended to run in multiple environments; otherwise, check them in:
414
+ # .python-version
415
+
416
+ # pipenv
417
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
418
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
419
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
420
+ # install all needed dependencies.
Dockerfile ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # docker build -t map-master .
2
+ # cd Documents/gen_ai_course_project/map-master
3
+ # docker run -p 5000:7860 --env-file .env map-master
4
+ # Luego ir a http://localhost:5000 o http://192.168.1.91:7860
5
+ # Crea un mapa mental sobre Daredevil
6
+
7
+ FROM python:3.9-slim
8
+
9
+ RUN apt-get update && apt-get install -y nodejs npm
10
+ # Crear un nuevo usuario "user" con el ID de usuario 1000
11
+ RUN useradd -m -u 1000 user
12
+
13
+ # Cambiar al usuario "user"
14
+ USER user
15
+
16
+ # Configurar el directorio de trabajo y las variables de entorno
17
+ ENV HOME=/home/user \
18
+ PATH=/home/user/.local/bin:$PATH
19
+ WORKDIR $HOME/app
20
+
21
+ # Actualizar pip e instalar las dependencias de Python
22
+ RUN pip install --no-cache-dir --upgrade pip
23
+
24
+ # Copiar el archivo requirements.txt e instalar dependencias
25
+ COPY --chown=user requirements.txt .
26
+ RUN pip install --no-cache-dir -r requirements.txt
27
+
28
+ # Copiar package.json y package-lock.json
29
+ COPY --chown=user package*.json ./
30
+
31
+ # Ajustar permisos para evitar errores de acceso
32
+ USER root
33
+ RUN chown -R user:user /home/user/app
34
+
35
+ # Volver al usuario "user" para instalar las dependencias de npm
36
+ USER user
37
+ RUN npm install
38
+
39
+ # Copiar el resto del código de la aplicación
40
+ COPY --chown=user . $HOME/app
41
+
42
+ # Crear y establecer permisos para el directorio de markdowns
43
+ RUN mkdir -p $HOME/app/markdowns
44
+ RUN chmod 777 $HOME/app/markdowns
45
+
46
+ # Exponer el puerto 7860
47
+ EXPOSE 7860
48
+
49
+ # Comando para ejecutar la aplicación usando Gunicorn
50
+ CMD ["gunicorn", "-b", "0.0.0.0:7860", "app:app"]
51
+
README.md CHANGED
@@ -1,10 +1,11 @@
1
  ---
2
  title: Map Master
3
- emoji: 📉
4
- colorFrom: indigo
5
  colorTo: green
6
  sdk: docker
7
  pinned: false
 
8
  ---
9
 
10
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: Map Master
3
+ emoji: 🌍
4
+ colorFrom: pink
5
  colorTo: green
6
  sdk: docker
7
  pinned: false
8
+ license: apache-2.0
9
  ---
10
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, render_template, jsonify, send_from_directory
2
+ from mindmap_service import MindMapService
3
+ from markdown_generator import MarkdownGenerator
4
+ import os
5
+ import re
6
+
7
+ app = Flask(__name__)
8
+ markdown_generator = MarkdownGenerator()
9
+
10
+
11
+ @app.route('/')
12
+ def index():
13
+ return render_template('index.html')
14
+
15
+
16
+ @app.route('/send_message', methods=['POST'])
17
+ def send_message():
18
+ user_input = request.form['message']
19
+ markdown, messages = markdown_generator.send_message(user_input)
20
+ response = {'markdown': markdown, 'messages': messages}
21
+ return jsonify(response)
22
+
23
+ # Nueva ruta para servir los archivos HTML generados
24
+
25
+
26
+ @app.route('/templates/<path:filename>')
27
+ def serve_page(filename):
28
+ return send_from_directory('templates', filename)
29
+
30
+
31
+ @app.route('/get_maps', methods=['GET'])
32
+ def get_maps():
33
+ maps = []
34
+ for filename in os.listdir('templates'):
35
+ if filename != 'index.html' and filename.endswith('.html'):
36
+ with open(os.path.join('templates', filename), 'r', encoding='utf-8') as f:
37
+ content = f.read()
38
+ title_match = re.search(r"<title>(.*?)</title>", content)
39
+ title = title_match.group(
40
+ 1) if title_match else os.path.splitext(filename)[0]
41
+ maps.append({'title': title, 'filename': filename})
42
+ return jsonify({'maps': maps})
43
+
44
+
45
+ @app.route('/delete_map/<filename>', methods=['DELETE'])
46
+ def delete_map(filename):
47
+ try:
48
+ html_path = os.path.join('templates', filename)
49
+ markdown_path = os.path.join(
50
+ 'markdowns', f"{os.path.splitext(filename)[0]}.md")
51
+
52
+ if os.path.exists(html_path):
53
+ os.remove(html_path)
54
+ if os.path.exists(markdown_path):
55
+ os.remove(markdown_path)
56
+ mindmap_service = MindMapService()
57
+ mindmap_service.generate_menu()
58
+ return jsonify({'success': True})
59
+ except Exception as e:
60
+ return jsonify({'success': False, 'error': str(e)})
61
+
62
+
63
+ @app.route('/regenerate_content', methods=['POST'])
64
+ def regenerate_content():
65
+ try:
66
+ mindmap_service = MindMapService()
67
+ mindmap_service.convert_markdown_to_html()
68
+ mindmap_service.style_htmls()
69
+ mindmap_service.generate_menu()
70
+ return jsonify({'success': True})
71
+ except Exception as e:
72
+ return jsonify({'success': False, 'error': str(e)})
73
+
74
+
75
+ if __name__ == '__main__':
76
+ app.run(host='0.0.0.0', port=7860, debug=False)
convert_markdown_to_html.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { Transformer } = require('markmap-lib');
4
+ const { fillTemplate } = require('markmap-render');
5
+ const yamlFront = require('yaml-front-matter');
6
+
7
+ const markdownDir = path.join(__dirname, 'markdowns');
8
+ const outputDir = path.join(__dirname, 'templates');
9
+
10
+ const transformer = new Transformer();
11
+
12
+ function convertMarkdownToHtml(markdown, title) {
13
+ const { root, features } = transformer.transform(markdown);
14
+ const keys = Object.keys(features);
15
+ const assets = transformer.getAssets(keys);
16
+ let html = fillTemplate(root, assets);
17
+
18
+ // Insert the title into the HTML
19
+ html = html.replace('<title>Markmap</title>', `<title>${title}</title>`);
20
+ return html;
21
+ }
22
+
23
+ fs.readdir(markdownDir, (err, files) => {
24
+ if (err) {
25
+ return console.error('Unable to scan directory:', err);
26
+ }
27
+
28
+ files.forEach((file) => {
29
+ if (path.extname(file) === '.md') {
30
+ const markdownPath = path.join(markdownDir, file);
31
+ const outputFilePath = path.join(outputDir, path.basename(file, '.md') + '.html');
32
+
33
+ fs.readFile(markdownPath, 'utf8', (err, markdown) => {
34
+ if (err) {
35
+ return console.error('Unable to read file:', err);
36
+ }
37
+
38
+ // Extract YAML front matter and the content
39
+ const parsedMarkdown = yamlFront.loadFront(markdown);
40
+
41
+ const title = parsedMarkdown.markmap.title || 'Document';
42
+ const content = parsedMarkdown.__content;
43
+
44
+ const html = convertMarkdownToHtml(content, title);
45
+
46
+ fs.writeFile(outputFilePath, html, (err) => {
47
+ if (err) {
48
+ return console.error('Unable to write HTML file:', err);
49
+ }
50
+
51
+ console.log(`HTML file generated: ${outputFilePath}`);
52
+ });
53
+ });
54
+ }
55
+ });
56
+ });
favicon.ico ADDED
markdown_generator.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from openai import OpenAI
2
+ from dotenv import load_dotenv
3
+ import os
4
+ import re
5
+ import hashlib
6
+ from mindmap_service import MindMapService
7
+
8
+ load_dotenv()
9
+
10
+ api_key = os.getenv('OPENAI_API_KEY')
11
+ assistant_id = os.getenv('OPENAI_ASSISTANT_ID')
12
+ client = OpenAI(api_key=api_key)
13
+
14
+
15
+ class MarkdownGenerator:
16
+ def __init__(self):
17
+ self.thread = client.beta.threads.create()
18
+
19
+ def send_message(self, user_input):
20
+ # Verificar y cancelar cualquier ejecución activa antes de añadir un nuevo mensaje
21
+ self.cancel_active_run()
22
+
23
+ # Añadir un nuevo mensaje al hilo
24
+ message = client.beta.threads.messages.create(
25
+ thread_id=self.thread.id,
26
+ role="user",
27
+ content=user_input
28
+ )
29
+
30
+ run = client.beta.threads.runs.create_and_poll(
31
+ thread_id=self.thread.id,
32
+ assistant_id=assistant_id
33
+ )
34
+
35
+ if run.status == 'completed':
36
+ messages = client.beta.threads.messages.list(
37
+ thread_id=self.thread.id
38
+ )
39
+ markdown = self.__extract_markdown(messages)
40
+ if markdown and "---\nmarkmap" in markdown:
41
+ # Guardar el markdown solo si contiene una cabecera y cuerpo válidos
42
+ self.save_markdown(user_input, markdown)
43
+
44
+ return markdown, self.__serialize_messages(messages)
45
+ else:
46
+ return None, run.status
47
+
48
+ def cancel_active_run(self):
49
+ runs = client.beta.threads.runs.list(thread_id=self.thread.id)
50
+ for run in runs.data:
51
+ if run.status == 'active':
52
+ client.beta.threads.runs.cancel(run_id=run.id)
53
+
54
+ def __extract_markdown(self, messages):
55
+ text = ""
56
+ for element in messages.data:
57
+ for content in element.content:
58
+ if content.type == 'text':
59
+ text += content.text.value + "\n"
60
+
61
+ if not text:
62
+ print("No text content found in messages.")
63
+ return None
64
+
65
+ # Extraer el contenido de la cabecera entre ---
66
+ header_pattern = r"---\n([\s\S]*?)\n---"
67
+ header_match = re.search(header_pattern, text)
68
+ header = header_match.group(0) if header_match else ""
69
+
70
+ # Extraer el contenido entre los delimitadores <!--midmap-start--> y <!--midmap-end-->
71
+ body_pattern = r"<!--midmap-start-->([\s\S]*?)<!--midmap-end-->"
72
+ body_match = re.search(body_pattern, text)
73
+ body = body_match.group(1).strip() if body_match else ""
74
+
75
+ if header and body:
76
+ return f"{header}\n{body}"
77
+ return text if text else None
78
+
79
+ def __serialize_messages(self, messages):
80
+ serialized_messages = []
81
+ for element in messages.data:
82
+ message_content = []
83
+ for content in element.content:
84
+ if content.type == 'text':
85
+ message_content.append(content.text.value)
86
+ serialized_messages.append({
87
+ 'role': element.role,
88
+ 'content': message_content
89
+ })
90
+ return serialized_messages
91
+
92
+ def save_markdown(self, user_input, markdown):
93
+ # Reemplazar espacios en el nombre del archivo
94
+ hash_object = hashlib.sha256(user_input.encode())
95
+ filename = f"markdowns/{hash_object.hexdigest()}.md"
96
+ os.makedirs(os.path.dirname(filename), exist_ok=True)
97
+ with open(filename, 'w', encoding='utf-8') as f:
98
+ f.write(markdown)
99
+ # Ejecutar los scripts en el orden especificado
100
+ self.regenerate_content()
101
+
102
+ def regenerate_content(self):
103
+ service = MindMapService()
104
+ service.convert_markdown_to_html()
105
+ service.style_htmls()
106
+ service.generate_menu()
markdowns/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.md ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ markmap:
3
+ title: Impresionismo Español
4
+ maxWidth: 300
5
+ embedAssets: true
6
+ extraJs:
7
+ - npm:katex/dist/contrib/mhchem.min.js
8
+ ---
9
+ # Impresionismo Español
10
+
11
+ ## Contexto Histórico
12
+ - Finales del siglo XIX
13
+ - Influencias Francesas
14
+
15
+ ## Características
16
+ - Uso de la luz y el color
17
+ - Pinceladas sueltas y rápidas
18
+ - Temas cotidianos y naturales
19
+
20
+ ## Principales Artistas
21
+ - Joaquín Sorolla
22
+ - Especialización en escenas de playa
23
+ - Dominio de la luz mediterránea
24
+ - Darío de Regoyos
25
+ - Experimentación con color y técnica
26
+ - Influencia del impresionismo europeo
27
+
28
+ ## Obras Representativas
29
+ - "Paseo a orillas del mar" - Sorolla
30
+ - "La Concha, nocturno" - Regoyos
31
+
32
+ ## Influencias Externas
33
+ - Claude Monet
34
+ - Édouard Manet
35
+
36
+ ## Impacto y Legado
37
+ - Evolución hacia el modernismo
38
+ - Influencia en generaciones posteriores de artistas
39
+
40
+ ## Links
41
+ - [Impresionismo](https://es.wikipedia.org/wiki/Impresionismo)
markdowns/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ markmap:
3
+ title: Daredevil
4
+ maxWidth: 300
5
+ embedAssets: true
6
+ extraJs:
7
+ - npm:katex/dist/contrib/mhchem.min.js
8
+ ---
9
+ # Daredevil
10
+
11
+ ## Identidad
12
+ - Nombre real: Matt Murdock
13
+ - Ocupación: Abogado, Vigilante
14
+
15
+ ## Origen
16
+ - Creado por: Stan Lee y Bill Everett
17
+ - Primera aparición: Daredevil #1 (1964)
18
+ - Accidentes: exposición a residuos radiactivos
19
+
20
+ ## Habilidades
21
+ - Sentidos superdesarrollados
22
+ - Vista
23
+ - Oído
24
+ - Olfato
25
+ - Tacto
26
+ - Gusto
27
+ - Acrobacias y combate cuerpo a cuerpo
28
+
29
+ ## Villanos
30
+ - Kingpin
31
+ - Bullseye
32
+ - The Hand
33
+ - Elektra (a veces)
34
+
35
+ ## Aliados
36
+ - Foggy Nelson
37
+ - Karen Page
38
+ - Elektra
39
+ - Spider-Man
40
+
41
+ ## Adaptaciones
42
+ - Series de TV
43
+ - Daredevil (Netflix)
44
+ - Películas
45
+ - Daredevil (2003)
46
+
47
+ ## Cultura Popular
48
+ - Comic
49
+ - Series regulares
50
+ - Miniseries
51
+ - Juegos
52
+ - Videojuegos
53
+ - Juegos de mesa
54
+
55
+ ## Links
56
+ - [Más información en Wikipedia](https://es.wikipedia.org/wiki/Daredevil_(c%C3%B3mic))
markdowns/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ markmap:
3
+ title: Spider-Man
4
+ maxWidth: 300
5
+ embedAssets: true
6
+ extraJs:
7
+ - npm:katex/dist/contrib/mhchem.min.js
8
+ ---
9
+ # Spider-Man
10
+
11
+ ## Origins
12
+ - Created by Stan Lee and Steve Ditko
13
+ - First appearance in Amazing Fantasy #15 (1962)
14
+ - Bitten by a radioactive spider
15
+
16
+ ## Superpowers
17
+ - Superhuman strength
18
+ - Wall-crawling
19
+ - Spider-sense
20
+ - Enhanced agility and reflexes
21
+ - Web-shooting (via mechanical web-shooters)
22
+
23
+ ## Alter Ego
24
+ - Peter Parker
25
+ - High school student/photographer/scientist
26
+ - Uncle Ben's "With great power, comes great responsibility"
27
+
28
+ ## Main Villains
29
+ - Green Goblin (Norman Osborn)
30
+ - Doctor Octopus (Otto Octavius)
31
+ - Venom (Eddie Brock)
32
+ - The Vulture (Adrian Toomes)
33
+ - Sandman (Flint Marko)
34
+
35
+ ## Allies
36
+ - Aunt May
37
+ - Mary Jane Watson
38
+ - Gwen Stacy
39
+ - Harry Osborn
40
+ - The Avengers
41
+
42
+ ## Adaptations
43
+ - Comics
44
+ - Animated TV Shows
45
+ - Movies
46
+ - Tobey Maguire
47
+ - Andrew Garfield
48
+ - Tom Holland
49
+ - Video Games
50
+
51
+ ## Impact
52
+ - Cultural Icon
53
+ - Merchandise
54
+ - Inspiration to fans
55
+
56
+ ## Links
57
+ - [Spider-Man (Wikipedia)](https://en.wikipedia.org/wiki/Spider-Man)
markdowns/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.md ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ markmap:
3
+ title: Arte Abstracto Español
4
+ maxWidth: 300
5
+ embedAssets: true
6
+ extraJs:
7
+ - npm:katex/dist/contrib/mhchem.min.js
8
+ ---
9
+ # Arte Abstracto Español
10
+
11
+ ## Origen
12
+ - Vanguardias del Siglo XX
13
+ - Influencias Europeas
14
+ - Guerra Civil Española
15
+
16
+ ## Artistas Destacados
17
+ - Antoni Tàpies
18
+ - Materialidad
19
+ - Textura
20
+ - Pablo Picasso
21
+ - Periodo Azul
22
+ - Cubismo
23
+ - Juan Gris
24
+ - Collage
25
+ - Geometría
26
+
27
+ ## Movimientos
28
+ - Surrealismo
29
+ - Expresionismo Abstracto
30
+ - Informalismo
31
+
32
+ ## Técnicas y Estilos
33
+ - Pintura
34
+ - Óleo
35
+ - Acrílico
36
+ - Escultura
37
+ - Materiales Diversos
38
+ - Instalaciones
39
+ - Arte Conceptual
40
+
41
+ ## Exposiciones Notables
42
+ - Museo Reina Sofía
43
+ - Retrospectivas
44
+ - Exposiciones Temporales
45
+ - Museo Guggenheim Bilbao
46
+ - Exposiciones Permanentes
47
+ - Obras Internacionales
48
+
49
+ ## Influencia Internacional
50
+ - Simposios y Bienales
51
+ - Colecciones en Museos Internacionales
52
+ - Intercambio Cultural
53
+
54
+ ## Recursos
55
+ - [Wikipedia](https://es.wikipedia.org/wiki/Arte_abstracto)
mindmap_service.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import subprocess
3
+ import re
4
+ import shutil
5
+ from datetime import datetime
6
+ from dotenv import load_dotenv
7
+
8
+
9
+ class MindMapService:
10
+ def __init__(self):
11
+ load_dotenv()
12
+ self.project_name = os.getenv('PROJECT_NAME', 'Project')
13
+ self.templates_directory = os.path.join(
14
+ os.path.dirname(os.path.abspath(__file__)), "templates")
15
+ self.markdowns_directory = os.path.join(os.path.dirname(
16
+ os.path.abspath(__file__)), "markdowns")
17
+ self.css_path = 'static/css/styles.css'
18
+
19
+ def convert_markdown_to_html(self):
20
+ try:
21
+ result = subprocess.run(['node', 'convert_markdown_to_html.js'],
22
+ check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
23
+ print(result.stdout.decode())
24
+ except subprocess.CalledProcessError as e:
25
+ print(f"Error converting markdown to HTML: {e.stderr.decode()}")
26
+
27
+ def style_htmls(self):
28
+ css_link = f'<link rel="stylesheet" type="text/css" href="/{self.css_path}">'
29
+
30
+ # Define el directorio de respaldo con marca de tiempo
31
+ timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
32
+ """
33
+ backup_directory = os.path.join(
34
+ self.templates_directory, f"backup_{timestamp}")
35
+
36
+ # Crea el directorio de respaldo si no existe
37
+ if not os.path.exists(backup_directory):
38
+ os.makedirs(backup_directory)
39
+ """
40
+ # Copia los archivos originales al directorio de respaldo
41
+ files = [f for f in os.listdir(
42
+ self.templates_directory) if f.endswith('.html')]
43
+ """
44
+ for file in files:
45
+ shutil.copy2(os.path.join(
46
+ self.templates_directory, file), backup_directory)
47
+ """
48
+ # Itera sobre cada archivo y realiza la sustitución
49
+ for file in files:
50
+ file_path = os.path.join(self.templates_directory, file)
51
+
52
+ # Lee el contenido del archivo
53
+ with open(file_path, 'r', encoding='utf-8') as f:
54
+ content = f.read()
55
+
56
+ # Agrega el enlace al CSS si no existe
57
+ if css_link not in content:
58
+ if '<head>' in content:
59
+ new_content = content.replace(
60
+ '<head>', f'<head>\n {css_link}')
61
+ elif '<head ' in content: # Manejo de variaciones de la etiqueta <head>
62
+ new_content = re.sub(
63
+ r'(<head\s*.*?>)', r'\1\n ' + css_link, content, flags=re.IGNORECASE)
64
+ else:
65
+ new_content = re.sub(r'(<html\s*.*?>)', r'\1\n<head>\n ' +
66
+ css_link + '\n</head>', content, flags=re.IGNORECASE)
67
+ else:
68
+ new_content = content
69
+
70
+ # Inserta el logo al final del body
71
+ if '<img id="logo" src="static/assets/logo.png"' not in new_content:
72
+ new_content = new_content.replace(
73
+ "</body>", '<img id="logo" src="/static/assets/logo.png" alt="Logo">\n</body>')
74
+
75
+ # Guarda el contenido modificado en el archivo
76
+ with open(file_path, 'w', encoding='utf-8') as f:
77
+ f.write(new_content)
78
+
79
+ print(
80
+ f"Enlace al CSS actualizado y logo añadido en todos los archivos HTML. Respaldo creado en el directorio 'backup_{timestamp}'.")
81
+
82
+ def generate_menu(self):
83
+ # Define el template del sidebar con comillas consistentes
84
+ sidebar_template = """
85
+ <div id="sidebar">
86
+ <h2>{0}</h2>
87
+ {1}
88
+ </div>
89
+ """
90
+
91
+ # Define el directorio de respaldo con marca de tiempo
92
+ timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
93
+ backup_directory = os.path.join(
94
+ self.templates_directory, f"backup_{timestamp}")
95
+
96
+ # Crea el directorio de respaldo si no existe
97
+ """
98
+ if not os.path.exists(backup_directory):
99
+ os.makedirs(backup_directory)
100
+ """
101
+ # Copia los archivos originales al directorio de respaldo
102
+ files = [f for f in os.listdir(
103
+ self.templates_directory) if f.endswith('.html')]
104
+ """
105
+ for file in files:
106
+ shutil.copy2(os.path.join(
107
+ self.templates_directory, file), backup_directory)
108
+ """
109
+ # Construye el sidebar con los enlaces a todos los archivos HTML
110
+ sidebar_links = ""
111
+ for file in files:
112
+ file_path = os.path.join(self.templates_directory, file)
113
+ with open(file_path, 'r', encoding='utf-8') as f:
114
+ content = f.read()
115
+ match = re.search(r"<title>(.*?)</title>", content)
116
+ if match:
117
+ title = match.group(1)
118
+ else:
119
+ # Usa el nombre del archivo si no se encuentra <title>
120
+ title = os.path.splitext(file)[0]
121
+
122
+ # Ajusta la ruta para Flask
123
+ sidebar_links += f'<a href="/templates/{file}">{title}</a>\n'
124
+
125
+ # Itera sobre cada archivo y realiza la modificación del título y la inserción del sidebar
126
+ for file in files:
127
+ file_path = os.path.join(self.templates_directory, file)
128
+
129
+ # Lee el contenido del archivo
130
+ with open(file_path, 'r', encoding='utf-8') as f:
131
+ content = f.read()
132
+
133
+ # Define el nuevo contenido con el sidebar
134
+ new_sidebar_links = re.sub(
135
+ f'<a href="/templates/{file}"', f'<a href="/templates/{file}" class="active"', sidebar_links)
136
+ sidebar = sidebar_template.format(
137
+ self.project_name, new_sidebar_links)
138
+
139
+ # Reemplaza o inserta el sidebar de manera robusta
140
+ if '<div id="sidebar">' in content:
141
+ new_content = re.sub(
142
+ r'<div id="sidebar">.*?</div>', sidebar, content, flags=re.DOTALL)
143
+ else:
144
+ new_content = re.sub(
145
+ r'(<body.*?>)', r'\1\n' + sidebar, content, flags=re.IGNORECASE)
146
+
147
+ # Guarda el contenido modificado en el archivo
148
+ with open(file_path, 'w', encoding='utf-8') as f:
149
+ f.write(new_content)
150
+
151
+ print(
152
+ f"Título y menú actualizados en todos los archivos HTML. Respaldo creado en el directorio 'backup_{timestamp}'.")
153
+
154
+
155
+ # Ejemplo de uso
156
+ if __name__ == '__main__':
157
+ service = MindMapService()
158
+ service.convert_markdown_to_html()
159
+ service.style_htmls()
160
+ service.generate_menu()
package-lock.json ADDED
@@ -0,0 +1,1214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "map-master",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "name": "map-master",
8
+ "dependencies": {
9
+ "markmap-lib": "^0.16.1",
10
+ "markmap-render": "^0.17.0",
11
+ "yaml-front-matter": "^4.1.1"
12
+ }
13
+ },
14
+ "node_modules/@babel/runtime": {
15
+ "version": "7.24.5",
16
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
17
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "regenerator-runtime": "^0.14.0"
21
+ },
22
+ "engines": {
23
+ "node": ">=6.9.0"
24
+ }
25
+ },
26
+ "node_modules/@gera2ld/jsx-dom": {
27
+ "version": "2.2.2",
28
+ "resolved": "https://registry.npmjs.org/@gera2ld/jsx-dom/-/jsx-dom-2.2.2.tgz",
29
+ "integrity": "sha512-EOqf31IATRE6zS1W1EoWmXZhGfLAoO9FIlwTtHduSrBdud4npYBxYAkv8dZ5hudDPwJeeSjn40kbCL4wAzr8dA==",
30
+ "license": "ISC",
31
+ "dependencies": {
32
+ "@babel/runtime": "^7.21.5"
33
+ }
34
+ },
35
+ "node_modules/@types/d3": {
36
+ "version": "7.4.3",
37
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
38
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
39
+ "license": "MIT",
40
+ "dependencies": {
41
+ "@types/d3-array": "*",
42
+ "@types/d3-axis": "*",
43
+ "@types/d3-brush": "*",
44
+ "@types/d3-chord": "*",
45
+ "@types/d3-color": "*",
46
+ "@types/d3-contour": "*",
47
+ "@types/d3-delaunay": "*",
48
+ "@types/d3-dispatch": "*",
49
+ "@types/d3-drag": "*",
50
+ "@types/d3-dsv": "*",
51
+ "@types/d3-ease": "*",
52
+ "@types/d3-fetch": "*",
53
+ "@types/d3-force": "*",
54
+ "@types/d3-format": "*",
55
+ "@types/d3-geo": "*",
56
+ "@types/d3-hierarchy": "*",
57
+ "@types/d3-interpolate": "*",
58
+ "@types/d3-path": "*",
59
+ "@types/d3-polygon": "*",
60
+ "@types/d3-quadtree": "*",
61
+ "@types/d3-random": "*",
62
+ "@types/d3-scale": "*",
63
+ "@types/d3-scale-chromatic": "*",
64
+ "@types/d3-selection": "*",
65
+ "@types/d3-shape": "*",
66
+ "@types/d3-time": "*",
67
+ "@types/d3-time-format": "*",
68
+ "@types/d3-timer": "*",
69
+ "@types/d3-transition": "*",
70
+ "@types/d3-zoom": "*"
71
+ }
72
+ },
73
+ "node_modules/@types/d3-array": {
74
+ "version": "3.2.1",
75
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
76
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
77
+ "license": "MIT"
78
+ },
79
+ "node_modules/@types/d3-axis": {
80
+ "version": "3.0.6",
81
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
82
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
83
+ "license": "MIT",
84
+ "dependencies": {
85
+ "@types/d3-selection": "*"
86
+ }
87
+ },
88
+ "node_modules/@types/d3-brush": {
89
+ "version": "3.0.6",
90
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
91
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
92
+ "license": "MIT",
93
+ "dependencies": {
94
+ "@types/d3-selection": "*"
95
+ }
96
+ },
97
+ "node_modules/@types/d3-chord": {
98
+ "version": "3.0.6",
99
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
100
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
101
+ "license": "MIT"
102
+ },
103
+ "node_modules/@types/d3-color": {
104
+ "version": "3.1.3",
105
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
106
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
107
+ "license": "MIT"
108
+ },
109
+ "node_modules/@types/d3-contour": {
110
+ "version": "3.0.6",
111
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
112
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
113
+ "license": "MIT",
114
+ "dependencies": {
115
+ "@types/d3-array": "*",
116
+ "@types/geojson": "*"
117
+ }
118
+ },
119
+ "node_modules/@types/d3-delaunay": {
120
+ "version": "6.0.4",
121
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
122
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
123
+ "license": "MIT"
124
+ },
125
+ "node_modules/@types/d3-dispatch": {
126
+ "version": "3.0.6",
127
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
128
+ "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==",
129
+ "license": "MIT"
130
+ },
131
+ "node_modules/@types/d3-drag": {
132
+ "version": "3.0.7",
133
+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
134
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
135
+ "license": "MIT",
136
+ "dependencies": {
137
+ "@types/d3-selection": "*"
138
+ }
139
+ },
140
+ "node_modules/@types/d3-dsv": {
141
+ "version": "3.0.7",
142
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
143
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
144
+ "license": "MIT"
145
+ },
146
+ "node_modules/@types/d3-ease": {
147
+ "version": "3.0.2",
148
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
149
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
150
+ "license": "MIT"
151
+ },
152
+ "node_modules/@types/d3-fetch": {
153
+ "version": "3.0.7",
154
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
155
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "@types/d3-dsv": "*"
159
+ }
160
+ },
161
+ "node_modules/@types/d3-force": {
162
+ "version": "3.0.9",
163
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz",
164
+ "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==",
165
+ "license": "MIT"
166
+ },
167
+ "node_modules/@types/d3-format": {
168
+ "version": "3.0.4",
169
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
170
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
171
+ "license": "MIT"
172
+ },
173
+ "node_modules/@types/d3-geo": {
174
+ "version": "3.1.0",
175
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
176
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
177
+ "license": "MIT",
178
+ "dependencies": {
179
+ "@types/geojson": "*"
180
+ }
181
+ },
182
+ "node_modules/@types/d3-hierarchy": {
183
+ "version": "3.1.7",
184
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
185
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
186
+ "license": "MIT"
187
+ },
188
+ "node_modules/@types/d3-interpolate": {
189
+ "version": "3.0.4",
190
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
191
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
192
+ "license": "MIT",
193
+ "dependencies": {
194
+ "@types/d3-color": "*"
195
+ }
196
+ },
197
+ "node_modules/@types/d3-path": {
198
+ "version": "3.1.0",
199
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
200
+ "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==",
201
+ "license": "MIT"
202
+ },
203
+ "node_modules/@types/d3-polygon": {
204
+ "version": "3.0.2",
205
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
206
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
207
+ "license": "MIT"
208
+ },
209
+ "node_modules/@types/d3-quadtree": {
210
+ "version": "3.0.6",
211
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
212
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
213
+ "license": "MIT"
214
+ },
215
+ "node_modules/@types/d3-random": {
216
+ "version": "3.0.3",
217
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
218
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
219
+ "license": "MIT"
220
+ },
221
+ "node_modules/@types/d3-scale": {
222
+ "version": "4.0.8",
223
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
224
+ "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
225
+ "license": "MIT",
226
+ "dependencies": {
227
+ "@types/d3-time": "*"
228
+ }
229
+ },
230
+ "node_modules/@types/d3-scale-chromatic": {
231
+ "version": "3.0.3",
232
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz",
233
+ "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==",
234
+ "license": "MIT"
235
+ },
236
+ "node_modules/@types/d3-selection": {
237
+ "version": "3.0.10",
238
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz",
239
+ "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==",
240
+ "license": "MIT"
241
+ },
242
+ "node_modules/@types/d3-shape": {
243
+ "version": "3.1.6",
244
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
245
+ "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
246
+ "license": "MIT",
247
+ "dependencies": {
248
+ "@types/d3-path": "*"
249
+ }
250
+ },
251
+ "node_modules/@types/d3-time": {
252
+ "version": "3.0.3",
253
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
254
+ "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==",
255
+ "license": "MIT"
256
+ },
257
+ "node_modules/@types/d3-time-format": {
258
+ "version": "4.0.3",
259
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
260
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
261
+ "license": "MIT"
262
+ },
263
+ "node_modules/@types/d3-timer": {
264
+ "version": "3.0.2",
265
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
266
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
267
+ "license": "MIT"
268
+ },
269
+ "node_modules/@types/d3-transition": {
270
+ "version": "3.0.8",
271
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz",
272
+ "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
273
+ "license": "MIT",
274
+ "dependencies": {
275
+ "@types/d3-selection": "*"
276
+ }
277
+ },
278
+ "node_modules/@types/d3-zoom": {
279
+ "version": "3.0.8",
280
+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
281
+ "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
282
+ "license": "MIT",
283
+ "dependencies": {
284
+ "@types/d3-interpolate": "*",
285
+ "@types/d3-selection": "*"
286
+ }
287
+ },
288
+ "node_modules/@types/geojson": {
289
+ "version": "7946.0.14",
290
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
291
+ "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==",
292
+ "license": "MIT"
293
+ },
294
+ "node_modules/argparse": {
295
+ "version": "2.0.1",
296
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
297
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
298
+ "license": "Python-2.0"
299
+ },
300
+ "node_modules/autolinker": {
301
+ "version": "3.16.2",
302
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz",
303
+ "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==",
304
+ "dependencies": {
305
+ "tslib": "^2.3.0"
306
+ }
307
+ },
308
+ "node_modules/boolbase": {
309
+ "version": "1.0.0",
310
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
311
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
312
+ },
313
+ "node_modules/cheerio": {
314
+ "version": "1.0.0-rc.12",
315
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
316
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
317
+ "dependencies": {
318
+ "cheerio-select": "^2.1.0",
319
+ "dom-serializer": "^2.0.0",
320
+ "domhandler": "^5.0.3",
321
+ "domutils": "^3.0.1",
322
+ "htmlparser2": "^8.0.1",
323
+ "parse5": "^7.0.0",
324
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
325
+ },
326
+ "engines": {
327
+ "node": ">= 6"
328
+ },
329
+ "funding": {
330
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
331
+ }
332
+ },
333
+ "node_modules/cheerio-select": {
334
+ "version": "2.1.0",
335
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
336
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
337
+ "dependencies": {
338
+ "boolbase": "^1.0.0",
339
+ "css-select": "^5.1.0",
340
+ "css-what": "^6.1.0",
341
+ "domelementtype": "^2.3.0",
342
+ "domhandler": "^5.0.3",
343
+ "domutils": "^3.0.1"
344
+ },
345
+ "funding": {
346
+ "url": "https://github.com/sponsors/fb55"
347
+ }
348
+ },
349
+ "node_modules/commander": {
350
+ "version": "8.3.0",
351
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
352
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
353
+ "license": "MIT",
354
+ "engines": {
355
+ "node": ">= 12"
356
+ }
357
+ },
358
+ "node_modules/css-select": {
359
+ "version": "5.1.0",
360
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
361
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
362
+ "dependencies": {
363
+ "boolbase": "^1.0.0",
364
+ "css-what": "^6.1.0",
365
+ "domhandler": "^5.0.2",
366
+ "domutils": "^3.0.1",
367
+ "nth-check": "^2.0.1"
368
+ },
369
+ "funding": {
370
+ "url": "https://github.com/sponsors/fb55"
371
+ }
372
+ },
373
+ "node_modules/css-what": {
374
+ "version": "6.1.0",
375
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
376
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
377
+ "engines": {
378
+ "node": ">= 6"
379
+ },
380
+ "funding": {
381
+ "url": "https://github.com/sponsors/fb55"
382
+ }
383
+ },
384
+ "node_modules/d3": {
385
+ "version": "7.9.0",
386
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
387
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
388
+ "license": "ISC",
389
+ "dependencies": {
390
+ "d3-array": "3",
391
+ "d3-axis": "3",
392
+ "d3-brush": "3",
393
+ "d3-chord": "3",
394
+ "d3-color": "3",
395
+ "d3-contour": "4",
396
+ "d3-delaunay": "6",
397
+ "d3-dispatch": "3",
398
+ "d3-drag": "3",
399
+ "d3-dsv": "3",
400
+ "d3-ease": "3",
401
+ "d3-fetch": "3",
402
+ "d3-force": "3",
403
+ "d3-format": "3",
404
+ "d3-geo": "3",
405
+ "d3-hierarchy": "3",
406
+ "d3-interpolate": "3",
407
+ "d3-path": "3",
408
+ "d3-polygon": "3",
409
+ "d3-quadtree": "3",
410
+ "d3-random": "3",
411
+ "d3-scale": "4",
412
+ "d3-scale-chromatic": "3",
413
+ "d3-selection": "3",
414
+ "d3-shape": "3",
415
+ "d3-time": "3",
416
+ "d3-time-format": "4",
417
+ "d3-timer": "3",
418
+ "d3-transition": "3",
419
+ "d3-zoom": "3"
420
+ },
421
+ "engines": {
422
+ "node": ">=12"
423
+ }
424
+ },
425
+ "node_modules/d3-array": {
426
+ "version": "3.2.4",
427
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
428
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
429
+ "license": "ISC",
430
+ "dependencies": {
431
+ "internmap": "1 - 2"
432
+ },
433
+ "engines": {
434
+ "node": ">=12"
435
+ }
436
+ },
437
+ "node_modules/d3-axis": {
438
+ "version": "3.0.0",
439
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
440
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
441
+ "license": "ISC",
442
+ "engines": {
443
+ "node": ">=12"
444
+ }
445
+ },
446
+ "node_modules/d3-brush": {
447
+ "version": "3.0.0",
448
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
449
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
450
+ "license": "ISC",
451
+ "dependencies": {
452
+ "d3-dispatch": "1 - 3",
453
+ "d3-drag": "2 - 3",
454
+ "d3-interpolate": "1 - 3",
455
+ "d3-selection": "3",
456
+ "d3-transition": "3"
457
+ },
458
+ "engines": {
459
+ "node": ">=12"
460
+ }
461
+ },
462
+ "node_modules/d3-chord": {
463
+ "version": "3.0.1",
464
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
465
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
466
+ "license": "ISC",
467
+ "dependencies": {
468
+ "d3-path": "1 - 3"
469
+ },
470
+ "engines": {
471
+ "node": ">=12"
472
+ }
473
+ },
474
+ "node_modules/d3-color": {
475
+ "version": "3.1.0",
476
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
477
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
478
+ "license": "ISC",
479
+ "engines": {
480
+ "node": ">=12"
481
+ }
482
+ },
483
+ "node_modules/d3-contour": {
484
+ "version": "4.0.2",
485
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
486
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
487
+ "license": "ISC",
488
+ "dependencies": {
489
+ "d3-array": "^3.2.0"
490
+ },
491
+ "engines": {
492
+ "node": ">=12"
493
+ }
494
+ },
495
+ "node_modules/d3-delaunay": {
496
+ "version": "6.0.4",
497
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
498
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
499
+ "license": "ISC",
500
+ "dependencies": {
501
+ "delaunator": "5"
502
+ },
503
+ "engines": {
504
+ "node": ">=12"
505
+ }
506
+ },
507
+ "node_modules/d3-dispatch": {
508
+ "version": "3.0.1",
509
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
510
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
511
+ "license": "ISC",
512
+ "engines": {
513
+ "node": ">=12"
514
+ }
515
+ },
516
+ "node_modules/d3-drag": {
517
+ "version": "3.0.0",
518
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
519
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
520
+ "license": "ISC",
521
+ "dependencies": {
522
+ "d3-dispatch": "1 - 3",
523
+ "d3-selection": "3"
524
+ },
525
+ "engines": {
526
+ "node": ">=12"
527
+ }
528
+ },
529
+ "node_modules/d3-dsv": {
530
+ "version": "3.0.1",
531
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
532
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
533
+ "license": "ISC",
534
+ "dependencies": {
535
+ "commander": "7",
536
+ "iconv-lite": "0.6",
537
+ "rw": "1"
538
+ },
539
+ "bin": {
540
+ "csv2json": "bin/dsv2json.js",
541
+ "csv2tsv": "bin/dsv2dsv.js",
542
+ "dsv2dsv": "bin/dsv2dsv.js",
543
+ "dsv2json": "bin/dsv2json.js",
544
+ "json2csv": "bin/json2dsv.js",
545
+ "json2dsv": "bin/json2dsv.js",
546
+ "json2tsv": "bin/json2dsv.js",
547
+ "tsv2csv": "bin/dsv2dsv.js",
548
+ "tsv2json": "bin/dsv2json.js"
549
+ },
550
+ "engines": {
551
+ "node": ">=12"
552
+ }
553
+ },
554
+ "node_modules/d3-dsv/node_modules/commander": {
555
+ "version": "7.2.0",
556
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
557
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
558
+ "license": "MIT",
559
+ "engines": {
560
+ "node": ">= 10"
561
+ }
562
+ },
563
+ "node_modules/d3-ease": {
564
+ "version": "3.0.1",
565
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
566
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
567
+ "license": "BSD-3-Clause",
568
+ "engines": {
569
+ "node": ">=12"
570
+ }
571
+ },
572
+ "node_modules/d3-fetch": {
573
+ "version": "3.0.1",
574
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
575
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
576
+ "license": "ISC",
577
+ "dependencies": {
578
+ "d3-dsv": "1 - 3"
579
+ },
580
+ "engines": {
581
+ "node": ">=12"
582
+ }
583
+ },
584
+ "node_modules/d3-flextree": {
585
+ "version": "2.1.2",
586
+ "resolved": "https://registry.npmjs.org/d3-flextree/-/d3-flextree-2.1.2.tgz",
587
+ "integrity": "sha512-gJiHrx5uTTHq44bjyIb3xpbmmdZcWLYPKeO9EPVOq8EylMFOiH2+9sWqKAiQ4DcFuOZTAxPOQyv0Rnmji/g15A==",
588
+ "license": "WTFPL",
589
+ "dependencies": {
590
+ "d3-hierarchy": "^1.1.5"
591
+ }
592
+ },
593
+ "node_modules/d3-flextree/node_modules/d3-hierarchy": {
594
+ "version": "1.1.9",
595
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
596
+ "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==",
597
+ "license": "BSD-3-Clause"
598
+ },
599
+ "node_modules/d3-force": {
600
+ "version": "3.0.0",
601
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
602
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
603
+ "license": "ISC",
604
+ "dependencies": {
605
+ "d3-dispatch": "1 - 3",
606
+ "d3-quadtree": "1 - 3",
607
+ "d3-timer": "1 - 3"
608
+ },
609
+ "engines": {
610
+ "node": ">=12"
611
+ }
612
+ },
613
+ "node_modules/d3-format": {
614
+ "version": "3.1.0",
615
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
616
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
617
+ "license": "ISC",
618
+ "engines": {
619
+ "node": ">=12"
620
+ }
621
+ },
622
+ "node_modules/d3-geo": {
623
+ "version": "3.1.1",
624
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
625
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
626
+ "license": "ISC",
627
+ "dependencies": {
628
+ "d3-array": "2.5.0 - 3"
629
+ },
630
+ "engines": {
631
+ "node": ">=12"
632
+ }
633
+ },
634
+ "node_modules/d3-hierarchy": {
635
+ "version": "3.1.2",
636
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
637
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
638
+ "license": "ISC",
639
+ "engines": {
640
+ "node": ">=12"
641
+ }
642
+ },
643
+ "node_modules/d3-interpolate": {
644
+ "version": "3.0.1",
645
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
646
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
647
+ "license": "ISC",
648
+ "dependencies": {
649
+ "d3-color": "1 - 3"
650
+ },
651
+ "engines": {
652
+ "node": ">=12"
653
+ }
654
+ },
655
+ "node_modules/d3-path": {
656
+ "version": "3.1.0",
657
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
658
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
659
+ "license": "ISC",
660
+ "engines": {
661
+ "node": ">=12"
662
+ }
663
+ },
664
+ "node_modules/d3-polygon": {
665
+ "version": "3.0.1",
666
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
667
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
668
+ "license": "ISC",
669
+ "engines": {
670
+ "node": ">=12"
671
+ }
672
+ },
673
+ "node_modules/d3-quadtree": {
674
+ "version": "3.0.1",
675
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
676
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
677
+ "license": "ISC",
678
+ "engines": {
679
+ "node": ">=12"
680
+ }
681
+ },
682
+ "node_modules/d3-random": {
683
+ "version": "3.0.1",
684
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
685
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
686
+ "license": "ISC",
687
+ "engines": {
688
+ "node": ">=12"
689
+ }
690
+ },
691
+ "node_modules/d3-scale": {
692
+ "version": "4.0.2",
693
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
694
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
695
+ "license": "ISC",
696
+ "dependencies": {
697
+ "d3-array": "2.10.0 - 3",
698
+ "d3-format": "1 - 3",
699
+ "d3-interpolate": "1.2.0 - 3",
700
+ "d3-time": "2.1.1 - 3",
701
+ "d3-time-format": "2 - 4"
702
+ },
703
+ "engines": {
704
+ "node": ">=12"
705
+ }
706
+ },
707
+ "node_modules/d3-scale-chromatic": {
708
+ "version": "3.1.0",
709
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
710
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
711
+ "license": "ISC",
712
+ "dependencies": {
713
+ "d3-color": "1 - 3",
714
+ "d3-interpolate": "1 - 3"
715
+ },
716
+ "engines": {
717
+ "node": ">=12"
718
+ }
719
+ },
720
+ "node_modules/d3-selection": {
721
+ "version": "3.0.0",
722
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
723
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
724
+ "license": "ISC",
725
+ "engines": {
726
+ "node": ">=12"
727
+ }
728
+ },
729
+ "node_modules/d3-shape": {
730
+ "version": "3.2.0",
731
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
732
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
733
+ "license": "ISC",
734
+ "dependencies": {
735
+ "d3-path": "^3.1.0"
736
+ },
737
+ "engines": {
738
+ "node": ">=12"
739
+ }
740
+ },
741
+ "node_modules/d3-time": {
742
+ "version": "3.1.0",
743
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
744
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
745
+ "license": "ISC",
746
+ "dependencies": {
747
+ "d3-array": "2 - 3"
748
+ },
749
+ "engines": {
750
+ "node": ">=12"
751
+ }
752
+ },
753
+ "node_modules/d3-time-format": {
754
+ "version": "4.1.0",
755
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
756
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
757
+ "license": "ISC",
758
+ "dependencies": {
759
+ "d3-time": "1 - 3"
760
+ },
761
+ "engines": {
762
+ "node": ">=12"
763
+ }
764
+ },
765
+ "node_modules/d3-timer": {
766
+ "version": "3.0.1",
767
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
768
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
769
+ "license": "ISC",
770
+ "engines": {
771
+ "node": ">=12"
772
+ }
773
+ },
774
+ "node_modules/d3-transition": {
775
+ "version": "3.0.1",
776
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
777
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
778
+ "license": "ISC",
779
+ "dependencies": {
780
+ "d3-color": "1 - 3",
781
+ "d3-dispatch": "1 - 3",
782
+ "d3-ease": "1 - 3",
783
+ "d3-interpolate": "1 - 3",
784
+ "d3-timer": "1 - 3"
785
+ },
786
+ "engines": {
787
+ "node": ">=12"
788
+ },
789
+ "peerDependencies": {
790
+ "d3-selection": "2 - 3"
791
+ }
792
+ },
793
+ "node_modules/d3-zoom": {
794
+ "version": "3.0.0",
795
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
796
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
797
+ "license": "ISC",
798
+ "dependencies": {
799
+ "d3-dispatch": "1 - 3",
800
+ "d3-drag": "2 - 3",
801
+ "d3-interpolate": "1 - 3",
802
+ "d3-selection": "2 - 3",
803
+ "d3-transition": "2 - 3"
804
+ },
805
+ "engines": {
806
+ "node": ">=12"
807
+ }
808
+ },
809
+ "node_modules/delaunator": {
810
+ "version": "5.0.1",
811
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
812
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
813
+ "license": "ISC",
814
+ "dependencies": {
815
+ "robust-predicates": "^3.0.2"
816
+ }
817
+ },
818
+ "node_modules/dom-serializer": {
819
+ "version": "2.0.0",
820
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
821
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
822
+ "dependencies": {
823
+ "domelementtype": "^2.3.0",
824
+ "domhandler": "^5.0.2",
825
+ "entities": "^4.2.0"
826
+ },
827
+ "funding": {
828
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
829
+ }
830
+ },
831
+ "node_modules/domelementtype": {
832
+ "version": "2.3.0",
833
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
834
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
835
+ "funding": [
836
+ {
837
+ "type": "github",
838
+ "url": "https://github.com/sponsors/fb55"
839
+ }
840
+ ]
841
+ },
842
+ "node_modules/domhandler": {
843
+ "version": "5.0.3",
844
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
845
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
846
+ "dependencies": {
847
+ "domelementtype": "^2.3.0"
848
+ },
849
+ "engines": {
850
+ "node": ">= 4"
851
+ },
852
+ "funding": {
853
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
854
+ }
855
+ },
856
+ "node_modules/domutils": {
857
+ "version": "3.1.0",
858
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
859
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
860
+ "dependencies": {
861
+ "dom-serializer": "^2.0.0",
862
+ "domelementtype": "^2.3.0",
863
+ "domhandler": "^5.0.3"
864
+ },
865
+ "funding": {
866
+ "url": "https://github.com/fb55/domutils?sponsor=1"
867
+ }
868
+ },
869
+ "node_modules/entities": {
870
+ "version": "4.5.0",
871
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
872
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
873
+ "engines": {
874
+ "node": ">=0.12"
875
+ },
876
+ "funding": {
877
+ "url": "https://github.com/fb55/entities?sponsor=1"
878
+ }
879
+ },
880
+ "node_modules/esprima": {
881
+ "version": "4.0.1",
882
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
883
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
884
+ "license": "BSD-2-Clause",
885
+ "bin": {
886
+ "esparse": "bin/esparse.js",
887
+ "esvalidate": "bin/esvalidate.js"
888
+ },
889
+ "engines": {
890
+ "node": ">=4"
891
+ }
892
+ },
893
+ "node_modules/highlight.js": {
894
+ "version": "11.9.0",
895
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz",
896
+ "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==",
897
+ "license": "BSD-3-Clause",
898
+ "engines": {
899
+ "node": ">=12.0.0"
900
+ }
901
+ },
902
+ "node_modules/htmlparser2": {
903
+ "version": "8.0.2",
904
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
905
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
906
+ "funding": [
907
+ "https://github.com/fb55/htmlparser2?sponsor=1",
908
+ {
909
+ "type": "github",
910
+ "url": "https://github.com/sponsors/fb55"
911
+ }
912
+ ],
913
+ "dependencies": {
914
+ "domelementtype": "^2.3.0",
915
+ "domhandler": "^5.0.3",
916
+ "domutils": "^3.0.1",
917
+ "entities": "^4.4.0"
918
+ }
919
+ },
920
+ "node_modules/iconv-lite": {
921
+ "version": "0.6.3",
922
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
923
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
924
+ "license": "MIT",
925
+ "dependencies": {
926
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
927
+ },
928
+ "engines": {
929
+ "node": ">=0.10.0"
930
+ }
931
+ },
932
+ "node_modules/internmap": {
933
+ "version": "2.0.3",
934
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
935
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
936
+ "license": "ISC",
937
+ "engines": {
938
+ "node": ">=12"
939
+ }
940
+ },
941
+ "node_modules/js-yaml": {
942
+ "version": "4.1.0",
943
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
944
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
945
+ "license": "MIT",
946
+ "dependencies": {
947
+ "argparse": "^2.0.1"
948
+ },
949
+ "bin": {
950
+ "js-yaml": "bin/js-yaml.js"
951
+ }
952
+ },
953
+ "node_modules/katex": {
954
+ "version": "0.16.10",
955
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz",
956
+ "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==",
957
+ "funding": [
958
+ "https://opencollective.com/katex",
959
+ "https://github.com/sponsors/katex"
960
+ ],
961
+ "license": "MIT",
962
+ "dependencies": {
963
+ "commander": "^8.3.0"
964
+ },
965
+ "bin": {
966
+ "katex": "cli.js"
967
+ }
968
+ },
969
+ "node_modules/markmap-common": {
970
+ "version": "0.17.0",
971
+ "resolved": "https://registry.npmjs.org/markmap-common/-/markmap-common-0.17.0.tgz",
972
+ "integrity": "sha512-3tuU6PxjrQxivZD18czJKcGKTTRJKMNne1bBflcHqu7yASznJRBM80CC4DzIVGiAb74hTuX8tTfkEQUMu0yKMg==",
973
+ "license": "MIT",
974
+ "peer": true,
975
+ "dependencies": {
976
+ "@babel/runtime": "^7.22.6",
977
+ "@gera2ld/jsx-dom": "^2.2.2",
978
+ "npm2url": "^0.2.4"
979
+ }
980
+ },
981
+ "node_modules/markmap-html-parser": {
982
+ "version": "0.16.1",
983
+ "resolved": "https://registry.npmjs.org/markmap-html-parser/-/markmap-html-parser-0.16.1.tgz",
984
+ "integrity": "sha512-/Mgm4g1qMQ8uEOz8h8K+jPspdgjfw29NqmfTLZSt8yG+vW7fWWduPjGRFc5axAZxCzP7PTzZLEuOxAqOwEg8Bg==",
985
+ "dependencies": {
986
+ "@babel/runtime": "^7.22.6",
987
+ "cheerio": "1.0.0-rc.12"
988
+ },
989
+ "peerDependencies": {
990
+ "markmap-common": "*"
991
+ }
992
+ },
993
+ "node_modules/markmap-lib": {
994
+ "version": "0.16.1",
995
+ "resolved": "https://registry.npmjs.org/markmap-lib/-/markmap-lib-0.16.1.tgz",
996
+ "integrity": "sha512-jD8VsB67m677IRehGSwwVJDlC6PS+xzDKsJOwdvjZ+ndfXrHa1lyqfvR6mIwvGGUIciF86YEITSKL9hQTHE4Rw==",
997
+ "dependencies": {
998
+ "@babel/runtime": "^7.22.6",
999
+ "highlight.js": "^11.8.0",
1000
+ "js-yaml": "^4.1.0",
1001
+ "katex": "^0.16.8",
1002
+ "markmap-html-parser": "0.16.1",
1003
+ "markmap-view": "0.16.0",
1004
+ "prismjs": "^1.29.0",
1005
+ "remarkable": "^2.0.1",
1006
+ "remarkable-katex": "^1.2.1"
1007
+ },
1008
+ "peerDependencies": {
1009
+ "markmap-common": "*"
1010
+ }
1011
+ },
1012
+ "node_modules/markmap-lib/node_modules/markmap-view": {
1013
+ "version": "0.16.0",
1014
+ "resolved": "https://registry.npmjs.org/markmap-view/-/markmap-view-0.16.0.tgz",
1015
+ "integrity": "sha512-JOiSEThs8B4bAP9E6rcCWOz2SsMwCBFaR76wLARRVb04C/qLiLmvrm675kNPq4lRBAwtugHCYvjG0otpSlB4Cw==",
1016
+ "dependencies": {
1017
+ "@babel/runtime": "^7.22.6",
1018
+ "@gera2ld/jsx-dom": "^2.2.2",
1019
+ "@types/d3": "^7.4.0",
1020
+ "d3": "^7.8.5",
1021
+ "d3-flextree": "^2.1.2"
1022
+ },
1023
+ "peerDependencies": {
1024
+ "markmap-common": "*"
1025
+ }
1026
+ },
1027
+ "node_modules/markmap-render": {
1028
+ "version": "0.17.0",
1029
+ "resolved": "https://registry.npmjs.org/markmap-render/-/markmap-render-0.17.0.tgz",
1030
+ "integrity": "sha512-xSJ7stB2nhdVD5FImCNc6lKfDSt8P9zqV4K5GbbqS/5ByJei4Ssdnl7aI2iKOTkM9m8NlJcDrn+jHorNIgFwbQ==",
1031
+ "license": "MIT",
1032
+ "dependencies": {
1033
+ "@babel/runtime": "^7.22.6",
1034
+ "markmap-view": "0.17.0"
1035
+ },
1036
+ "peerDependencies": {
1037
+ "markmap-common": "*"
1038
+ }
1039
+ },
1040
+ "node_modules/markmap-view": {
1041
+ "version": "0.17.0",
1042
+ "resolved": "https://registry.npmjs.org/markmap-view/-/markmap-view-0.17.0.tgz",
1043
+ "integrity": "sha512-V4n5gXbIk7b/ns/gzoNoMaRu7Es+9OLUqfRqj/EiWuiYMlmmQ/rN8NDCgPcuTAnr0hJmor7UXaKYqWL275LspA==",
1044
+ "license": "MIT",
1045
+ "dependencies": {
1046
+ "@babel/runtime": "^7.22.6",
1047
+ "@gera2ld/jsx-dom": "^2.2.2",
1048
+ "@types/d3": "^7.4.0",
1049
+ "d3": "^7.8.5",
1050
+ "d3-flextree": "^2.1.2"
1051
+ },
1052
+ "peerDependencies": {
1053
+ "markmap-common": "*"
1054
+ }
1055
+ },
1056
+ "node_modules/npm2url": {
1057
+ "version": "0.2.4",
1058
+ "resolved": "https://registry.npmjs.org/npm2url/-/npm2url-0.2.4.tgz",
1059
+ "integrity": "sha512-arzGp/hQz0Ey+ZGhF64XVH7Xqwd+1Q/po5uGiBbzph8ebX6T0uvt3N7c1nBHQNsQVykQgHhqoRTX7JFcHecGuw==",
1060
+ "license": "MIT",
1061
+ "peer": true
1062
+ },
1063
+ "node_modules/nth-check": {
1064
+ "version": "2.1.1",
1065
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
1066
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
1067
+ "dependencies": {
1068
+ "boolbase": "^1.0.0"
1069
+ },
1070
+ "funding": {
1071
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
1072
+ }
1073
+ },
1074
+ "node_modules/parse5": {
1075
+ "version": "7.1.2",
1076
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
1077
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
1078
+ "dependencies": {
1079
+ "entities": "^4.4.0"
1080
+ },
1081
+ "funding": {
1082
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
1083
+ }
1084
+ },
1085
+ "node_modules/parse5-htmlparser2-tree-adapter": {
1086
+ "version": "7.0.0",
1087
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
1088
+ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
1089
+ "dependencies": {
1090
+ "domhandler": "^5.0.2",
1091
+ "parse5": "^7.0.0"
1092
+ },
1093
+ "funding": {
1094
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
1095
+ }
1096
+ },
1097
+ "node_modules/prismjs": {
1098
+ "version": "1.29.0",
1099
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
1100
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
1101
+ "license": "MIT",
1102
+ "engines": {
1103
+ "node": ">=6"
1104
+ }
1105
+ },
1106
+ "node_modules/regenerator-runtime": {
1107
+ "version": "0.14.1",
1108
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
1109
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
1110
+ "license": "MIT"
1111
+ },
1112
+ "node_modules/remarkable": {
1113
+ "version": "2.0.1",
1114
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz",
1115
+ "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==",
1116
+ "dependencies": {
1117
+ "argparse": "^1.0.10",
1118
+ "autolinker": "^3.11.0"
1119
+ },
1120
+ "bin": {
1121
+ "remarkable": "bin/remarkable.js"
1122
+ },
1123
+ "engines": {
1124
+ "node": ">= 6.0.0"
1125
+ }
1126
+ },
1127
+ "node_modules/remarkable-katex": {
1128
+ "version": "1.2.1",
1129
+ "resolved": "https://registry.npmjs.org/remarkable-katex/-/remarkable-katex-1.2.1.tgz",
1130
+ "integrity": "sha512-Y1VquJBZnaVsfsVcKW2hmjT+pDL7mp8l5WAVlvuvViltrdok2m1AIKmJv8SsH+mBY84PoMw67t3kTWw1dIm8+g=="
1131
+ },
1132
+ "node_modules/remarkable/node_modules/argparse": {
1133
+ "version": "1.0.10",
1134
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
1135
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
1136
+ "dependencies": {
1137
+ "sprintf-js": "~1.0.2"
1138
+ }
1139
+ },
1140
+ "node_modules/robust-predicates": {
1141
+ "version": "3.0.2",
1142
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
1143
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
1144
+ "license": "Unlicense"
1145
+ },
1146
+ "node_modules/rw": {
1147
+ "version": "1.3.3",
1148
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
1149
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
1150
+ "license": "BSD-3-Clause"
1151
+ },
1152
+ "node_modules/safer-buffer": {
1153
+ "version": "2.1.2",
1154
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1155
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1156
+ "license": "MIT"
1157
+ },
1158
+ "node_modules/sprintf-js": {
1159
+ "version": "1.0.3",
1160
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1161
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
1162
+ "license": "BSD-3-Clause"
1163
+ },
1164
+ "node_modules/tslib": {
1165
+ "version": "2.6.2",
1166
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1167
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
1168
+ },
1169
+ "node_modules/yaml-front-matter": {
1170
+ "version": "4.1.1",
1171
+ "resolved": "https://registry.npmjs.org/yaml-front-matter/-/yaml-front-matter-4.1.1.tgz",
1172
+ "integrity": "sha512-ULGbghCLsN8Hs8vfExlqrJIe8Hl2TUjD7/zsIGMP8U+dgRXEsDXk4yydxeZJgdGiimP1XB7zhmhOB4/HyfqOyQ==",
1173
+ "license": "MIT",
1174
+ "dependencies": {
1175
+ "commander": "^6.2.0",
1176
+ "js-yaml": "^3.14.1"
1177
+ },
1178
+ "bin": {
1179
+ "yaml-front-matter": "bin/js-yaml-front.js"
1180
+ }
1181
+ },
1182
+ "node_modules/yaml-front-matter/node_modules/argparse": {
1183
+ "version": "1.0.10",
1184
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
1185
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
1186
+ "license": "MIT",
1187
+ "dependencies": {
1188
+ "sprintf-js": "~1.0.2"
1189
+ }
1190
+ },
1191
+ "node_modules/yaml-front-matter/node_modules/commander": {
1192
+ "version": "6.2.1",
1193
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
1194
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
1195
+ "license": "MIT",
1196
+ "engines": {
1197
+ "node": ">= 6"
1198
+ }
1199
+ },
1200
+ "node_modules/yaml-front-matter/node_modules/js-yaml": {
1201
+ "version": "3.14.1",
1202
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
1203
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
1204
+ "license": "MIT",
1205
+ "dependencies": {
1206
+ "argparse": "^1.0.7",
1207
+ "esprima": "^4.0.0"
1208
+ },
1209
+ "bin": {
1210
+ "js-yaml": "bin/js-yaml.js"
1211
+ }
1212
+ }
1213
+ }
1214
+ }
package.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "dependencies": {
3
+ "markmap-lib": "^0.16.1",
4
+ "markmap-render": "^0.17.0",
5
+ "yaml-front-matter": "^4.1.1"
6
+ }
7
+ }
project-title.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ MapMaster
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Flask
2
+ python-dotenv
3
+ openai
4
+ gunicorn
rollback.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import shutil
3
+ from datetime import datetime
4
+
5
+ # Obtiene el directorio del script actual
6
+ script_directory = os.path.dirname(os.path.abspath(__file__))
7
+
8
+ # Obtiene todos los directorios de respaldo ordenados por fecha
9
+ backup_directories = sorted(
10
+ [d for d in os.listdir(script_directory) if d.startswith('backup_')],
11
+ key=lambda x: os.path.getmtime(os.path.join(script_directory, x)),
12
+ reverse=True
13
+ )
14
+
15
+ # Verifica si existen directorios de respaldo
16
+ if not backup_directories:
17
+ print("No se encontraron directorios de respaldo. No se puede realizar el rollback.")
18
+ exit()
19
+
20
+ # Selecciona el último directorio de respaldo
21
+ latest_backup_directory = os.path.join(script_directory, backup_directories[0])
22
+
23
+ # Restaura los archivos originales desde el último directorio de respaldo
24
+ backup_files = [f for f in os.listdir(
25
+ latest_backup_directory) if f.endswith('.html')]
26
+ for file in backup_files:
27
+ shutil.copy2(os.path.join(latest_backup_directory, file), script_directory)
28
+
29
+ # Elimina el último directorio de respaldo
30
+ shutil.rmtree(latest_backup_directory)
31
+
32
+ print(
33
+ f"Rollback completado. Los archivos originales han sido restaurados desde '{latest_backup_directory}' y el respaldo ha sido eliminado.")
static/assets/logo.png ADDED
static/css/styles.css ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ font-family: Arial, sans-serif;
5
+ }
6
+
7
+ body {
8
+ background-color: #242e3d;
9
+ color: white;
10
+ }
11
+
12
+ #mindmap {
13
+ display: block;
14
+ width: 100vw;
15
+ height: 100vh;
16
+ color: white;
17
+ }
18
+
19
+ #sidebar {
20
+ position: fixed;
21
+ left: 0;
22
+ top: 0;
23
+ width: 200px;
24
+ height: 100%;
25
+ background-color: #33475b;
26
+ color: white;
27
+ padding: 10px;
28
+ box-sizing: border-box;
29
+ overflow-y: auto;
30
+ }
31
+
32
+ #sidebar h2 {
33
+ font-size: 24px;
34
+ text-align: center;
35
+ margin-bottom: 20px;
36
+ }
37
+
38
+ #sidebar a {
39
+ display: block;
40
+ color: white;
41
+ padding: 10px 20px;
42
+ text-decoration: none;
43
+ transition: background-color 0.3s;
44
+ }
45
+
46
+ #sidebar a.active {
47
+ background-color: #4caf50;
48
+ color: white;
49
+ }
50
+
51
+ #sidebar a:hover:not(.active) {
52
+ background-color: #555;
53
+ color: white;
54
+ }
55
+
56
+ #logo {
57
+ position: fixed;
58
+ bottom: 10px;
59
+ right: 10px;
60
+ width: 50px;
61
+ height: auto;
62
+ }
63
+
64
+ #loading {
65
+ display: none;
66
+ color: white;
67
+ text-align: center;
68
+ }
69
+
70
+ #response-container {
71
+ background-color: white;
72
+ color: black;
73
+ padding: 10px;
74
+ border-radius: 5px;
75
+ margin-top: 20px;
76
+ }
77
+
78
+ pre {
79
+ white-space: pre-wrap;
80
+ word-wrap: break-word;
81
+ background-color: #f8f9fa;
82
+ padding: 10px;
83
+ border-radius: 5px;
84
+ }
85
+
86
+ #settings {
87
+ position: fixed;
88
+ top: 10px;
89
+ right: 10px;
90
+ cursor: pointer;
91
+ font-size: 24px;
92
+ color: white;
93
+ }
94
+
95
+ #settings-menu {
96
+ display: none;
97
+ position: fixed;
98
+ top: 40px;
99
+ right: 10px;
100
+ background-color: #33475b;
101
+ padding: 10px;
102
+ border-radius: 5px;
103
+ }
104
+
105
+ #settings-menu ul {
106
+ list-style: none;
107
+ padding: 0;
108
+ }
109
+
110
+ #settings-menu ul li {
111
+ padding: 5px 0;
112
+ }
113
+
114
+ #settings-menu ul li a {
115
+ color: white;
116
+ text-decoration: none;
117
+ }
118
+
119
+ #settings-menu ul li a:hover {
120
+ text-decoration: underline;
121
+ }
122
+
123
+ #response-container ul {
124
+ list-style-type: none;
125
+ padding: 0;
126
+ margin: 0;
127
+ max-width: 600px;
128
+ margin: auto;
129
+ }
130
+
131
+ #response-container ul li {
132
+ background: #fff;
133
+ margin: 10px 0;
134
+ padding: 15px;
135
+ border-radius: 5px;
136
+ display: flex;
137
+ justify-content: space-between;
138
+ align-items: center;
139
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
140
+ transition: background 0.3s;
141
+ }
142
+
143
+ #response-container ul li:hover {
144
+ background: #f9f9f9;
145
+ }
146
+
147
+ #response-container ul li button {
148
+ background-color: #ff6b6b;
149
+ border: none;
150
+ color: white;
151
+ padding: 10px 15px;
152
+ border-radius: 5px;
153
+ cursor: pointer;
154
+ font-size: 14px;
155
+ transition: background-color 0.3s;
156
+ }
157
+
158
+ #response-container ul li button:hover {
159
+ background-color: #ff4c4c;
160
+ }
161
+
162
+ #response-container ul li span {
163
+ flex-grow: 1;
164
+ margin-right: 10px;
165
+ }
templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
+ <title>Impresionismo Español</title>
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ #mindmap {
15
+ display: block;
16
+ width: 100vw;
17
+ height: 100vh;
18
+ }
19
+ </style>
20
+
21
+ </head>
22
+ <body>
23
+
24
+ <div id="sidebar">
25
+ <h2>Project</h2>
26
+ <a href="/templates/index.html">MapMaster Chat</a>
27
+ <a href="/templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html">Spider-Man</a>
28
+ <a href="/templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html" class="active">Impresionismo Español</a>
29
+ <a href="/templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html">Arte Abstracto Español</a>
30
+ <a href="/templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html">Daredevil</a>
31
+
32
+ </div>
33
+
34
+ <svg id="mindmap"></svg>
35
+ <script src="https://cdn.jsdelivr.net/npm/d3@7.8.5/dist/d3.min.js"></script><script src="https://cdn.jsdelivr.net/npm/markmap-view@0.17.0/dist/browser/index.js"></script><script>((getMarkmap, getOptions, root2, jsonOptions) => {
36
+ const markmap = getMarkmap();
37
+ window.mm = markmap.Markmap.create(
38
+ "svg#mindmap",
39
+ (getOptions || markmap.deriveOptions)(jsonOptions),
40
+ root2
41
+ );
42
+ })(() => window.markmap,null,{"content":"Impresionismo Español","children":[{"content":"Contexto Histórico","children":[{"content":"Finales del siglo XIX","children":[],"payload":{"lines":"4,5"}},{"content":"Influencias Francesas","children":[],"payload":{"lines":"5,7"}}],"payload":{"lines":"3,4"}},{"content":"Características","children":[{"content":"Uso de la luz y el color","children":[],"payload":{"lines":"8,9"}},{"content":"Pinceladas sueltas y rápidas","children":[],"payload":{"lines":"9,10"}},{"content":"Temas cotidianos y naturales","children":[],"payload":{"lines":"10,12"}}],"payload":{"lines":"7,8"}},{"content":"Principales Artistas","children":[{"content":"Joaquín Sorolla","children":[{"content":"Especialización en escenas de playa","children":[],"payload":{"lines":"14,15"}},{"content":"Dominio de la luz mediterránea","children":[],"payload":{"lines":"15,16"}}],"payload":{"lines":"13,16"}},{"content":"Darío de Regoyos","children":[{"content":"Experimentación con color y técnica","children":[],"payload":{"lines":"17,18"}},{"content":"Influencia del impresionismo europeo","children":[],"payload":{"lines":"18,20"}}],"payload":{"lines":"16,20"}}],"payload":{"lines":"12,13"}},{"content":"Obras Representativas","children":[{"content":"\"Paseo a orillas del mar\" - Sorolla","children":[],"payload":{"lines":"21,22"}},{"content":"\"La Concha, nocturno\" - Regoyos","children":[],"payload":{"lines":"22,24"}}],"payload":{"lines":"20,21"}},{"content":"Influencias Externas","children":[{"content":"Claude Monet","children":[],"payload":{"lines":"25,26"}},{"content":"Édouard Manet","children":[],"payload":{"lines":"26,28"}}],"payload":{"lines":"24,25"}},{"content":"Impacto y Legado","children":[{"content":"Evolución hacia el modernismo","children":[],"payload":{"lines":"29,30"}},{"content":"Influencia en generaciones posteriores de artistas","children":[],"payload":{"lines":"30,32"}}],"payload":{"lines":"28,29"}},{"content":"Links","children":[{"content":"<a href=\"https://es.wikipedia.org/wiki/Impresionismo\">Impresionismo</a>","children":[],"payload":{"lines":"33,34"}}],"payload":{"lines":"32,33"}}],"payload":{"lines":"1,2"}},null)</script>
43
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
44
+ </body>
45
+ </html>
templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
+ <title>Daredevil</title>
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ #mindmap {
15
+ display: block;
16
+ width: 100vw;
17
+ height: 100vh;
18
+ }
19
+ </style>
20
+
21
+ </head>
22
+ <body>
23
+
24
+ <div id="sidebar">
25
+ <h2>Project</h2>
26
+ <a href="/templates/index.html">MapMaster Chat</a>
27
+ <a href="/templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html">Spider-Man</a>
28
+ <a href="/templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html">Impresionismo Español</a>
29
+ <a href="/templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html">Arte Abstracto Español</a>
30
+ <a href="/templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html" class="active">Daredevil</a>
31
+
32
+ </div>
33
+
34
+ <svg id="mindmap"></svg>
35
+ <script src="https://cdn.jsdelivr.net/npm/d3@7.8.5/dist/d3.min.js"></script><script src="https://cdn.jsdelivr.net/npm/markmap-view@0.17.0/dist/browser/index.js"></script><script>((getMarkmap, getOptions, root2, jsonOptions) => {
36
+ const markmap = getMarkmap();
37
+ window.mm = markmap.Markmap.create(
38
+ "svg#mindmap",
39
+ (getOptions || markmap.deriveOptions)(jsonOptions),
40
+ root2
41
+ );
42
+ })(() => window.markmap,null,{"content":"Daredevil","children":[{"content":"Identidad","children":[{"content":"Nombre real: Matt Murdock","children":[],"payload":{"lines":"4,5"}},{"content":"Ocupación: Abogado, Vigilante","children":[],"payload":{"lines":"5,7"}}],"payload":{"lines":"3,4"}},{"content":"Origen","children":[{"content":"Creado por: Stan Lee y Bill Everett","children":[],"payload":{"lines":"8,9"}},{"content":"Primera aparición: Daredevil #1 (1964)","children":[],"payload":{"lines":"9,10"}},{"content":"Accidentes: exposición a residuos radiactivos","children":[],"payload":{"lines":"10,12"}}],"payload":{"lines":"7,8"}},{"content":"Habilidades","children":[{"content":"Sentidos superdesarrollados","children":[{"content":"Vista","children":[],"payload":{"lines":"14,15"}},{"content":"Oído","children":[],"payload":{"lines":"15,16"}},{"content":"Olfato","children":[],"payload":{"lines":"16,17"}},{"content":"Tacto","children":[],"payload":{"lines":"17,18"}},{"content":"Gusto","children":[],"payload":{"lines":"18,19"}}],"payload":{"lines":"13,19"}},{"content":"Acrobacias y combate cuerpo a cuerpo","children":[],"payload":{"lines":"19,21"}}],"payload":{"lines":"12,13"}},{"content":"Villanos","children":[{"content":"Kingpin","children":[],"payload":{"lines":"22,23"}},{"content":"Bullseye","children":[],"payload":{"lines":"23,24"}},{"content":"The Hand","children":[],"payload":{"lines":"24,25"}},{"content":"Elektra (a veces)","children":[],"payload":{"lines":"25,27"}}],"payload":{"lines":"21,22"}},{"content":"Aliados","children":[{"content":"Foggy Nelson","children":[],"payload":{"lines":"28,29"}},{"content":"Karen Page","children":[],"payload":{"lines":"29,30"}},{"content":"Elektra","children":[],"payload":{"lines":"30,31"}},{"content":"Spider-Man","children":[],"payload":{"lines":"31,33"}}],"payload":{"lines":"27,28"}},{"content":"Adaptaciones","children":[{"content":"Series de TV","children":[{"content":"Daredevil (Netflix)","children":[],"payload":{"lines":"35,36"}}],"payload":{"lines":"34,36"}},{"content":"Películas","children":[{"content":"Daredevil (2003)","children":[],"payload":{"lines":"37,39"}}],"payload":{"lines":"36,39"}}],"payload":{"lines":"33,34"}},{"content":"Cultura Popular","children":[{"content":"Comic","children":[{"content":"Series regulares","children":[],"payload":{"lines":"41,42"}},{"content":"Miniseries","children":[],"payload":{"lines":"42,43"}}],"payload":{"lines":"40,43"}},{"content":"Juegos","children":[{"content":"Videojuegos","children":[],"payload":{"lines":"44,45"}},{"content":"Juegos de mesa","children":[],"payload":{"lines":"45,47"}}],"payload":{"lines":"43,47"}}],"payload":{"lines":"39,40"}},{"content":"Links","children":[{"content":"<a href=\"https://es.wikipedia.org/wiki/Daredevil_(c%C3%B3mic)\">Más información en Wikipedia</a>","children":[],"payload":{"lines":"48,49"}}],"payload":{"lines":"47,48"}}],"payload":{"lines":"1,2"}},null)</script>
43
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
44
+ </body>
45
+ </html>
templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
+ <title>Spider-Man</title>
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ #mindmap {
15
+ display: block;
16
+ width: 100vw;
17
+ height: 100vh;
18
+ }
19
+ </style>
20
+
21
+ </head>
22
+ <body>
23
+
24
+ <div id="sidebar">
25
+ <h2>Project</h2>
26
+ <a href="/templates/index.html">MapMaster Chat</a>
27
+ <a href="/templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html" class="active">Spider-Man</a>
28
+ <a href="/templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html">Impresionismo Español</a>
29
+ <a href="/templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html">Arte Abstracto Español</a>
30
+ <a href="/templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html">Daredevil</a>
31
+
32
+ </div>
33
+
34
+ <svg id="mindmap"></svg>
35
+ <script src="https://cdn.jsdelivr.net/npm/d3@7.8.5/dist/d3.min.js"></script><script src="https://cdn.jsdelivr.net/npm/markmap-view@0.17.0/dist/browser/index.js"></script><script>((getMarkmap, getOptions, root2, jsonOptions) => {
36
+ const markmap = getMarkmap();
37
+ window.mm = markmap.Markmap.create(
38
+ "svg#mindmap",
39
+ (getOptions || markmap.deriveOptions)(jsonOptions),
40
+ root2
41
+ );
42
+ })(() => window.markmap,null,{"content":"Spider-Man","children":[{"content":"Origins","children":[{"content":"Created by Stan Lee and Steve Ditko","children":[],"payload":{"lines":"4,5"}},{"content":"First appearance in Amazing Fantasy #15 (1962)","children":[],"payload":{"lines":"5,6"}},{"content":"Bitten by a radioactive spider","children":[],"payload":{"lines":"6,8"}}],"payload":{"lines":"3,4"}},{"content":"Superpowers","children":[{"content":"Superhuman strength","children":[],"payload":{"lines":"9,10"}},{"content":"Wall-crawling","children":[],"payload":{"lines":"10,11"}},{"content":"Spider-sense","children":[],"payload":{"lines":"11,12"}},{"content":"Enhanced agility and reflexes","children":[],"payload":{"lines":"12,13"}},{"content":"Web-shooting (via mechanical web-shooters)","children":[],"payload":{"lines":"13,15"}}],"payload":{"lines":"8,9"}},{"content":"Alter Ego","children":[{"content":"Peter Parker","children":[{"content":"High school student/photographer/scientist","children":[],"payload":{"lines":"17,18"}},{"content":"Uncle Ben's \"With great power, comes great responsibility\"","children":[],"payload":{"lines":"18,20"}}],"payload":{"lines":"16,20"}}],"payload":{"lines":"15,16"}},{"content":"Main Villains","children":[{"content":"Green Goblin (Norman Osborn)","children":[],"payload":{"lines":"21,22"}},{"content":"Doctor Octopus (Otto Octavius)","children":[],"payload":{"lines":"22,23"}},{"content":"Venom (Eddie Brock)","children":[],"payload":{"lines":"23,24"}},{"content":"The Vulture (Adrian Toomes)","children":[],"payload":{"lines":"24,25"}},{"content":"Sandman (Flint Marko)","children":[],"payload":{"lines":"25,27"}}],"payload":{"lines":"20,21"}},{"content":"Allies","children":[{"content":"Aunt May","children":[],"payload":{"lines":"28,29"}},{"content":"Mary Jane Watson","children":[],"payload":{"lines":"29,30"}},{"content":"Gwen Stacy","children":[],"payload":{"lines":"30,31"}},{"content":"Harry Osborn","children":[],"payload":{"lines":"31,32"}},{"content":"The Avengers","children":[],"payload":{"lines":"32,34"}}],"payload":{"lines":"27,28"}},{"content":"Adaptations","children":[{"content":"Comics","children":[],"payload":{"lines":"35,36"}},{"content":"Animated TV Shows","children":[],"payload":{"lines":"36,37"}},{"content":"Movies","children":[{"content":"Tobey Maguire","children":[],"payload":{"lines":"38,39"}},{"content":"Andrew Garfield","children":[],"payload":{"lines":"39,40"}},{"content":"Tom Holland","children":[],"payload":{"lines":"40,41"}}],"payload":{"lines":"37,41"}},{"content":"Video Games","children":[],"payload":{"lines":"41,43"}}],"payload":{"lines":"34,35"}},{"content":"Impact","children":[{"content":"Cultural Icon","children":[],"payload":{"lines":"44,45"}},{"content":"Merchandise","children":[],"payload":{"lines":"45,46"}},{"content":"Inspiration to fans","children":[],"payload":{"lines":"46,48"}}],"payload":{"lines":"43,44"}},{"content":"Links","children":[{"content":"<a href=\"https://en.wikipedia.org/wiki/Spider-Man\">Spider-Man (Wikipedia)</a>","children":[],"payload":{"lines":"49,50"}}],"payload":{"lines":"48,49"}}],"payload":{"lines":"1,2"}},null)</script>
43
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
44
+ </body>
45
+ </html>
templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
+ <title>Arte Abstracto Español</title>
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+ #mindmap {
15
+ display: block;
16
+ width: 100vw;
17
+ height: 100vh;
18
+ }
19
+ </style>
20
+
21
+ </head>
22
+ <body>
23
+
24
+ <div id="sidebar">
25
+ <h2>Project</h2>
26
+ <a href="/templates/index.html">MapMaster Chat</a>
27
+ <a href="/templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html">Spider-Man</a>
28
+ <a href="/templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html">Impresionismo Español</a>
29
+ <a href="/templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html" class="active">Arte Abstracto Español</a>
30
+ <a href="/templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html">Daredevil</a>
31
+
32
+ </div>
33
+
34
+ <svg id="mindmap"></svg>
35
+ <script src="https://cdn.jsdelivr.net/npm/d3@7.8.5/dist/d3.min.js"></script><script src="https://cdn.jsdelivr.net/npm/markmap-view@0.17.0/dist/browser/index.js"></script><script>((getMarkmap, getOptions, root2, jsonOptions) => {
36
+ const markmap = getMarkmap();
37
+ window.mm = markmap.Markmap.create(
38
+ "svg#mindmap",
39
+ (getOptions || markmap.deriveOptions)(jsonOptions),
40
+ root2
41
+ );
42
+ })(() => window.markmap,null,{"content":"Arte Abstracto Español","children":[{"content":"Origen","children":[{"content":"Vanguardias del Siglo XX","children":[],"payload":{"lines":"4,5"}},{"content":"Influencias Europeas","children":[],"payload":{"lines":"5,6"}},{"content":"Guerra Civil Española","children":[],"payload":{"lines":"6,8"}}],"payload":{"lines":"3,4"}},{"content":"Artistas Destacados","children":[{"content":"Antoni Tàpies","children":[{"content":"Materialidad","children":[],"payload":{"lines":"10,11"}},{"content":"Textura","children":[],"payload":{"lines":"11,12"}}],"payload":{"lines":"9,12"}},{"content":"Pablo Picasso","children":[{"content":"Periodo Azul","children":[],"payload":{"lines":"13,14"}},{"content":"Cubismo","children":[],"payload":{"lines":"14,15"}}],"payload":{"lines":"12,15"}},{"content":"Juan Gris","children":[{"content":"Collage","children":[],"payload":{"lines":"16,17"}},{"content":"Geometría","children":[],"payload":{"lines":"17,19"}}],"payload":{"lines":"15,19"}}],"payload":{"lines":"8,9"}},{"content":"Movimientos","children":[{"content":"Surrealismo","children":[],"payload":{"lines":"20,21"}},{"content":"Expresionismo Abstracto","children":[],"payload":{"lines":"21,22"}},{"content":"Informalismo","children":[],"payload":{"lines":"22,24"}}],"payload":{"lines":"19,20"}},{"content":"Técnicas y Estilos","children":[{"content":"Pintura","children":[{"content":"Óleo","children":[],"payload":{"lines":"26,27"}},{"content":"Acrílico","children":[],"payload":{"lines":"27,28"}}],"payload":{"lines":"25,28"}},{"content":"Escultura","children":[{"content":"Materiales Diversos","children":[],"payload":{"lines":"29,30"}}],"payload":{"lines":"28,30"}},{"content":"Instalaciones","children":[{"content":"Arte Conceptual","children":[],"payload":{"lines":"31,33"}}],"payload":{"lines":"30,33"}}],"payload":{"lines":"24,25"}},{"content":"Exposiciones Notables","children":[{"content":"Museo Reina Sofía","children":[{"content":"Retrospectivas","children":[],"payload":{"lines":"35,36"}},{"content":"Exposiciones Temporales","children":[],"payload":{"lines":"36,37"}}],"payload":{"lines":"34,37"}},{"content":"Museo Guggenheim Bilbao","children":[{"content":"Exposiciones Permanentes","children":[],"payload":{"lines":"38,39"}},{"content":"Obras Internacionales","children":[],"payload":{"lines":"39,41"}}],"payload":{"lines":"37,41"}}],"payload":{"lines":"33,34"}},{"content":"Influencia Internacional","children":[{"content":"Simposios y Bienales","children":[],"payload":{"lines":"42,43"}},{"content":"Colecciones en Museos Internacionales","children":[],"payload":{"lines":"43,44"}},{"content":"Intercambio Cultural","children":[],"payload":{"lines":"44,46"}}],"payload":{"lines":"41,42"}},{"content":"Recursos","children":[{"content":"<a href=\"https://es.wikipedia.org/wiki/Arte_abstracto\">Wikipedia</a>","children":[],"payload":{"lines":"47,48"}}],"payload":{"lines":"46,47"}}],"payload":{"lines":"1,2"}},null)</script>
43
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
44
+ </body>
45
+ </html>
templates/index.html ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css">
5
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css" />
6
+ <meta charset="UTF-8" />
7
+ <title>MapMaster Chat</title>
8
+ <link
9
+ rel="stylesheet"
10
+ href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
11
+ />
12
+ <link rel="stylesheet" type="text/css" href="/static/css/styles.css" />
13
+ </head>
14
+ <body>
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ <div id="sidebar">
34
+ <h2>Project</h2>
35
+ <a href="/templates/index.html" class="active">MapMaster Chat</a>
36
+ <a href="/templates/acc5298da7e6c28972547fee04ae882f6ee7f582566e2f78d23b63253c8a4741.html">Spider-Man</a>
37
+ <a href="/templates/4638dc9aab9e7422a3632098471765a445a6e8c61316e5cde4dea4ca7538b969.html">Impresionismo Español</a>
38
+ <a href="/templates/bc8c3cc3d2caf61eba4bc498daf9134c68a952ed645fc62d443d111f3f8904ba.html">Arte Abstracto Español</a>
39
+ <a href="/templates/9a7f018817c8ff030971229e20b1b07b4d84ad6ef94621bf3382a1da9ffe3a93.html">Daredevil</a>
40
+
41
+ </div>
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+ <div class="container">
62
+ <h1 class="mt-5">Chat con MapMaster</h1>
63
+ <form id="chatForm">
64
+ <div class="form-group">
65
+ <label for="message">Mensaje:</label>
66
+ <textarea
67
+ class="form-control"
68
+ id="message"
69
+ name="message"
70
+ required
71
+ rows="5"
72
+ ></textarea>
73
+ </div>
74
+ <button type="submit" class="btn btn-primary">Send</button>
75
+ </form>
76
+ <div class="mt-5" id="response-container">
77
+ <h2>Respuesta</h2>
78
+ <pre id="response"></pre>
79
+ </div>
80
+ <div id="loading">Cargando...</div>
81
+ </div>
82
+
83
+ <div id="settings">⚙️</div>
84
+ <div id="settings-menu">
85
+ <ul>
86
+ <li>
87
+ <a href="#" onclick="showDeleteMapDialog()"
88
+ >Eliminar Mapas Mentales</a
89
+ >
90
+ </li>
91
+ <li>
92
+ <a href="#" onclick="regenerateContent()">Regenerar contenido</a>
93
+ </li>
94
+ </ul>
95
+ </div>
96
+
97
+ <script>
98
+ document
99
+ .getElementById("chatForm")
100
+ .addEventListener("submit", function (event) {
101
+ event.preventDefault();
102
+ const messageInput = document.getElementById("message");
103
+ const message = messageInput.value;
104
+ const responseContainer = document.getElementById("response");
105
+ const loadingIndicator = document.getElementById("loading");
106
+ const formData = new FormData();
107
+ formData.append("message", message);
108
+
109
+ loadingIndicator.style.display = "block";
110
+ responseContainer.textContent = "";
111
+
112
+ fetch("/send_message", {
113
+ method: "POST",
114
+ body: formData,
115
+ })
116
+ .then((response) => response.json())
117
+ .then((data) => {
118
+ loadingIndicator.style.display = "none";
119
+ if (data.markdown) {
120
+ responseContainer.textContent = data.markdown;
121
+ } else if (data.status) {
122
+ responseContainer.textContent = data.status;
123
+ }
124
+ })
125
+ .catch((error) => {
126
+ loadingIndicator.style.display = "none";
127
+ console.error("Error:", error);
128
+ });
129
+
130
+ messageInput.value = ""; // Clear the input field after sending the message
131
+ });
132
+
133
+ document
134
+ .getElementById("settings")
135
+ .addEventListener("click", function () {
136
+ const settingsMenu = document.getElementById("settings-menu");
137
+ if (settingsMenu.style.display === "none") {
138
+ settingsMenu.style.display = "block";
139
+ } else {
140
+ settingsMenu.style.display = "none";
141
+ }
142
+ });
143
+
144
+ function showDeleteMapDialog() {
145
+ fetch("/get_maps")
146
+ .then((response) => response.json())
147
+ .then((data) => {
148
+ let mapList = "<ul>";
149
+ data.maps.forEach((map) => {
150
+ mapList += `<li><span>${map.title}</span><button onclick="deleteMap('${map.filename}')">Eliminar</button></li>`;
151
+ });
152
+ mapList += "</ul>";
153
+ document.getElementById("response").innerHTML = mapList;
154
+ });
155
+ }
156
+
157
+ function deleteMap(filename) {
158
+ fetch(`/delete_map/${filename}`, { method: "DELETE" })
159
+ .then((response) => response.json())
160
+ .then((data) => {
161
+ if (data.success) {
162
+ alert("Mapa eliminado con éxito");
163
+ location.reload();
164
+ } else {
165
+ alert("Error al eliminar el mapa");
166
+ }
167
+ });
168
+ }
169
+
170
+ function regenerateContent() {
171
+ fetch("/regenerate_content", { method: "POST" })
172
+ .then((response) => response.json())
173
+ .then((data) => {
174
+ if (data.success) {
175
+ alert("Contenido regenerado con éxito");
176
+ location.reload();
177
+ } else {
178
+ alert("Error al regenerar el contenido");
179
+ }
180
+ });
181
+ }
182
+ </script>
183
+ <img id="logo" src="/static/assets/logo.png" alt="Logo" />
184
+ <img id="logo" src="/static/assets/logo.png" alt="Logo" />
185
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
186
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
187
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
188
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
189
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
190
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
191
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
192
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
193
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
194
+ <img id="logo" src="/static/assets/logo.png" alt="Logo">
195
+ </body>
196
+ </html>