Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/README.md
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/README.md	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/README.md	(working copy)
@@ -1,20 +1,24 @@
 # Grunt: The JavaScript Task Runner
 
-[![Build Status: Linux](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
-<a href="https://ci.appveyor.com/project/gruntjs/grunt"><img src="https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva/branch/master" alt="Build Status: Windows" height="18" /></a>
-[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
+[![Build Status: Linux](https://travis-ci.org/gruntjs/grunt.svg?branch=master)](https://travis-ci.org/gruntjs/grunt)
+[![Build Status: Windows](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva/branch/master?svg=true)](https://ci.appveyor.com/project/gruntjs/grunt/branch/master)
+[![Built with Grunt](https://cdn.gruntjs.com/builtwith.svg)](http://gruntjs.com/)
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgruntjs%2Fgrunt.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgruntjs%2Fgrunt?ref=badge_shield)
 
-<img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg">
+<img align="right" height="260" src="https://gruntjs.com/img/grunt-logo-no-wordmark.svg">
 
 
 ### Documentation
 
-Visit the [gruntjs.com](http://gruntjs.com/) website for all the things.
+Visit the [gruntjs.com](https://gruntjs.com/) website for all the things.
 
 ### Support / Contributing
-Before you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.
 
-You can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).
+Before you make an issue, please read our [Contributing](https://gruntjs.com/contributing) guide.
 
 ### Release History
 See the [CHANGELOG](CHANGELOG).
+
+### License
+
+[MIT](LICENSE)
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt.js	(working copy)
@@ -1,19 +1,28 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 // Nodejs libs.
 var path = require('path');
 
 // This allows grunt to require() .coffee files.
-require('coffee-script');
+try {
+  // Note: grunt no longer depends on CoffeeScript, it will only use it if it is intentionally
+  // installed in the project.
+  require('coffeescript/register');
+} catch (e) {
+  // This is fine, and will cause no problems so long as the user doesn't load .coffee files.
+  // Print a useful error if we attempt to load a .coffee file.
+  if (require.extensions) {
+    var FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md'];
+    for (var i = 0; i < FILE_EXTENSIONS.length; i++) {
+      require.extensions[FILE_EXTENSIONS[i]] = function() {
+        throw new Error(
+          'Grunt attempted to load a .coffee file but CoffeeScript was not installed.\n' +
+          'Please run `npm install --dev coffeescript` to enable loading CoffeeScript.'
+        );
+      };
+    }
+  }
+}
 
 // The module to be exported.
 var grunt = module.exports = {};
@@ -117,7 +126,7 @@
   tasks = task.parseArgs([tasksSpecified ? tasks : 'default']);
 
   // Initialize tasks.
-  task.init(tasks);
+  task.init(tasks, options);
 
   verbose.writeln();
   if (!tasksSpecified) {
@@ -161,5 +170,5 @@
   tasks.forEach(function(name) { task.run(name); });
   // Run tasks async internally to reduce call-stack, per:
   // https://github.com/gruntjs/grunt/pull/1026
-  task.start({asyncDone:true});
+  task.start({asyncDone: true});
 };
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/cli.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/cli.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/cli.js	(working copy)
@@ -1,21 +1,10 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
 
-// Nodejs libs.
-var path = require('path');
-
 // External libs.
 var nopt = require('nopt');
+var gruntOptions = require('grunt-known-options');
 
 // This is only executed when run via command line.
 var cli = module.exports = function(options, done) {
@@ -39,69 +28,7 @@
 };
 
 // Default options.
-var optlist = cli.optlist = {
-  help: {
-    short: 'h',
-    info: 'Display this help text.',
-    type: Boolean
-  },
-  base: {
-    info: 'Specify an alternate base path. By default, all file paths are relative to the Gruntfile. (grunt.file.setBase) *',
-    type: path
-  },
-  color: {
-    info: 'Disable colored output.',
-    type: Boolean,
-    negate: true
-  },
-  gruntfile: {
-    info: 'Specify an alternate Gruntfile. By default, grunt looks in the current or parent directories for the nearest Gruntfile.js or Gruntfile.coffee file.',
-    type: path
-  },
-  debug: {
-    short: 'd',
-    info: 'Enable debugging mode for tasks that support it.',
-    type: [Number, Boolean]
-  },
-  stack: {
-    info: 'Print a stack trace when exiting with a warning or fatal error.',
-    type: Boolean
-  },
-  force: {
-    short: 'f',
-    info: 'A way to force your way past warnings. Want a suggestion? Don\'t use this option, fix your code.',
-    type: Boolean
-  },
-  tasks: {
-    info: 'Additional directory paths to scan for task and "extra" files. (grunt.loadTasks) *',
-    type: Array
-  },
-  npm: {
-    info: 'Npm-installed grunt plugins to scan for task and "extra" files. (grunt.loadNpmTasks) *',
-    type: Array
-  },
-  write: {
-    info: 'Disable writing files (dry run).',
-    type: Boolean,
-    negate: true
-  },
-  verbose: {
-    short: 'v',
-    info: 'Verbose mode. A lot more information output.',
-    type: Boolean
-  },
-  version: {
-    short: 'V',
-    info: 'Print the grunt version. Combine with --verbose for more info.',
-    type: Boolean
-  },
-  // Even though shell auto-completion is now handled by grunt-cli, leave this
-  // option here for display in the --help screen.
-  completion: {
-    info: 'Output shell auto-completion rules. See the grunt-cli documentation for more information.',
-    type: String
-  },
-};
+var optlist = cli.optlist = gruntOptions;
 
 // Parse `optlist` into a form that nopt can handle.
 var aliases = {};
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/config.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/config.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/config.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/event.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/event.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/event.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 // External lib.
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/fail.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/fail.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/fail.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
@@ -79,6 +70,6 @@
   if (fail.warncount > 0) {
     grunt.log.writeln().fail('Done, but with warnings.');
   } else {
-    grunt.log.writeln().success('Done, without errors.');
+    grunt.log.writeln().success('Done.');
   }
 };
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/file.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/file.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/file.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
@@ -23,7 +14,6 @@
 file.minimatch = require('minimatch');
 file.findup = require('findup-sync');
 var YAML = require('js-yaml');
-var rimraf = require('rimraf');
 var iconv = require('iconv-lite');
 
 // Windows?
@@ -50,7 +40,7 @@
   // Filepaths to return.
   var result = [];
   // Iterate over flattened patterns array.
-  grunt.util._.flatten(patterns).forEach(function(pattern) {
+  grunt.util._.flattenDeep(patterns).forEach(function(pattern) {
     // If the first character is ! it should be omitted
     var exclusion = pattern.indexOf('!') === 0;
     // If the pattern is an exclusion, remove the !
@@ -122,7 +112,7 @@
           // If the file is of the right type and exists, this should work.
           return fs.statSync(filepath)[options.filter]();
         }
-      } catch(e) {
+      } catch (e) {
         // Otherwise, it's probably not the right type.
         return false;
       }
@@ -188,22 +178,11 @@
 // Like mkdir -p. Create a directory and any intermediary directories.
 file.mkdir = function(dirpath, mode) {
   if (grunt.option('no-write')) { return; }
-  // Set directory mode in a strict-mode-friendly way.
-  if (mode == null) {
-    mode = parseInt('0777', 8) & (~process.umask());
-  }
-  dirpath.split(pathSeparatorRe).reduce(function(parts, part) {
-    parts += part + '/';
-    var subpath = path.resolve(parts);
-    if (!file.exists(subpath)) {
-      try {
-        fs.mkdirSync(subpath, mode);
-      } catch(e) {
-        throw grunt.util.error('Unable to create directory "' + subpath + '" (Error code: ' + e.code + ').', e);
-      }
-    }
-    return parts;
-  }, '');
+  try {
+    fs.mkdirSync(dirpath, { recursive: true, mode: mode });
+  } catch (e) {
+    throw grunt.util.error('Unable to create directory "' + dirpath + '" (Error code: ' + e.code + ').', e);
+  }
 };
 
 // Recurse into a directory, executing callback for each file.
@@ -234,15 +213,11 @@
     // If encoding is not explicitly null, convert from encoded buffer to a
     // string. If no encoding was specified, use the default.
     if (options.encoding !== null) {
-      contents = iconv.decode(contents, options.encoding || file.defaultEncoding);
-      // Strip any BOM that might exist.
-      if (!file.preserveBOM && contents.charCodeAt(0) === 0xFEFF) {
-        contents = contents.substring(1);
-      }
+      contents = iconv.decode(contents, options.encoding || file.defaultEncoding, {stripBOM: !file.preserveBOM});
     }
     grunt.verbose.ok();
     return contents;
-  } catch(e) {
+  } catch (e) {
     grunt.verbose.error();
     throw grunt.util.error('Unable to read "' + filepath + '" file (Error code: ' + e.code + ').', e);
   }
@@ -257,24 +232,33 @@
     result = JSON.parse(src);
     grunt.verbose.ok();
     return result;
-  } catch(e) {
+  } catch (e) {
     grunt.verbose.error();
     throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.message + ').', e);
   }
 };
 
 // Read a YAML file, parse its contents, return an object.
-file.readYAML = function(filepath, options) {
+file.readYAML = function(filepath, options, yamlOptions) {
+  if (!options) { options = {}; }
+  if (!yamlOptions) { yamlOptions = {}; }
+
   var src = file.read(filepath, options);
   var result;
   grunt.verbose.write('Parsing ' + filepath + '...');
   try {
-    result = YAML.load(src);
+    // use the recommended way of reading YAML files
+    // https://github.com/nodeca/js-yaml#safeload-string---options-
+    if (yamlOptions.unsafeLoad) {
+      result = YAML.load(src);
+    } else {
+      result = YAML.safeLoad(src);
+    }
     grunt.verbose.ok();
     return result;
-  } catch(e) {
+  } catch (e) {
     grunt.verbose.error();
-    throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.problem + ').', e);
+    throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.message + ').', e);
   }
 };
 
@@ -293,18 +277,39 @@
     }
     // Actually write file.
     if (!nowrite) {
-      fs.writeFileSync(filepath, contents);
+      fs.writeFileSync(filepath, contents, 'mode' in options ? {mode: options.mode} : {});
     }
     grunt.verbose.ok();
     return true;
-  } catch(e) {
+  } catch (e) {
     grunt.verbose.error();
     throw grunt.util.error('Unable to write "' + filepath + '" file (Error code: ' + e.code + ').', e);
   }
 };
 
 // Read a file, optionally processing its content, then write the output.
-file.copy = function(srcpath, destpath, options) {
+// Or read a directory, recursively creating directories, reading files,
+// processing content, writing output.
+// Handles symlinks by coping them as files or directories.
+file.copy = function copy(srcpath, destpath, options) {
+  if (file.isLink(srcpath)) {
+    file._copySymbolicLink(srcpath, destpath);
+  } else if (file.isDir(srcpath)) {
+    // Copy a directory, recursively.
+    // Explicitly create new dest directory.
+    file.mkdir(destpath);
+    // Iterate over all sub-files/dirs, recursing.
+    fs.readdirSync(srcpath).forEach(function(filepath) {
+      copy(path.join(srcpath, filepath), path.join(destpath, filepath), options);
+    });
+  } else {
+    // Copy a single file.
+    file._copy(srcpath, destpath, options);
+  }
+};
+
+// Read a file, optionally processing its content, then write the output.
+file._copy = function(srcpath, destpath, options) {
   if (!options) { options = {}; }
   // If a process function was specified, and noProcess isn't true or doesn't
   // match the srcpath, process the file's source.
@@ -318,16 +323,16 @@
   if (process) {
     grunt.verbose.write('Processing source...');
     try {
-      contents = options.process(contents, srcpath);
+      contents = options.process(contents, srcpath, destpath);
       grunt.verbose.ok();
-    } catch(e) {
+    } catch (e) {
       grunt.verbose.error();
       throw grunt.util.error('Error while processing "' + srcpath + '" file.', e);
     }
   }
   // Abort copy if the process function returns false.
-  if (contents === false) {
-    grunt.verbose.writeln('Write aborted.');
+  if (contents === false || file.isLink(destpath)) {
+    grunt.verbose.writeln('Write aborted. Either the process function returned false or the destination is a symlink');
   } else {
     file.write(destpath, contents, readWriteOptions);
   }
@@ -366,11 +371,11 @@
   try {
     // Actually delete. Or not.
     if (!nowrite) {
-      rimraf.sync(filepath);
+      fs.rmSync(filepath, { recursive: true, force: true });
     }
     grunt.verbose.ok();
     return true;
-  } catch(e) {
+  } catch (e) {
     grunt.verbose.error();
     throw grunt.util.error('Unable to delete "' + filepath + '" file (' + e.message + ').', e);
   }
@@ -385,7 +390,15 @@
 // True if the file is a symbolic link.
 file.isLink = function() {
   var filepath = path.join.apply(path, arguments);
-  return file.exists(filepath) && fs.lstatSync(filepath).isSymbolicLink();
+  try {
+    return fs.lstatSync(filepath).isSymbolicLink();
+  } catch (e) {
+    if (e.code === 'ENOENT') {
+      // The file doesn't exist, so it's not a symbolic link.
+      return false;
+    }
+    throw grunt.util.error('Unable to read "' + filepath + '" file (Error code: ' + e.code + ').', e);
+  }
 };
 
 // True if the path is a directory.
@@ -403,7 +416,7 @@
 // Is a given file path absolute?
 file.isPathAbsolute = function() {
   var filepath = path.join.apply(path, arguments);
-  return path.resolve(filepath) === filepath.replace(/[\/\\]+$/, '');
+  return path.isAbsolute(filepath);
 };
 
 // Do all the specified paths refer to the same path?
@@ -432,17 +445,32 @@
   var filepath = path.join.apply(path, arguments);
   try {
     return file.arePathsEquivalent(fs.realpathSync(process.cwd()), fs.realpathSync(filepath));
-  } catch(e) {
+  } catch (e) {
     return false;
   }
 };
 
+file._copySymbolicLink = function(srcpath, destpath) {
+  var destdir = path.join(destpath, '..');
+  // Use the correct relative path for the symlink
+  if (!grunt.file.isPathAbsolute(srcpath)) {
+    srcpath = path.relative(destdir, srcpath) || '.';
+  }
+  file.mkdir(destdir);
+  var mode = grunt.file.isDir(srcpath) ? 'dir' : 'file';
+  if (fs.existsSync(destpath)) {
+    // skip symlink if file already exists
+    return;
+  }
+  return fs.symlinkSync(srcpath, destpath, mode);
+};
+
 // Test to see if a filepath is contained within the CWD.
 file.isPathInCwd = function() {
   var filepath = path.join.apply(path, arguments);
   try {
     return file.doesPathContain(fs.realpathSync(process.cwd()), fs.realpathSync(filepath));
-  } catch(e) {
+  } catch (e) {
     return false;
   }
 };
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/help.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/help.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/help.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
@@ -21,7 +12,8 @@
 };
 exports.initWidths = function() {
   // Widths for options/tasks table output.
-  exports.widths = [1, col1len, 2, 76 - col1len];
+  var commandWidth = Math.max(col1len + 20, 76);
+  exports.widths = [1, col1len, 2, commandWidth - col1len];
 };
 
 // Render an array in table form.
@@ -49,7 +41,6 @@
   exports.queue.forEach(function(name) { exports[name](); });
 };
 
-
 // Header.
 exports.header = function() {
   grunt.log.writeln('Grunt: The JavaScript Task Runner (v' + grunt.version + ')');
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/option.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/option.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/option.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 // The actual option data.
@@ -40,3 +31,8 @@
       (typeof val === 'boolean' ? '' : '=' + val);
   });
 };
+
+// Get all option keys
+option.keys = function() {
+  return Object.keys(data);
+};
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/task.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/task.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/task.js	(working copy)
@@ -1,14 +1,8 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
+// Keep track of the number of log.error() calls and the last specified tasks message.
+var errorcount, lastInfo;
+
 var grunt = require('../grunt');
 
 // Nodejs libs.
@@ -23,15 +17,9 @@
 // A temporary registry of tasks and metadata.
 var registry = {tasks: [], untasks: [], meta: {}};
 
-// The last specified tasks message.
-var lastInfo;
-
 // Number of levels of recursion when loading tasks in collections.
 var loadTaskDepth = 0;
 
-// Keep track of the number of log.error() calls.
-var errorcount;
-
 // Override built-in registerTask.
 task.registerTask = function(name) {
   // Add task to registry.
@@ -107,7 +95,7 @@
         files.push({src: data.files[prop], dest: grunt.config.process(prop)});
       }
     } else if (Array.isArray(data.files)) {
-      grunt.util._.flatten(data.files).forEach(function(obj) {
+      grunt.util._.flattenDeep(data.files).forEach(function(obj) {
         var prop;
         if ('src' in obj || 'dest' in obj) {
           files.push(obj);
@@ -257,7 +245,7 @@
     Object.defineProperty(this, 'filesSrc', {
       enumerable: true,
       get: function() {
-        return grunt.util._(this.files).chain().pluck('src').flatten().uniq().value();
+        return grunt.util._(this.files).chain().map('src').flatten().uniq().value();
       }.bind(this)
     });
     // Call original task function, passing in the target and any other args.
@@ -286,7 +274,7 @@
     registry.tasks.push(newname);
     // Return result.
     return result;
-  } catch(e) {
+  } catch (e) {
     grunt.log.error(e.message);
   }
 };
@@ -295,13 +283,15 @@
 task.runAllTargets = function(taskname, args) {
   // Get an array of sub-property keys under the given config object.
   var targets = Object.keys(grunt.config.getRaw(taskname) || {});
+  // Remove invalid target properties.
+  targets = targets.filter(isValidMultiTaskTarget);
   // Fail if there are no actual properties to iterate over.
   if (targets.length === 0) {
     grunt.log.error('No "' + taskname + '" targets found.');
     return false;
   }
-  // Iterate over all valid target properties, running a task for each.
-  targets.filter(isValidMultiTaskTarget).forEach(function(target) {
+  // Iterate over all targets, running a task for each.
+  targets.forEach(function(target) {
     // Be sure to pass in any additionally specified args.
     task.run([taskname, target].concat(args || []).join(':'));
   });
@@ -336,7 +326,7 @@
     if (regCount === 0) {
       grunt.verbose.warn('No tasks were registered or unregistered.');
     }
-  } catch(e) {
+  } catch (e) {
     // Something went wrong.
     grunt.log.write(msg).error().verbose.error(e.stack).or.error(e);
   }
@@ -355,12 +345,12 @@
 // Load tasks and handlers from a given directory.
 function loadTasks(tasksdir) {
   try {
-    var files = grunt.file.glob.sync('*.{js,coffee}', {cwd: tasksdir, maxDepth: 1});
+    var files = grunt.file.glob.sync('*.{js,cjs,coffee}', {cwd: tasksdir, maxDepth: 1});
     // Load tasks from files.
     files.forEach(function(filename) {
       loadTask(path.join(tasksdir, filename));
     });
-  } catch(e) {
+  } catch (e) {
     grunt.log.verbose.error(e.stack).or.error(e);
   }
 }
@@ -380,7 +370,23 @@
 task.loadNpmTasks = function(name) {
   loadTasksMessage('"' + name + '" local Npm module');
   var root = path.resolve('node_modules');
-  var pkgfile = path.join(root, name, 'package.json');
+  var pkgpath = path.join(root, name);
+  var pkgfile = path.join(pkgpath, 'package.json');
+  // If package does not exist where grunt expects it to be,
+  // try to find it using Node's package path resolution mechanism
+  if (!grunt.file.exists(pkgpath)) {
+    var nameParts = name.split('/');
+    // In case name points to directory inside module,
+    // get real name of the module with respect to scope (if any)
+    var normailzedName = (name[0] === '@' ? nameParts.slice(0,2).join('/') : nameParts[0]);
+    try {
+      pkgfile = require.resolve(normailzedName + '/package.json');
+      root = pkgfile.substr(0, pkgfile.length - normailzedName.length - '/package.json'.length);
+    } catch (err) {
+      grunt.log.error('Local Npm module "' + normailzedName + '" not found. Is it installed?');
+      return;
+    }
+  }
   var pkg = grunt.file.exists(pkgfile) ? grunt.file.readJSON(pkgfile) : {keywords: []};
 
   // Process collection plugins.
@@ -423,11 +429,18 @@
 
   // Get any local Gruntfile or tasks that might exist. Use --gruntfile override
   // if specified, otherwise search the current directory or any parent.
-  var gruntfile = allInit ? null : grunt.option('gruntfile') ||
-    grunt.file.findup('Gruntfile.{js,coffee}', {nocase: true});
+  var gruntfile, msg;
+  if (allInit || options.gruntfile === false) {
+    gruntfile = null;
+  } else {
+    gruntfile = grunt.option('gruntfile') ||
+      grunt.file.findup('Gruntfile.{js,cjs,coffee}', {nocase: true});
+    msg = 'Reading "' + (gruntfile ? path.basename(gruntfile) : '???') + '" Gruntfile...';
+  }
 
-  var msg = 'Reading "' + (gruntfile ? path.basename(gruntfile) : '???') + '" Gruntfile...';
-  if (gruntfile && grunt.file.exists(gruntfile)) {
+  if (options.gruntfile === false) {
+    // Grunt was run as a lib with {gruntfile: false}.
+  } else if (gruntfile && grunt.file.exists(gruntfile)) {
     grunt.verbose.writeln().write(msg).ok();
     // Change working directory so that all paths are relative to the
     // Gruntfile's location (or the --base option, if specified).
@@ -452,7 +465,7 @@
   }
 
   // Load all user-specified --npm tasks.
-  (grunt.option('npm') || []).forEach(task.loadNpmTasks);
+  (grunt.option('npm') || []).map(String).forEach(task.loadNpmTasks);
   // Load all user-specified --tasks.
-  (grunt.option('tasks') || []).forEach(task.loadTasks);
+  (grunt.option('tasks') || []).map(String).forEach(task.loadTasks);
 };
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/template.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/template.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/grunt/template.js	(working copy)
@@ -1,12 +1,3 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 'use strict';
 
 var grunt = require('../grunt');
@@ -19,7 +10,11 @@
 
 // Format today's date.
 template.today = function(format) {
-  return template.date(new Date(), format);
+  var now = new Date();
+  if (process.env.SOURCE_DATE_EPOCH) {
+    now = new Date((process.env.SOURCE_DATE_EPOCH * 1000) + (now.getTimezoneOffset() * 60000));
+  }
+  return template.date(now, format);
 };
 
 // Template delimiters.
@@ -51,7 +46,7 @@
   // Get the appropriate delimiters.
   var delimiters = allDelimiters[name in allDelimiters ? name : 'config'];
   // Tell Lo-Dash which delimiters to use.
-  grunt.util._.templateSettings = delimiters.lodash;
+  grunt.util._.extend(grunt.util._.templateSettings, delimiters.lodash);
   // Return the delimiters.
   return delimiters;
 };
@@ -72,7 +67,7 @@
     // As long as tmpl contains template tags, render it and get the result,
     // otherwise just use the template string.
     while (tmpl.indexOf(delimiters.opener) >= 0) {
-      tmpl = grunt.util._.template(tmpl, data);
+      tmpl = grunt.util._.template(tmpl, options)(data);
       // Abort if template didn't change - nothing left to process!
       if (tmpl === last) { break; }
       last = tmpl;
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/util/task.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/util/task.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/lib/util/task.js	(working copy)
@@ -1,16 +1,9 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
 (function(exports) {
 
   'use strict';
 
+  var grunt = require('../grunt');
+
   // Construct-o-rama.
   function Task() {
     // Information about the currently-running task.
@@ -223,7 +216,7 @@
       // only call done async if explicitly requested to
       // see: https://github.com/gruntjs/grunt/pull/1026
       if (asyncDone) {
-        process.nextTick(function () {
+        process.nextTick(function() {
           done(err, success);
         });
       } else {
@@ -237,9 +230,9 @@
       async = true;
       // The returned function should execute asynchronously in case
       // someone tries to do this.async()(); inside a task (WTF).
-      return function(success) {
+      return grunt.util._.once(function(success) {
         setTimeout(function() { complete(success); }, 1);
-      };
+      });
     };
 
     // Expose some information about the currently-running task.
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/README.md
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/README.md	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/README.md	(working copy)
@@ -1,4 +1,4 @@
-# getobject [![Build Status](https://secure.travis-ci.org/cowboy/node-getobject.png?branch=master)](http://travis-ci.org/cowboy/node-getobject)
+# getobject [![Build Status](https://github.com/cowboy/node-getobject/workflows/Tests/badge.svg)](https://github.com/cowboy/node-getobject/actions?workflow=Tests)
 
 get.and.set.deep.objects.easily = true;
 
@@ -13,8 +13,10 @@
 In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
 
 ## Release History
-_(Nothing yet)_
+
+* 11/03/2021 - 1.0.0 Release. Fixes CVE-2020-28282.
+* 21/11/2013 - 0.1.0 Release.
 
 ## License
 Copyright (c) 2013 "Cowboy" Ben Alman
-Licensed under the MIT license.
\ No newline at end of file
+Licensed under the MIT license.
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/lib/getobject.js
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/lib/getobject.js	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/lib/getobject.js	(working copy)
@@ -41,6 +41,10 @@
 // as we go.
 getobject.set = function(obj, parts, value) {
   parts = getParts(parts);
+  if (parts.includes('__proto__')) {
+    // do not allow setting of __proto__. See CVE-2020-28282.
+    return;
+  }
 
   var prop = parts.pop();
   obj = getobject.get(obj, parts, true);
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/package.json
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/package.json	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/node_modules/getobject/package.json	(working copy)
@@ -1,7 +1,7 @@
 {
   "name": "getobject",
   "description": "get.and.set.deep.objects.easily = true",
-  "version": "0.1.0",
+  "version": "1.1.1",
   "homepage": "https://github.com/cowboy/node-getobject",
   "author": {
     "name": "\"Cowboy\" Ben Alman",
@@ -22,16 +22,16 @@
   ],
   "main": "lib/getobject",
   "engines": {
-    "node": ">= 0.8.0"
+    "node": ">=10"
   },
   "scripts": {
     "test": "grunt nodeunit"
   },
   "devDependencies": {
-    "grunt-contrib-jshint": "~0.1.1",
-    "grunt-contrib-nodeunit": "~0.1.2",
-    "grunt-contrib-watch": "~0.2.0",
-    "grunt": "~0.4.1"
+    "grunt-contrib-jshint": "~3.2.0",
+    "grunt-contrib-nodeunit": "~4.0.0",
+    "grunt-contrib-watch": "~1.1.0",
+    "grunt": "~1.5.2"
   },
   "keywords": [
     "dot notation",
@@ -41,12 +41,7 @@
     "object",
     "dot"
   ],
-  "readme": "# getobject [![Build Status](https://secure.travis-ci.org/cowboy/node-getobject.png?branch=master)](http://travis-ci.org/cowboy/node-getobject)\n\nget.and.set.deep.objects.easily = true;\n\n## Getting Started\nInstall the module with: `npm install getobject`\n\n```javascript\nvar getobject = require('getobject');\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n_(Nothing yet)_\n\n## License\nCopyright (c) 2013 \"Cowboy\" Ben Alman\nLicensed under the MIT license.",
-  "readmeFilename": "README.md",
-  "_id": "getobject@0.1.0",
-  "dist": {
-    "shasum": "72a86facf869ff91ddff557b35011901bfdbc972"
-  },
-  "_from": "getobject@~0.1.0",
-  "_resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
+  "files": [
+    "lib"
+  ]
 }
Index: /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/package.json
===================================================================
--- /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/package.json	(revision 20239)
+++ /branches/rel_ag_9_4_0_493_SBOM/restfulapi/proxy/media/node_modules/grunt/package.json	(working copy)
@@ -1,31 +1,21 @@
 {
   "name": "grunt",
   "description": "The JavaScript Task Runner",
-  "version": "0.4.5",
-  "author": {
-    "name": "\"Cowboy\" Ben Alman",
-    "url": "http://benalman.com/"
-  },
-  "homepage": "http://gruntjs.com/",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/gruntjs/grunt.git"
-  },
-  "bugs": {
-    "url": "http://github.com/gruntjs/grunt/issues"
+  "version": "1.6.1",
+  "author": "Grunt Development Team (https://gruntjs.com/development-team)",
+  "homepage": "https://gruntjs.com/",
+  "repository": "https://github.com/gruntjs/grunt.git",
+  "license": "MIT",
+  "engines": {
+    "node": ">=16"
   },
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "http://github.com/gruntjs/grunt/blob/master/LICENSE-MIT"
-    }
-  ],
-  "main": "lib/grunt",
   "scripts": {
-    "test": "grunt test"
+    "test": "node bin/grunt test",
+    "test-tap": "node bin/grunt test:tap"
   },
-  "engines": {
-    "node": ">= 0.8.0"
+  "main": "lib/grunt",
+  "bin": {
+    "grunt": "bin/grunt"
   },
   "keywords": [
     "task",
@@ -47,42 +37,31 @@
     "tool"
   ],
   "dependencies": {
-    "async": "~0.1.22",
-    "coffee-script": "~1.3.3",
-    "colors": "~0.6.2",
-    "dateformat": "1.0.2-1.2.3",
+    "dateformat": "~4.6.2",
     "eventemitter2": "~0.4.13",
-    "findup-sync": "~0.1.2",
-    "glob": "~3.1.21",
-    "hooker": "~0.2.3",
-    "iconv-lite": "~0.2.11",
-    "minimatch": "~0.2.12",
-    "nopt": "~1.0.10",
-    "rimraf": "~2.2.8",
-    "lodash": "~0.9.2",
-    "underscore.string": "~2.2.1",
-    "which": "~1.0.5",
-    "js-yaml": "~2.0.5",
-    "exit": "~0.1.1",
-    "getobject": "~0.1.0",
-    "grunt-legacy-util": "~0.2.0",
-    "grunt-legacy-log": "~0.1.0"
+    "exit": "~0.1.2",
+    "findup-sync": "~5.0.0",
+    "glob": "~7.1.6",
+    "grunt-cli": "~1.4.3",
+    "grunt-known-options": "~2.0.0",
+    "grunt-legacy-log": "~3.0.0",
+    "grunt-legacy-util": "~2.0.1",
+    "iconv-lite": "~0.6.3",
+    "js-yaml": "~3.14.0",
+    "minimatch": "~3.0.4",
+    "nopt": "~3.0.6"
   },
   "devDependencies": {
-    "temporary": "~0.0.4",
-    "grunt-contrib-jshint": "~0.6.4",
-    "grunt-contrib-nodeunit": "~0.2.0",
-    "grunt-contrib-watch": "~0.5.3",
-    "difflet": "~0.2.3",
-    "semver": "2.1.0",
-    "shelljs": "~0.2.5"
-  },
-  "readme": "# Grunt: The JavaScript Task Runner\n\n[![Build Status: Linux](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n<a href=\"https://ci.appveyor.com/project/gruntjs/grunt\"><img src=\"https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva/branch/master\" alt=\"Build Status: Windows\" height=\"18\" /></a>\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
-  "readmeFilename": "README.md",
-  "_id": "grunt@0.4.5",
-  "dist": {
-    "shasum": "053cb7566c9f576ce2f8093a0e7e39720181407c"
-  },
-  "_from": "grunt@~0.4.1",
-  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz"
+    "difflet": "~1.0.1",
+    "eslint-config-grunt": "~2.0.1",
+    "grunt-contrib-nodeunit": "~4.0.0",
+    "grunt-contrib-watch": "~1.1.0",
+    "grunt-eslint": "~24.0.1",
+    "temporary": "~1.1.0",
+    "through2": "~4.0.2"
+  },
+  "files": [
+    "lib",
+    "bin"
+  ]
 }
