diff --git a/app/assets/javascripts/app/controllers/editor.js b/app/assets/javascripts/app/controllers/editor.js
index 39250180e..023889f23 100644
--- a/app/assets/javascripts/app/controllers/editor.js
+++ b/app/assets/javascripts/app/controllers/editor.js
@@ -64,7 +64,7 @@ angular.module('app')
return;
}
- if(!ModelManager.isMappingSourceRetrieved(source)) {
+ if(!SFModelManager.isMappingSourceRetrieved(source)) {
return;
}
@@ -554,7 +554,7 @@ angular.module('app')
// Currently extensions are not notified of association until a full server sync completes.
// We need a better system for this, but for now, we'll manually notify observers
- modelManager.notifySyncObserversOfModels([this.note], ModelManager.MappingSourceLocalSaved);
+ modelManager.notifySyncObserversOfModels([this.note], SFModelManager.MappingSourceLocalSaved);
}
}
@@ -564,7 +564,7 @@ angular.module('app')
// Currently extensions are not notified of association until a full server sync completes.
// We need a better system for this, but for now, we'll manually notify observers
- modelManager.notifySyncObserversOfModels([this.note], ModelManager.MappingSourceLocalSaved);
+ modelManager.notifySyncObserversOfModels([this.note], SFModelManager.MappingSourceLocalSaved);
}
else if(action === "save-items" || action === "save-success" || action == "save-error") {
diff --git a/app/assets/javascripts/app/controllers/home.js b/app/assets/javascripts/app/controllers/home.js
index 7bd300fd2..cc4ed01ef 100644
--- a/app/assets/javascripts/app/controllers/home.js
+++ b/app/assets/javascripts/app/controllers/home.js
@@ -87,7 +87,8 @@ angular.module('app')
}
function loadAllTag() {
- var allTag = new Tag({all: true, title: "All"});
+ var allTag = new Tag({content: {title: "All"}});
+ allTag.all = true;
allTag.needsLoad = true;
$scope.allTag = allTag;
$scope.tags = modelManager.tags;
@@ -95,7 +96,8 @@ angular.module('app')
}
function loadArchivedTag() {
- var archiveTag = new Tag({archiveTag: true, title: "Archived"});
+ var archiveTag = new Tag({content: {title: "Archived"}});
+ archiveTag.archiveTag = true;
$scope.archiveTag = archiveTag;
$scope.archiveTag.notes = modelManager.notes;
}
@@ -115,8 +117,6 @@ angular.module('app')
for(var tagToRemove of toRemove) {
note.removeItemAsRelationship(tagToRemove);
- tagToRemove.removeItemAsRelationship(note);
- tagToRemove.setDirty(true);
}
var tags = [];
@@ -128,7 +128,7 @@ angular.module('app')
}
for(var tag of tags) {
- modelManager.createRelationshipBetweenItems(note, tag);
+ note.addItemAsRelationship(tag);
}
note.setDirty(true);
@@ -190,7 +190,8 @@ angular.module('app')
modelManager.addItem(note);
if(!$scope.selectedTag.all && !$scope.selectedTag.archiveTag) {
- modelManager.createRelationshipBetweenItems($scope.selectedTag, note);
+ note.addItemAsRelationship($scope.selectedTag);
+ note.setDirty(true);
}
}
diff --git a/app/assets/javascripts/app/controllers/notes.js b/app/assets/javascripts/app/controllers/notes.js
index e6f51c142..4759856cb 100644
--- a/app/assets/javascripts/app/controllers/notes.js
+++ b/app/assets/javascripts/app/controllers/notes.js
@@ -217,8 +217,9 @@ angular.module('app')
this.createNewNote = function() {
var title = "New Note" + (this.tag.notes ? (" " + (this.tag.notes.length + 1)) : "");
- this.newNote = modelManager.createItem({content_type: "Note", dummy: true, text: ""});
- this.newNote.title = title;
+ let newNote = modelManager.createItem({content_type: "Note", content: {text: "", title: title}});
+ newNote.dummy = true;
+ this.newNote = newNote;
this.selectNote(this.newNote);
this.addNew()(this.newNote);
}
diff --git a/app/assets/javascripts/app/directives/views/accountMenu.js b/app/assets/javascripts/app/directives/views/accountMenu.js
index 31b677134..2a271fd1a 100644
--- a/app/assets/javascripts/app/directives/views/accountMenu.js
+++ b/app/assets/javascripts/app/directives/views/accountMenu.js
@@ -244,7 +244,7 @@ class AccountMenu {
$scope.importJSONData = function(data, password, callback) {
var onDataReady = function(errorCount) {
- var items = modelManager.mapResponseItemsToLocalModels(data.items, ModelManager.MappingSourceFileImport);
+ var items = modelManager.mapResponseItemsToLocalModels(data.items, SFModelManager.MappingSourceFileImport);
items.forEach(function(item){
item.setDirty(true, true);
item.deleted = false;
diff --git a/app/assets/javascripts/app/models/api/item.js b/app/assets/javascripts/app/models/api/item.js
deleted file mode 100644
index 52a28c1d4..000000000
--- a/app/assets/javascripts/app/models/api/item.js
+++ /dev/null
@@ -1,314 +0,0 @@
-let AppDomain = "org.standardnotes.sn";
-var dateFormatter;
-
-class Item {
-
- constructor(json_obj = {}) {
- this.appData = {};
- this.updateFromJSON(json_obj);
- this.observers = [];
-
- if(!this.uuid) {
- this.uuid = SFJS.crypto.generateUUIDSync();
- }
- }
-
- static sortItemsByDate(items) {
- items.sort(function(a,b){
- return new Date(b.created_at) - new Date(a.created_at);
- });
- }
-
- get contentObject() {
- if(!this.content) {
- return {};
- }
-
- if(this.content !== null && typeof this.content === 'object') {
- // this is the case when mapping localStorage content, in which case the content is already parsed
- return this.content;
- }
-
- try {
- // console.log("Parsing json", this.content);
- this.content = JSON.parse(this.content);
- return this.content;
- } catch (e) {
- console.log("Error parsing json", e, this);
- return {};
- }
- }
-
- updateFromJSON(json) {
- _.merge(this, json);
-
- if(this.created_at) {
- this.created_at = new Date(this.created_at);
- this.updated_at = new Date(this.updated_at);
- } else {
- this.created_at = new Date();
- this.updated_at = new Date();
- }
-
- // Allows the getter to be re-invoked
- this._client_updated_at = null;
-
- if(json.content) {
- this.mapContentToLocalProperties(this.contentObject);
- } else if(json.deleted == true) {
- this.handleDeletedContent();
- }
- }
-
- mapContentToLocalProperties(contentObj) {
- if(contentObj.appData) {
- this.appData = contentObj.appData;
- }
- if(!this.appData) { this.appData = {}; }
- }
-
- createContentJSONFromProperties() {
- return this.structureParams();
- }
-
- referenceParams() {
- // subclasses can override
- return this.contentObject.references || [];
- }
-
- structureParams() {
- var params = this.contentObject;
- params.appData = this.appData;
- params.references = this.referenceParams();
- return params;
- }
-
- refreshContentObject() {
- // Before an item can be duplicated or cloned, we must update this.content (if it is an object) with the object's
- // current physical properties, because updateFromJSON, which is what all new items must go through,
- // will call this.mapContentToLocalProperties(this.contentObject), which may have stale values if not explicitly updated.
-
- this.content = this.structureParams();
- }
-
- /* Allows the item to handle the case where the item is deleted and the content is null */
- handleDeletedContent() {
- // Subclasses can override
- }
-
- setDirty(dirty, dontUpdateClientDate) {
- this.dirty = dirty;
-
- // Allows the syncManager to check if an item has been marked dirty after a sync has been started
- // This prevents it from clearing it as a dirty item after sync completion, if someone else has marked it dirty
- // again after an ongoing sync.
- if(!this.dirtyCount) { this.dirtyCount = 0; }
- if(dirty) {
- this.dirtyCount++;
- } else {
- this.dirtyCount = 0;
- }
-
- if(dirty && !dontUpdateClientDate) {
- // Set the client modified date to now if marking the item as dirty
- this.client_updated_at = new Date();
- } else if(!this.hasRawClientUpdatedAtValue()) {
- // copy updated_at
- this.client_updated_at = new Date(this.updated_at);
- }
-
- if(dirty) {
- this.notifyObserversOfChange();
- }
- }
-
- addObserver(observer, callback) {
- if(!_.find(this.observers, observer)) {
- this.observers.push({observer: observer, callback: callback});
- }
- }
-
- removeObserver(observer) {
- _.remove(this.observers, {observer: observer})
- }
-
- notifyObserversOfChange() {
- for(var observer of this.observers) {
- observer.callback(this);
- }
- }
-
- addItemAsRelationship(item) {
- // must override
- }
-
- removeItemAsRelationship(item) {
- // must override
- }
-
- isBeingRemovedLocally() {
-
- }
-
- removeAndDirtyAllRelationships() {
- // must override
- this.setDirty(true);
- }
-
- removeReferencesNotPresentIn(references) {
-
- }
-
- mergeMetadataFromItem(item) {
- _.merge(this, _.omit(item, ["content"]));
- }
-
- informReferencesOfUUIDChange(oldUUID, newUUID) {
- // optional override
- }
-
- potentialItemOfInterestHasChangedItsUUID(newItem, oldUUID, newUUID) {
- // optional override
- for(var reference of this.content.references) {
- if(reference.uuid == oldUUID) {
- reference.uuid = newUUID;
- }
- }
- }
-
- doNotEncrypt() {
- return false;
- }
-
- /*
- App Data
- */
-
- setDomainDataItem(key, value, domain) {
- var data = this.appData[domain];
- if(!data) {
- data = {}
- }
- data[key] = value;
- this.appData[domain] = data;
- }
-
- getDomainDataItem(key, domain) {
- var data = this.appData[domain];
- if(data) {
- return data[key];
- } else {
- return null;
- }
- }
-
- setAppDataItem(key, value) {
- this.setDomainDataItem(key, value, AppDomain);
- }
-
- getAppDataItem(key) {
- return this.getDomainDataItem(key, AppDomain);
- }
-
- get pinned() {
- return this.getAppDataItem("pinned");
- }
-
- get archived() {
- return this.getAppDataItem("archived");
- }
-
- get locked() {
- return this.getAppDataItem("locked");
- }
-
- hasRawClientUpdatedAtValue() {
- return this.getAppDataItem("client_updated_at") != null;
- }
-
- get client_updated_at() {
- if(!this._client_updated_at) {
- var saved = this.getAppDataItem("client_updated_at");
- if(saved) {
- this._client_updated_at = new Date(saved);
- } else {
- this._client_updated_at = new Date(this.updated_at);
- }
- }
- return this._client_updated_at;
- }
-
- set client_updated_at(date) {
- this._client_updated_at = date;
-
- this.setAppDataItem("client_updated_at", date);
- }
-
- /*
- During sync conflicts, when determing whether to create a duplicate for an item, we can omit keys that have no
- meaningful weight and can be ignored. For example, if one component has active = true and another component has active = false,
- it would be silly to duplicate them, so instead we ignore this.
- */
- keysToIgnoreWhenCheckingContentEquality() {
- return [];
- }
-
- // Same as above, but keys inside appData[AppDomain]
- appDataKeysToIgnoreWhenCheckingContentEquality() {
- return ["client_updated_at"];
- }
-
- isItemContentEqualWith(otherItem) {
- let omit = (obj, keys) => {
- for(var key of keys) {
- delete obj[key];
- }
- return obj;
- }
-
- var left = this.structureParams();
- left.appData[AppDomain] = omit(left.appData[AppDomain], this.appDataKeysToIgnoreWhenCheckingContentEquality());
- left = omit(left, this.keysToIgnoreWhenCheckingContentEquality());
-
- var right = otherItem.structureParams();
- right.appData[AppDomain] = omit(right.appData[AppDomain], otherItem.appDataKeysToIgnoreWhenCheckingContentEquality());
- right = omit(right, otherItem.keysToIgnoreWhenCheckingContentEquality());
-
- return JSON.stringify(left) === JSON.stringify(right)
- }
-
- /*
- Dates
- */
-
- createdAtString() {
- return this.dateToLocalizedString(this.created_at);
- }
-
- updatedAtString() {
- return this.dateToLocalizedString(this.client_updated_at);
- }
-
- dateToLocalizedString(date) {
- if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) {
- if (!dateFormatter) {
- var locale = (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.language;
- dateFormatter = new Intl.DateTimeFormat(locale, {
- year: 'numeric',
- month: 'short',
- day: '2-digit',
- weekday: 'long',
- hour: '2-digit',
- minute: '2-digit',
- });
- }
- return dateFormatter.format(date);
- } else {
- // IE < 11, Safari <= 9.0.
- // In English, this generates the string most similar to
- // the toLocaleDateString() result above.
- return date.toDateString() + ' ' + date.toLocaleTimeString();
- }
- }
-
-}
diff --git a/app/assets/javascripts/app/models/api/mfa.js b/app/assets/javascripts/app/models/api/mfa.js
index 8c17fcb78..e3371f17e 100644
--- a/app/assets/javascripts/app/models/api/mfa.js
+++ b/app/assets/javascripts/app/models/api/mfa.js
@@ -1,4 +1,4 @@
-class Mfa extends Item {
+class Mfa extends SFItem {
constructor(json_obj) {
super(json_obj);
diff --git a/app/assets/javascripts/app/models/api/serverExtension.js b/app/assets/javascripts/app/models/api/serverExtension.js
index 03c5e95fc..4d7d3dc0e 100644
--- a/app/assets/javascripts/app/models/api/serverExtension.js
+++ b/app/assets/javascripts/app/models/api/serverExtension.js
@@ -1,4 +1,4 @@
-class ServerExtension extends Item {
+class ServerExtension extends SFItem {
constructor(json_obj) {
super(json_obj);
diff --git a/app/assets/javascripts/app/models/app/component.js b/app/assets/javascripts/app/models/app/component.js
index 25d05cd1b..a077eb733 100644
--- a/app/assets/javascripts/app/models/app/component.js
+++ b/app/assets/javascripts/app/models/app/component.js
@@ -1,4 +1,4 @@
-class Component extends Item {
+class Component extends SFItem {
constructor(json_obj) {
// If making a copy of an existing component (usually during sign in if you have a component active in the session),
diff --git a/app/assets/javascripts/app/models/app/editor.js b/app/assets/javascripts/app/models/app/editor.js
index b25c50885..cc71e1657 100644
--- a/app/assets/javascripts/app/models/app/editor.js
+++ b/app/assets/javascripts/app/models/app/editor.js
@@ -1,4 +1,4 @@
-class Editor extends Item {
+class Editor extends SFItem {
constructor(json_obj) {
super(json_obj);
@@ -68,18 +68,18 @@ class Editor extends Item {
var uuids = references.map(function(ref){return ref.uuid});
this.notes.forEach(function(note){
if(!uuids.includes(note.uuid)) {
- _.pull(this.notes, note);
+ _.remove(this.notes, {uuid: note.uuid});
}
}.bind(this))
}
potentialItemOfInterestHasChangedItsUUID(newItem, oldUUID, newUUID) {
if(newItem.content_type === "Note" && _.find(this.notes, {uuid: oldUUID})) {
- _.pull(this.notes, {uuid: oldUUID});
+ _.remove(this.notes, {uuid: oldUUID});
this.notes.push(newItem);
}
}
-
+
toJSON() {
return {uuid: this.uuid}
}
diff --git a/app/assets/javascripts/app/models/app/note.js b/app/assets/javascripts/app/models/app/note.js
index b1140acf8..3669b3420 100644
--- a/app/assets/javascripts/app/models/app/note.js
+++ b/app/assets/javascripts/app/models/app/note.js
@@ -1,4 +1,4 @@
-class Note extends Item {
+export class Note extends SFItem {
constructor(json_obj) {
super(json_obj);
@@ -21,14 +21,6 @@ class Note extends Item {
this.text = content.text;
}
- referenceParams() {
- var references = _.map(this.tags, function(tag){
- return {uuid: tag.uuid, content_type: tag.content_type};
- })
-
- return references;
- }
-
structureParams() {
var params = {
title: this.title,
@@ -44,8 +36,9 @@ class Note extends Item {
this.savedTagsString = null;
if(item.content_type == "Tag") {
- if(!_.find(this.tags, item)) {
+ if(!_.find(this.tags, {uuid: item.uuid})) {
this.tags.push(item);
+ item.notes.push(this);
}
}
super.addItemAsRelationship(item);
@@ -55,38 +48,29 @@ class Note extends Item {
this.savedTagsString = null;
if(item.content_type == "Tag") {
- _.pull(this.tags, item);
+ _.remove(this.tags, {uuid: item.uuid});
+ _.remove(item.notes, {uuid: this.uuid});
}
super.removeItemAsRelationship(item);
}
- removeAndDirtyAllRelationships() {
+ updateLocalRelationships() {
this.savedTagsString = null;
- this.tags.forEach(function(tag){
- _.pull(tag.notes, this);
- tag.setDirty(true);
- }.bind(this))
- this.tags = [];
- }
-
- removeReferencesNotPresentIn(references) {
- this.savedTagsString = null;
-
- super.removeReferencesNotPresentIn(references);
+ var references = this.content.references;
var uuids = references.map(function(ref){return ref.uuid});
this.tags.slice().forEach(function(tag){
if(!uuids.includes(tag.uuid)) {
- _.pull(tag.notes, this);
- _.pull(this.tags, tag);
+ _.remove(tag.notes, {uuid: this.uuid});
+ _.remove(this.tags, {uuid: tag.uuid});
}
}.bind(this))
}
isBeingRemovedLocally() {
this.tags.forEach(function(tag){
- _.pull(tag.notes, this);
+ _.remove(tag.notes, {uuid: this.uuid});
}.bind(this))
super.isBeingRemovedLocally();
}
@@ -99,7 +83,7 @@ class Note extends Item {
informReferencesOfUUIDChange(oldUUID, newUUID) {
super.informReferencesOfUUIDChange();
for(var tag of this.tags) {
- _.pull(tag.notes, {uuid: oldUUID});
+ _.remove(tag.notes, {uuid: oldUUID});
tag.notes.push(this);
}
}
@@ -116,10 +100,6 @@ class Note extends Item {
return {uuid: this.uuid}
}
- get content_type() {
- return "Note";
- }
-
tagsString() {
this.savedTagsString = Tag.arrayToDisplayString(this.tags);
return this.savedTagsString;
diff --git a/app/assets/javascripts/app/models/app/tag.js b/app/assets/javascripts/app/models/app/tag.js
index 69e3437da..f1c89f237 100644
--- a/app/assets/javascripts/app/models/app/tag.js
+++ b/app/assets/javascripts/app/models/app/tag.js
@@ -1,4 +1,4 @@
-class Tag extends Item {
+export class Tag extends SFItem {
constructor(json_obj) {
super(json_obj);
@@ -13,14 +13,6 @@ class Tag extends Item {
this.title = content.title;
}
- referenceParams() {
- var references = _.map(this.notes, function(note){
- return {uuid: note.uuid, content_type: note.content_type};
- })
-
- return references;
- }
-
structureParams() {
var params = {
title: this.title
@@ -31,59 +23,20 @@ class Tag extends Item {
return superParams;
}
- addItemAsRelationship(item) {
- if(item.content_type == "Note") {
- if(!_.find(this.notes, item)) {
- this.notes.unshift(item);
- }
- }
- super.addItemAsRelationship(item);
- }
-
- removeItemAsRelationship(item) {
- if(item.content_type == "Note") {
- _.pull(this.notes, item);
- }
- super.removeItemAsRelationship(item);
- }
-
- removeAndDirtyAllRelationships() {
- this.notes.forEach(function(note){
- _.pull(note.tags, this);
- note.setDirty(true);
- }.bind(this))
-
- this.notes = [];
- }
-
- removeReferencesNotPresentIn(references) {
- var uuids = references.map(function(ref){return ref.uuid});
- this.notes.slice().forEach(function(note){
- if(!uuids.includes(note.uuid)) {
- _.pull(note.tags, this);
- _.pull(this.notes, note);
- }
- }.bind(this))
- }
-
isBeingRemovedLocally() {
this.notes.forEach(function(note){
- _.pull(note.tags, this);
+ _.remove(note.tags, {uuid: this.uuid});
}.bind(this))
super.isBeingRemovedLocally();
}
informReferencesOfUUIDChange(oldUUID, newUUID) {
for(var note of this.notes) {
- _.pull(note.tags, {uuid: oldUUID});
+ _.remove(note.tags, {uuid: oldUUID});
note.tags.push(this);
}
}
- get content_type() {
- return "Tag";
- }
-
static arrayToDisplayString(tags) {
return tags.sort((a, b) => {return a.title > b.title}).map(function(tag, i){
return "#" + tag.title;
diff --git a/app/assets/javascripts/app/models/local/encryptedStorage.js b/app/assets/javascripts/app/models/local/encryptedStorage.js
index 764d0ae24..b70c678f6 100644
--- a/app/assets/javascripts/app/models/local/encryptedStorage.js
+++ b/app/assets/javascripts/app/models/local/encryptedStorage.js
@@ -1,4 +1,4 @@
-class EncryptedStorage extends Item {
+class EncryptedStorage extends SFItem {
constructor(json_obj) {
super(json_obj);
diff --git a/app/assets/javascripts/app/models/local/itemParams.js b/app/assets/javascripts/app/models/local/itemParams.js
deleted file mode 100644
index c59de929a..000000000
--- a/app/assets/javascripts/app/models/local/itemParams.js
+++ /dev/null
@@ -1,72 +0,0 @@
-class ItemParams {
-
- constructor(item, keys, version) {
- this.item = item;
- this.keys = keys;
- this.version = version || SFJS.version();
- }
-
- async paramsForExportFile(includeDeleted) {
- this.additionalFields = ["updated_at"];
- this.forExportFile = true;
- if(includeDeleted) {
- return this.__params();
- } else {
- var result = await this.__params();
- return _.omit(result, ["deleted"]);
- }
- }
-
- async paramsForExtension() {
- return this.paramsForExportFile();
- }
-
- async paramsForLocalStorage() {
- this.additionalFields = ["updated_at", "dirty", "errorDecrypting"];
- this.forExportFile = true;
- return this.__params();
- }
-
- async paramsForSync() {
- return this.__params();
- }
-
- async __params() {
-
- console.assert(!this.item.dummy, "Item is dummy, should not have gotten here.", this.item.dummy)
-
- var params = {uuid: this.item.uuid, content_type: this.item.content_type, deleted: this.item.deleted, created_at: this.item.created_at};
- if(!this.item.errorDecrypting) {
- // Items should always be encrypted for export files. Only respect item.doNotEncrypt for remote sync params.
- var doNotEncrypt = this.item.doNotEncrypt() && !this.forExportFile;
- if(this.keys && !doNotEncrypt) {
- var encryptedParams = await SFJS.itemTransformer.encryptItem(this.item, this.keys, this.version);
- _.merge(params, encryptedParams);
-
- if(this.version !== "001") {
- params.auth_hash = null;
- }
- }
- else {
- params.content = this.forExportFile ? this.item.createContentJSONFromProperties() : "000" + await SFJS.crypto.base64(JSON.stringify(this.item.createContentJSONFromProperties()));
- if(!this.forExportFile) {
- params.enc_item_key = null;
- params.auth_hash = null;
- }
- }
- } else {
- // Error decrypting, keep "content" and related fields as is (and do not try to encrypt, otherwise that would be undefined behavior)
- params.content = this.item.content;
- params.enc_item_key = this.item.enc_item_key;
- params.auth_hash = this.item.auth_hash;
- }
-
- if(this.additionalFields) {
- _.merge(params, _.pick(this.item, this.additionalFields));
- }
-
- return params;
- }
-
-
-}
diff --git a/app/assets/javascripts/app/services/actionsManager.js b/app/assets/javascripts/app/services/actionsManager.js
index 21c8739a3..fb283a912 100644
--- a/app/assets/javascripts/app/services/actionsManager.js
+++ b/app/assets/javascripts/app/services/actionsManager.js
@@ -74,7 +74,7 @@ class ActionsManager {
if(!item.errorDecrypting) {
if(merge) {
- var items = this.modelManager.mapResponseItemsToLocalModels([item], ModelManager.MappingSourceRemoteActionRetrieved);
+ var items = this.modelManager.mapResponseItemsToLocalModels([item], SFModelManager.MappingSourceRemoteActionRetrieved);
for(var mappedItem of items) {
mappedItem.setDirty(true);
}
@@ -179,7 +179,7 @@ class ActionsManager {
if(decrypted) {
keys = null;
}
- var itemParams = new ItemParams(item, keys, this.authManager.protocolVersion());
+ var itemParams = new SFItemParams(item, keys, this.authManager.protocolVersion());
return itemParams.paramsForExtension();
}
diff --git a/app/assets/javascripts/app/services/authManager.js b/app/assets/javascripts/app/services/authManager.js
index bcc4321b5..49793b140 100644
--- a/app/assets/javascripts/app/services/authManager.js
+++ b/app/assets/javascripts/app/services/authManager.js
@@ -296,7 +296,7 @@ angular.module('app')
this.userPreferencesDidChange();
}, (valueCallback) => {
// Safe to create. Create and return object.
- var prefs = new Item({content_type: prefsContentType});
+ var prefs = new SFItem({content_type: prefsContentType});
modelManager.addItem(prefs);
prefs.setDirty(true);
$rootScope.sync("authManager singletonCreate");
diff --git a/app/assets/javascripts/app/services/componentManager.js b/app/assets/javascripts/app/services/componentManager.js
index a7d3eaaba..2916eef3f 100644
--- a/app/assets/javascripts/app/services/componentManager.js
+++ b/app/assets/javascripts/app/services/componentManager.js
@@ -53,13 +53,13 @@ class ComponentManager {
/* If the source of these new or updated items is from a Component itself saving items, we don't need to notify
components again of the same item. Regarding notifying other components than the issuing component, other mapping sources
- will take care of that, like ModelManager.MappingSourceRemoteSaved
+ will take care of that, like SFModelManager.MappingSourceRemoteSaved
Update: We will now check sourceKey to determine whether the incoming change should be sent to
a component. If sourceKey == component.uuid, it will be skipped. This way, if one component triggers a change,
it's sent to other components.
*/
- // if(source == ModelManager.MappingSourceComponentRetrieved) {
+ // if(source == SFModelManager.MappingSourceComponentRetrieved) {
// return;
// }
@@ -70,7 +70,7 @@ class ComponentManager {
/* We only want to sync if the item source is Retrieved, not MappingSourceRemoteSaved to avoid
recursion caused by the component being modified and saved after it is updated.
*/
- if(syncedComponents.length > 0 && source != ModelManager.MappingSourceRemoteSaved) {
+ if(syncedComponents.length > 0 && source != SFModelManager.MappingSourceRemoteSaved) {
// Ensure any component in our data is installed by the system
this.desktopManager.syncComponentsInstallation(syncedComponents);
}
@@ -195,11 +195,11 @@ class ComponentManager {
/* This means the this function is being triggered through a remote Saving response, which should not update
actual local content values. The reason is, Save responses may be delayed, and a user may have changed some values
in between the Save was initiated, and the time it completes. So we only want to update actual content values (and not just metadata)
- when its another source, like ModelManager.MappingSourceRemoteRetrieved.
+ when its another source, like SFModelManager.MappingSourceRemoteRetrieved.
3/7/18: Add MappingSourceLocalSaved as well to handle fully offline saving. github.com/standardnotes/forum/issues/169
*/
- if(source && (source == ModelManager.MappingSourceRemoteSaved || source == ModelManager.MappingSourceLocalSaved)) {
+ if(source && (source == SFModelManager.MappingSourceRemoteSaved || source == SFModelManager.MappingSourceLocalSaved)) {
params.isMetadataUpdate = true;
}
this.removePrivatePropertiesFromResponseItems([params], component);
@@ -468,7 +468,7 @@ class ComponentManager {
We map the items here because modelManager is what updates the UI. If you were to instead get the items directly,
this would update them server side via sync, but would never make its way back to the UI.
*/
- var localItems = this.modelManager.mapResponseItemsToLocalModels(responseItems, ModelManager.MappingSourceComponentRetrieved, component.uuid);
+ var localItems = this.modelManager.mapResponseItemsToLocalModels(responseItems, SFModelManager.MappingSourceComponentRetrieved, component.uuid);
for(var item of localItems) {
var responseItem = _.find(responseItems, {uuid: item.uuid});
diff --git a/app/assets/javascripts/app/services/desktopManager.js b/app/assets/javascripts/app/services/desktopManager.js
index 23edc562d..a643127a7 100644
--- a/app/assets/javascripts/app/services/desktopManager.js
+++ b/app/assets/javascripts/app/services/desktopManager.js
@@ -37,7 +37,7 @@ class DesktopManager {
Keys are not passed into ItemParams, so the result is not encrypted
*/
async convertComponentForTransmission(component) {
- return new ItemParams(component).paramsForExportFile(true);
+ return new SFItemParams(component).paramsForExportFile(true);
}
// All `components` should be installed
@@ -96,7 +96,7 @@ class DesktopManager {
for(var key of permissableKeys) {
component[key] = componentData.content[key];
}
- this.modelManager.notifySyncObserversOfModels([component], ModelManager.MappingSourceDesktopInstalled);
+ this.modelManager.notifySyncObserversOfModels([component], SFModelManager.MappingSourceDesktopInstalled);
component.setAppDataItem("installError", null);
}
component.setDirty(true);
diff --git a/app/assets/javascripts/app/services/migrationManager.js b/app/assets/javascripts/app/services/migrationManager.js
index 9fec09d65..3e2a50ad4 100644
--- a/app/assets/javascripts/app/services/migrationManager.js
+++ b/app/assets/javascripts/app/services/migrationManager.js
@@ -36,9 +36,11 @@ class MigrationManager {
if(editor.url && !this.componentManager.componentForUrl(editor.url)) {
var component = this.modelManager.createItem({
content_type: "SN|Component",
- url: editor.url,
- name: editor.name,
- area: "editor-editor"
+ content: {
+ url: editor.url,
+ name: editor.name,
+ area: "editor-editor"
+ }
})
component.setAppDataItem("data", editor.data);
component.setDirty(true);
diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js
index 018a806bc..52012717d 100644
--- a/app/assets/javascripts/app/services/modelManager.js
+++ b/app/assets/javascripts/app/services/modelManager.js
@@ -1,10 +1,25 @@
-class ModelManager {
+SFModelManager.ContentTypeClassMapping = {
+ "Note" : Note,
+ "Tag" : Tag,
+ "Extension" : Extension,
+ "SN|Editor" : Editor,
+ "SN|Theme" : Theme,
+ "SN|Component" : Component,
+ "SF|Extension" : ServerExtension,
+ "SF|MFA" : Mfa
+};
+
+SFItem.AppDomain = "org.standardnotes.sn";
+
+class ModelManager extends SFModelManager {
constructor(storageManager) {
- super(storageManager);
+ super();
this.notes = [];
this.tags = [];
this._extensions = [];
+
+ this.storageManager = storageManager;
}
resetLocalMemory() {
@@ -17,7 +32,7 @@ class ModelManager {
findOrCreateTagByTitle(title) {
var tag = _.find(this.tags, {title: title})
if(!tag) {
- tag = this.createItem({content_type: "Tag", title: title});
+ tag = this.createItem({content_type: "Tag", content: {title: title}});
this.addItem(tag);
}
return tag;
@@ -86,6 +101,8 @@ class ModelManager {
} else if(item.content_type == "Extension") {
_.pull(this._extensions, item);
}
+
+ this.storageManager.deleteModel(item, callback);
}
/*
diff --git a/app/assets/javascripts/app/services/storageManager.js b/app/assets/javascripts/app/services/storageManager.js
index c82500c68..5910e655c 100644
--- a/app/assets/javascripts/app/services/storageManager.js
+++ b/app/assets/javascripts/app/services/storageManager.js
@@ -153,7 +153,7 @@ class StorageManager {
encryptedStorage.storage = this.storageAsHash();
// Save new encrypted storage in Fixed storage
- var params = new ItemParams(encryptedStorage, this.encryptedStorageKeys, this.encryptedStorageAuthParams.version);
+ var params = new SFItemParams(encryptedStorage, this.encryptedStorageKeys, this.encryptedStorageAuthParams.version);
params.paramsForSync().then((syncParams) => {
this.setItem("encryptedStorage", JSON.stringify(syncParams), StorageManager.Fixed);
})
diff --git a/app/assets/javascripts/app/services/syncManager.js b/app/assets/javascripts/app/services/syncManager.js
index 031d4169d..f2b87ac5c 100644
--- a/app/assets/javascripts/app/services/syncManager.js
+++ b/app/assets/javascripts/app/services/syncManager.js
@@ -48,7 +48,7 @@ class SyncManager {
var keys = this.authManager.offline() ? this.passcodeManager.keys() : this.authManager.keys();
Promise.all(items.map(async (item) => {
- var itemParams = new ItemParams(item, keys, version);
+ var itemParams = new SFItemParams(item, keys, version);
itemParams = await itemParams.paramsForLocalStorage();
if(offlineOnly) {
delete itemParams.dirty;
@@ -79,13 +79,13 @@ class SyncManager {
var processed = [];
var completion = () => {
- Item.sortItemsByDate(processed);
+ SFItem.sortItemsByDate(processed);
callback(processed);
}
var decryptNext = async () => {
var subitems = items.slice(current, current + iteration);
- var processedSubitems = await this.handleItemsResponse(subitems, null, ModelManager.MappingSourceLocalRetrieved);
+ var processedSubitems = await this.handleItemsResponse(subitems, null, SFModelManager.MappingSourceLocalRetrieved);
processed.push(processedSubitems);
current += subitems.length;
@@ -93,6 +93,7 @@ class SyncManager {
if(current < total) {
this.$timeout(() => { decryptNext(); });
} else {
+ // this.modelManager.resolveReferencesForAllItems()
completion();
}
}
@@ -341,7 +342,7 @@ class SyncManager {
params.limit = 150;
await Promise.all(subItems.map((item) => {
- var itemParams = new ItemParams(item, keys, version);
+ var itemParams = new SFItemParams(item, keys, version);
itemParams.additionalFields = options.additionalFields;
return itemParams.paramsForSync();
})).then((itemsParams) => {
@@ -386,7 +387,7 @@ class SyncManager {
// Map retrieved items to local data
// Note that deleted items will not be returned
- var retrieved = await this.handleItemsResponse(response.retrieved_items, null, ModelManager.MappingSourceRemoteRetrieved);
+ var retrieved = await this.handleItemsResponse(response.retrieved_items, null, SFModelManager.MappingSourceRemoteRetrieved);
// Append items to master list of retrieved items for this ongoing sync operation
this.allRetreivedItems = this.allRetreivedItems.concat(retrieved);
@@ -397,7 +398,7 @@ class SyncManager {
var omitFields = ["content", "auth_hash"];
// Map saved items to local data
- var saved = await this.handleItemsResponse(response.saved_items, omitFields, ModelManager.MappingSourceRemoteSaved);
+ var saved = await this.handleItemsResponse(response.saved_items, omitFields, SFModelManager.MappingSourceRemoteSaved);
// Append items to master list of saved items for this ongoing sync operation
this.allSavedItems = this.allSavedItems.concat(saved);
@@ -504,7 +505,7 @@ class SyncManager {
refreshErroredItems() {
var erroredItems = this.modelManager.allItems.filter((item) => {return item.errorDecrypting == true});
if(erroredItems.length > 0) {
- this.handleItemsResponse(erroredItems, null, ModelManager.MappingSourceLocalRetrieved);
+ this.handleItemsResponse(erroredItems, null, SFModelManager.MappingSourceLocalRetrieved);
}
}
diff --git a/package-lock.json b/package-lock.json
index 94c93c089..7699cddf4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5721,10 +5721,3699 @@
"dev": true
},
"standard-file-js": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/standard-file-js/-/standard-file-js-0.3.1.tgz",
- "integrity": "sha512-UEYlIiIMJJeqZSjmeJnLPlWH6SYa8x4HW9tuklF4mqSdGuZvUc1eJcUPiJ2n1Tv+rHEmKeX5IHAhSFOFoiSKag==",
- "dev": true
+ "version": "file:../../sf/sfjs",
+ "dev": true,
+ "dependencies": {
+ "JSONStream": {
+ "version": "1.3.3",
+ "bundled": true,
+ "requires": {
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
+ }
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "acorn": {
+ "version": "5.7.1",
+ "bundled": true
+ },
+ "acorn-dynamic-import": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "acorn": "5.7.1"
+ }
+ },
+ "acorn-node": {
+ "version": "1.5.2",
+ "bundled": true,
+ "requires": {
+ "acorn": "5.7.1",
+ "acorn-dynamic-import": "3.0.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "bundled": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "bundled": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "bundled": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "bundled": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "array-map": {
+ "version": "0.0.0",
+ "bundled": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "bundled": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "bundled": true
+ },
+ "asn1.js": {
+ "version": "4.10.1",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "bundled": true,
+ "requires": {
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "bundled": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "bundled": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "babel-cli": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-polyfill": "6.26.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "chokidar": "1.7.0",
+ "commander": "2.15.1",
+ "convert-source-map": "1.5.1",
+ "fs-readdir-recursive": "1.1.0",
+ "glob": "7.1.2",
+ "lodash": "4.17.10",
+ "output-file-sync": "1.1.2",
+ "path-is-absolute": "1.0.1",
+ "slash": "1.0.0",
+ "source-map": "0.5.7",
+ "v8flags": "2.1.1"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.3",
+ "bundled": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "bundled": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "1.3.0",
+ "bundled": true
+ }
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-explode-assignable-expression": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "bundled": true
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "bundled": true
+ },
+ "babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "bundled": true
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-runtime": {
+ "version": "6.23.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.6",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "bundled": true
+ }
+ }
+ },
+ "babel-preset-env": {
+ "version": "1.7.0",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0",
+ "browserslist": "3.2.8",
+ "invariant": "2.2.4",
+ "semver": "5.5.0"
+ }
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-preset-es2016": {
+ "version": "6.24.1",
+ "bundled": true,
+ "requires": {
+ "babel-plugin-transform-exponentiation-operator": "6.24.1"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.6",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.10",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "core-js": "2.5.6",
+ "regenerator-runtime": "0.11.1"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "bundled": true
+ }
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babelify": {
+ "version": "8.0.0",
+ "bundled": true
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "bundled": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "bundled": true
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "bundled": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "bundled": true
+ },
+ "body": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "continuable-cache": "0.3.1",
+ "error": "7.0.2",
+ "raw-body": "1.1.7",
+ "safe-json-parse": "1.0.1"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "bundled": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "browser-pack": {
+ "version": "6.1.0",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "1.3.3",
+ "combine-source-map": "0.8.0",
+ "defined": "1.0.0",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3",
+ "umd": "3.0.3"
+ }
+ },
+ "browser-resolve": {
+ "version": "1.11.3",
+ "bundled": true,
+ "requires": {
+ "resolve": "1.1.7"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "bundled": true
+ },
+ "browserify": {
+ "version": "16.2.2",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "1.3.3",
+ "assert": "1.4.1",
+ "browser-pack": "6.1.0",
+ "browser-resolve": "1.11.3",
+ "browserify-zlib": "0.2.0",
+ "buffer": "5.1.0",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.6.2",
+ "console-browserify": "1.1.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "defined": "1.0.0",
+ "deps-sort": "2.0.0",
+ "domain-browser": "1.2.0",
+ "duplexer2": "0.1.4",
+ "events": "2.1.0",
+ "glob": "7.1.2",
+ "has": "1.0.1",
+ "htmlescape": "1.1.1",
+ "https-browserify": "1.0.0",
+ "inherits": "2.0.3",
+ "insert-module-globals": "7.2.0",
+ "labeled-stream-splicer": "2.0.1",
+ "mkdirp": "0.5.1",
+ "module-deps": "6.1.0",
+ "os-browserify": "0.3.0",
+ "parents": "1.0.1",
+ "path-browserify": "0.0.1",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "read-only-stream": "2.0.0",
+ "readable-stream": "2.3.6",
+ "resolve": "1.1.7",
+ "shasum": "1.0.2",
+ "shell-quote": "1.6.1",
+ "stream-browserify": "2.0.1",
+ "stream-http": "2.8.3",
+ "string_decoder": "1.1.1",
+ "subarg": "1.0.0",
+ "syntax-error": "1.4.0",
+ "through2": "2.0.3",
+ "timers-browserify": "1.4.2",
+ "tty-browserify": "0.0.1",
+ "url": "0.11.0",
+ "util": "0.10.4",
+ "vm-browserify": "1.1.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "buffer-xor": "1.0.3",
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "browserify-cache-api": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "async": "1.5.2",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "browserify-aes": "1.2.0",
+ "browserify-des": "1.0.1",
+ "evp_bytestokey": "1.0.3"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "des.js": "1.0.0",
+ "inherits": "2.0.3"
+ }
+ },
+ "browserify-incremental": {
+ "version": "3.1.1",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "0.10.0",
+ "browserify-cache-api": "3.0.1",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "JSONStream": {
+ "version": "0.10.0",
+ "bundled": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": "2.3.8"
+ }
+ },
+ "jsonparse": {
+ "version": "0.0.5",
+ "bundled": true
+ }
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "randombytes": "2.0.6"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "elliptic": "6.4.0",
+ "inherits": "2.0.3",
+ "parse-asn1": "5.1.1"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "bundled": true,
+ "requires": {
+ "pako": "1.0.6"
+ }
+ },
+ "browserslist": {
+ "version": "3.2.8",
+ "bundled": true,
+ "requires": {
+ "caniuse-lite": "1.0.30000844",
+ "electron-to-chromium": "1.3.47"
+ }
+ },
+ "buffer": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "base64-js": "1.3.0",
+ "ieee754": "1.1.12"
+ }
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "bytes": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "cached-path-relative": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000844",
+ "bundled": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "bundled": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "bundled": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.8"
+ }
+ },
+ "chai-as-promised": {
+ "version": "7.1.1",
+ "bundled": true,
+ "requires": {
+ "check-error": "1.0.2"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "bundled": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "bundled": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.2.4",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "coffeescript": {
+ "version": "1.10.0",
+ "bundled": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "bundled": true
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "bundled": true,
+ "requires": {
+ "convert-source-map": "1.1.3",
+ "inline-source-map": "0.6.2",
+ "lodash.memoize": "3.0.4",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.1.3",
+ "bundled": true
+ }
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "bundled": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "connect": {
+ "version": "3.6.6",
+ "bundled": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.0",
+ "parseurl": "1.3.2",
+ "utils-merge": "1.0.1"
+ }
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "date-now": "0.1.4"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "continuable-cache": {
+ "version": "0.3.1",
+ "bundled": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "bundled": true
+ },
+ "core-js": {
+ "version": "2.5.6",
+ "bundled": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "elliptic": "6.4.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "md5.js": "1.3.4",
+ "ripemd160": "2.0.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "bundled": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "bundled": true,
+ "requires": {
+ "browserify-cipher": "1.0.1",
+ "browserify-sign": "4.0.4",
+ "create-ecdh": "4.0.3",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "diffie-hellman": "5.0.3",
+ "inherits": "2.0.3",
+ "pbkdf2": "3.0.16",
+ "public-encrypt": "4.0.2",
+ "randombytes": "2.0.6",
+ "randomfill": "1.0.4"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "bundled": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "bundled": true
+ },
+ "dateformat": {
+ "version": "1.0.12",
+ "bundled": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.2",
+ "bundled": true,
+ "requires": {
+ "foreach": "2.0.5",
+ "object-keys": "1.0.11"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "bundled": true
+ },
+ "deps-sort": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "1.3.3",
+ "shasum": "1.0.2",
+ "subarg": "1.0.0",
+ "through2": "2.0.3"
+ }
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "bundled": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "bundled": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detective": {
+ "version": "5.1.0",
+ "bundled": true,
+ "requires": {
+ "acorn-node": "1.5.2",
+ "defined": "1.0.0",
+ "minimist": "1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "bundled": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "miller-rabin": "4.0.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.47",
+ "bundled": true
+ },
+ "elliptic": {
+ "version": "6.4.0",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.4",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "error": {
+ "version": "7.0.2",
+ "bundled": true,
+ "requires": {
+ "string-template": "0.2.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "bundled": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "bundled": true
+ },
+ "esprima": {
+ "version": "2.7.3",
+ "bundled": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "bundled": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "bundled": true
+ },
+ "eventemitter2": {
+ "version": "0.4.14",
+ "bundled": true
+ },
+ "events": {
+ "version": "2.1.0",
+ "bundled": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "bundled": true,
+ "requires": {
+ "md5.js": "1.3.4",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "bundled": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "bundled": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "bundled": true,
+ "requires": {
+ "fill-range": "2.2.4"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "bundled": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "faye-websocket": {
+ "version": "0.10.0",
+ "bundled": true,
+ "requires": {
+ "websocket-driver": "0.7.0"
+ }
+ },
+ "figures": {
+ "version": "1.7.0",
+ "bundled": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "bundled": true
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "bundled": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.0.0",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "bundled": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "bundled": true,
+ "requires": {
+ "glob": "5.0.15"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "bundled": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "bundled": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "bundled": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "bundled": true
+ },
+ "fs-readdir-recursive": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "fsevents": {
+ "version": "1.2.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.10.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "bundled": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.10.0",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.7",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.7",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "bundled": true,
+ "requires": {
+ "globule": "1.2.0"
+ }
+ },
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "bundled": true
+ },
+ "getobject": {
+ "version": "0.1.0",
+ "bundled": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "bundled": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "bundled": true
+ },
+ "globule": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "bundled": true
+ },
+ "growl": {
+ "version": "1.10.5",
+ "bundled": true
+ },
+ "grunt": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "coffeescript": "1.10.0",
+ "dateformat": "1.0.12",
+ "eventemitter2": "0.4.14",
+ "exit": "0.1.2",
+ "findup-sync": "0.3.0",
+ "glob": "7.0.6",
+ "grunt-cli": "1.2.0",
+ "grunt-known-options": "1.1.0",
+ "grunt-legacy-log": "1.0.2",
+ "grunt-legacy-util": "1.0.0",
+ "iconv-lite": "0.4.23",
+ "js-yaml": "3.5.5",
+ "minimatch": "3.0.4",
+ "nopt": "3.0.6",
+ "path-is-absolute": "1.0.1",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.0.6",
+ "bundled": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "grunt-cli": {
+ "version": "1.2.0",
+ "bundled": true,
+ "requires": {
+ "findup-sync": "0.3.0",
+ "grunt-known-options": "1.1.0",
+ "nopt": "3.0.6",
+ "resolve": "1.1.7"
+ }
+ }
+ }
+ },
+ "grunt-babel": {
+ "version": "6.0.0",
+ "bundled": true,
+ "requires": {
+ "babel-core": "6.26.3"
+ }
+ },
+ "grunt-browserify": {
+ "version": "5.3.0",
+ "bundled": true,
+ "requires": {
+ "async": "2.6.1",
+ "browserify": "16.2.2",
+ "browserify-incremental": "3.1.1",
+ "glob": "7.1.2",
+ "lodash": "4.17.10",
+ "resolve": "1.1.7",
+ "watchify": "3.11.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.1",
+ "bundled": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ }
+ }
+ },
+ "grunt-contrib-concat": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "source-map": "0.5.7"
+ }
+ },
+ "grunt-contrib-uglify": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "maxmin": "1.1.0",
+ "object.assign": "4.1.0",
+ "uglify-js": "2.8.29",
+ "uri-path": "1.0.0"
+ }
+ },
+ "grunt-contrib-watch": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "async": "2.6.1",
+ "gaze": "1.1.3",
+ "lodash": "4.17.10",
+ "tiny-lr": "1.1.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.1",
+ "bundled": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ }
+ }
+ },
+ "grunt-known-options": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "grunt-legacy-log": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "colors": "1.1.2",
+ "grunt-legacy-log-utils": "1.0.0",
+ "hooker": "0.2.3",
+ "lodash": "4.17.10"
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "4.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.3.0",
+ "bundled": true
+ }
+ }
+ },
+ "grunt-legacy-util": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "async": "1.5.2",
+ "exit": "0.1.2",
+ "getobject": "0.1.0",
+ "hooker": "0.2.3",
+ "lodash": "4.3.0",
+ "underscore.string": "3.2.3",
+ "which": "1.2.14"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.3.0",
+ "bundled": true
+ }
+ }
+ },
+ "grunt-newer": {
+ "version": "1.3.0",
+ "bundled": true,
+ "requires": {
+ "async": "1.5.2",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ }
+ }
+ },
+ "gzip-size": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "browserify-zlib": "0.1.4",
+ "concat-stream": "1.6.2"
+ },
+ "dependencies": {
+ "browserify-zlib": {
+ "version": "0.1.4",
+ "bundled": true,
+ "requires": {
+ "pako": "0.2.9"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "bundled": true
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.4",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "hash.js": "1.1.4",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "hooker": {
+ "version": "0.2.3",
+ "bundled": true
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "bundled": true
+ },
+ "htmlescape": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "bundled": true,
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.5.0"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "1.5.0",
+ "bundled": true
+ }
+ }
+ },
+ "http-parser-js": {
+ "version": "0.4.13",
+ "bundled": true
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "bundled": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ieee754": {
+ "version": "1.1.12",
+ "bundled": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true
+ },
+ "inline-source-map": {
+ "version": "0.6.2",
+ "bundled": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "insert-module-globals": {
+ "version": "7.2.0",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "1.3.3",
+ "acorn-node": "1.5.2",
+ "combine-source-map": "0.8.0",
+ "concat-stream": "1.6.2",
+ "is-buffer": "1.1.6",
+ "path-is-absolute": "1.0.1",
+ "process": "0.11.10",
+ "through2": "2.0.3",
+ "undeclared-identifiers": "1.1.2",
+ "xtend": "4.0.1"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "bundled": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "bundled": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "bundled": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "bundled": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "bundled": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "bundled": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "bundled": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "js-yaml": {
+ "version": "3.5.5",
+ "bundled": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "2.7.3"
+ }
+ },
+ "jsesc": {
+ "version": "0.5.0",
+ "bundled": true
+ },
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "bundled": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json5": {
+ "version": "0.5.1",
+ "bundled": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "bundled": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "bundled": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "bundled": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "labeled-stream-splicer": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "isarray": "2.0.4",
+ "stream-splicer": "2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.4",
+ "bundled": true
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "bundled": true
+ },
+ "livereload-js": {
+ "version": "2.3.0",
+ "bundled": true
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "bundled": true
+ },
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "bundled": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "bundled": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "bundled": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "maxmin": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "figures": "1.7.0",
+ "gzip-size": "1.0.0",
+ "pretty-bytes": "1.0.4"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.4",
+ "bundled": true,
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "bundled": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true
+ }
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "bundled": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "bundled": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "5.2.0",
+ "bundled": true,
+ "requires": {
+ "browser-stdout": "1.3.1",
+ "commander": "2.15.1",
+ "debug": "3.1.0",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.2",
+ "growl": "1.10.5",
+ "he": "1.1.1",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "supports-color": "5.4.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "bundled": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "module-deps": {
+ "version": "6.1.0",
+ "bundled": true,
+ "requires": {
+ "JSONStream": "1.3.3",
+ "browser-resolve": "1.11.3",
+ "cached-path-relative": "1.0.1",
+ "concat-stream": "1.6.2",
+ "defined": "1.0.0",
+ "detective": "5.1.0",
+ "duplexer2": "0.1.4",
+ "inherits": "2.0.3",
+ "parents": "1.0.1",
+ "readable-stream": "2.3.6",
+ "resolve": "1.8.1",
+ "stream-combiner2": "1.1.1",
+ "subarg": "1.0.0",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.8.1",
+ "bundled": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "nan": {
+ "version": "2.10.0",
+ "bundled": true,
+ "optional": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "bundled": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "bundled": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "bundled": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true
+ },
+ "object-keys": {
+ "version": "1.0.11",
+ "bundled": true
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "bundled": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "function-bind": "1.1.1",
+ "has-symbols": "1.0.0",
+ "object-keys": "1.0.11"
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "bundled": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "bundled": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "outpipe": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "shell-quote": "1.6.1"
+ }
+ },
+ "output-file-sync": {
+ "version": "1.1.2",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1"
+ }
+ },
+ "pako": {
+ "version": "1.0.6",
+ "bundled": true
+ },
+ "parents": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "path-platform": "0.11.15"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.1",
+ "bundled": true,
+ "requires": {
+ "asn1.js": "4.10.1",
+ "browserify-aes": "1.2.0",
+ "create-hash": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "pbkdf2": "3.0.16"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "bundled": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "bundled": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "bundled": true
+ },
+ "path-browserify": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "bundled": true
+ },
+ "path-platform": {
+ "version": "0.11.15",
+ "bundled": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "pbkdf2": {
+ "version": "3.0.16",
+ "bundled": true,
+ "requires": {
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "bundled": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "bundled": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "bundled": true
+ },
+ "pretty-bytes": {
+ "version": "1.0.4",
+ "bundled": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "private": {
+ "version": "0.1.8",
+ "bundled": true
+ },
+ "process": {
+ "version": "0.11.10",
+ "bundled": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "public-encrypt": {
+ "version": "4.0.2",
+ "bundled": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.2.0",
+ "parse-asn1": "5.1.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "bundled": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "bundled": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "bundled": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "bundled": true
+ },
+ "randomatic": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "is-number": "4.0.0",
+ "kind-of": "6.0.2",
+ "math-random": "1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "bundled": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "bundled": true
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "bundled": true,
+ "requires": {
+ "randombytes": "2.0.6",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "bundled": true
+ },
+ "raw-body": {
+ "version": "1.1.7",
+ "bundled": true,
+ "requires": {
+ "bytes": "1.0.0",
+ "string_decoder": "0.10.31"
+ },
+ "dependencies": {
+ "string_decoder": {
+ "version": "0.10.31",
+ "bundled": true
+ }
+ }
+ },
+ "read-only-stream": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "bundled": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "bundled": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.0",
+ "bundled": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "bundled": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "bundled": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "bundled": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "regenerate": "1.4.0",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "bundled": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "bundled": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "bundled": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "bundled": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "bundled": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "bundled": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.2.8",
+ "bundled": true
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "bundled": true,
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "bundled": true
+ },
+ "safe-json-parse": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "bundled": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "1.4.0",
+ "bundled": true
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "bundled": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.2"
+ }
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "shasum": {
+ "version": "1.0.2",
+ "bundled": true,
+ "requires": {
+ "json-stable-stringify": "0.0.1",
+ "sha.js": "2.4.11"
+ }
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "bundled": true,
+ "requires": {
+ "array-filter": "0.0.1",
+ "array-map": "0.0.0",
+ "array-reduce": "0.0.0",
+ "jsonify": "0.0.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true
+ },
+ "simple-concat": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "bundled": true
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "bundled": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "bundled": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "bundled": true,
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "bundled": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "bundled": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "bundled": true,
+ "requires": {
+ "builtin-status-codes": "3.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "to-arraybuffer": "1.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "stream-splicer": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "string-template": {
+ "version": "0.2.1",
+ "bundled": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "bundled": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "bundled": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "bundled": true,
+ "requires": {
+ "minimist": "1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true
+ }
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "bundled": true
+ },
+ "syntax-error": {
+ "version": "1.4.0",
+ "bundled": true,
+ "requires": {
+ "acorn-node": "1.5.2"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "bundled": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "bundled": true,
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "bundled": true,
+ "requires": {
+ "process": "0.11.10"
+ }
+ },
+ "tiny-lr": {
+ "version": "1.1.1",
+ "bundled": true,
+ "requires": {
+ "body": "5.1.0",
+ "debug": "3.1.0",
+ "faye-websocket": "0.10.0",
+ "livereload-js": "2.3.0",
+ "object-assign": "4.1.1",
+ "qs": "6.5.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "bundled": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "bundled": true
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "bundled": true
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "bundled": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "bundled": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "bundled": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "bundled": true,
+ "optional": true
+ },
+ "umd": {
+ "version": "3.0.3",
+ "bundled": true
+ },
+ "undeclared-identifiers": {
+ "version": "1.1.2",
+ "bundled": true,
+ "requires": {
+ "acorn-node": "1.5.2",
+ "get-assigned-identifiers": "1.2.0",
+ "simple-concat": "1.0.0",
+ "xtend": "4.0.1"
+ }
+ },
+ "underscore.string": {
+ "version": "3.2.3",
+ "bundled": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "uri-path": {
+ "version": "1.0.0",
+ "bundled": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "bundled": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "bundled": true
+ }
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "bundled": true
+ },
+ "util": {
+ "version": "0.10.4",
+ "bundled": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "bundled": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "bundled": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "bundled": true,
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "vm-browserify": {
+ "version": "1.1.0",
+ "bundled": true
+ },
+ "watchify": {
+ "version": "3.11.0",
+ "bundled": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "browserify": "16.2.2",
+ "chokidar": "1.7.0",
+ "defined": "1.0.0",
+ "outpipe": "1.1.1",
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "websocket-driver": {
+ "version": "0.7.0",
+ "bundled": true,
+ "requires": {
+ "http-parser-js": "0.4.13",
+ "websocket-extensions": "0.1.3"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "bundled": true
+ },
+ "which": {
+ "version": "1.2.14",
+ "bundled": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "bundled": true
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "bundled": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "bundled": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "bundled": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "bundled": true
+ }
+ }
+ }
+ }
},
"statuses": {
"version": "1.5.0",
diff --git a/package.json b/package.json
index 7aa34d9db..31b877db1 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,7 @@
"karma-jasmine": "^1.1.0",
"karma-phantomjs-launcher": "^1.0.2",
"sn-stylekit": "1.0.15",
- "standard-file-js": "0.3.1"
+ "standard-file-js": "file:~/Desktop/sf/sfjs"
},
"license": "GPL-3.0"
}
diff --git a/test/controllers/.keep b/test/controllers/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/controllers/apikey_controller_test.rb b/test/controllers/apikey_controller_test.rb
deleted file mode 100644
index 820a42899..000000000
--- a/test/controllers/apikey_controller_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class ApikeyControllerTest < ActionController::TestCase
- # test "the truth" do
- # assert true
- # end
-end
diff --git a/test/controllers/names_controller_test.rb b/test/controllers/names_controller_test.rb
deleted file mode 100644
index fcb52fbec..000000000
--- a/test/controllers/names_controller_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class NamesControllerTest < ActionController::TestCase
- # test "the truth" do
- # assert true
- # end
-end
diff --git a/test/controllers/proto_controller_test.rb b/test/controllers/proto_controller_test.rb
deleted file mode 100644
index f8ce50c03..000000000
--- a/test/controllers/proto_controller_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class ProtoControllerTest < ActionController::TestCase
- # test "the truth" do
- # assert true
- # end
-end
diff --git a/test/fixtures/.keep b/test/fixtures/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/fixtures/api_keys.yml b/test/fixtures/api_keys.yml
deleted file mode 100644
index bbd2b2b65..000000000
--- a/test/fixtures/api_keys.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
-
-one:
- access_token: MyString
-
-two:
- access_token: MyString
diff --git a/test/fixtures/names.yml b/test/fixtures/names.yml
deleted file mode 100644
index 861ee7df1..000000000
--- a/test/fixtures/names.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
-
-one:
- text: MyString
-
-two:
- text: MyString
diff --git a/test/helpers/.keep b/test/helpers/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/integration/.keep b/test/integration/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/javascripts/mocha.js b/test/javascripts/mocha.js
new file mode 100644
index 000000000..82f562e7d
--- /dev/null
+++ b/test/javascripts/mocha.js
@@ -0,0 +1,137 @@
+describe("notes and tags", () => {
+ const getNoteParams = () => {
+ var params = {
+ uuid: SFJS.crypto.generateUUIDSync(),
+ content_type: "Note",
+ content: {
+ title: "hello",
+ text: "world"
+ }
+ };
+ return params;
+ }
+
+ const createRelatedNoteTagPair = () => {
+ let noteParams = getNoteParams();
+ let tagParams = {
+ uuid: SFJS.crypto.generateUUIDSync(),
+ content_type: "Tag",
+ content: {
+ title: "thoughts",
+ }
+ };
+ noteParams.content.references = [
+ {
+ uuid: tagParams.uuid,
+ content_type: tagParams.content_type
+ }
+ ]
+
+ tagParams.content.references = [
+ {
+ uuid: noteParams.uuid,
+ content_type: noteParams.content_type
+ }
+ ]
+
+ return [noteParams, tagParams];
+ }
+
+ it('uses proper class for note', () => {
+ let modelManager = createModelManager();
+ let noteParams = getNoteParams();
+ modelManager.mapResponseItemsToLocalModels([noteParams]);
+ let note = modelManager.allItemsMatchingTypes(["Note"])[0];
+ expect(note).to.be.an.instanceOf(Note);
+ });
+
+ it('creates two-way relationship between note and tag', () => {
+ let modelManager = createModelManager();
+
+ let pair = createRelatedNoteTagPair();
+ let noteParams = pair[0];
+ let tagParams = pair[1];
+
+ expect(tagParams.content.references.length).to.equal(1);
+ expect(tagParams.content.references.length).to.equal(1);
+
+ modelManager.mapResponseItemsToLocalModels([noteParams, tagParams]);
+ let note = modelManager.allItemsMatchingTypes(["Note"])[0];
+ let tag = modelManager.allItemsMatchingTypes(["Tag"])[0];
+
+ // expect to be false
+ expect(note.dirty).to.not.be.ok;
+ expect(tag.dirty).to.not.be.ok;
+
+ expect(note).to.not.be.null;
+ expect(tag).to.not.be.null;
+
+ expect(note.content.references.length).to.equal(1);
+ expect(tag.content.references.length).to.equal(1);
+
+ expect(note.hasRelationshipWithItem(tag)).to.equal(true);
+ expect(tag.hasRelationshipWithItem(note)).to.equal(true);
+
+ expect(note.tags.length).to.equal(1);
+ expect(tag.notes.length).to.equal(1);
+
+ modelManager.setItemToBeDeleted(note);
+ expect(note.tags.length).to.equal(0);
+ expect(tag.notes.length).to.equal(0);
+
+ // expect to be true
+ expect(note.dirty).to.be.ok;
+ expect(tag.dirty).to.be.ok;
+ });
+
+ it('handles remote deletion of relationship', () => {
+ let modelManager = createModelManager();
+
+ let pair = createRelatedNoteTagPair();
+ let noteParams = pair[0];
+ let tagParams = pair[1];
+
+ modelManager.mapResponseItemsToLocalModels([noteParams, tagParams]);
+ let note = modelManager.allItemsMatchingTypes(["Note"])[0];
+ let tag = modelManager.allItemsMatchingTypes(["Tag"])[0];
+
+ expect(note.content.references.length).to.equal(1);
+ expect(tag.content.references.length).to.equal(1);
+
+ noteParams.content.references = [];
+ modelManager.mapResponseItemsToLocalModels([noteParams]);
+
+ expect(note.content.references.length).to.equal(0);
+ expect(note.tags.length).to.equal(0);
+ expect(tag.notes.length).to.equal(0);
+
+ // expect to be false
+ expect(note.dirty).to.not.be.ok;
+ expect(tag.dirty).to.not.be.ok;
+ });
+
+ it('properly handles duplication', () => {
+ let modelManager = createModelManager();
+
+ let pair = createRelatedNoteTagPair();
+ let noteParams = pair[0];
+ let tagParams = pair[1];
+
+ modelManager.mapResponseItemsToLocalModels([noteParams, tagParams]);
+ let note = modelManager.allItemsMatchingTypes(["Note"])[0];
+ let tag = modelManager.allItemsMatchingTypes(["Tag"])[0];
+
+ var duplicateNote = modelManager.createDuplicateItem(note);
+ expect(note.uuid).to.equal(duplicateNote.uuid);
+
+ expect(duplicateNote.content.references.length).to.equal(1);
+ expect(duplicateNote.tags.length).to.equal(1);
+
+ expect(tag.content.references.length).to.equal(1);
+ expect(tag.notes.length).to.equal(1);
+
+ // expect to be false
+ expect(note.dirty).to.not.be.ok;
+ expect(tag.dirty).to.not.be.ok;
+ });
+});
diff --git a/test/mailers/.keep b/test/mailers/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/models/.keep b/test/models/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/test/models/api_key_test.rb b/test/models/api_key_test.rb
deleted file mode 100644
index 2b1012784..000000000
--- a/test/models/api_key_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class ApiKeyTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
-end
diff --git a/test/models/name_test.rb b/test/models/name_test.rb
deleted file mode 100644
index 5f9eba9e1..000000000
--- a/test/models/name_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class NameTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
-end
diff --git a/vendor/assets/javascripts/lodash/lodash.custom.js b/vendor/assets/javascripts/lodash/lodash.custom.js
index 558796f7b..cc8de1a6b 100644
--- a/vendor/assets/javascripts/lodash/lodash.custom.js
+++ b/vendor/assets/javascripts/lodash/lodash.custom.js
@@ -1,7 +1,7 @@
/**
* @license
* Lodash (Custom Build)
- * Build: `lodash include="includes,merge,filter,map,remove,find,omit,pull,cloneDeep,pick,uniq,sortedIndexBy"`
+ * Build: `lodash include="includes,merge,filter,map,remove,find,omit,pull,cloneDeep,pick,uniq,sortedIndexBy,mergeWith"`
* Copyright JS Foundation and other contributors
* Released under MIT license
* Based on Underscore.js 1.8.3
@@ -4890,6 +4890,41 @@
baseMerge(object, source, srcIndex);
});
+ /**
+ * This method is like `_.merge` except that it accepts `customizer` which
+ * is invoked to produce the merged values of the destination and source
+ * properties. If `customizer` returns `undefined`, merging is handled by the
+ * method instead. The `customizer` is invoked with six arguments:
+ * (objValue, srcValue, key, object, source, stack).
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} sources The source objects.
+ * @param {Function} customizer The function to customize assigned values.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function customizer(objValue, srcValue) {
+ * if (_.isArray(objValue)) {
+ * return objValue.concat(srcValue);
+ * }
+ * }
+ *
+ * var object = { 'a': [1], 'b': [2] };
+ * var other = { 'a': [3], 'b': [4] };
+ *
+ * _.mergeWith(object, other, customizer);
+ * // => { 'a': [1, 3], 'b': [2, 4] }
+ */
+ var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
+ baseMerge(object, source, srcIndex, customizer);
+ });
+
/**
* The opposite of `_.pick`; this method creates an object composed of the
* own and inherited enumerable property paths of `object` that are not omitted.
@@ -5169,6 +5204,7 @@
lodash.map = map;
lodash.memoize = memoize;
lodash.merge = merge;
+ lodash.mergeWith = mergeWith;
lodash.omit = omit;
lodash.pick = pick;
lodash.property = property;
diff --git a/vendor/assets/javascripts/lodash/lodash.custom.min.js b/vendor/assets/javascripts/lodash/lodash.custom.min.js
index ae5bffea2..51b6ea591 100644
--- a/vendor/assets/javascripts/lodash/lodash.custom.min.js
+++ b/vendor/assets/javascripts/lodash/lodash.custom.min.js
@@ -1,50 +1,51 @@
/**
* @license
* Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
- * Build: `lodash include="includes,merge,filter,map,remove,find,omit,pull,cloneDeep,pick,uniq,sortedIndexBy"`
+ * Build: `lodash include="includes,merge,filter,map,remove,find,omit,pull,cloneDeep,pick,uniq,sortedIndexBy,mergeWith"`
*/
-;(function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function r(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function e(t,n){for(var r=-1,e=null==t?0:t.length;++r-1;
-}function i(t,n,r){for(var e=-1,u=null==t?0:t.length;++e-1}function T(t,n){var r=this.__data__,e=rt(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this}function U(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n0&&r(c)?n>1?ft(c,n-1,r,e,u):f(u,c):e||(u[u.length]=c)}return u}function at(t,n){return t&&Eu(t,n,hr)}function lt(t,n){n=Ct(n,t);for(var r=0,e=n.length;null!=t&&r-1;)f!==t&&iu.call(f,a,1),iu.call(t,a,1);return t}function Pt(t,n){for(var r=t?n.length:0,e=r-1;r--;){var u=n[r];if(r==e||u!==o){
-var o=u;wn(u)?iu.call(t,u,1):Nt(t,u)}}return t}function Et(t,n){return Nu(Pn(t,n,gr),t+"")}function Ft(t,n,r,e){if(!tr(t))return t;n=Ct(n,t);for(var u=-1,o=n.length,i=o-1,c=t;null!=c&&++uu?0:u+n),r=r>u?u:r,r<0&&(r+=u),u=n>r?0:r-n>>>0,n>>>=0;for(var o=Array(u);++e=Ar){var s=n?null:Bu(t);if(s)return m(s);f=false,u=d,l=new q}else l=n?[]:a;t:for(;++e1?r[u-1]:Or,i=u>2?r[2]:Or;for(o=t.length>3&&typeof o=="function"?(u--,o):Or,i&&On(r[0],r[1],i)&&(o=u<3?Or:o,u=1),n=Object(n);++e-1?u[o?n[i]:i]:Or}}function en(t){return rr(t)?Or:t}function un(t,n,r,e,u,o){var i=r&Lr,c=t.length,f=n.length;if(c!=f&&!(i&&f>c))return false;var a=o.get(t);if(a&&o.get(n))return a==n;var s=-1,h=true,v=r&Pr?new q:Or;
-for(o.set(t,n),o.set(n,t);++s-1&&t%1==0&&t0){if(++n>=Er)return arguments[0]}else n=0;return t.apply(Or,arguments)}}function Bn(t){if(typeof t=="string"||ur(t))return t;var n=t+"";return"0"==n&&1/t==-Br?"-0":n}function Mn(t){if(null!=t){try{return He.call(t)}catch(t){}try{return t+""}catch(t){}}return""}function Tn(t,n,r){var e=null==t?0:t.length;if(!e)return-1;var u=null==r?0:ir(r);return u<0&&(u=pu(e+u,0)),s(t,sn(n,3),u)}function Un(t){return(null==t?0:t.length)?ft(t,1):[]}function Nn(t){var n=null==t?0:t.length;
-return n?t[n-1]:Or}function Cn(t,n){return t&&t.length&&n&&n.length?Lt(t,n):t}function Dn(t,n){var r=[];if(!t||!t.length)return r;var e=-1,u=[],o=t.length;for(n=sn(n,3);++e-1:!!u&&h(t,n,r)>-1;
-}function Gn(t,n){return(qu(t)?c:mt)(t,sn(n,3))}function Hn(t,n){if(typeof t!="function"||null!=n&&typeof n!="function")throw new TypeError(zr);var r=function(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;if(o.has(u))return o.get(u);var i=t.apply(this,e);return r.cache=o.set(u,i)||o,i};return r.cache=new(Hn.Cache||U),r}function Jn(t){return it(t,kr|Ir)}function Kn(t,n){return t===n||t!==t&&n!==n}function Qn(t){return null!=t&&Zn(t.length)&&!Yn(t)}function Xn(t){return nr(t)&&Qn(t)}function Yn(t){
-if(!tr(t))return false;var n=ht(t);return n==Hr||n==Jr||n==Vr||n==te}function Zn(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=Mr}function tr(t){var n=typeof t;return null!=t&&("object"==n||"function"==n)}function nr(t){return null!=t&&typeof t=="object"}function rr(t){if(!nr(t)||ht(t)!=Yr)return false;var n=eu(t);if(null===n)return true;var r=Je.call(n,"constructor")&&n.constructor;return typeof r=="function"&&r instanceof r&&He.call(r)==Xe}function er(t){return typeof t=="string"||!qu(t)&&nr(t)&&ht(t)==ee}function ur(t){
-return typeof t=="symbol"||nr(t)&&ht(t)==ue}function or(t){if(!t)return 0===t?t:0;if(t=cr(t),t===Br||t===-Br){return(t<0?-1:1)*Tr}return t===t?t:0}function ir(t){var n=or(t),r=n%1;return n===n?r?n-r:n:0}function cr(t){if(typeof t=="number")return t;if(ur(t))return Ur;if(tr(t)){var n=typeof t.valueOf=="function"?t.valueOf():t;t=tr(n)?n+"":n}if(typeof t!="string")return 0===t?t:+t;t=t.replace(me,"");var r=Se.test(t);return r||$e.test(t)?Ee(t.slice(2),r?2:8):xe.test(t)?Ur:+t}function fr(t){return Qt(t,vr(t));
-}function ar(t){return null==t?"":Tt(t)}function lr(t,n,r){var e=null==t?Or:lt(t,n);return e===Or?r:e}function sr(t,n){return null!=t&&gn(t,n,vt)}function hr(t){return Qn(t)?Z(t):wt(t)}function vr(t){return Qn(t)?Z(t,true):Ot(t)}function pr(t){return null==t?[]:_(t,hr(t))}function yr(t){return function(){return t}}function gr(t){return t}function br(t){return jt(typeof t=="function"?t:it(t,kr))}function _r(){}function dr(t){return mn(t)?y(Bn(t)):It(t)}function jr(){return[]}function wr(){return false}var Or,mr="4.17.4",Ar=200,zr="Expected a function",xr="__lodash_hash_undefined__",Sr=500,kr=1,$r=2,Ir=4,Lr=1,Pr=2,Er=800,Fr=16,Br=1/0,Mr=9007199254740991,Tr=1.7976931348623157e308,Ur=NaN,Nr=4294967295,Cr=Nr-1,Dr="[object Arguments]",Rr="[object Array]",Vr="[object AsyncFunction]",qr="[object Boolean]",Wr="[object Date]",Gr="[object Error]",Hr="[object Function]",Jr="[object GeneratorFunction]",Kr="[object Map]",Qr="[object Number]",Xr="[object Null]",Yr="[object Object]",Zr="[object Promise]",te="[object Proxy]",ne="[object RegExp]",re="[object Set]",ee="[object String]",ue="[object Symbol]",oe="[object Undefined]",ie="[object WeakMap]",ce="[object ArrayBuffer]",fe="[object DataView]",ae="[object Float32Array]",le="[object Float64Array]",se="[object Int8Array]",he="[object Int16Array]",ve="[object Int32Array]",pe="[object Uint8Array]",ye="[object Uint8ClampedArray]",ge="[object Uint16Array]",be="[object Uint32Array]",_e=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,de=/^\w*$/,je=/^\./,we=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Oe=/[\\^$.*+?()[\]{}|]/g,me=/^\s+|\s+$/g,Ae=/\\(\\)?/g,ze=/\w*$/,xe=/^[-+]0x[0-9a-f]+$/i,Se=/^0b[01]+$/i,ke=/^\[object .+?Constructor\]$/,$e=/^0o[0-7]+$/i,Ie=/^(?:0|[1-9]\d*)$/,Le={};
-Le[ae]=Le[le]=Le[se]=Le[he]=Le[ve]=Le[pe]=Le[ye]=Le[ge]=Le[be]=true,Le[Dr]=Le[Rr]=Le[ce]=Le[qr]=Le[fe]=Le[Wr]=Le[Gr]=Le[Hr]=Le[Kr]=Le[Qr]=Le[Yr]=Le[ne]=Le[re]=Le[ee]=Le[ie]=false;var Pe={};Pe[Dr]=Pe[Rr]=Pe[ce]=Pe[fe]=Pe[qr]=Pe[Wr]=Pe[ae]=Pe[le]=Pe[se]=Pe[he]=Pe[ve]=Pe[Kr]=Pe[Qr]=Pe[Yr]=Pe[ne]=Pe[re]=Pe[ee]=Pe[ue]=Pe[pe]=Pe[ye]=Pe[ge]=Pe[be]=true,Pe[Gr]=Pe[Hr]=Pe[ie]=false;var Ee=parseInt,Fe=typeof global=="object"&&global&&global.Object===Object&&global,Be=typeof self=="object"&&self&&self.Object===Object&&self,Me=Fe||Be||Function("return this")(),Te=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Ue=Te&&typeof module=="object"&&module&&!module.nodeType&&module,Ne=Ue&&Ue.exports===Te,Ce=Ne&&Fe.process,De=function(){
-try{return Ce&&Ce.binding&&Ce.binding("util")}catch(t){}}(),Re=De&&De.isTypedArray,Ve=Array.prototype,qe=Function.prototype,We=Object.prototype,Ge=Me["__core-js_shared__"],He=qe.toString,Je=We.hasOwnProperty,Ke=function(){var t=/[^.]+$/.exec(Ge&&Ge.keys&&Ge.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),Qe=We.toString,Xe=He.call(Object),Ye=RegExp("^"+He.call(Je).replace(Oe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ze=Ne?Me.Buffer:Or,tu=Me.Symbol,nu=Me.Uint8Array,ru=Ze?Ze.allocUnsafe:Or,eu=O(Object.getPrototypeOf,Object),uu=Object.create,ou=We.propertyIsEnumerable,iu=Ve.splice,cu=tu?tu.isConcatSpreadable:Or,fu=tu?tu.toStringTag:Or,au=function(){
-try{var t=pn(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),lu=Math.floor,su=Object.getOwnPropertySymbols,hu=Ze?Ze.isBuffer:Or,vu=O(Object.keys,Object),pu=Math.max,yu=Math.min,gu=Date.now,bu=pn(Me,"DataView"),_u=pn(Me,"Map"),du=pn(Me,"Promise"),ju=pn(Me,"Set"),wu=pn(Me,"WeakMap"),Ou=pn(Object,"create"),mu=Mn(bu),Au=Mn(_u),zu=Mn(du),xu=Mn(ju),Su=Mn(wu),ku=tu?tu.prototype:Or,$u=ku?ku.valueOf:Or,Iu=ku?ku.toString:Or,Lu=function(){function t(){}return function(n){if(!tr(n))return{};if(uu)return uu(n);
-t.prototype=n;var r=new t;return t.prototype=Or,r}}();x.prototype.clear=S,x.prototype.delete=k,x.prototype.get=$,x.prototype.has=I,x.prototype.set=L,P.prototype.clear=E,P.prototype.delete=F,P.prototype.get=B,P.prototype.has=M,P.prototype.set=T,U.prototype.clear=N,U.prototype.delete=C,U.prototype.get=D,U.prototype.has=R,U.prototype.set=V,q.prototype.add=q.prototype.push=W,q.prototype.has=G,H.prototype.clear=J,H.prototype.delete=K,H.prototype.get=Q,H.prototype.has=X,H.prototype.set=Y;var Pu=tn(at),Eu=nn(),Fu=au?function(t,n){
-return au(t,"toString",{configurable:true,enumerable:false,value:yr(n),writable:true})}:gr,Bu=ju&&1/m(new ju([,-0]))[1]==Br?function(t){return new ju(t)}:_r,Mu=su?function(t){return null==t?[]:(t=Object(t),u(su(t),function(n){return ou.call(t,n)}))}:jr,Tu=su?function(t){for(var n=[];t;)f(n,Mu(t)),t=eu(t);return n}:jr,Uu=ht;(bu&&Uu(new bu(new ArrayBuffer(1)))!=fe||_u&&Uu(new _u)!=Kr||du&&Uu(du.resolve())!=Zr||ju&&Uu(new ju)!=re||wu&&Uu(new wu)!=ie)&&(Uu=function(t){var n=ht(t),r=n==Yr?t.constructor:Or,e=r?Mn(r):"";
-if(e)switch(e){case mu:return fe;case Au:return Kr;case zu:return Zr;case xu:return re;case Su:return ie}return n});var Nu=Fn(Fu),Cu=$n(function(t){var n=[];return je.test(t)&&n.push(""),t.replace(we,function(t,r,e,u){n.push(e?u.replace(Ae,"$1"):r||t)}),n}),Du=Et(Cn),Ru=rn(Tn);Hn.Cache=U;var Vu=pt(function(){return arguments}())?pt:function(t){return nr(t)&&Je.call(t,"callee")&&!ou.call(t,"callee")},qu=Array.isArray,Wu=hu||wr,Gu=Re?b(Re):dt,Hu=Zt(function(t,n,r){xt(t,n,r)}),Ju=fn(function(t,n){var r={};
-if(null==t)return r;var e=false;n=c(n,function(n){return n=Ct(n,t),e||(e=n.length>1),n}),Qt(t,ln(t),r),e&&(r=it(r,kr|$r|Ir,en));for(var u=n.length;u--;)Nt(r,n[u]);return r}),Ku=fn(function(t,n){return null==t?{}:kt(t,n)});z.constant=yr,z.filter=qn,z.flatten=Un,z.iteratee=br,z.keys=hr,z.keysIn=vr,z.map=Gn,z.memoize=Hn,z.merge=Hu,z.omit=Ju,z.pick=Ku,z.property=dr,z.pull=Du,z.pullAll=Cn,z.remove=Dn,z.toPlainObject=fr,z.uniq=Vn,z.values=pr,z.cloneDeep=Jn,z.eq=Kn,z.find=Ru,z.findIndex=Tn,z.get=lr,z.hasIn=sr,
-z.identity=gr,z.includes=Wn,z.isArguments=Vu,z.isArray=qu,z.isArrayLike=Qn,z.isArrayLikeObject=Xn,z.isBuffer=Wu,z.isFunction=Yn,z.isLength=Zn,z.isObject=tr,z.isObjectLike=nr,z.isPlainObject=rr,z.isString=er,z.isSymbol=ur,z.isTypedArray=Gu,z.last=Nn,z.stubArray=jr,z.stubFalse=wr,z.noop=_r,z.sortedIndexBy=Rn,z.toFinite=or,z.toInteger=ir,z.toNumber=cr,z.toString=ar,z.VERSION=mr,typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Me._=z, define(function(){return z})):Ue?((Ue.exports=z)._=z,
-Te._=z):Me._=z}).call(this);
\ No newline at end of file
+;(function(){function t(t,e){return t.set(e[0],e[1]),t}function e(t,e){return t.add(e),t}function n(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function r(t,e){for(var n=-1,r=null==t?0:t.length;++ne.length)n=t;else{n=e;var r=0,o=-1,u=-1,c=n.length;for(0>r&&(r=-r>c?0:c+r),o=o>c?c:o,0>o&&(o+=c),c=r>o?0:o-r>>>0,r>>>=0,o=Array(c);++uu?ae:c,u=1),e=Object(e);++oi))return false;if((a=u.get(t))&&u.get(e))return a==e;var a=-1,l=true,s=2&n?new O:ae;for(u.set(t,e),u.set(e,t);++an&&(n=un(r+n,0)),l(t,yt(e,3),n)):-1}function Et(t){return(null==t?0:t.length)?B(t,1):[]}function Mt(t){
+var e=null==t?0:t.length;return e?t[e-1]:ae}function $t(t,e){var n;if(t&&t.length&&e&&e.length){n=e;var r=s,o=-1,u=n.length;for(t===n&&(n=ot(n));++o=t}function Vt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Ct(t){return null!=t&&typeof t=="object";
+}function Rt(t){return!(!Ct(t)||"[object Object]"!=L(t))&&(t=Je(t),null===t||(t=Ne.call(t,"constructor")&&t.constructor,typeof t=="function"&&t instanceof t&&Le.call(t)==Re))}function Tt(t){return typeof t=="string"||!Dn(t)&&Ct(t)&&"[object String]"==L(t)}function Wt(t){return typeof t=="symbol"||Ct(t)&&"[object Symbol]"==L(t)}function qt(t){return t?(t=Ht(t),t===fe||t===-fe?1.7976931348623157e308*(0>t?-1:1):t===t?t:0):0===t?t:0}function Gt(t){t=qt(t);var e=t%1;return t===t?e?t-e:t:0}function Ht(t){
+if(typeof t=="number")return t;if(Wt(t))return le;if(Vt(t)&&(t=typeof t.valueOf=="function"?t.valueOf():t,t=Vt(t)?t+"":t),typeof t!="string")return 0===t?t:+t;t=t.replace(ye,"");var e=_e.test(t);return e||Ae.test(t)?ke(t.slice(2),e?2:8):ge.test(t)?le:+t}function Jt(t){return ut(t,Zt(t))}function Kt(t){return null==t?"":Y(t)}function Qt(t,e,n){return t=null==t?ae:D(t,e),t===ae?n:t}function Xt(t,e){var n;if(n=null!=t){n=t;var r;r=tt(e,n);for(var o=-1,u=r.length,c=false;++ot)&&(t==e.length-1?e.pop():Xe.call(e,t,1),--this.size,true)},w.prototype.get=function(t){var e=this.__data__;return t=I(e,t),0>t?ae:e[t][1]},w.prototype.has=function(t){return-1r?(++this.size,n.push([t,e])):n[r][1]=e,this},m.prototype.clear=function(){this.size=0,this.__data__={
+hash:new A,map:new(ln||w),string:new A}},m.prototype.delete=function(t){return t=jt(this,t).delete(t),this.size-=t?1:0,t},m.prototype.get=function(t){return jt(this,t).get(t)},m.prototype.has=function(t){return jt(this,t).has(t)},m.prototype.set=function(t,e){var n=jt(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},O.prototype.add=O.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},O.prototype.has=function(t){return this.__data__.has(t)},S.prototype.clear=function(){
+this.__data__=new w,this.size=0},S.prototype.delete=function(t){var e=this.__data__;return t=e.delete(t),this.size=e.size,t},S.prototype.get=function(t){return this.__data__.get(t)},S.prototype.has=function(t){return this.__data__.has(t)},S.prototype.set=function(t,e){var n=this.__data__;if(n instanceof w){var r=n.__data__;if(!ln||199>r.length)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new m(r)}return n.set(t,e),this.size=n.size,this};var On=function(t,e){return function(n,r){if(null==n)return n;
+if(!Dt(n))return t(n,r);for(var o=n.length,u=e?o:-1,c=Object(n);(e?u--:++un&&(n=un(r+n,0)),Tt(t)?n<=r&&-1