diff --git a/LICENSE b/LICENSE
index cfcef36a1..c8c86ee4d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright (c) 22015-2018, e-mission
+Copyright (c) 2014-2020, UC Regents
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/OpenSourceLicenses.md b/OpenSourceLicenses.md
new file mode 100644
index 000000000..400946acc
--- /dev/null
+++ b/OpenSourceLicenses.md
@@ -0,0 +1,99 @@
+This file lists the module dependencies for the project and their licenses.
+
+1. Most of this module code is **not** redistributed, either in source or binary
+form. Instead, it is downloaded automatically using package managers and linked
+from the code. The module download includes the license and appropriate credit.
+
+1. So our primary check here is for modules which do not have a license, or
+which are GPL licensed.
+
+The original project was created based on the ionic starter tabs template
+https://github.com/ionic-team/ionic-starter-tabs
+which is explicitly designed to provide a template for developers.
+
+## Redistributed, modified javascript dependencies
+
+These dependencies were checked in over time in order to support libraries that
+did not have bower entries, or libraries that were modified with minor changes
+based on bugs. TODO: Go through the modules, determine the changes and submit them as PRs 🚧
+
+| Module | License | Original code |
+|--------|---------|---------------|
+| `www/manual_lib/angularjs-nvd3-directives` | Apache |
+| `www/manual_lib/fontawesome` | Icons: CC BY 4.0, Code: MIT License | https://fontawesome.com |
+| `www/manual_lib/ionic-datepicker` | MIT | https://github.com/rajeshwarpatlolla/ionic-datepicker |
+| `www/manual_lib/leaflet` | BSD 2-clause | https://github.com/Leaflet/Leaflet |
+| `www/manual_lib/ui-leaflet` | MIT | https://github.com/angular-ui/ui-leaflet 🗄️ |
+
+## Javascript dependencies installed via bower
+
+| Module | License |
+|--------|---------|
+| `www/lib/ionic` | MIT (from [`bower.json`](https://github.com/ionic-team/ionic-bower/blob/v1.3.0/bower.json)) |
+| `www/lib/ionic-toast` | MIT |
+| `www/lib/ngCordova` | MIT |
+| `www/lib/moment` | MIT |
+| `www/lib/moment-timezone` | MIT |
+| `www/lib/Leaflet.awesome-markers` | MIT |
+| `www/lib/angular` | MIT |
+| `www/lib/angular-animate` | MIT |
+| `www/lib/angular-sanitize` | MIT |
+| `www/lib/angular-nvd3` | MIT |
+| `www/lib/angularLocalStorage` | MIT |
+| `www/lib/ng-walkthrough` | MIT |
+| `www/lib/animate.css` | MIT |
+| `www/lib/nz-tour` | MIT |
+| `www/lib/leaflet-plugins` | MIT |
+| `www/lib/angularjs-slider` | MIT |
+| `www/lib/angular-translate` | MIT |
+| `www/lib/angular-translate-loader-static-files` | MIT |
+| `www/lib/angular-translate-interpolation-messageformat` | MIT |
+
+## Javascript dev dependencies installed via npm `package.json`
+
+Note that these are only required for development, not for proper operation.
+Not sure whether we should list them or not, but it doesn't hurt.
+
+| Module | License |
+|--------|---------|
+| phonegap | Apache |
+
+## Javascript dependencies installed via npm command line
+
+| Module | License |
+|--------|---------|
+| cordova | Apache |
+| bower | MIT |
+| ionic | MIT |
+
+## Cordova platforms, installed automatically
+
+| Module | License |
+|--------|---------|
+| cordova-ios | Apache |
+| cordova-android | Apache |
+
+## Cordova plugins, installed automatically
+
+| Module | License |
+|--------|---------|
+| phonegap-plugin-push | MIT |
+| ionic-plugin-keyboard | Apache |
+| cordova-plugin-app-version | MIT |
+| cordova-plugin-file | Apache |
+| cordova-plugin-device | Apache |
+| cordova-plugin-whitelist | Apache |
+| cordova-plugin-customurlscheme | MIT |
+| cordova-plugin-email-composer | Apache |
+| cordova-plugin-x-socialsharing | MIT |
+| cordova-plugin-inappbrowser | Apache |
+| de.appplant.cordova.plugin.local-notification-ios9-fix | Apache |
+| cordova-plugin-ionic | MIT |
+| edu.berkeley.eecs.emission.cordova.auth | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.comm | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.datacollection | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.serversync | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.settings | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.transitionnotify | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.unifiedlogger | BSD 3-clause |
+| edu.berkeley.eecs.emission.cordova.usercache | BSD 3-clause |
diff --git a/bower.json b/bower.json
index 479b64fc0..78e99ab4a 100644
--- a/bower.json
+++ b/bower.json
@@ -18,7 +18,6 @@
},
"dependencies": {
"angular-nvd3": "^1.0.7",
- "string.startsWith": "*",
"angularLocalStorage": "^0.3.2",
"ng-walkthrough": "^1.0.0",
"animate.css": "^3.5.2",
diff --git a/www/index.html b/www/index.html
index cde962100..32eeed126 100644
--- a/www/index.html
+++ b/www/index.html
@@ -55,10 +55,8 @@
-
-
diff --git a/www/manual_lib/leaflet-plugins/leaflet.textpath.js b/www/manual_lib/leaflet-plugins/leaflet.textpath.js
deleted file mode 100644
index 559615309..000000000
--- a/www/manual_lib/leaflet-plugins/leaflet.textpath.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Inspired by Tom Mac Wright article :
- * http://mapbox.com/osmdev/2012/11/20/getting-serious-about-svg/
- */
-
-(function () {
-
-var __onAdd = L.Polyline.prototype.onAdd,
- __onRemove = L.Polyline.prototype.onRemove,
- __updatePath = L.Polyline.prototype._updatePath,
- __bringToFront = L.Polyline.prototype.bringToFront;
-
-
-var PolylineTextPath = {
-
- onAdd: function (map) {
- __onAdd.call(this, map);
- this._textRedraw();
- },
-
- onRemove: function (map) {
- map = map || this._map;
- if (map && this._textNode)
- map._pathRoot.removeChild(this._textNode);
- __onRemove.call(this, map);
- },
-
- bringToFront: function () {
- __bringToFront.call(this);
- this._textRedraw();
- },
-
- _updatePath: function () {
- __updatePath.call(this);
- this._textRedraw();
- },
-
- _textRedraw: function () {
- var text = this._text,
- options = this._textOptions;
- if (text) {
- this.setText(null).setText(text, options);
- }
- },
-
- setText: function (text, options) {
- this._text = text;
- this._textOptions = options;
-
- /* If not in SVG mode or Polyline not added to map yet return */
- /* setText will be called by onAdd, using value stored in this._text */
- if (!L.Browser.svg || typeof this._map === 'undefined') {
- return this;
- }
-
- var defaults = {
- repeat: false,
- fillColor: 'black',
- attributes: {},
- below: false,
- };
- options = L.Util.extend(defaults, options);
-
- /* If empty text, hide */
- if (!text) {
- if (this._textNode && this._textNode.parentNode) {
- this._map._pathRoot.removeChild(this._textNode);
-
- /* delete the node, so it will not be removed a 2nd time if the layer is later removed from the map */
- delete this._textNode;
- }
- return this;
- }
-
- text = text.replace(/ /g, '\u00A0'); // Non breakable spaces
- var id = 'pathdef-' + L.Util.stamp(this);
- var svg = this._map._pathRoot;
- this._path.setAttribute('id', id);
-
- if (options.repeat) {
- /* Compute single pattern length */
- var pattern = L.Path.prototype._createElement('text');
- for (var attr in options.attributes)
- pattern.setAttribute(attr, options.attributes[attr]);
- pattern.appendChild(document.createTextNode(text));
- svg.appendChild(pattern);
- var alength = pattern.getComputedTextLength();
- svg.removeChild(pattern);
-
- /* Create string as long as path */
- text = new Array(Math.ceil(this._path.getTotalLength() / alength)).join(text);
- }
-
- /* Put it along the path using textPath */
- var textNode = L.Path.prototype._createElement('text'),
- textPath = L.Path.prototype._createElement('textPath');
-
- var dy = options.offset || this._path.getAttribute('stroke-width');
-
- textPath.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", '#'+id);
- textNode.setAttribute('dy', dy);
- for (var attr in options.attributes)
- textNode.setAttribute(attr, options.attributes[attr]);
- textPath.appendChild(document.createTextNode(text));
- textNode.appendChild(textPath);
- this._textNode = textNode;
-
- if (options.below) {
- svg.insertBefore(textNode, svg.firstChild);
- }
- else {
- svg.appendChild(textNode);
- }
-
- /* Center text according to the path's bounding box */
- if (options.center) {
- var textLength = textNode.getComputedTextLength();
- var pathLength = this._path.getTotalLength();
- /* Set the position for the left side of the textNode */
- textNode.setAttribute('dx', ((pathLength / 2) - (textLength / 2)));
- }
-
- /* Initialize mouse events for the additional nodes */
- if (this.options.clickable) {
- if (L.Browser.svg || !L.Browser.vml) {
- textPath.setAttribute('class', 'leaflet-clickable');
- }
-
- L.DomEvent.on(textNode, 'click', this._onMouseClick, this);
-
- var events = ['dblclick', 'mousedown', 'mouseover',
- 'mouseout', 'mousemove', 'contextmenu'];
- for (var i = 0; i < events.length; i++) {
- L.DomEvent.on(textNode, events[i], this._fireMouseEvent, this);
- }
- }
-
- return this;
- }
-};
-
-L.Polyline.include(PolylineTextPath);
-
-L.LayerGroup.include({
- setText: function(text, options) {
- for (var layer in this._layers) {
- if (typeof this._layers[layer].setText === 'function') {
- this._layers[layer].setText(text, options);
- }
- }
- return this;
- }
-});
-
-})();