Index: trip-planner-front/node_modules/yargs/lib/apply-extends.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/apply-extends.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/apply-extends.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,53 @@
+
+'use strict'
+const fs = require('fs')
+const path = require('path')
+const YError = require('./yerror')
+
+let previouslyVisitedConfigs = []
+
+function checkForCircularExtends (cfgPath) {
+  if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {
+    throw new YError(`Circular extended configurations: '${cfgPath}'.`)
+  }
+}
+
+function getPathToDefaultConfig (cwd, pathToExtend) {
+  return path.resolve(cwd, pathToExtend)
+}
+
+function applyExtends (config, cwd) {
+  let defaultConfig = {}
+
+  if (config.hasOwnProperty('extends')) {
+    if (typeof config.extends !== 'string') return defaultConfig
+    const isPath = /\.json|\..*rc$/.test(config.extends)
+    let pathToDefault = null
+    if (!isPath) {
+      try {
+        pathToDefault = require.resolve(config.extends)
+      } catch (err) {
+        // most likely this simply isn't a module.
+      }
+    } else {
+      pathToDefault = getPathToDefaultConfig(cwd, config.extends)
+    }
+    // maybe the module uses key for some other reason,
+    // err on side of caution.
+    if (!pathToDefault && !isPath) return config
+
+    checkForCircularExtends(pathToDefault)
+
+    previouslyVisitedConfigs.push(pathToDefault)
+
+    defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends)
+    delete config.extends
+    defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))
+  }
+
+  previouslyVisitedConfigs = []
+
+  return Object.assign({}, defaultConfig, config)
+}
+
+module.exports = applyExtends
Index: trip-planner-front/node_modules/yargs/lib/argsert.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/argsert.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/argsert.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,68 @@
+'use strict'
+
+// hoisted due to circular dependency on command.
+module.exports = argsert
+const command = require('./command')()
+const YError = require('./yerror')
+
+const positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
+function argsert (expected, callerArguments, length) {
+  // TODO: should this eventually raise an exception.
+  try {
+    // preface the argument description with "cmd", so
+    // that we can run it through yargs' command parser.
+    let position = 0
+    let parsed = { demanded: [], optional: [] }
+    if (typeof expected === 'object') {
+      length = callerArguments
+      callerArguments = expected
+    } else {
+      parsed = command.parseCommand(`cmd ${expected}`)
+    }
+    const args = [].slice.call(callerArguments)
+
+    while (args.length && args[args.length - 1] === undefined) args.pop()
+    length = length || args.length
+
+    if (length < parsed.demanded.length) {
+      throw new YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`)
+    }
+
+    const totalCommands = parsed.demanded.length + parsed.optional.length
+    if (length > totalCommands) {
+      throw new YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`)
+    }
+
+    parsed.demanded.forEach((demanded) => {
+      const arg = args.shift()
+      const observedType = guessType(arg)
+      const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*')
+      if (matchingTypes.length === 0) argumentTypeError(observedType, demanded.cmd, position, false)
+      position += 1
+    })
+
+    parsed.optional.forEach((optional) => {
+      if (args.length === 0) return
+      const arg = args.shift()
+      const observedType = guessType(arg)
+      const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*')
+      if (matchingTypes.length === 0) argumentTypeError(observedType, optional.cmd, position, true)
+      position += 1
+    })
+  } catch (err) {
+    console.warn(err.stack)
+  }
+}
+
+function guessType (arg) {
+  if (Array.isArray(arg)) {
+    return 'array'
+  } else if (arg === null) {
+    return 'null'
+  }
+  return typeof arg
+}
+
+function argumentTypeError (observedType, allowedTypes, position, optional) {
+  throw new YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`)
+}
Index: trip-planner-front/node_modules/yargs/lib/command.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/command.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/command.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,437 @@
+'use strict'
+
+const inspect = require('util').inspect
+const isPromise = require('./is-promise')
+const { applyMiddleware, commandMiddlewareFactory } = require('./middleware')
+const path = require('path')
+const Parser = require('yargs-parser')
+
+const DEFAULT_MARKER = /(^\*)|(^\$0)/
+
+// handles parsing positional arguments,
+// and populating argv with said positional
+// arguments.
+module.exports = function command (yargs, usage, validation, globalMiddleware) {
+  const self = {}
+  let handlers = {}
+  let aliasMap = {}
+  let defaultCommand
+  globalMiddleware = globalMiddleware || []
+
+  self.addHandler = function addHandler (cmd, description, builder, handler, commandMiddleware) {
+    let aliases = []
+    const middlewares = commandMiddlewareFactory(commandMiddleware)
+    handler = handler || (() => {})
+
+    if (Array.isArray(cmd)) {
+      aliases = cmd.slice(1)
+      cmd = cmd[0]
+    } else if (typeof cmd === 'object') {
+      let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd)
+      if (cmd.aliases) command = [].concat(command).concat(cmd.aliases)
+      self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares)
+      return
+    }
+
+    // allow a module to be provided instead of separate builder and handler
+    if (typeof builder === 'object' && builder.builder && typeof builder.handler === 'function') {
+      self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares)
+      return
+    }
+
+    // parse positionals out of cmd string
+    const parsedCommand = self.parseCommand(cmd)
+
+    // remove positional args from aliases only
+    aliases = aliases.map(alias => self.parseCommand(alias).cmd)
+
+    // check for default and filter out '*''
+    let isDefault = false
+    const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => {
+      if (DEFAULT_MARKER.test(c)) {
+        isDefault = true
+        return false
+      }
+      return true
+    })
+
+    // standardize on $0 for default command.
+    if (parsedAliases.length === 0 && isDefault) parsedAliases.push('$0')
+
+    // shift cmd and aliases after filtering out '*'
+    if (isDefault) {
+      parsedCommand.cmd = parsedAliases[0]
+      aliases = parsedAliases.slice(1)
+      cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd)
+    }
+
+    // populate aliasMap
+    aliases.forEach((alias) => {
+      aliasMap[alias] = parsedCommand.cmd
+    })
+
+    if (description !== false) {
+      usage.command(cmd, description, isDefault, aliases)
+    }
+
+    handlers[parsedCommand.cmd] = {
+      original: cmd,
+      description: description,
+      handler,
+      builder: builder || {},
+      middlewares: middlewares || [],
+      demanded: parsedCommand.demanded,
+      optional: parsedCommand.optional
+    }
+
+    if (isDefault) defaultCommand = handlers[parsedCommand.cmd]
+  }
+
+  self.addDirectory = function addDirectory (dir, context, req, callerFile, opts) {
+    opts = opts || {}
+    // disable recursion to support nested directories of subcommands
+    if (typeof opts.recurse !== 'boolean') opts.recurse = false
+    // exclude 'json', 'coffee' from require-directory defaults
+    if (!Array.isArray(opts.extensions)) opts.extensions = ['js']
+    // allow consumer to define their own visitor function
+    const parentVisit = typeof opts.visit === 'function' ? opts.visit : o => o
+    // call addHandler via visitor function
+    opts.visit = function visit (obj, joined, filename) {
+      const visited = parentVisit(obj, joined, filename)
+      // allow consumer to skip modules with their own visitor
+      if (visited) {
+        // check for cyclic reference
+        // each command file path should only be seen once per execution
+        if (~context.files.indexOf(joined)) return visited
+        // keep track of visited files in context.files
+        context.files.push(joined)
+        self.addHandler(visited)
+      }
+      return visited
+    }
+    require('require-directory')({ require: req, filename: callerFile }, dir, opts)
+  }
+
+  // lookup module object from require()d command and derive name
+  // if module was not require()d and no name given, throw error
+  function moduleName (obj) {
+    const mod = require('which-module')(obj)
+    if (!mod) throw new Error(`No command name given for module: ${inspect(obj)}`)
+    return commandFromFilename(mod.filename)
+  }
+
+  // derive command name from filename
+  function commandFromFilename (filename) {
+    return path.basename(filename, path.extname(filename))
+  }
+
+  function extractDesc (obj) {
+    for (let keys = ['describe', 'description', 'desc'], i = 0, l = keys.length, test; i < l; i++) {
+      test = obj[keys[i]]
+      if (typeof test === 'string' || typeof test === 'boolean') return test
+    }
+    return false
+  }
+
+  self.parseCommand = function parseCommand (cmd) {
+    const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ')
+    const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/)
+    const bregex = /\.*[\][<>]/g
+    const parsedCommand = {
+      cmd: (splitCommand.shift()).replace(bregex, ''),
+      demanded: [],
+      optional: []
+    }
+    splitCommand.forEach((cmd, i) => {
+      let variadic = false
+      cmd = cmd.replace(/\s/g, '')
+      if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) variadic = true
+      if (/^\[/.test(cmd)) {
+        parsedCommand.optional.push({
+          cmd: cmd.replace(bregex, '').split('|'),
+          variadic
+        })
+      } else {
+        parsedCommand.demanded.push({
+          cmd: cmd.replace(bregex, '').split('|'),
+          variadic
+        })
+      }
+    })
+    return parsedCommand
+  }
+
+  self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap))
+
+  self.getCommandHandlers = () => handlers
+
+  self.hasDefaultCommand = () => !!defaultCommand
+
+  self.runCommand = function runCommand (command, yargs, parsed, commandIndex) {
+    let aliases = parsed.aliases
+    const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand
+    const currentContext = yargs.getContext()
+    let numFiles = currentContext.files.length
+    const parentCommands = currentContext.commands.slice()
+
+    // what does yargs look like after the buidler is run?
+    let innerArgv = parsed.argv
+    let innerYargs = null
+    let positionalMap = {}
+    if (command) {
+      currentContext.commands.push(command)
+      currentContext.fullCommands.push(commandHandler.original)
+    }
+    if (typeof commandHandler.builder === 'function') {
+      // a function can be provided, which builds
+      // up a yargs chain and possibly returns it.
+      innerYargs = commandHandler.builder(yargs.reset(parsed.aliases))
+      // if the builder function did not yet parse argv with reset yargs
+      // and did not explicitly set a usage() string, then apply the
+      // original command string as usage() for consistent behavior with
+      // options object below.
+      if (yargs.parsed === false) {
+        if (shouldUpdateUsage(yargs)) {
+          yargs.getUsageInstance().usage(
+            usageFromParentCommandsCommandHandler(parentCommands, commandHandler),
+            commandHandler.description
+          )
+        }
+        innerArgv = innerYargs ? innerYargs._parseArgs(null, null, true, commandIndex) : yargs._parseArgs(null, null, true, commandIndex)
+      } else {
+        innerArgv = yargs.parsed.argv
+      }
+
+      if (innerYargs && yargs.parsed === false) aliases = innerYargs.parsed.aliases
+      else aliases = yargs.parsed.aliases
+    } else if (typeof commandHandler.builder === 'object') {
+      // as a short hand, an object can instead be provided, specifying
+      // the options that a command takes.
+      innerYargs = yargs.reset(parsed.aliases)
+      if (shouldUpdateUsage(innerYargs)) {
+        innerYargs.getUsageInstance().usage(
+          usageFromParentCommandsCommandHandler(parentCommands, commandHandler),
+          commandHandler.description
+        )
+      }
+      Object.keys(commandHandler.builder).forEach((key) => {
+        innerYargs.option(key, commandHandler.builder[key])
+      })
+      innerArgv = innerYargs._parseArgs(null, null, true, commandIndex)
+      aliases = innerYargs.parsed.aliases
+    }
+
+    if (!yargs._hasOutput()) {
+      positionalMap = populatePositionals(commandHandler, innerArgv, currentContext, yargs)
+    }
+
+    const middlewares = globalMiddleware.slice(0).concat(commandHandler.middlewares || [])
+    applyMiddleware(innerArgv, yargs, middlewares, true)
+
+    // we apply validation post-hoc, so that custom
+    // checks get passed populated positional arguments.
+    if (!yargs._hasOutput()) yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error)
+
+    if (commandHandler.handler && !yargs._hasOutput()) {
+      yargs._setHasOutput()
+
+      innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false)
+
+      const handlerResult = isPromise(innerArgv)
+        ? innerArgv.then(argv => commandHandler.handler(argv))
+        : commandHandler.handler(innerArgv)
+
+      if (isPromise(handlerResult)) {
+        handlerResult.catch(error =>
+          yargs.getUsageInstance().fail(null, error)
+        )
+      }
+    }
+
+    if (command) {
+      currentContext.commands.pop()
+      currentContext.fullCommands.pop()
+    }
+    numFiles = currentContext.files.length - numFiles
+    if (numFiles > 0) currentContext.files.splice(numFiles * -1, numFiles)
+
+    return innerArgv
+  }
+
+  function shouldUpdateUsage (yargs) {
+    return !yargs.getUsageInstance().getUsageDisabled() &&
+      yargs.getUsageInstance().getUsage().length === 0
+  }
+
+  function usageFromParentCommandsCommandHandler (parentCommands, commandHandler) {
+    const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original
+    const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c) })
+    pc.push(c)
+    return `$0 ${pc.join(' ')}`
+  }
+
+  self.runDefaultBuilderOn = function (yargs) {
+    if (shouldUpdateUsage(yargs)) {
+      // build the root-level command string from the default string.
+      const commandString = DEFAULT_MARKER.test(defaultCommand.original)
+        ? defaultCommand.original : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 ')
+      yargs.getUsageInstance().usage(
+        commandString,
+        defaultCommand.description
+      )
+    }
+    const builder = defaultCommand.builder
+    if (typeof builder === 'function') {
+      builder(yargs)
+    } else {
+      Object.keys(builder).forEach((key) => {
+        yargs.option(key, builder[key])
+      })
+    }
+  }
+
+  // transcribe all positional arguments "command <foo> <bar> [apple]"
+  // onto argv.
+  function populatePositionals (commandHandler, argv, context, yargs) {
+    argv._ = argv._.slice(context.commands.length) // nuke the current commands
+    const demanded = commandHandler.demanded.slice(0)
+    const optional = commandHandler.optional.slice(0)
+    const positionalMap = {}
+
+    validation.positionalCount(demanded.length, argv._.length)
+
+    while (demanded.length) {
+      const demand = demanded.shift()
+      populatePositional(demand, argv, positionalMap)
+    }
+
+    while (optional.length) {
+      const maybe = optional.shift()
+      populatePositional(maybe, argv, positionalMap)
+    }
+
+    argv._ = context.commands.concat(argv._)
+
+    postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original))
+
+    return positionalMap
+  }
+
+  function populatePositional (positional, argv, positionalMap, parseOptions) {
+    const cmd = positional.cmd[0]
+    if (positional.variadic) {
+      positionalMap[cmd] = argv._.splice(0).map(String)
+    } else {
+      if (argv._.length) positionalMap[cmd] = [String(argv._.shift())]
+    }
+  }
+
+  // we run yargs-parser against the positional arguments
+  // applying the same parsing logic used for flags.
+  function postProcessPositionals (argv, positionalMap, parseOptions) {
+    // combine the parsing hints we've inferred from the command
+    // string with explicitly configured parsing hints.
+    const options = Object.assign({}, yargs.getOptions())
+    options.default = Object.assign(parseOptions.default, options.default)
+    options.alias = Object.assign(parseOptions.alias, options.alias)
+    options.array = options.array.concat(parseOptions.array)
+    delete options.config //  don't load config when processing positionals.
+
+    const unparsed = []
+    Object.keys(positionalMap).forEach((key) => {
+      positionalMap[key].map((value) => {
+        unparsed.push(`--${key}`)
+        unparsed.push(value)
+      })
+    })
+
+    // short-circuit parse.
+    if (!unparsed.length) return
+
+    const parsed = Parser.detailed(unparsed, options)
+
+    if (parsed.error) {
+      yargs.getUsageInstance().fail(parsed.error.message, parsed.error)
+    } else {
+      // only copy over positional keys (don't overwrite
+      // flag arguments that were already parsed).
+      const positionalKeys = Object.keys(positionalMap)
+      Object.keys(positionalMap).forEach((key) => {
+        [].push.apply(positionalKeys, parsed.aliases[key])
+      })
+
+      Object.keys(parsed.argv).forEach((key) => {
+        if (positionalKeys.indexOf(key) !== -1) {
+          // any new aliases need to be placed in positionalMap, which
+          // is used for validation.
+          if (!positionalMap[key]) positionalMap[key] = parsed.argv[key]
+          argv[key] = parsed.argv[key]
+        }
+      })
+    }
+  }
+
+  self.cmdToParseOptions = function (cmdString) {
+    const parseOptions = {
+      array: [],
+      default: {},
+      alias: {},
+      demand: {}
+    }
+
+    const parsed = self.parseCommand(cmdString)
+    parsed.demanded.forEach((d) => {
+      const cmds = d.cmd.slice(0)
+      const cmd = cmds.shift()
+      if (d.variadic) {
+        parseOptions.array.push(cmd)
+        parseOptions.default[cmd] = []
+      }
+      cmds.forEach((c) => {
+        parseOptions.alias[cmd] = c
+      })
+      parseOptions.demand[cmd] = true
+    })
+
+    parsed.optional.forEach((o) => {
+      const cmds = o.cmd.slice(0)
+      const cmd = cmds.shift()
+      if (o.variadic) {
+        parseOptions.array.push(cmd)
+        parseOptions.default[cmd] = []
+      }
+      cmds.forEach((c) => {
+        parseOptions.alias[cmd] = c
+      })
+    })
+
+    return parseOptions
+  }
+
+  self.reset = () => {
+    handlers = {}
+    aliasMap = {}
+    defaultCommand = undefined
+    return self
+  }
+
+  // used by yargs.parse() to freeze
+  // the state of commands such that
+  // we can apply .parse() multiple times
+  // with the same yargs instance.
+  let frozen
+  self.freeze = () => {
+    frozen = {}
+    frozen.handlers = handlers
+    frozen.aliasMap = aliasMap
+    frozen.defaultCommand = defaultCommand
+  }
+  self.unfreeze = () => {
+    handlers = frozen.handlers
+    aliasMap = frozen.aliasMap
+    defaultCommand = frozen.defaultCommand
+    frozen = undefined
+  }
+
+  return self
+}
Index: trip-planner-front/node_modules/yargs/lib/completion-templates.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/completion-templates.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/completion-templates.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,49 @@
+exports.completionShTemplate =
+`###-begin-{{app_name}}-completions-###
+#
+# yargs command completion script
+#
+# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc
+#    or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.
+#
+_yargs_completions()
+{
+    local cur_word args type_list
+
+    cur_word="\${COMP_WORDS[COMP_CWORD]}"
+    args=("\${COMP_WORDS[@]}")
+
+    # ask yargs to generate completions.
+    type_list=$({{app_path}} --get-yargs-completions "\${args[@]}")
+
+    COMPREPLY=( $(compgen -W "\${type_list}" -- \${cur_word}) )
+
+    # if no match was found, fall back to filename completion
+    if [ \${#COMPREPLY[@]} -eq 0 ]; then
+      COMPREPLY=()
+    fi
+
+    return 0
+}
+complete -o default -F _yargs_completions {{app_name}}
+###-end-{{app_name}}-completions-###
+`
+
+exports.completionZshTemplate = `###-begin-{{app_name}}-completions-###
+#
+# yargs command completion script
+#
+# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc
+#    or {{app_path}} {{completion_command}} >> ~/.zsh_profile on OSX.
+#
+_{{app_name}}_yargs_completions()
+{
+  local reply
+  local si=$IFS
+  IFS=$'\n' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "\${words[@]}"))
+  IFS=$si
+  _describe 'values' reply
+}
+compdef _{{app_name}}_yargs_completions {{app_name}}
+###-end-{{app_name}}-completions-###
+`
Index: trip-planner-front/node_modules/yargs/lib/completion.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/completion.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/completion.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,115 @@
+'use strict'
+const path = require('path')
+
+// add bash completions to your
+//  yargs-powered applications.
+module.exports = function completion (yargs, usage, command) {
+  const self = {
+    completionKey: 'get-yargs-completions'
+  }
+
+  const zshShell = process.env.SHELL && process.env.SHELL.indexOf('zsh') !== -1
+  // get a list of completion commands.
+  // 'args' is the array of strings from the line to be completed
+  self.getCompletion = function getCompletion (args, done) {
+    const completions = []
+    const current = args.length ? args[args.length - 1] : ''
+    const argv = yargs.parse(args, true)
+    const aliases = yargs.parsed.aliases
+    const parentCommands = yargs.getContext().commands
+
+    // a custom completion function can be provided
+    // to completion().
+    if (completionFunction) {
+      if (completionFunction.length < 3) {
+        const result = completionFunction(current, argv)
+
+        // promise based completion function.
+        if (typeof result.then === 'function') {
+          return result.then((list) => {
+            process.nextTick(() => { done(list) })
+          }).catch((err) => {
+            process.nextTick(() => { throw err })
+          })
+        }
+
+        // synchronous completion function.
+        return done(result)
+      } else {
+        // asynchronous completion function
+        return completionFunction(current, argv, (completions) => {
+          done(completions)
+        })
+      }
+    }
+
+    const handlers = command.getCommandHandlers()
+    for (let i = 0, ii = args.length; i < ii; ++i) {
+      if (handlers[args[i]] && handlers[args[i]].builder) {
+        const builder = handlers[args[i]].builder
+        if (typeof builder === 'function') {
+          const y = yargs.reset()
+          builder(y)
+          return y.argv
+        }
+      }
+    }
+
+    if (!current.match(/^-/) && parentCommands[parentCommands.length - 1] !== current) {
+      usage.getCommands().forEach((usageCommand) => {
+        const commandName = command.parseCommand(usageCommand[0]).cmd
+        if (args.indexOf(commandName) === -1) {
+          if (!zshShell) {
+            completions.push(commandName)
+          } else {
+            const desc = usageCommand[1] || ''
+            completions.push(commandName.replace(/:/g, '\\:') + ':' + desc)
+          }
+        }
+      })
+    }
+
+    if (current.match(/^-/) || (current === '' && completions.length === 0)) {
+      const descs = usage.getDescriptions()
+      Object.keys(yargs.getOptions().key).forEach((key) => {
+        // If the key and its aliases aren't in 'args', add the key to 'completions'
+        const keyAndAliases = [key].concat(aliases[key] || [])
+        const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1)
+        if (notInArgs) {
+          if (!zshShell) {
+            completions.push(`--${key}`)
+          } else {
+            const desc = descs[key] || ''
+            completions.push(`--${key.replace(/:/g, '\\:')}:${desc.replace('__yargsString__:', '')}`)
+          }
+        }
+      })
+    }
+
+    done(completions)
+  }
+
+  // generate the completion script to add to your .bashrc.
+  self.generateCompletionScript = function generateCompletionScript ($0, cmd) {
+    const templates = require('./completion-templates')
+    let script = zshShell ? templates.completionZshTemplate : templates.completionShTemplate
+    const name = path.basename($0)
+
+    // add ./to applications not yet installed as bin.
+    if ($0.match(/\.js$/)) $0 = `./${$0}`
+
+    script = script.replace(/{{app_name}}/g, name)
+    script = script.replace(/{{completion_command}}/g, cmd)
+    return script.replace(/{{app_path}}/g, $0)
+  }
+
+  // register a function to perform your own custom
+  // completions., this function can be either
+  // synchrnous or asynchronous.
+  let completionFunction = null
+  self.registerFunction = (fn) => {
+    completionFunction = fn
+  }
+
+  return self
+}
Index: trip-planner-front/node_modules/yargs/lib/decamelize.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/decamelize.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/decamelize.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,32 @@
+/*
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+'use strict'
+
+module.exports = (text, separator) => {
+  separator = typeof separator === 'undefined' ? '_' : separator
+
+  return text
+    .replace(/([a-z\d])([A-Z])/g, `$1${separator}$2`)
+    .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, `$1${separator}$2`)
+    .toLowerCase()
+}
Index: trip-planner-front/node_modules/yargs/lib/is-promise.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/is-promise.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/is-promise.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,3 @@
+module.exports = function isPromise (maybePromise) {
+  return maybePromise instanceof Promise
+}
Index: trip-planner-front/node_modules/yargs/lib/levenshtein.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/levenshtein.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/levenshtein.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,58 @@
+/*
+Copyright (c) 2011 Andrei Mackenzie
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+// levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed.
+// gist, which can be found here: https://gist.github.com/andrei-m/982927
+'use strict'
+// Compute the edit distance between the two given strings
+module.exports = function levenshtein (a, b) {
+  if (a.length === 0) return b.length
+  if (b.length === 0) return a.length
+
+  const matrix = []
+
+  // increment along the first column of each row
+  let i
+  for (i = 0; i <= b.length; i++) {
+    matrix[i] = [i]
+  }
+
+  // increment each column in the first row
+  let j
+  for (j = 0; j <= a.length; j++) {
+    matrix[0][j] = j
+  }
+
+  // Fill in the rest of the matrix
+  for (i = 1; i <= b.length; i++) {
+    for (j = 1; j <= a.length; j++) {
+      if (b.charAt(i - 1) === a.charAt(j - 1)) {
+        matrix[i][j] = matrix[i - 1][j - 1]
+      } else {
+        matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
+          Math.min(matrix[i][j - 1] + 1, // insertion
+            matrix[i - 1][j] + 1)) // deletion
+      }
+    }
+  }
+
+  return matrix[b.length][a.length]
+}
Index: trip-planner-front/node_modules/yargs/lib/middleware.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/middleware.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/middleware.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,65 @@
+'use strict'
+
+// hoisted due to circular dependency on command.
+module.exports = {
+  applyMiddleware,
+  commandMiddlewareFactory,
+  globalMiddlewareFactory
+}
+const isPromise = require('./is-promise')
+const argsert = require('./argsert')
+
+function globalMiddlewareFactory (globalMiddleware, context) {
+  return function (callback, applyBeforeValidation = false) {
+    argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length)
+    if (Array.isArray(callback)) {
+      for (let i = 0; i < callback.length; i++) {
+        if (typeof callback[i] !== 'function') {
+          throw Error('middleware must be a function')
+        }
+        callback[i].applyBeforeValidation = applyBeforeValidation
+      }
+      Array.prototype.push.apply(globalMiddleware, callback)
+    } else if (typeof callback === 'function') {
+      callback.applyBeforeValidation = applyBeforeValidation
+      globalMiddleware.push(callback)
+    }
+    return context
+  }
+}
+
+function commandMiddlewareFactory (commandMiddleware) {
+  if (!commandMiddleware) return []
+  return commandMiddleware.map(middleware => {
+    middleware.applyBeforeValidation = false
+    return middleware
+  })
+}
+
+function applyMiddleware (argv, yargs, middlewares, beforeValidation) {
+  const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true')
+  return middlewares
+    .reduce((accumulation, middleware) => {
+      if (middleware.applyBeforeValidation !== beforeValidation &&
+          !isPromise(accumulation)) {
+        return accumulation
+      }
+
+      if (isPromise(accumulation)) {
+        return accumulation
+          .then(initialObj =>
+            Promise.all([initialObj, middleware(initialObj, yargs)])
+          )
+          .then(([initialObj, middlewareObj]) =>
+            Object.assign(initialObj, middlewareObj)
+          )
+      } else {
+        const result = middleware(argv, yargs)
+        if (beforeValidation && isPromise(result)) throw beforeValidationError
+
+        return isPromise(result)
+          ? result.then(middlewareObj => Object.assign(accumulation, middlewareObj))
+          : Object.assign(accumulation, result)
+      }
+    }, argv)
+}
Index: trip-planner-front/node_modules/yargs/lib/obj-filter.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/obj-filter.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/obj-filter.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,11 @@
+'use strict'
+module.exports = function objFilter (original, filter) {
+  const obj = {}
+  filter = filter || ((k, v) => true)
+  Object.keys(original || {}).forEach((key) => {
+    if (filter(key, original[key])) {
+      obj[key] = original[key]
+    }
+  })
+  return obj
+}
Index: trip-planner-front/node_modules/yargs/lib/platform-shims/browser.mjs
===================================================================
--- trip-planner-front/node_modules/yargs/lib/platform-shims/browser.mjs	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ 	(revision )
@@ -1,95 +1,0 @@
-/* eslint-disable no-unused-vars */
-'use strict';
-
-import cliui from 'https://unpkg.com/cliui@7.0.1/index.mjs'; // eslint-disable-line
-import Parser from 'https://unpkg.com/yargs-parser@19.0.0/browser.js'; // eslint-disable-line
-import {getProcessArgvBin} from '../../build/lib/utils/process-argv.js';
-import {YError} from '../../build/lib/yerror.js';
-
-const REQUIRE_ERROR = 'require is not supported in browser';
-const REQUIRE_DIRECTORY_ERROR =
-  'loading a directory of commands is not supported in browser';
-
-export default {
-  assert: {
-    notStrictEqual: (a, b) => {
-      // noop.
-    },
-    strictEqual: (a, b) => {
-      // noop.
-    },
-  },
-  cliui,
-  findUp: () => undefined,
-  getEnv: key => {
-    // There is no environment in browser:
-    return undefined;
-  },
-  inspect: console.log,
-  getCallerFile: () => {
-    throw new YError(REQUIRE_DIRECTORY_ERROR);
-  },
-  getProcessArgvBin,
-  mainFilename: 'yargs',
-  Parser,
-  path: {
-    basename: str => str,
-    dirname: str => str,
-    extname: str => str,
-    relative: str => str,
-  },
-  process: {
-    argv: () => [],
-    cwd: () => '',
-    emitWarning: (warning, name) => {},
-    execPath: () => '',
-    // exit is noop browser:
-    exit: () => {},
-    nextTick: cb => {
-      // eslint-disable-next-line no-undef
-      window.setTimeout(cb, 1);
-    },
-    stdColumns: 80,
-  },
-  readFileSync: () => {
-    return '';
-  },
-  require: () => {
-    throw new YError(REQUIRE_ERROR);
-  },
-  requireDirectory: () => {
-    throw new YError(REQUIRE_DIRECTORY_ERROR);
-  },
-  stringWidth: str => {
-    return [...str].length;
-  },
-  // TODO: replace this with y18n once it's ported to ESM:
-  y18n: {
-    __: (...str) => {
-      if (str.length === 0) return '';
-      const args = str.slice(1);
-      return sprintf(str[0], ...args);
-    },
-    __n: (str1, str2, count, ...args) => {
-      if (count === 1) {
-        return sprintf(str1, ...args);
-      } else {
-        return sprintf(str2, ...args);
-      }
-    },
-    getLocale: () => {
-      return 'en_US';
-    },
-    setLocale: () => {},
-    updateLocale: () => {},
-  },
-};
-
-function sprintf(_str, ...args) {
-  let str = '';
-  const split = _str.split('%s');
-  split.forEach((token, i) => {
-    str += `${token}${split[i + 1] !== undefined && args[i] ? args[i] : ''}`;
-  });
-  return str;
-}
Index: trip-planner-front/node_modules/yargs/lib/platform-shims/esm.mjs
===================================================================
--- trip-planner-front/node_modules/yargs/lib/platform-shims/esm.mjs	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ 	(revision )
@@ -1,68 +1,0 @@
-'use strict'
-
-import { notStrictEqual, strictEqual } from 'assert'
-import cliui from 'cliui'
-import escalade from 'escalade/sync'
-import { inspect } from 'util'
-import { readFileSync } from 'fs'
-import { fileURLToPath } from 'url';
-import Parser from 'yargs-parser'
-import { basename, dirname, extname, relative, resolve } from 'path'
-import { getProcessArgvBin } from '../../build/lib/utils/process-argv.js'
-import { YError } from '../../build/lib/yerror.js'
-import y18n from 'y18n'
-
-const REQUIRE_ERROR = 'require is not supported by ESM'
-const REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supported yet for ESM'
-
-const mainFilename = fileURLToPath(import.meta.url).split('node_modules')[0]
-const __dirname = fileURLToPath(import.meta.url)
-
-export default {
-  assert: {
-    notStrictEqual,
-    strictEqual
-  },
-  cliui,
-  findUp: escalade,
-  getEnv: (key) => {
-    return process.env[key]
-  },
-  inspect,
-  getCallerFile: () => {
-    throw new YError(REQUIRE_DIRECTORY_ERROR)
-  },
-  getProcessArgvBin,
-  mainFilename: mainFilename || process.cwd(),
-  Parser,
-  path: {
-    basename,
-    dirname,
-    extname,
-    relative,
-    resolve
-  },
-  process: {
-    argv: () => process.argv,
-    cwd: process.cwd,
-    emitWarning: (warning, type) => process.emitWarning(warning, type),
-    execPath: () => process.execPath,
-    exit: process.exit,
-    nextTick: process.nextTick,
-    stdColumns: typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null
-  },
-  readFileSync,
-  require: () => {
-    throw new YError(REQUIRE_ERROR)
-  },
-  requireDirectory: () => {
-    throw new YError(REQUIRE_DIRECTORY_ERROR)
-  },
-  stringWidth: (str) => {
-    return [...str].length
-  },
-  y18n: y18n({
-    directory: resolve(__dirname, '../../../locales'),
-    updateFiles: false
-  })
-}
Index: trip-planner-front/node_modules/yargs/lib/usage.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/usage.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/usage.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,540 @@
+'use strict'
+// this file handles outputting usage instructions,
+// failures, etc. keeps logging in one place.
+const decamelize = require('./decamelize')
+const stringWidth = require('string-width')
+const objFilter = require('./obj-filter')
+const path = require('path')
+const setBlocking = require('set-blocking')
+const YError = require('./yerror')
+
+module.exports = function usage (yargs, y18n) {
+  const __ = y18n.__
+  const self = {}
+
+  // methods for ouputting/building failure message.
+  const fails = []
+  self.failFn = function failFn (f) {
+    fails.push(f)
+  }
+
+  let failMessage = null
+  let showHelpOnFail = true
+  self.showHelpOnFail = function showHelpOnFailFn (enabled, message) {
+    if (typeof enabled === 'string') {
+      message = enabled
+      enabled = true
+    } else if (typeof enabled === 'undefined') {
+      enabled = true
+    }
+    failMessage = message
+    showHelpOnFail = enabled
+    return self
+  }
+
+  let failureOutput = false
+  self.fail = function fail (msg, err) {
+    const logger = yargs._getLoggerInstance()
+
+    if (fails.length) {
+      for (let i = fails.length - 1; i >= 0; --i) {
+        fails[i](msg, err, self)
+      }
+    } else {
+      if (yargs.getExitProcess()) setBlocking(true)
+
+      // don't output failure message more than once
+      if (!failureOutput) {
+        failureOutput = true
+        if (showHelpOnFail) {
+          yargs.showHelp('error')
+          logger.error()
+        }
+        if (msg || err) logger.error(msg || err)
+        if (failMessage) {
+          if (msg || err) logger.error('')
+          logger.error(failMessage)
+        }
+      }
+
+      err = err || new YError(msg)
+      if (yargs.getExitProcess()) {
+        return yargs.exit(1)
+      } else if (yargs._hasParseCallback()) {
+        return yargs.exit(1, err)
+      } else {
+        throw err
+      }
+    }
+  }
+
+  // methods for ouputting/building help (usage) message.
+  let usages = []
+  let usageDisabled = false
+  self.usage = (msg, description) => {
+    if (msg === null) {
+      usageDisabled = true
+      usages = []
+      return
+    }
+    usageDisabled = false
+    usages.push([msg, description || ''])
+    return self
+  }
+  self.getUsage = () => {
+    return usages
+  }
+  self.getUsageDisabled = () => {
+    return usageDisabled
+  }
+
+  self.getPositionalGroupName = () => {
+    return __('Positionals:')
+  }
+
+  let examples = []
+  self.example = (cmd, description) => {
+    examples.push([cmd, description || ''])
+  }
+
+  let commands = []
+  self.command = function command (cmd, description, isDefault, aliases) {
+    // the last default wins, so cancel out any previously set default
+    if (isDefault) {
+      commands = commands.map((cmdArray) => {
+        cmdArray[2] = false
+        return cmdArray
+      })
+    }
+    commands.push([cmd, description || '', isDefault, aliases])
+  }
+  self.getCommands = () => commands
+
+  let descriptions = {}
+  self.describe = function describe (key, desc) {
+    if (typeof key === 'object') {
+      Object.keys(key).forEach((k) => {
+        self.describe(k, key[k])
+      })
+    } else {
+      descriptions[key] = desc
+    }
+  }
+  self.getDescriptions = () => descriptions
+
+  let epilog
+  self.epilog = (msg) => {
+    epilog = msg
+  }
+
+  let wrapSet = false
+  let wrap
+  self.wrap = (cols) => {
+    wrapSet = true
+    wrap = cols
+  }
+
+  function getWrap () {
+    if (!wrapSet) {
+      wrap = windowWidth()
+      wrapSet = true
+    }
+
+    return wrap
+  }
+
+  const deferY18nLookupPrefix = '__yargsString__:'
+  self.deferY18nLookup = str => deferY18nLookupPrefix + str
+
+  const defaultGroup = 'Options:'
+  self.help = function help () {
+    normalizeAliases()
+
+    // handle old demanded API
+    const base$0 = path.basename(yargs.$0)
+    const demandedOptions = yargs.getDemandedOptions()
+    const demandedCommands = yargs.getDemandedCommands()
+    const groups = yargs.getGroups()
+    const options = yargs.getOptions()
+
+    let keys = []
+    keys = keys.concat(Object.keys(descriptions))
+    keys = keys.concat(Object.keys(demandedOptions))
+    keys = keys.concat(Object.keys(demandedCommands))
+    keys = keys.concat(Object.keys(options.default))
+    keys = keys.filter(filterHiddenOptions)
+    keys = Object.keys(keys.reduce((acc, key) => {
+      if (key !== '_') acc[key] = true
+      return acc
+    }, {}))
+
+    const theWrap = getWrap()
+    const ui = require('cliui')({
+      width: theWrap,
+      wrap: !!theWrap
+    })
+
+    // the usage string.
+    if (!usageDisabled) {
+      if (usages.length) {
+        // user-defined usage.
+        usages.forEach((usage) => {
+          ui.div(`${usage[0].replace(/\$0/g, base$0)}`)
+          if (usage[1]) {
+            ui.div({ text: `${usage[1]}`, padding: [1, 0, 0, 0] })
+          }
+        })
+        ui.div()
+      } else if (commands.length) {
+        let u = null
+        // demonstrate how commands are used.
+        if (demandedCommands._) {
+          u = `${base$0} <${__('command')}>\n`
+        } else {
+          u = `${base$0} [${__('command')}]\n`
+        }
+        ui.div(`${u}`)
+      }
+    }
+
+    // your application's commands, i.e., non-option
+    // arguments populated in '_'.
+    if (commands.length) {
+      ui.div(__('Commands:'))
+
+      const context = yargs.getContext()
+      const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : ''
+
+      if (yargs.getParserConfiguration()['sort-commands'] === true) {
+        commands = commands.sort((a, b) => a[0].localeCompare(b[0]))
+      }
+
+      commands.forEach((command) => {
+        const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}` // drop $0 from default commands.
+        ui.span(
+          {
+            text: commandString,
+            padding: [0, 2, 0, 2],
+            width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4
+          },
+          { text: command[1] }
+        )
+        const hints = []
+        if (command[2]) hints.push(`[${__('default:').slice(0, -1)}]`) // TODO hacking around i18n here
+        if (command[3] && command[3].length) {
+          hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`)
+        }
+        if (hints.length) {
+          ui.div({ text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right' })
+        } else {
+          ui.div()
+        }
+      })
+
+      ui.div()
+    }
+
+    // perform some cleanup on the keys array, making it
+    // only include top-level keys not their aliases.
+    const aliasKeys = (Object.keys(options.alias) || [])
+      .concat(Object.keys(yargs.parsed.newAliases) || [])
+
+    keys = keys.filter(key => !yargs.parsed.newAliases[key] && aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1))
+
+    // populate 'Options:' group with any keys that have not
+    // explicitly had a group set.
+    if (!groups[defaultGroup]) groups[defaultGroup] = []
+    addUngroupedKeys(keys, options.alias, groups)
+
+    // display 'Options:' table along with any custom tables:
+    Object.keys(groups).forEach((groupName) => {
+      if (!groups[groupName].length) return
+
+      // if we've grouped the key 'f', but 'f' aliases 'foobar',
+      // normalizedKeys should contain only 'foobar'.
+      const normalizedKeys = groups[groupName].filter(filterHiddenOptions).map((key) => {
+        if (~aliasKeys.indexOf(key)) return key
+        for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) {
+          if (~(options.alias[aliasKey] || []).indexOf(key)) return aliasKey
+        }
+        return key
+      })
+
+      if (normalizedKeys.length < 1) return
+
+      ui.div(__(groupName))
+
+      // actually generate the switches string --foo, -f, --bar.
+      const switches = normalizedKeys.reduce((acc, key) => {
+        acc[key] = [ key ].concat(options.alias[key] || [])
+          .map(sw => {
+            // for the special positional group don't
+            // add '--' or '-' prefix.
+            if (groupName === self.getPositionalGroupName()) return sw
+            else return (sw.length > 1 ? '--' : '-') + sw
+          })
+          .join(', ')
+
+        return acc
+      }, {})
+
+      normalizedKeys.forEach((key) => {
+        const kswitch = switches[key]
+        let desc = descriptions[key] || ''
+        let type = null
+
+        if (~desc.lastIndexOf(deferY18nLookupPrefix)) desc = __(desc.substring(deferY18nLookupPrefix.length))
+
+        if (~options.boolean.indexOf(key)) type = `[${__('boolean')}]`
+        if (~options.count.indexOf(key)) type = `[${__('count')}]`
+        if (~options.string.indexOf(key)) type = `[${__('string')}]`
+        if (~options.normalize.indexOf(key)) type = `[${__('string')}]`
+        if (~options.array.indexOf(key)) type = `[${__('array')}]`
+        if (~options.number.indexOf(key)) type = `[${__('number')}]`
+
+        const extra = [
+          type,
+          (key in demandedOptions) ? `[${__('required')}]` : null,
+          options.choices && options.choices[key] ? `[${__('choices:')} ${
+            self.stringifiedValues(options.choices[key])}]` : null,
+          defaultString(options.default[key], options.defaultDescription[key])
+        ].filter(Boolean).join(' ')
+
+        ui.span(
+          { text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4 },
+          desc
+        )
+
+        if (extra) ui.div({ text: extra, padding: [0, 0, 0, 2], align: 'right' })
+        else ui.div()
+      })
+
+      ui.div()
+    })
+
+    // describe some common use-cases for your application.
+    if (examples.length) {
+      ui.div(__('Examples:'))
+
+      examples.forEach((example) => {
+        example[0] = example[0].replace(/\$0/g, base$0)
+      })
+
+      examples.forEach((example) => {
+        if (example[1] === '') {
+          ui.div(
+            {
+              text: example[0],
+              padding: [0, 2, 0, 2]
+            }
+          )
+        } else {
+          ui.div(
+            {
+              text: example[0],
+              padding: [0, 2, 0, 2],
+              width: maxWidth(examples, theWrap) + 4
+            }, {
+              text: example[1]
+            }
+          )
+        }
+      })
+
+      ui.div()
+    }
+
+    // the usage string.
+    if (epilog) {
+      const e = epilog.replace(/\$0/g, base$0)
+      ui.div(`${e}\n`)
+    }
+
+    // Remove the trailing white spaces
+    return ui.toString().replace(/\s*$/, '')
+  }
+
+  // return the maximum width of a string
+  // in the left-hand column of a table.
+  function maxWidth (table, theWrap, modifier) {
+    let width = 0
+
+    // table might be of the form [leftColumn],
+    // or {key: leftColumn}
+    if (!Array.isArray(table)) {
+      table = Object.keys(table).map(key => [table[key]])
+    }
+
+    table.forEach((v) => {
+      width = Math.max(
+        stringWidth(modifier ? `${modifier} ${v[0]}` : v[0]),
+        width
+      )
+    })
+
+    // if we've enabled 'wrap' we should limit
+    // the max-width of the left-column.
+    if (theWrap) width = Math.min(width, parseInt(theWrap * 0.5, 10))
+
+    return width
+  }
+
+  // make sure any options set for aliases,
+  // are copied to the keys being aliased.
+  function normalizeAliases () {
+    // handle old demanded API
+    const demandedOptions = yargs.getDemandedOptions()
+    const options = yargs.getOptions()
+
+    ;(Object.keys(options.alias) || []).forEach((key) => {
+      options.alias[key].forEach((alias) => {
+        // copy descriptions.
+        if (descriptions[alias]) self.describe(key, descriptions[alias])
+        // copy demanded.
+        if (alias in demandedOptions) yargs.demandOption(key, demandedOptions[alias])
+        // type messages.
+        if (~options.boolean.indexOf(alias)) yargs.boolean(key)
+        if (~options.count.indexOf(alias)) yargs.count(key)
+        if (~options.string.indexOf(alias)) yargs.string(key)
+        if (~options.normalize.indexOf(alias)) yargs.normalize(key)
+        if (~options.array.indexOf(alias)) yargs.array(key)
+        if (~options.number.indexOf(alias)) yargs.number(key)
+      })
+    })
+  }
+
+  // given a set of keys, place any keys that are
+  // ungrouped under the 'Options:' grouping.
+  function addUngroupedKeys (keys, aliases, groups) {
+    let groupedKeys = []
+    let toCheck = null
+    Object.keys(groups).forEach((group) => {
+      groupedKeys = groupedKeys.concat(groups[group])
+    })
+
+    keys.forEach((key) => {
+      toCheck = [key].concat(aliases[key])
+      if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) {
+        groups[defaultGroup].push(key)
+      }
+    })
+    return groupedKeys
+  }
+
+  function filterHiddenOptions (key) {
+    return yargs.getOptions().hiddenOptions.indexOf(key) < 0 || yargs.parsed.argv[yargs.getOptions().showHiddenOpt]
+  }
+
+  self.showHelp = (level) => {
+    const logger = yargs._getLoggerInstance()
+    if (!level) level = 'error'
+    const emit = typeof level === 'function' ? level : logger[level]
+    emit(self.help())
+  }
+
+  self.functionDescription = (fn) => {
+    const description = fn.name ? decamelize(fn.name, '-') : __('generated-value')
+    return ['(', description, ')'].join('')
+  }
+
+  self.stringifiedValues = function stringifiedValues (values, separator) {
+    let string = ''
+    const sep = separator || ', '
+    const array = [].concat(values)
+
+    if (!values || !array.length) return string
+
+    array.forEach((value) => {
+      if (string.length) string += sep
+      string += JSON.stringify(value)
+    })
+
+    return string
+  }
+
+  // format the default-value-string displayed in
+  // the right-hand column.
+  function defaultString (value, defaultDescription) {
+    let string = `[${__('default:')} `
+
+    if (value === undefined && !defaultDescription) return null
+
+    if (defaultDescription) {
+      string += defaultDescription
+    } else {
+      switch (typeof value) {
+        case 'string':
+          string += `"${value}"`
+          break
+        case 'object':
+          string += JSON.stringify(value)
+          break
+        default:
+          string += value
+      }
+    }
+
+    return `${string}]`
+  }
+
+  // guess the width of the console window, max-width 80.
+  function windowWidth () {
+    const maxWidth = 80
+    if (typeof process === 'object' && process.stdout && process.stdout.columns) {
+      return Math.min(maxWidth, process.stdout.columns)
+    } else {
+      return maxWidth
+    }
+  }
+
+  // logic for displaying application version.
+  let version = null
+  self.version = (ver) => {
+    version = ver
+  }
+
+  self.showVersion = () => {
+    const logger = yargs._getLoggerInstance()
+    logger.log(version)
+  }
+
+  self.reset = function reset (localLookup) {
+    // do not reset wrap here
+    // do not reset fails here
+    failMessage = null
+    failureOutput = false
+    usages = []
+    usageDisabled = false
+    epilog = undefined
+    examples = []
+    commands = []
+    descriptions = objFilter(descriptions, (k, v) => !localLookup[k])
+    return self
+  }
+
+  let frozen
+  self.freeze = function freeze () {
+    frozen = {}
+    frozen.failMessage = failMessage
+    frozen.failureOutput = failureOutput
+    frozen.usages = usages
+    frozen.usageDisabled = usageDisabled
+    frozen.epilog = epilog
+    frozen.examples = examples
+    frozen.commands = commands
+    frozen.descriptions = descriptions
+  }
+  self.unfreeze = function unfreeze () {
+    failMessage = frozen.failMessage
+    failureOutput = frozen.failureOutput
+    usages = frozen.usages
+    usageDisabled = frozen.usageDisabled
+    epilog = frozen.epilog
+    examples = frozen.examples
+    commands = frozen.commands
+    descriptions = frozen.descriptions
+    frozen = undefined
+  }
+
+  return self
+}
Index: trip-planner-front/node_modules/yargs/lib/validation.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/validation.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/validation.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,341 @@
+'use strict'
+const argsert = require('./argsert')
+const objFilter = require('./obj-filter')
+const specialKeys = ['$0', '--', '_']
+
+// validation-type-stuff, missing params,
+// bad implications, custom checks.
+module.exports = function validation (yargs, usage, y18n) {
+  const __ = y18n.__
+  const __n = y18n.__n
+  const self = {}
+
+  // validate appropriate # of non-option
+  // arguments were provided, i.e., '_'.
+  self.nonOptionCount = function nonOptionCount (argv) {
+    const demandedCommands = yargs.getDemandedCommands()
+    // don't count currently executing commands
+    const _s = argv._.length - yargs.getContext().commands.length
+
+    if (demandedCommands._ && (_s < demandedCommands._.min || _s > demandedCommands._.max)) {
+      if (_s < demandedCommands._.min) {
+        if (demandedCommands._.minMsg !== undefined) {
+          usage.fail(
+            // replace $0 with observed, $1 with expected.
+            demandedCommands._.minMsg ? demandedCommands._.minMsg.replace(/\$0/g, _s).replace(/\$1/, demandedCommands._.min) : null
+          )
+        } else {
+          usage.fail(
+            __('Not enough non-option arguments: got %s, need at least %s', _s, demandedCommands._.min)
+          )
+        }
+      } else if (_s > demandedCommands._.max) {
+        if (demandedCommands._.maxMsg !== undefined) {
+          usage.fail(
+            // replace $0 with observed, $1 with expected.
+            demandedCommands._.maxMsg ? demandedCommands._.maxMsg.replace(/\$0/g, _s).replace(/\$1/, demandedCommands._.max) : null
+          )
+        } else {
+          usage.fail(
+            __('Too many non-option arguments: got %s, maximum of %s', _s, demandedCommands._.max)
+          )
+        }
+      }
+    }
+  }
+
+  // validate the appropriate # of <required>
+  // positional arguments were provided:
+  self.positionalCount = function positionalCount (required, observed) {
+    if (observed < required) {
+      usage.fail(
+        __('Not enough non-option arguments: got %s, need at least %s', observed, required)
+      )
+    }
+  }
+
+  // make sure all the required arguments are present.
+  self.requiredArguments = function requiredArguments (argv) {
+    const demandedOptions = yargs.getDemandedOptions()
+    let missing = null
+
+    Object.keys(demandedOptions).forEach((key) => {
+      if (!argv.hasOwnProperty(key) || typeof argv[key] === 'undefined') {
+        missing = missing || {}
+        missing[key] = demandedOptions[key]
+      }
+    })
+
+    if (missing) {
+      const customMsgs = []
+      Object.keys(missing).forEach((key) => {
+        const msg = missing[key]
+        if (msg && customMsgs.indexOf(msg) < 0) {
+          customMsgs.push(msg)
+        }
+      })
+
+      const customMsg = customMsgs.length ? `\n${customMsgs.join('\n')}` : ''
+
+      usage.fail(__n(
+        'Missing required argument: %s',
+        'Missing required arguments: %s',
+        Object.keys(missing).length,
+        Object.keys(missing).join(', ') + customMsg
+      ))
+    }
+  }
+
+  // check for unknown arguments (strict-mode).
+  self.unknownArguments = function unknownArguments (argv, aliases, positionalMap) {
+    const commandKeys = yargs.getCommandInstance().getCommands()
+    const unknown = []
+    const currentContext = yargs.getContext()
+
+    Object.keys(argv).forEach((key) => {
+      if (specialKeys.indexOf(key) === -1 &&
+        !positionalMap.hasOwnProperty(key) &&
+        !yargs._getParseContext().hasOwnProperty(key) &&
+        !aliases.hasOwnProperty(key)
+      ) {
+        unknown.push(key)
+      }
+    })
+
+    if (commandKeys.length > 0) {
+      argv._.slice(currentContext.commands.length).forEach((key) => {
+        if (commandKeys.indexOf(key) === -1) {
+          unknown.push(key)
+        }
+      })
+    }
+
+    if (unknown.length > 0) {
+      usage.fail(__n(
+        'Unknown argument: %s',
+        'Unknown arguments: %s',
+        unknown.length,
+        unknown.join(', ')
+      ))
+    }
+  }
+
+  // validate arguments limited to enumerated choices
+  self.limitedChoices = function limitedChoices (argv) {
+    const options = yargs.getOptions()
+    const invalid = {}
+
+    if (!Object.keys(options.choices).length) return
+
+    Object.keys(argv).forEach((key) => {
+      if (specialKeys.indexOf(key) === -1 &&
+        options.choices.hasOwnProperty(key)) {
+        [].concat(argv[key]).forEach((value) => {
+          // TODO case-insensitive configurability
+          if (options.choices[key].indexOf(value) === -1 &&
+              value !== undefined) {
+            invalid[key] = (invalid[key] || []).concat(value)
+          }
+        })
+      }
+    })
+
+    const invalidKeys = Object.keys(invalid)
+
+    if (!invalidKeys.length) return
+
+    let msg = __('Invalid values:')
+    invalidKeys.forEach((key) => {
+      msg += `\n  ${__(
+        'Argument: %s, Given: %s, Choices: %s',
+        key,
+        usage.stringifiedValues(invalid[key]),
+        usage.stringifiedValues(options.choices[key])
+      )}`
+    })
+    usage.fail(msg)
+  }
+
+  // custom checks, added using the `check` option on yargs.
+  let checks = []
+  self.check = function check (f, global) {
+    checks.push({
+      func: f,
+      global
+    })
+  }
+
+  self.customChecks = function customChecks (argv, aliases) {
+    for (let i = 0, f; (f = checks[i]) !== undefined; i++) {
+      const func = f.func
+      let result = null
+      try {
+        result = func(argv, aliases)
+      } catch (err) {
+        usage.fail(err.message ? err.message : err, err)
+        continue
+      }
+
+      if (!result) {
+        usage.fail(__('Argument check failed: %s', func.toString()))
+      } else if (typeof result === 'string' || result instanceof Error) {
+        usage.fail(result.toString(), result)
+      }
+    }
+  }
+
+  // check implications, argument foo implies => argument bar.
+  let implied = {}
+  self.implies = function implies (key, value) {
+    argsert('<string|object> [array|number|string]', [key, value], arguments.length)
+
+    if (typeof key === 'object') {
+      Object.keys(key).forEach((k) => {
+        self.implies(k, key[k])
+      })
+    } else {
+      yargs.global(key)
+      if (!implied[key]) {
+        implied[key] = []
+      }
+      if (Array.isArray(value)) {
+        value.forEach((i) => self.implies(key, i))
+      } else {
+        implied[key].push(value)
+      }
+    }
+  }
+  self.getImplied = function getImplied () {
+    return implied
+  }
+
+  self.implications = function implications (argv) {
+    const implyFail = []
+
+    Object.keys(implied).forEach((key) => {
+      const origKey = key
+      ;(implied[key] || []).forEach((value) => {
+        let num
+        let key = origKey
+        const origValue = value
+
+        // convert string '1' to number 1
+        num = Number(key)
+        key = isNaN(num) ? key : num
+
+        if (typeof key === 'number') {
+          // check length of argv._
+          key = argv._.length >= key
+        } else if (key.match(/^--no-.+/)) {
+          // check if key doesn't exist
+          key = key.match(/^--no-(.+)/)[1]
+          key = !argv[key]
+        } else {
+          // check if key exists
+          key = argv[key]
+        }
+
+        num = Number(value)
+        value = isNaN(num) ? value : num
+
+        if (typeof value === 'number') {
+          value = argv._.length >= value
+        } else if (value.match(/^--no-.+/)) {
+          value = value.match(/^--no-(.+)/)[1]
+          value = !argv[value]
+        } else {
+          value = argv[value]
+        }
+        if (key && !value) {
+          implyFail.push(` ${origKey} -> ${origValue}`)
+        }
+      })
+    })
+
+    if (implyFail.length) {
+      let msg = `${__('Implications failed:')}\n`
+
+      implyFail.forEach((value) => {
+        msg += (value)
+      })
+
+      usage.fail(msg)
+    }
+  }
+
+  let conflicting = {}
+  self.conflicts = function conflicts (key, value) {
+    argsert('<string|object> [array|string]', [key, value], arguments.length)
+
+    if (typeof key === 'object') {
+      Object.keys(key).forEach((k) => {
+        self.conflicts(k, key[k])
+      })
+    } else {
+      yargs.global(key)
+      if (!conflicting[key]) {
+        conflicting[key] = []
+      }
+      if (Array.isArray(value)) {
+        value.forEach((i) => self.conflicts(key, i))
+      } else {
+        conflicting[key].push(value)
+      }
+    }
+  }
+  self.getConflicting = () => conflicting
+
+  self.conflicting = function conflictingFn (argv) {
+    Object.keys(argv).forEach((key) => {
+      if (conflicting[key]) {
+        conflicting[key].forEach((value) => {
+          // we default keys to 'undefined' that have been configured, we should not
+          // apply conflicting check unless they are a value other than 'undefined'.
+          if (value && argv[key] !== undefined && argv[value] !== undefined) {
+            usage.fail(__('Arguments %s and %s are mutually exclusive', key, value))
+          }
+        })
+      }
+    })
+  }
+
+  self.recommendCommands = function recommendCommands (cmd, potentialCommands) {
+    const distance = require('./levenshtein')
+    const threshold = 3 // if it takes more than three edits, let's move on.
+    potentialCommands = potentialCommands.sort((a, b) => b.length - a.length)
+
+    let recommended = null
+    let bestDistance = Infinity
+    for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) {
+      const d = distance(cmd, candidate)
+      if (d <= threshold && d < bestDistance) {
+        bestDistance = d
+        recommended = candidate
+      }
+    }
+    if (recommended) usage.fail(__('Did you mean %s?', recommended))
+  }
+
+  self.reset = function reset (localLookup) {
+    implied = objFilter(implied, (k, v) => !localLookup[k])
+    conflicting = objFilter(conflicting, (k, v) => !localLookup[k])
+    checks = checks.filter(c => c.global)
+    return self
+  }
+
+  let frozen
+  self.freeze = function freeze () {
+    frozen = {}
+    frozen.implied = implied
+    frozen.checks = checks
+    frozen.conflicting = conflicting
+  }
+  self.unfreeze = function unfreeze () {
+    implied = frozen.implied
+    checks = frozen.checks
+    conflicting = frozen.conflicting
+    frozen = undefined
+  }
+
+  return self
+}
Index: trip-planner-front/node_modules/yargs/lib/yerror.js
===================================================================
--- trip-planner-front/node_modules/yargs/lib/yerror.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
+++ trip-planner-front/node_modules/yargs/lib/yerror.js	(revision bdd64917749115bbdd228a9569a675d590c112e3)
@@ -0,0 +1,11 @@
+'use strict'
+function YError (msg) {
+  this.name = 'YError'
+  this.message = msg || 'yargs error'
+  Error.captureStackTrace(this, YError)
+}
+
+YError.prototype = Object.create(Error.prototype)
+YError.prototype.constructor = YError
+
+module.exports = YError
