Index: trip-planner-front/node_modules/svgo/lib/stringifier.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/stringifier.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
+++ trip-planner-front/node_modules/svgo/lib/stringifier.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -0,0 +1,326 @@
+'use strict';
+
+/**
+ * @typedef {import('./types').XastParent} XastParent
+ * @typedef {import('./types').XastRoot} XastRoot
+ * @typedef {import('./types').XastElement} XastElement
+ * @typedef {import('./types').XastInstruction} XastInstruction
+ * @typedef {import('./types').XastDoctype} XastDoctype
+ * @typedef {import('./types').XastText} XastText
+ * @typedef {import('./types').XastCdata} XastCdata
+ * @typedef {import('./types').XastComment} XastComment
+ * @typedef {import('./types').StringifyOptions} StringifyOptions
+ */
+
+const { textElems } = require('../plugins/_collections.js');
+
+/**
+ * @typedef {{
+ *   width: void | string,
+ *   height: void | string,
+ *   indent: string,
+ *   textContext: null | XastElement,
+ *   indentLevel: number,
+ * }} State
+ */
+
+/**
+ * @typedef {Required<StringifyOptions>} Options
+ */
+
+/**
+ * @type {(char: string) => string}
+ */
+const encodeEntity = (char) => {
+  return entities[char];
+};
+
+/**
+ * @type {Options}
+ */
+const defaults = {
+  doctypeStart: '<!DOCTYPE',
+  doctypeEnd: '>',
+  procInstStart: '<?',
+  procInstEnd: '?>',
+  tagOpenStart: '<',
+  tagOpenEnd: '>',
+  tagCloseStart: '</',
+  tagCloseEnd: '>',
+  tagShortStart: '<',
+  tagShortEnd: '/>',
+  attrStart: '="',
+  attrEnd: '"',
+  commentStart: '<!--',
+  commentEnd: '-->',
+  cdataStart: '<![CDATA[',
+  cdataEnd: ']]>',
+  textStart: '',
+  textEnd: '',
+  indent: 4,
+  regEntities: /[&'"<>]/g,
+  regValEntities: /[&"<>]/g,
+  encodeEntity: encodeEntity,
+  pretty: false,
+  useShortTags: true,
+  eol: 'lf',
+  finalNewline: false,
+};
+
+/**
+ * @type {Record<string, string>}
+ */
+const entities = {
+  '&': '&amp;',
+  "'": '&apos;',
+  '"': '&quot;',
+  '>': '&gt;',
+  '<': '&lt;',
+};
+
+/**
+ * convert XAST to SVG string
+ *
+ * @type {(data: XastRoot, config: StringifyOptions) => {
+ *   data: string,
+ *   info: {
+ *     width: void | string,
+ *     height: void | string
+ *   }
+ * }}
+ */
+const stringifySvg = (data, userOptions = {}) => {
+  /**
+   * @type {Options}
+   */
+  const config = { ...defaults, ...userOptions };
+  const indent = config.indent;
+  let newIndent = '    ';
+  if (typeof indent === 'number' && Number.isNaN(indent) === false) {
+    newIndent = indent < 0 ? '\t' : ' '.repeat(indent);
+  } else if (typeof indent === 'string') {
+    newIndent = indent;
+  }
+  /**
+   * @type {State}
+   */
+  const state = {
+    // TODO remove width and height in v3
+    width: undefined,
+    height: undefined,
+    indent: newIndent,
+    textContext: null,
+    indentLevel: 0,
+  };
+  const eol = config.eol === 'crlf' ? '\r\n' : '\n';
+  if (config.pretty) {
+    config.doctypeEnd += eol;
+    config.procInstEnd += eol;
+    config.commentEnd += eol;
+    config.cdataEnd += eol;
+    config.tagShortEnd += eol;
+    config.tagOpenEnd += eol;
+    config.tagCloseEnd += eol;
+    config.textEnd += eol;
+  }
+  let svg = stringifyNode(data, config, state);
+  if (config.finalNewline && svg.length > 0 && svg[svg.length - 1] !== '\n') {
+    svg += eol;
+  }
+  return {
+    data: svg,
+    info: {
+      width: state.width,
+      height: state.height,
+    },
+  };
+};
+exports.stringifySvg = stringifySvg;
+
+/**
+ * @type {(node: XastParent, config: Options, state: State) => string}
+ */
+const stringifyNode = (data, config, state) => {
+  let svg = '';
+  state.indentLevel += 1;
+  for (const item of data.children) {
+    if (item.type === 'element') {
+      svg += stringifyElement(item, config, state);
+    }
+    if (item.type === 'text') {
+      svg += stringifyText(item, config, state);
+    }
+    if (item.type === 'doctype') {
+      svg += stringifyDoctype(item, config);
+    }
+    if (item.type === 'instruction') {
+      svg += stringifyInstruction(item, config);
+    }
+    if (item.type === 'comment') {
+      svg += stringifyComment(item, config);
+    }
+    if (item.type === 'cdata') {
+      svg += stringifyCdata(item, config, state);
+    }
+  }
+  state.indentLevel -= 1;
+  return svg;
+};
+
+/**
+ * create indent string in accordance with the current node level.
+ *
+ * @type {(config: Options, state: State) => string}
+ */
+const createIndent = (config, state) => {
+  let indent = '';
+  if (config.pretty && state.textContext == null) {
+    indent = state.indent.repeat(state.indentLevel - 1);
+  }
+  return indent;
+};
+
+/**
+ * @type {(node: XastDoctype, config: Options) => string}
+ */
+const stringifyDoctype = (node, config) => {
+  return config.doctypeStart + node.data.doctype + config.doctypeEnd;
+};
+
+/**
+ * @type {(node: XastInstruction, config: Options) => string}
+ */
+const stringifyInstruction = (node, config) => {
+  return (
+    config.procInstStart + node.name + ' ' + node.value + config.procInstEnd
+  );
+};
+
+/**
+ * @type {(node: XastComment, config: Options) => string}
+ */
+const stringifyComment = (node, config) => {
+  return config.commentStart + node.value + config.commentEnd;
+};
+
+/**
+ * @type {(node: XastCdata, config: Options, state: State) => string}
+ */
+const stringifyCdata = (node, config, state) => {
+  return (
+    createIndent(config, state) +
+    config.cdataStart +
+    node.value +
+    config.cdataEnd
+  );
+};
+
+/**
+ * @type {(node: XastElement, config: Options, state: State) => string}
+ */
+const stringifyElement = (node, config, state) => {
+  // beautiful injection for obtaining SVG information :)
+  if (
+    node.name === 'svg' &&
+    node.attributes.width != null &&
+    node.attributes.height != null
+  ) {
+    state.width = node.attributes.width;
+    state.height = node.attributes.height;
+  }
+
+  // empty element and short tag
+  if (node.children.length === 0) {
+    if (config.useShortTags) {
+      return (
+        createIndent(config, state) +
+        config.tagShortStart +
+        node.name +
+        stringifyAttributes(node, config) +
+        config.tagShortEnd
+      );
+    } else {
+      return (
+        createIndent(config, state) +
+        config.tagShortStart +
+        node.name +
+        stringifyAttributes(node, config) +
+        config.tagOpenEnd +
+        config.tagCloseStart +
+        node.name +
+        config.tagCloseEnd
+      );
+    }
+    // non-empty element
+  } else {
+    let tagOpenStart = config.tagOpenStart;
+    let tagOpenEnd = config.tagOpenEnd;
+    let tagCloseStart = config.tagCloseStart;
+    let tagCloseEnd = config.tagCloseEnd;
+    let openIndent = createIndent(config, state);
+    let closeIndent = createIndent(config, state);
+
+    if (state.textContext) {
+      tagOpenStart = defaults.tagOpenStart;
+      tagOpenEnd = defaults.tagOpenEnd;
+      tagCloseStart = defaults.tagCloseStart;
+      tagCloseEnd = defaults.tagCloseEnd;
+      openIndent = '';
+    } else if (textElems.includes(node.name)) {
+      tagOpenEnd = defaults.tagOpenEnd;
+      tagCloseStart = defaults.tagCloseStart;
+      closeIndent = '';
+      state.textContext = node;
+    }
+
+    const children = stringifyNode(node, config, state);
+
+    if (state.textContext === node) {
+      state.textContext = null;
+    }
+
+    return (
+      openIndent +
+      tagOpenStart +
+      node.name +
+      stringifyAttributes(node, config) +
+      tagOpenEnd +
+      children +
+      closeIndent +
+      tagCloseStart +
+      node.name +
+      tagCloseEnd
+    );
+  }
+};
+
+/**
+ * @type {(node: XastElement, config: Options) => string}
+ */
+const stringifyAttributes = (node, config) => {
+  let attrs = '';
+  for (const [name, value] of Object.entries(node.attributes)) {
+    // TODO remove attributes without values support in v3
+    if (value !== undefined) {
+      const encodedValue = value
+        .toString()
+        .replace(config.regValEntities, config.encodeEntity);
+      attrs += ' ' + name + config.attrStart + encodedValue + config.attrEnd;
+    } else {
+      attrs += ' ' + name;
+    }
+  }
+  return attrs;
+};
+
+/**
+ * @type {(node: XastText, config: Options, state: State) => string}
+ */
+const stringifyText = (node, config, state) => {
+  return (
+    createIndent(config, state) +
+    config.textStart +
+    node.value.replace(config.regEntities, config.encodeEntity) +
+    (state.textContext ? '' : config.textEnd)
+  );
+};
Index: trip-planner-front/node_modules/svgo/lib/svgo-node.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/svgo-node.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/svgo/lib/svgo-node.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -16,19 +16,26 @@
 const importConfig = async (configFile) => {
   let config;
-  try {
-    // dynamic import expects file url instead of path and may fail
-    // when windows path is provided
-    const { default: imported } = await import(pathToFileURL(configFile));
-    config = imported;
-  } catch (importError) {
-    // TODO remove require in v3
+  // at the moment dynamic import may randomly fail with segfault
+  // to workaround this for some users .cjs extension is loaded
+  // exclusively with require
+  if (configFile.endsWith('.cjs')) {
+    config = require(configFile);
+  } else {
     try {
-      config = require(configFile);
-    } catch (requireError) {
-      // throw original error if es module is detected
-      if (requireError.code === 'ERR_REQUIRE_ESM') {
-        throw importError;
-      } else {
-        throw requireError;
+      // dynamic import expects file url instead of path and may fail
+      // when windows path is provided
+      const { default: imported } = await import(pathToFileURL(configFile));
+      config = imported;
+    } catch (importError) {
+      // TODO remove require in v3
+      try {
+        config = require(configFile);
+      } catch (requireError) {
+        // throw original error if es module is detected
+        if (requireError.code === 'ERR_REQUIRE_ESM') {
+          throw importError;
+        } else {
+          throw requireError;
+        }
       }
     }
Index: trip-planner-front/node_modules/svgo/lib/svgo.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/svgo.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/svgo/lib/svgo.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -7,5 +7,5 @@
 } = require('./svgo/config.js');
 const { parseSvg } = require('./parser.js');
-const js2svg = require('./svgo/js2svg.js');
+const { stringifySvg } = require('./stringifier.js');
 const { invokePlugins } = require('./svgo/plugins.js');
 const JSAPI = require('./svgo/jsAPI.js');
@@ -54,8 +54,5 @@
     }
     svgjs = invokePlugins(svgjs, info, resolvedPlugins, null, globalOverrides);
-    svgjs = js2svg(svgjs, config.js2svg);
-    if (svgjs.error) {
-      throw Error(svgjs.error);
-    }
+    svgjs = stringifySvg(svgjs, config.js2svg);
     if (svgjs.data.length < prevResultSize) {
       input = svgjs.data;
Index: trip-planner-front/node_modules/svgo/lib/svgo/coa.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/svgo/coa.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/svgo/lib/svgo/coa.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -1,7 +1,7 @@
 'use strict';
 
-const FS = require('fs');
-const PATH = require('path');
-const { green, red } = require('nanocolors');
+const fs = require('fs');
+const path = require('path');
+const colors = require('picocolors');
 const { loadConfig, optimize } = require('../svgo-node.js');
 const pluginsMap = require('../../plugins/plugins.js');
@@ -17,5 +17,5 @@
 function checkIsDir(path) {
   try {
-    return FS.lstatSync(path).isDirectory();
+    return fs.lstatSync(path).isDirectory();
   } catch (e) {
     return false;
@@ -74,4 +74,6 @@
     )
     .option('--show-plugins', 'Show available plugins and exit')
+    // used by picocolors internally
+    .option('--no-color', 'Output plain text without color')
     .action(action);
 };
@@ -219,5 +221,5 @@
           output[i] = checkIsDir(input[i])
             ? input[i]
-            : PATH.resolve(dir, PATH.basename(input[i]));
+            : path.resolve(dir, path.basename(input[i]));
         }
       } else if (output.length < input.length) {
@@ -284,5 +286,5 @@
     console.log(`Processing directory '${dir}':\n`);
   }
-  return FS.promises
+  return fs.promises
     .readdir(dir)
     .then((files) => processDirectory(config, dir, files, output));
@@ -332,6 +334,6 @@
     )
     .map((name) => ({
-      inputPath: PATH.resolve(dir, name),
-      outputPath: PATH.resolve(output, name),
+      inputPath: path.resolve(dir, name),
+      outputPath: path.resolve(output, name),
     }));
 
@@ -340,9 +342,9 @@
         filesInThisFolder,
         files
-          .filter((name) => checkIsDir(PATH.resolve(dir, name)))
+          .filter((name) => checkIsDir(path.resolve(dir, name)))
           .map((subFolderName) => {
-            const subFolderPath = PATH.resolve(dir, subFolderName);
-            const subFolderFiles = FS.readdirSync(subFolderPath);
-            const subFolderOutput = PATH.resolve(output, subFolderName);
+            const subFolderPath = path.resolve(dir, subFolderName);
+            const subFolderFiles = fs.readdirSync(subFolderPath);
+            const subFolderOutput = path.resolve(output, subFolderName);
             return getFilesDescriptions(
               config,
@@ -365,5 +367,5 @@
  */
 function optimizeFile(config, file, output) {
-  return FS.promises.readFile(file, 'utf8').then(
+  return fs.promises.readFile(file, 'utf8').then(
     (data) =>
       processSVGData(config, { input: 'file', path: file }, data, output, file),
@@ -386,5 +388,5 @@
   const result = optimize(data, { ...config, ...info });
   if (result.modernError) {
-    console.error(red(result.modernError.toString()));
+    console.error(colors.red(result.modernError.toString()));
     process.exit(1);
   }
@@ -399,5 +401,5 @@
       if (!config.quiet && output != '-') {
         if (input) {
-          console.log(`\n${PATH.basename(input)}:`);
+          console.log(`\n${path.basename(input)}:`);
         }
         printTimeInfo(processingTime);
@@ -429,7 +431,7 @@
   }
 
-  FS.mkdirSync(PATH.dirname(output), { recursive: true });
-
-  return FS.promises
+  fs.mkdirSync(path.dirname(output), { recursive: true });
+
+  return fs.promises
     .writeFile(output, data, 'utf8')
     .catch((error) => checkWriteFileError(input, output, data, error));
@@ -456,5 +458,5 @@
       ' KiB' +
       (profitPercents < 0 ? ' + ' : ' - ') +
-      green(Math.abs(Math.round(profitPercents * 10) / 10) + '%') +
+      colors.green(Math.abs(Math.round(profitPercents * 10) / 10) + '%') +
       ' = ' +
       Math.round((outBytes / 1024) * 1000) / 1000 +
@@ -492,6 +494,6 @@
 function checkWriteFileError(input, output, data, error) {
   if (error.code == 'EISDIR' && input) {
-    return FS.promises.writeFile(
-      PATH.resolve(output, PATH.basename(input)),
+    return fs.promises.writeFile(
+      path.resolve(output, path.basename(input)),
       data,
       'utf8'
@@ -508,5 +510,5 @@
   const list = Object.entries(pluginsMap)
     .sort(([a], [b]) => a.localeCompare(b))
-    .map(([name, plugin]) => ` [ ${green(name)} ] ${plugin.description}`)
+    .map(([name, plugin]) => ` [ ${colors.green(name)} ] ${plugin.description}`)
     .join('\n');
   console.log('Currently available plugins:\n' + list);
Index: trip-planner-front/node_modules/svgo/lib/svgo/js2svg.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/svgo/js2svg.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ 	(revision )
@@ -1,337 +1,0 @@
-'use strict';
-
-const { textElems } = require('../../plugins/_collections.js');
-
-var defaults = {
-  doctypeStart: '<!DOCTYPE',
-  doctypeEnd: '>',
-  procInstStart: '<?',
-  procInstEnd: '?>',
-  tagOpenStart: '<',
-  tagOpenEnd: '>',
-  tagCloseStart: '</',
-  tagCloseEnd: '>',
-  tagShortStart: '<',
-  tagShortEnd: '/>',
-  attrStart: '="',
-  attrEnd: '"',
-  commentStart: '<!--',
-  commentEnd: '-->',
-  cdataStart: '<![CDATA[',
-  cdataEnd: ']]>',
-  textStart: '',
-  textEnd: '',
-  indent: 4,
-  regEntities: /[&'"<>]/g,
-  regValEntities: /[&"<>]/g,
-  encodeEntity: encodeEntity,
-  pretty: false,
-  useShortTags: true,
-  eol: 'lf',
-  finalNewline: false,
-};
-
-var entities = {
-  '&': '&amp;',
-  "'": '&apos;',
-  '"': '&quot;',
-  '>': '&gt;',
-  '<': '&lt;',
-};
-
-/**
- * Convert SVG-as-JS object to SVG (XML) string.
- *
- * @param {Object} data input data
- * @param {Object} config config
- *
- * @return {Object} output data
- */
-module.exports = function (data, config) {
-  return new JS2SVG(config).convert(data);
-};
-
-function JS2SVG(config) {
-  if (config) {
-    this.config = Object.assign({}, defaults, config);
-  } else {
-    this.config = Object.assign({}, defaults);
-  }
-
-  var indent = this.config.indent;
-  if (typeof indent == 'number' && !isNaN(indent)) {
-    this.config.indent = indent < 0 ? '\t' : ' '.repeat(indent);
-  } else if (typeof indent != 'string') {
-    this.config.indent = '    ';
-  }
-
-  if (this.config.eol === 'crlf') {
-    this.eol = '\r\n';
-  } else {
-    this.eol = '\n';
-  }
-
-  if (this.config.pretty) {
-    this.config.doctypeEnd += this.eol;
-    this.config.procInstEnd += this.eol;
-    this.config.commentEnd += this.eol;
-    this.config.cdataEnd += this.eol;
-    this.config.tagShortEnd += this.eol;
-    this.config.tagOpenEnd += this.eol;
-    this.config.tagCloseEnd += this.eol;
-    this.config.textEnd += this.eol;
-  }
-
-  this.indentLevel = 0;
-  this.textContext = null;
-}
-
-function encodeEntity(char) {
-  return entities[char];
-}
-
-/**
- * Start conversion.
- *
- * @param {Object} data input data
- *
- * @return {String}
- */
-JS2SVG.prototype.convert = function (data) {
-  var svg = '';
-
-  this.indentLevel++;
-
-  for (const item of data.children) {
-    if (item.type === 'element') {
-      svg += this.createElem(item);
-    }
-    if (item.type === 'text') {
-      svg += this.createText(item);
-    }
-    if (item.type === 'doctype') {
-      svg += this.createDoctype(item);
-    }
-    if (item.type === 'instruction') {
-      svg += this.createProcInst(item);
-    }
-    if (item.type === 'comment') {
-      svg += this.createComment(item);
-    }
-    if (item.type === 'cdata') {
-      svg += this.createCDATA(item);
-    }
-  }
-
-  this.indentLevel--;
-
-  if (
-    this.config.finalNewline &&
-    this.indentLevel === 0 &&
-    svg.length > 0 &&
-    svg[svg.length - 1] !== '\n'
-  ) {
-    svg += this.eol;
-  }
-
-  return {
-    data: svg,
-    info: {
-      width: this.width,
-      height: this.height,
-    },
-  };
-};
-
-/**
- * Create indent string in accordance with the current node level.
- *
- * @return {String}
- */
-JS2SVG.prototype.createIndent = function () {
-  var indent = '';
-
-  if (this.config.pretty && !this.textContext) {
-    indent = this.config.indent.repeat(this.indentLevel - 1);
-  }
-
-  return indent;
-};
-
-/**
- * Create doctype tag.
- *
- * @param {String} doctype doctype body string
- *
- * @return {String}
- */
-JS2SVG.prototype.createDoctype = function (node) {
-  const { doctype } = node.data;
-  return this.config.doctypeStart + doctype + this.config.doctypeEnd;
-};
-
-/**
- * Create XML Processing Instruction tag.
- *
- * @param {Object} instruction instruction object
- *
- * @return {String}
- */
-JS2SVG.prototype.createProcInst = function (node) {
-  const { name, value } = node;
-  return (
-    this.config.procInstStart + name + ' ' + value + this.config.procInstEnd
-  );
-};
-
-/**
- * Create comment tag.
- *
- * @param {String} comment comment body
- *
- * @return {String}
- */
-JS2SVG.prototype.createComment = function (node) {
-  const { value } = node;
-  return this.config.commentStart + value + this.config.commentEnd;
-};
-
-/**
- * Create CDATA section.
- *
- * @param {String} cdata CDATA body
- *
- * @return {String}
- */
-JS2SVG.prototype.createCDATA = function (node) {
-  const { value } = node;
-  return (
-    this.createIndent() + this.config.cdataStart + value + this.config.cdataEnd
-  );
-};
-
-/**
- * Create element tag.
- *
- * @param {Object} data element object
- *
- * @return {String}
- */
-JS2SVG.prototype.createElem = function (data) {
-  // beautiful injection for obtaining SVG information :)
-  if (
-    data.name === 'svg' &&
-    data.attributes.width != null &&
-    data.attributes.height != null
-  ) {
-    this.width = data.attributes.width;
-    this.height = data.attributes.height;
-  }
-
-  // empty element and short tag
-  if (data.children.length === 0) {
-    if (this.config.useShortTags) {
-      return (
-        this.createIndent() +
-        this.config.tagShortStart +
-        data.name +
-        this.createAttrs(data) +
-        this.config.tagShortEnd
-      );
-    } else {
-      return (
-        this.createIndent() +
-        this.config.tagShortStart +
-        data.name +
-        this.createAttrs(data) +
-        this.config.tagOpenEnd +
-        this.config.tagCloseStart +
-        data.name +
-        this.config.tagCloseEnd
-      );
-    }
-    // non-empty element
-  } else {
-    var tagOpenStart = this.config.tagOpenStart,
-      tagOpenEnd = this.config.tagOpenEnd,
-      tagCloseStart = this.config.tagCloseStart,
-      tagCloseEnd = this.config.tagCloseEnd,
-      openIndent = this.createIndent(),
-      closeIndent = this.createIndent(),
-      processedData = '',
-      dataEnd = '';
-
-    if (this.textContext) {
-      tagOpenStart = defaults.tagOpenStart;
-      tagOpenEnd = defaults.tagOpenEnd;
-      tagCloseStart = defaults.tagCloseStart;
-      tagCloseEnd = defaults.tagCloseEnd;
-      openIndent = '';
-    } else if (data.isElem(textElems)) {
-      tagOpenEnd = defaults.tagOpenEnd;
-      tagCloseStart = defaults.tagCloseStart;
-      closeIndent = '';
-      this.textContext = data;
-    }
-
-    processedData += this.convert(data).data;
-
-    if (this.textContext == data) {
-      this.textContext = null;
-    }
-
-    return (
-      openIndent +
-      tagOpenStart +
-      data.name +
-      this.createAttrs(data) +
-      tagOpenEnd +
-      processedData +
-      dataEnd +
-      closeIndent +
-      tagCloseStart +
-      data.name +
-      tagCloseEnd
-    );
-  }
-};
-
-/**
- * Create element attributes.
- *
- * @param {Object} elem attributes object
- *
- * @return {String}
- */
-JS2SVG.prototype.createAttrs = function (element) {
-  let attrs = '';
-  for (const [name, value] of Object.entries(element.attributes)) {
-    if (value !== undefined) {
-      const encodedValue = value
-        .toString()
-        .replace(this.config.regValEntities, this.config.encodeEntity);
-      attrs +=
-        ' ' + name + this.config.attrStart + encodedValue + this.config.attrEnd;
-    } else {
-      attrs += ' ' + name;
-    }
-  }
-  return attrs;
-};
-
-/**
- * Create text node.
- *
- * @param {String} text text
- *
- * @return {String}
- */
-JS2SVG.prototype.createText = function (node) {
-  const { value } = node;
-  return (
-    this.createIndent() +
-    this.config.textStart +
-    value.replace(this.config.regEntities, this.config.encodeEntity) +
-    (this.textContext ? '' : this.config.textEnd)
-  );
-};
Index: trip-planner-front/node_modules/svgo/lib/svgo/plugins.js
===================================================================
--- trip-planner-front/node_modules/svgo/lib/svgo/plugins.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/svgo/lib/svgo/plugins.js	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -87,4 +87,20 @@
         globalOverrides.floatPrecision = floatPrecision;
       }
+      if (overrides) {
+        for (const [pluginName, override] of Object.entries(overrides)) {
+          if (override === true) {
+            console.warn(
+              `You are trying to enable ${pluginName} which is not part of preset.\n` +
+                `Try to put it before or after preset, for example\n\n` +
+                `plugins: [\n` +
+                `  {\n` +
+                `    name: 'preset-default',\n` +
+                `  },\n` +
+                `  'cleanupListOfValues'\n` +
+                `]\n`
+            );
+          }
+        }
+      }
       return invokePlugins(ast, info, plugins, overrides, globalOverrides);
     },
Index: trip-planner-front/node_modules/svgo/lib/types.ts
===================================================================
--- trip-planner-front/node_modules/svgo/lib/types.ts	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/svgo/lib/types.ts	(revision 571e0df9a7a5e798c9941a85842f785177bedbbd)
@@ -51,4 +51,33 @@
 
 export type XastNode = XastRoot | XastChild;
+
+export type StringifyOptions = {
+  doctypeStart?: string;
+  doctypeEnd?: string;
+  procInstStart?: string;
+  procInstEnd?: string;
+  tagOpenStart?: string;
+  tagOpenEnd?: string;
+  tagCloseStart?: string;
+  tagCloseEnd?: string;
+  tagShortStart?: string;
+  tagShortEnd?: string;
+  attrStart?: string;
+  attrEnd?: string;
+  commentStart?: string;
+  commentEnd?: string;
+  cdataStart?: string;
+  cdataEnd?: string;
+  textStart?: string;
+  textEnd?: string;
+  indent?: number | string;
+  regEntities?: RegExp;
+  regValEntities?: RegExp;
+  encodeEntity?: (char: string) => string;
+  pretty?: boolean;
+  useShortTags?: boolean;
+  eol?: 'lf' | 'crlf';
+  finalNewline?: boolean;
+};
 
 type VisitorNode<Node> = {
