diff --git a/.gitignore b/.gitignore
index 0ec8e557c..c7aaa09d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
Data-Storage
Log-Files
My-Workspaces
+My-Social-Trading-Data
debug.log
.DS_Store
*.db
diff --git a/.vscode/settings.json b/.vscode/settings.json
index e94f27f6f..43e1dd87f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,14 +4,16 @@
"**/Documentation": true,
"**/Log-Files": true,
"**/node_modules": true,
- "**/Deprecated-Code": true
+ "**/Deprecated-Code": true,
+ "**/My-Social-Trading-Data": true,
},
"search.exclude": {
"**/Data-Storage": true,
"**/Documentation": true,
"**/Log-Files": true,
"**/node_modules": true,
- "**/Deprecated-Code": true
+ "**/Deprecated-Code": true,
+ "**/My-Social-Trading-Data": true
},
"search.maintainFileSearchCache": true
}
\ No newline at end of file
diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js
index d2bb686db..66838c3fe 100644
--- a/Desktop/DesktopApp.js
+++ b/Desktop/DesktopApp.js
@@ -8,33 +8,36 @@ exports.newDesktopApp = function newDesktopApp() {
async function run() {
/*
- let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph()
- await socialGraphService.initialize()
+ Heree we will store our running objects:
*/
+ DK.running = {}
/*
This is the Web Sockets client that interacts with the Superalgos Network.
*/
- //DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
- //await DK.webSocketsClient.initialize()
-
- /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/
- //let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
- let HTTP_INTERFACE = require('./httpInterface.js')
+ DK.running.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
+ await DK.running.socialGraph.initialize()
/*
- WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
- WEB_SOCKETS_INTERFACE.initialize()
- console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+ This is the Web Sockets client that interacts with the Superalgos Network.
*/
+ DK.running.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
+ await DK.running.webSocketsClient.initialize()
+ console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT)
- HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
- HTTP_INTERFACE.initialize()
- console.log('Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/
+
+ DK.running.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
+ DK.running.webSocketsInterface.initialize()
+ console.log('Desktop Client Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+
+
+ DK.running.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
+ DK.running.httpInterface.initialize()
+ console.log('Desktop Client Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
return
-
let queryMessage
let query
/*
diff --git a/Desktop/UI/AppLoader.js b/Desktop/UI/AppLoader.js
deleted file mode 100644
index b17587624..000000000
--- a/Desktop/UI/AppLoader.js
+++ /dev/null
@@ -1,190 +0,0 @@
-let postLoader
-
-function newAppLoader() {
- const MODULE_NAME = 'App Loader'
- const INFO_LOG = false
- const ERROR_LOG = true
- const logger = newWebDebugLog()
-
-
- let thisObject = {
- loadModules: loadModules
- }
-
- return thisObject
-
- async function loadModules() {
- try {
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Entering function.') }
-
- let plotters
- let modulesArray = []
-
- plotters = defaultPlotters()
-
- modulesArray = modulesArray.concat([
-
- 'Globals.js',
- 'Workspace.js',
-
- 'Files/SingleFile.js',
- 'Files/FileCloud.js',
- 'Files/MarketFiles.js',
- 'Files/DailyFiles.js',
- 'Files/FileCursor.js',
- 'Files/FileSequence.js',
- 'Files/FileStorage.js',
-
- 'EventsServerClient.js',
-
- 'LegacyPlotter.js',
- 'PlotterPanel.js',
-
- 'VideoRecorder.js',
- 'ProductStorage.js',
- 'Canvas.js',
- 'EventHandler.js',
- 'Frame.js',
- 'Animation.js',
- 'Container.js',
- 'Utilities.js',
- 'AppPostLoader.js'
- ])
-
- modulesArray = modulesArray.concat(plotters)
-
- functionLibraries()
-
- function functionLibraries() {
- let url = 'ListFunctionLibraries'
- httpRequest(undefined, url, onResponse)
-
- function onResponse(err, fileList) {
- let urlArray = []
- let fileArray = JSON.parse(fileList)
- for (let i = 0; i < fileArray.length; i++) {
- let item = fileArray[i]
-
- project = item[0]
- fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
- }
-
- modulesArray = modulesArray.concat(urlArray)
- utilities()
- }
- }
-
- function utilities() {
- let url = 'ListUtilitiesFiles'
- httpRequest(undefined, url, onResponse)
-
- function onResponse(err, fileList) {
- let urlArray = []
- let fileArray = JSON.parse(fileList)
- for (let i = 0; i < fileArray.length; i++) {
- let item = fileArray[i]
-
- project = item[0]
- fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
- }
-
- modulesArray = modulesArray.concat(urlArray)
- globals()
- }
- }
-
- function globals() {
- let url = 'ListGlobalFiles'
- httpRequest(undefined, url, onResponse)
-
- function onResponse(err, fileList) {
- let urlArray = []
- let fileArray = JSON.parse(fileList)
- for (let i = 0; i < fileArray.length; i++) {
- let item = fileArray[i]
-
- project = item[0]
- fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
- }
-
- modulesArray = modulesArray.concat(urlArray)
- spaces()
- }
- }
-
- function spaces() {
- let url = 'ListSpaceFiles'
- httpRequest(undefined, url, onResponse)
-
- function onResponse(err, fileList) {
- let urlArray = []
- let fileArray = JSON.parse(fileList)
- for (let i = 0; i < fileArray.length; i++) {
- let path = fileArray[i]
- urlArray.push('Projects' + '/' + path)
- }
-
- modulesArray = modulesArray.concat(urlArray)
- downloadIncludedFiles()
- }
- }
-
- function downloadIncludedFiles() {
-
- let downloadedCounter = 0
-
- for (let i = 0; i < modulesArray.length; i++) {
- let path = modulesArray[i]
-
- REQUIREJS([path], onRequired)
-
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') }
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> path = ' + path) }
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> total requested = ' + (i + 1)) }
-
- function onRequired(pModule) {
- try {
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Entering function.') }
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Module Downloaded.') }
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> path = ' + path) }
-
- downloadedCounter++
-
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> downloadedCounter = ' + downloadedCounter) }
-
- if (downloadedCounter === modulesArray.length) {
- if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Starting Advanced Algos Platform.') }
- setTimeout(() => {
- postLoader = newAppPostLoader()
- postLoader.start()
- }, 500)
-
- }
- } catch (err) {
- if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> onRequired -> err = ' + err.stack) }
- }
- }
- }
- }
-
- } catch (err) {
- if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> err = ' + err.stack) }
- }
- }
-
- function defaultPlotters() {
- return [
- 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Candles.js',
- 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/CandlePanel.js',
- 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Volumes.js',
- 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/VolumePanel.js',
- 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js',
- 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js',
- 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js'
- ]
- }
-}
-
diff --git a/Desktop/UI/Globals.js b/Desktop/UI/Globals.js
new file mode 100644
index 000000000..2bce6ff39
--- /dev/null
+++ b/Desktop/UI/Globals.js
@@ -0,0 +1,15 @@
+
+/* Root objects*/
+let UI = {
+ projects: {},
+ schemas: { projectSchema: undefined },
+ environment: undefined,
+ running: {}
+}
+
+let SA = { projects: {} }
+/*
+We will use this to load functions originally intended for Nodejs
+*/
+let exports = {}
+
diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js
new file mode 100644
index 000000000..bce4eb31d
--- /dev/null
+++ b/Desktop/UI/WebApp.js
@@ -0,0 +1,379 @@
+function newWebApp() {
+
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ async function initialize() {
+ try {
+ setupRootObject(UI, 'UI')
+ setupRootObject(SA, 'SA')
+ await UI.projects.socialTrading.modules.webSocketsClient.initialize()
+ loadWUserProfileTimeline()
+ loadWhoToFollow()
+ setupEventHandlers()
+ } catch (err) {
+ console.log('[ERROR] initialize -> err.stack = ' + err.stack)
+ }
+ }
+
+ function setupRootObject(rootObject, rootObjectName) {
+ /*
+ Here we will setup the UI object, with all the
+ projects and spaces.
+ */
+ for (let i = 0; i < UI.schemas.projectSchema.length; i++) {
+ let projectDefinition = UI.schemas.projectSchema[i]
+ rootObject.projects[projectDefinition.propertyName] = {}
+ let projectInstance = rootObject.projects[projectDefinition.propertyName]
+
+ projectInstance.utilities = {}
+ projectInstance.globals = {}
+ projectInstance.functionLibraries = {}
+ projectInstance.modules = {}
+
+ if (projectDefinition[rootObjectName] === undefined) { continue }
+
+ /* Set up Globals of this Project */
+ if (projectDefinition[rootObjectName].globals !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].globals.length; j++) {
+ let globalDefinition = projectDefinition[rootObjectName].globals[j]
+
+ if (exports[globalDefinition.functionName] === undefined) {
+ projectInstance.globals[globalDefinition.propertyName] = eval(globalDefinition.functionName + '()')
+ } else {
+ projectInstance.globals[globalDefinition.propertyName] = eval('exports.' + globalDefinition.functionName + '()')
+ }
+ }
+ }
+
+ /* Set up Utilities of this Project */
+ if (projectDefinition[rootObjectName].utilities !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].utilities.length; j++) {
+ let utilityDefinition = projectDefinition[rootObjectName].utilities[j]
+
+ if (exports[utilityDefinition.functionName] === undefined) {
+ projectInstance.utilities[utilityDefinition.propertyName] = eval(utilityDefinition.functionName + '()')
+ } else {
+ projectInstance.utilities[utilityDefinition.propertyName] = eval('exports.' + utilityDefinition.functionName + '()')
+ }
+ }
+ }
+
+ /* Set up Function Libraries of this Project */
+ if (projectDefinition[rootObjectName].functionLibraries !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].functionLibraries.length; j++) {
+ let functionLibraryDefinition = projectDefinition[rootObjectName].functionLibraries[j]
+
+ if (exports[functionLibraryDefinition.functionName] === undefined) {
+ projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()')
+ } else {
+ projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval('exports.' + functionLibraryDefinition.functionName + '()')
+ }
+ }
+ }
+
+ /* Set up Modules of this Project */
+ if (projectDefinition[rootObjectName].modules !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].modules.length; j++) {
+ let functionLibraryDefinition = projectDefinition[rootObjectName].modules[j]
+
+ if (exports[functionLibraryDefinition.functionName] === undefined) {
+ projectInstance.modules[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()')
+ } else {
+ projectInstance.modules[functionLibraryDefinition.propertyName] = eval('exports.' + functionLibraryDefinition.functionName + '()')
+ }
+ }
+ }
+ }
+ }
+
+ async function loadWUserProfileTimeline() {
+ let queryMessage = {
+ queryType: SA.projects.socialTrading.globals.queryTypes.EVENTS,
+ emitterUserProfileId: undefined,
+ initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_LAST,
+ amountRequested: 100,
+ direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST
+ }
+
+ let query = {
+ requestType: 'Query',
+ queryMessage: JSON.stringify(queryMessage)
+ }
+
+ await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
+ JSON.stringify(query)
+ )
+ .then(addToContentDiv)
+ .catch(onError)
+
+ function onError(errorMessage) {
+ console.log('[ERROR] Query not executed. ' + errorMessage)
+ console.log('[ERROR] query = ' + JSON.stringify(query))
+ }
+
+ function addToContentDiv(events) {
+
+ let contentDiv = document.getElementById('content-div')
+
+ for (let i = 0; i < events.length; i++) {
+ let event = events[i]
+
+ let postDiv = document.createElement("div")
+ postDiv.setAttribute("class", "post-div")
+ let textNode = document.createTextNode('POST #' + i)
+ postDiv.appendChild(textNode)
+ contentDiv.appendChild(postDiv)
+ }
+ }
+ }
+
+ async function loadWhoToFollow() {
+ let queryMessage = {
+ queryType: SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES,
+ emitterUserProfileId: undefined,
+ initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST,
+ amountRequested: 3,
+ direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP
+ }
+
+ let query = {
+ requestType: 'Query',
+ queryMessage: JSON.stringify(queryMessage)
+ }
+
+ await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
+ JSON.stringify(query)
+ )
+ .then(addWhoToFollowTable)
+ .catch(onError)
+
+ function onError(errorMessage) {
+ console.log('[ERROR] Query not executed. ' + errorMessage)
+ console.log('[ERROR] query = ' + JSON.stringify(query))
+ }
+
+ function addWhoToFollowTable(profiles) {
+
+ let contextCell = document.getElementById('who-to-follow-cell')
+ let table = document.createElement("table")
+ let tblBody = document.createElement("tbody")
+
+ for (let i = 0; i < profiles.length; i++) {
+ let profile = profiles[i]
+ let row = document.createElement("tr")
+
+ let cell = document.createElement("td")
+ addProfileToFollowTable(cell, profile)
+ row.appendChild(cell)
+
+ tblBody.appendChild(row)
+ }
+
+ table.appendChild(tblBody)
+ contextCell.appendChild(table)
+ table.setAttribute("class", "who-to-follow-table")
+
+ function addProfileToFollowTable(htmlElement, profile) {
+ let table = document.createElement("table")
+ let tblBody = document.createElement("tbody")
+
+ let row = document.createElement("tr")
+
+ {
+ let cell = document.createElement("td")
+ let textNode = document.createTextNode('Profile Picture')
+ cell.appendChild(textNode)
+ row.appendChild(cell)
+ }
+ {
+ let cell = document.createElement("td")
+ let textNode = document.createTextNode(profile.userProfileHandle)
+ cell.appendChild(textNode)
+ row.appendChild(cell)
+ }
+ {
+ let cell = document.createElement("td")
+ let span = document.createElement("span")
+ let button = document.createElement("button")
+ let text = document.createTextNode('Follow')
+
+ span.setAttribute("id", "profile-to-follow-span-" + profile.userProfileId)
+ button.setAttribute("id", "profile-to-follow-button-" + profile.userProfileId)
+ button.name = 'Follow Profile'
+ button.userProfileId = profile.userProfileId
+
+ span.setAttribute("class", "profile-to-follow-span")
+ button.setAttribute("class", "profile-to-follow-button")
+
+ button.appendChild(text)
+ span.appendChild(button)
+ cell.appendChild(span)
+ row.appendChild(cell)
+ }
+
+ tblBody.appendChild(row)
+
+ table.appendChild(tblBody)
+ htmlElement.appendChild(table)
+ table.setAttribute("class", "profile-to-follow-table")
+ }
+ }
+ }
+
+ function setupEventHandlers() {
+ /*
+ Add events to process button clicks , and mouseWheel.
+ */
+ document.addEventListener("click", onClick)
+ document.addEventListener('mousewheel', onMouseWheel, false)
+
+ async function onClick(event) {
+
+ if (event.target && event.target.nodeName === "BUTTON") {
+ switch (event.target.name) {
+ case 'New Post': {
+ let textArea = document.getElementById("new-post-text-area")
+ await sendNewPostEvent(
+ textArea.value
+ )
+ .then(updateTextArea)
+ .catch(onError)
+
+ function updateTextArea() {
+ textArea.value = ""
+ }
+ break
+ }
+ case 'Follow Profile': {
+ await sendTargetUserProfileEvent(
+ event.target.userProfileId,
+ SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE
+ )
+ .then(updateButton)
+ .catch(onError)
+
+ function updateButton() {
+ let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId)
+ let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId)
+ span.setAttribute("class", "profile-to-unfollow-span")
+ button.setAttribute("class", "profile-to-unfollow-button")
+ button.name = 'Unfollow Profile'
+ }
+ break
+ }
+ case 'Unfollow Profile': {
+ await sendTargetUserProfileEvent(
+ event.target.userProfileId,
+ SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE
+ )
+ .then(updateButton)
+ .catch(onError)
+
+ function updateButton() {
+ let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId)
+ let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId)
+ span.setAttribute("class", "profile-to-follow-span")
+ button.setAttribute("class", "profile-to-follow-button")
+ button.name = 'Follow Profile'
+ }
+ break
+ }
+ }
+ }
+
+ /*
+ Error Handling
+ */
+ function onError(errorMessage) {
+ console.log('[ERROR] Click event failed. ' + errorMessage)
+ }
+ }
+
+ function onMouseWheel(event) {
+ let scrollDiv = document.getElementById("scroll-div")
+ scrollDiv.scrollTop = scrollDiv.scrollTop + event.deltaY
+ }
+ }
+
+ async function sendTargetUserProfileEvent(
+ userProfileId,
+ eventType
+ ) {
+
+ return new Promise((resolve, reject) => { asyncCall(resolve, reject) })
+
+ async function asyncCall(resolve, reject) {
+ let eventMessage
+ let event
+
+ eventMessage = {
+ eventType: eventType,
+ eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
+ targetUserProfileId: userProfileId,
+ timestamp: new Date()
+ }
+
+ event = {
+ requestType: 'Event',
+ eventMessage: JSON.stringify(eventMessage)
+ }
+
+ await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
+ JSON.stringify(event)
+ )
+ .then(resolve)
+ .catch(onError)
+
+ function onError(errorMessage) {
+ console.log('[ERROR] Event not executed. ' + errorMessage)
+ console.log('[ERROR] event = ' + JSON.stringify(event))
+ reject(errorMessage)
+ }
+ }
+ }
+
+ async function sendNewPostEvent(
+ postText
+ ) {
+
+ return new Promise((resolve, reject) => { asyncCall(resolve, reject) })
+
+ async function asyncCall(resolve, reject) {
+ let eventMessage
+ let event
+
+ eventMessage = {
+ eventType: SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST,
+ eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
+ text: postText,
+ timestamp: new Date()
+ }
+
+ event = {
+ requestType: 'Event',
+ eventMessage: JSON.stringify(eventMessage)
+ }
+
+ await UI.projects.socialTrading.modules.webSocketsClient.sendMessage(
+ JSON.stringify(event)
+ )
+ .then(resolve)
+ .catch(onError)
+
+ function onError(errorMessage) {
+ console.log('[ERROR] Event not executed. ' + errorMessage)
+ console.log('[ERROR] event = ' + JSON.stringify(event))
+ reject(errorMessage)
+ }
+ }
+ }
+}
diff --git a/Desktop/UI/WebAppLoader.js b/Desktop/UI/WebAppLoader.js
new file mode 100644
index 000000000..baa4039f0
--- /dev/null
+++ b/Desktop/UI/WebAppLoader.js
@@ -0,0 +1,118 @@
+
+function newWebAppLoader() {
+
+ let thisObject = {
+ loadModules: loadModules
+ }
+
+ return thisObject
+
+ async function loadModules() {
+ try {
+ let modulesArray = [
+ 'WebDebugLog.js',
+ 'WebApp.js'
+ ]
+
+ for (let i = 0; i < UI.schemas.projectSchema.length; i++) {
+ let project = UI.schemas.projectSchema[i]
+
+ if (project.UI !== undefined) {
+ if (project.UI.functionLibraries !== undefined) {
+ for (let j = 0; j < project.UI.functionLibraries.length; j++) {
+ let fileName = project.UI.functionLibraries[j].fileName
+ if (fileName === undefined) {fileName = project.UI.functionLibraries[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
+ }
+ }
+ if (project.UI.utilities !== undefined) {
+ for (let j = 0; j < project.UI.utilities.length; j++) {
+ let fileName = project.UI.utilities[j].fileName
+ if (fileName === undefined) {fileName = project.UI.utilities[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
+ }
+ }
+ if (project.UI.globals !== undefined) {
+ for (let j = 0; j < project.UI.globals.length; j++) {
+ let fileName = project.UI.globals[j].fileName
+ if (fileName === undefined) {fileName = project.UI.globals[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
+ }
+ }
+ if (project.UI.modules !== undefined) {
+ for (let j = 0; j < project.UI.modules.length; j++) {
+ let fileName = project.UI.modules[j].fileName
+ if (fileName === undefined) {fileName = project.UI.modules[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'UI' + '/' + 'Modules' + '/' + fileName)
+ }
+ }
+ }
+
+ if (project.SA !== undefined) {
+ if (project.SA.functionLibraries !== undefined) {
+ for (let j = 0; j < project.SA.functionLibraries.length; j++) {
+ let fileName = project.SA.functionLibraries[j].fileName
+ if (fileName === undefined) {fileName = project.SA.functionLibraries[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Function-Libraries' + '/' + fileName)
+ }
+ }
+ if (project.SA.utilities !== undefined) {
+ for (let j = 0; j < project.SA.utilities.length; j++) {
+ let fileName = project.SA.utilities[j].fileName
+ if (fileName === undefined) {fileName = project.SA.utilities[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Utilities' + '/' + fileName)
+ }
+ }
+ if (project.SA.globals !== undefined) {
+ for (let j = 0; j < project.SA.globals.length; j++) {
+ let fileName = project.SA.globals[j].fileName
+ if (fileName === undefined) {fileName = project.SA.globals[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Globals' + '/' + fileName)
+ }
+ }
+ if (project.SA.modules !== undefined) {
+ for (let j = 0; j < project.SA.modules.length; j++) {
+ let fileName = project.SA.modules[j].fileName
+ if (fileName === undefined) {fileName = project.SA.modules[j].name.replaceAll(' ', '') + '.js'}
+ modulesArray.push('Projects' + '/' + project.name + '/' + 'SA' + '/' + 'Modules' + '/' + fileName)
+ }
+ }
+ }
+ }
+
+ downloadIncludedFiles()
+
+ function downloadIncludedFiles() {
+
+ let downloadedCounter = 0
+
+ for (let i = 0; i < modulesArray.length; i++) {
+ let path = modulesArray[i]
+
+ REQUIREJS([path], onRequired)
+
+ function onRequired(pModule) {
+ try {
+
+ downloadedCounter++
+
+ if (downloadedCounter === modulesArray.length) {
+ setTimeout(() => {
+ UI.running.webApp = newWebApp()
+ UI.running.webApp.initialize()
+ }, 500)
+
+ }
+ } catch (err) {
+ console.log('[ERROR] loadModules -> onRequired -> err = ' + err.stack)
+ }
+ }
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] loadModules -> err = ' + err.stack)
+ }
+ }
+}
+
diff --git a/Desktop/UI/WebAppPreLoader.js b/Desktop/UI/WebAppPreLoader.js
new file mode 100644
index 000000000..0c691e566
--- /dev/null
+++ b/Desktop/UI/WebAppPreLoader.js
@@ -0,0 +1,102 @@
+
+function loadSuperalgos() {
+
+ let browser = checkBrowserVersion()
+ if ((browser.name !== "Chrome" && browser.name !== "Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
+ alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
+ }
+
+ loadGlobals()
+
+ function loadGlobals() {
+ let path = "Globals.js"
+ REQUIREJS([path], onRequired)
+
+ function onRequired(pModule) {
+ setupEnvironment()
+ }
+ }
+
+ function setupEnvironment() {
+ httpRequest(undefined, 'Environment', onResponse)
+
+ function onResponse(err, file) {
+ UI.environment = JSON.parse(file)
+ setupProjectsSchema()
+ }
+ }
+
+ function setupProjectsSchema() {
+ httpRequest(undefined, 'ProjectsSchema', onResponse)
+
+ function onResponse(err, file) {
+ UI.schemas.projectSchema = JSON.parse(file)
+ loadModules()
+ }
+ }
+
+ function loadModules() {
+ let path = "WebAppLoader.js"
+ REQUIREJS([path], onRequired)
+
+ function onRequired(pModule) {
+ let APP_LOADER_MODULE = newWebAppLoader()
+ APP_LOADER_MODULE.loadModules()
+ }
+ }
+}
+
+function httpRequest(pContentToSend, pPath, callBackFunction) {
+ let xmlHttpRequest = new XMLHttpRequest()
+ xmlHttpRequest.onreadystatechange = function () {
+ if (this.readyState === 4 && this.status === 200) {
+ try {
+ callBackFunction(undefined, xmlHttpRequest.responseText)
+ } catch (err) {
+ console.log('[ERROR] httpRequest -> httpRequest -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpRequest -> httpRequest -> pContentToSend = ' + pContentToSend)
+ console.log('[ERROR] httpRequest -> httpRequest -> pPath = ' + pPath)
+ console.log('[ERROR] httpRequest -> httpRequest -> xmlHttpRequest.responseText = ' + xmlHttpRequest.responseText)
+ console.log('[ERROR] httpRequest -> httpRequest -> callBackFunction = ' + callBackFunction)
+
+ }
+ return
+ } else if (this.readyState === 4 && this.status === 404) {
+ callBackFunction({ result: "Fail", message: xmlHttpRequest.responseText.trim(), code: xmlHttpRequest.responseText.trim() })
+ return
+ }
+ }
+
+ if (pContentToSend === undefined) {
+ xmlHttpRequest.open("GET", pPath, true)
+ xmlHttpRequest.send()
+ } else {
+ try {
+ let blob = new Blob([pContentToSend], { type: 'text/plain' })
+ xmlHttpRequest.open("POST", pPath, true)
+ xmlHttpRequest.send(blob)
+ } catch (err) {
+ if (ERROR_LOG === true) { console.log("[ERROR] callServer -> err.message = " + err.message) }
+ callBackFunction({ result: "Fail", message: err.message })
+ }
+ }
+}
+
+function checkBrowserVersion() {
+
+ let ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []
+ if (/trident/i.test(M[1])) {
+ tem = /\brv[ :]+(\d+)/g.exec(ua) || []
+ return { name: 'IE', version: (tem[1] || '') }
+ }
+ if (M[1] === 'Chrome') {
+ tem = ua.match(/\bOPR|Edge\/(\d+)/)
+ if (tem != null) { return { name: 'Opera', version: tem[1] } }
+ }
+ M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']
+ if ((tem = ua.match(/version\/(\d+)/i)) != null) { M.splice(1, 1, tem[1]) }
+ return {
+ name: M[0],
+ version: M[1]
+ }
+}
diff --git a/Desktop/UI/WebDebugLog.js b/Desktop/UI/WebDebugLog.js
new file mode 100644
index 000000000..2a6bc1af1
--- /dev/null
+++ b/Desktop/UI/WebDebugLog.js
@@ -0,0 +1,21 @@
+function newWebDebugLog() {
+ try {
+ let thisObject = {
+ write: write,
+ fileName: 'undefined'
+ }
+
+ return thisObject
+
+ function write(pText) {
+ console.log(spacePad(thisObject.fileName, 50) + ' : ' + pText)
+
+ function spacePad(str, max) {
+ str = str.toString()
+ return str.length < max ? spacePad(' ' + str, max) : str
+ }
+ }
+ } catch (err) {
+ console.log(spacePad(MODULE_NAME, 50) + ' : ' + '[ERROR] WebDebugLog --> err = ' + err.stack)
+ }
+}
diff --git a/Desktop/WebServer/require.js b/Desktop/UI/require.js
similarity index 100%
rename from Desktop/WebServer/require.js
rename to Desktop/UI/require.js
diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css
index 5e3eedde8..3dadc5d11 100644
--- a/Desktop/WebServer/css/main.css
+++ b/Desktop/WebServer/css/main.css
@@ -22,13 +22,288 @@
font-style: normal;
}
- kbd {
- padding: 2px 8px;
- font-size: 125%;
- font-weight: 500;
+ .body{
+ overflow-y: hidden;
+ overflow-x: hidden;
+ }
+
+ .scroll-div {
+ position:absolute;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ top:0px;
+ left:0px;
+ vertical-align: top;
+ height: 100%;
+ width: 100%;
color: #000;
- background-color: #bcd643;
- border-radius: 5px;
- border-style: outset;
+ border-color: blue;
+ background-color: transparent;
+ border-width: 0px;
+ }
+
+ .static-div {
+ position: fixed;
+ top:0px;
+ left:18%;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ background:transparent;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .content-div {
+ position:relative;
+ vertical-align: top;
+ height: 100%;
+ width: 30%;
+ left: 31.2%;
+ color: #000;
+ border-color: blue;
+ background-color:transparent;
border-width: 1px;
+ }
+
+ .post-placeholder {
+ vertical-align: top;
+ height: 50px;
+ width: 100%;
+ color: #000;
+ border-color: blue;
+ background-color: transparent;
+ border-width: 0px;
+ }
+
+ .post-div {
+ vertical-align: top;
+ height: 300px;
+ width: 100%;
+ color: #000;
+ border-color: blue;
+ background-color: transparent;
+ border-width: 0px;
+ }
+
+ .new-post-div {
+ vertical-align: top;
+ height: 300px;
+ width: 100%;
+ color: #000;
+ border-color: blue;
+ background-color: transparent;
+ border-width: 0px;
+ }
+
+ .page-table {
+ top:0px;
+ left:18%;
+ width: 64%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ background:transparent;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .left-column {
+ position:relative;
+ top:0px;
+ width: 20%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .middle-column {
+ position:relative;
+ top:0px;
+ width: 50%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .right-column {
+ position:relative;
+ top:0px;
+ left:0px;
+ width: 30%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .left-table {
+ position:relative;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .logo-cell {
+ vertical-align: top;
+ width: 100%;
+ height: 70px;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .menu-cell {
+ vertical-align: top;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .profile-cell {
+ vertical-align: bottom;
+ width: 100%;
+ height: 50px;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .middle-table {
+ position:relative;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .content-title-cell {
+ vertical-align: top;
+ width: 100%;
+ height: 50px;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ background-color: #ffffff;
+ }
+
+ .content-cell {
+ vertical-align: top;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .right-table {
+ position:relative;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .search-cell {
+ vertical-align: top;
+ width: 100%;
+ height: 50px;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .context-cell {
+ vertical-align: top;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ background:transparent;
+ }
+
+ .menu-table {
+ position:relative;
+ width: 100%;
+ height: 65%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .menu-item-cell {
+ vertical-align: top;
+ width: 100%;
+ height: 50px;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ }
+
+ .who-to-follow-table {
+ position:relative;
+ width: 100%;
+ height: 30%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .profile-to-follow-table {
+ position:relative;
+ width: 100%;
+ height: 30%;
+ padding: 0;
+ margin: 0;
+ color: #000;
+ border-width: 0px;
+ border-collapse: collapse;
+ }
+
+ .profile-to-follow-span {
+ float: right;
+ }
+
+ .profile-to-follow-button {
+ float: right;
+ background-color: green;
+ }
+
+ .profile-to-unfollow-span {
+ float: right;
+ }
+
+ .profile-to-unfollow-button {
+ float: right;
+ background-color: red;
}
\ No newline at end of file
diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html
index afeb95d14..0f0c0a561 100644
--- a/Desktop/WebServer/index.html
+++ b/Desktop/WebServer/index.html
@@ -6,8 +6,8 @@
-
-
+
+
+
-
- Hello World!
-
-
-
+
+
\ No newline at end of file
diff --git a/Desktop/httpInterface.js b/Desktop/httpInterface.js
deleted file mode 100644
index ddbddda7e..000000000
--- a/Desktop/httpInterface.js
+++ /dev/null
@@ -1,68 +0,0 @@
-exports.newHttpInterface = function newHttpInterface() {
-
- /*
- This module represent the HTTP API of the
- Desktop App. All HTTP request are processed
- by this module.
- */
- let thisObject = {
- initialize: initialize,
- finalize: finalize
- }
-
- return thisObject
-
- function finalize() {
- }
-
- function initialize() {
- /*
- We will create an HTTP Server and leave it running forever.
- */
- SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT)
- /* Starting the browser now is optional */
- if (process.argv.includes("noBrowser")) {
- //Running Client only with no UI.
- } else {
- SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
- }
- }
-
- function onHttpRequest(httpRequest, httpResponse) {
- try {
- let requestPathAndParameters = httpRequest.url.split('?') // Remove version information
- let requestPath = requestPathAndParameters[0].split('/')
- let endpointOrFile = requestPath[1]
-
- switch (endpointOrFile) {
- case 'Images': // This means the Images folder.
- {
- let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2]
-
- if (requestPath[3] !== undefined) {
- path = path + '/' + requestPath[3]
- }
-
- if (requestPath[4] !== undefined) {
- path = path + '/' + requestPath[4]
- }
-
- if (requestPath[5] !== undefined) {
- path = path + '/' + requestPath[5]
- }
-
- path = unescape(path)
-
- SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
- }
- break
- default:
- {
- SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP)
- }
- }
- } catch (err) {
- console.log(err.stack)
- }
- }
-}
diff --git a/EnvironmentForDebug.js b/EnvironmentForDebug.js
index 932ed022b..754d228bb 100644
--- a/EnvironmentForDebug.js
+++ b/EnvironmentForDebug.js
@@ -4,6 +4,8 @@ exports.newEnvironment = function () {
WEB_SERVER_URL: 'localhost',
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
NETWORK_WEB_SOCKETS_INTERFACE_PORT: 18042,
+ DESKTOP_WEB_SOCKETS_INTERFACE_PORT: 18043,
+ DESKTOP_WEB_SOCKETS_INTERFACE_HOST: 'localhost',
CLIENT_HTTP_INTERFACE_PORT: 34248,
DESKTOP_HTTP_INTERFACE_PORT: 34249,
PATH_TO_TASK_SERVER: './TaskServer',
diff --git a/MultiProject.js b/MultiProject.js
index 47506b2cc..bc4f3035d 100644
--- a/MultiProject.js
+++ b/MultiProject.js
@@ -65,7 +65,7 @@ exports.newMultiProject = function () {
}
/*
- From here we will require and get the modules, but without instantiation thisObject.
+ From here we will require and get the modules, but without instantiating thisObject.
*/
/* Set up Modules for this Project */
diff --git a/Platform/UI/AppLoader.js b/Platform/UI/AppLoader.js
index b17587624..eb8f87864 100644
--- a/Platform/UI/AppLoader.js
+++ b/Platform/UI/AppLoader.js
@@ -5,7 +5,7 @@ function newAppLoader() {
const INFO_LOG = false
const ERROR_LOG = true
const logger = newWebDebugLog()
-
+
let thisObject = {
loadModules: loadModules
@@ -64,16 +64,16 @@ function newAppLoader() {
let fileArray = JSON.parse(fileList)
for (let i = 0; i < fileArray.length; i++) {
let item = fileArray[i]
-
+
project = item[0]
fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
}
modulesArray = modulesArray.concat(urlArray)
utilities()
}
- }
+ }
function utilities() {
let url = 'ListUtilitiesFiles'
@@ -84,16 +84,16 @@ function newAppLoader() {
let fileArray = JSON.parse(fileList)
for (let i = 0; i < fileArray.length; i++) {
let item = fileArray[i]
-
+
project = item[0]
fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
}
modulesArray = modulesArray.concat(urlArray)
globals()
}
- }
+ }
function globals() {
let url = 'ListGlobalFiles'
@@ -104,16 +104,16 @@ function newAppLoader() {
let fileArray = JSON.parse(fileList)
for (let i = 0; i < fileArray.length; i++) {
let item = fileArray[i]
-
+
project = item[0]
fileName = item[1]
- urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
}
modulesArray = modulesArray.concat(urlArray)
spaces()
}
- }
+ }
function spaces() {
let url = 'ListSpaceFiles'
@@ -138,7 +138,7 @@ function newAppLoader() {
for (let i = 0; i < modulesArray.length; i++) {
let path = modulesArray[i]
-
+ console.log(path)
REQUIREJS([path], onRequired)
if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') }
diff --git a/Projects/Education/Icons/docs-space-settings.png b/Projects/Education/Icons/docs-space-settings.png
new file mode 100644
index 000000000..7894c5596
Binary files /dev/null and b/Projects/Education/Icons/docs-space-settings.png differ
diff --git a/Projects/Education/Icons/docs-space-style.png b/Projects/Education/Icons/docs-space-style.png
new file mode 100644
index 000000000..1bea1bcbb
Binary files /dev/null and b/Projects/Education/Icons/docs-space-style.png differ
diff --git a/Projects/Foundations/Icons/Docs/docs-space.png b/Projects/Education/Icons/docs-space.png
similarity index 100%
rename from Projects/Foundations/Icons/Docs/docs-space.png
rename to Projects/Education/Icons/docs-space.png
diff --git a/Projects/Education/Schemas/App-Schema/docs-space-settings.json b/Projects/Education/Schemas/App-Schema/docs-space-settings.json
new file mode 100644
index 000000000..99c4ed7f4
--- /dev/null
+++ b/Projects/Education/Schemas/App-Schema/docs-space-settings.json
@@ -0,0 +1,33 @@
+{
+ "type": "Docs Space Settings",
+ "level": 4,
+ "propertyNameAtParent": "docsSpaceSettings",
+ "attachingRules": {
+ "compatibleTypes": "Docs Space->"
+ },
+ "editors": {
+ "config": true
+ },
+ "initialValues": {
+ "config": "{\"indexContent\": true \n }"
+ },
+ "menuItems": [
+ {
+ "action": "Configure",
+ "actionFunction": "uiObject.configEditor.activate",
+ "label": "Configure",
+ "iconPathOn": "configuration",
+ "iconPathOff": "configuration"
+ },
+ {
+ "action": "Delete UI Object",
+ "askConfirmation": true,
+ "confirmationLabel": "Confirm to Delete",
+ "actionFunction": "payload.executeAction",
+ "label": "Delete",
+ "iconPathOn": "delete-entity",
+ "iconPathOff": "delete-entity"
+ }
+ ],
+ "addLeftIcons": true
+}
\ No newline at end of file
diff --git a/Projects/Education/Schemas/App-Schema/docs-space-style.json b/Projects/Education/Schemas/App-Schema/docs-space-style.json
new file mode 100644
index 000000000..d3b71598c
--- /dev/null
+++ b/Projects/Education/Schemas/App-Schema/docs-space-style.json
@@ -0,0 +1,33 @@
+{
+ "type": "Docs Space Style",
+ "level": 4,
+ "propertyNameAtParent": "docsSpaceStyle",
+ "attachingRules": {
+ "compatibleTypes": "Docs Space->"
+ },
+ "editors": {
+ "config": true
+ },
+ "initialValues": {
+ "config": "{\"backgroundColor\":\"UI_COLOR.BLACK\",\"node\":{\"fontSize\":16,\"imageSize\":60,\"type\":{\"fontColor\":\"UI_COLOR.WHITE\"},\"name\":{\"fontColor\":\"UI_COLOR.WHITE\"},\"menuItem\":{\"backgroundColor\":\"UI_COLOR.BLACK\",\"fontColor\":\"UI_COLOR.WHITE\",\"fontSize\":14,\"imageSize\":14}}}"
+ },
+ "menuItems": [
+ {
+ "action": "Configure",
+ "actionFunction": "uiObject.configEditor.activate",
+ "label": "Configure",
+ "iconPathOn": "configuration",
+ "iconPathOff": "configuration"
+ },
+ {
+ "action": "Delete UI Object",
+ "askConfirmation": true,
+ "confirmationLabel": "Confirm to Delete",
+ "actionFunction": "payload.executeAction",
+ "label": "Delete",
+ "iconPathOn": "delete-entity",
+ "iconPathOff": "delete-entity"
+ }
+ ],
+ "addLeftIcons": true
+}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/App-Schema/docs-space.json b/Projects/Education/Schemas/App-Schema/docs-space.json
similarity index 87%
rename from Projects/Foundations/Schemas/App-Schema/docs-space.json
rename to Projects/Education/Schemas/App-Schema/docs-space.json
index aa6306186..44d674bb2 100644
--- a/Projects/Foundations/Schemas/App-Schema/docs-space.json
+++ b/Projects/Education/Schemas/App-Schema/docs-space.json
@@ -32,15 +32,15 @@
"level": 0,
"childrenNodesProperties": [
{
- "name": "spaceStyle",
+ "name": "docsSpaceStyle",
"type": "node",
- "childType": "Space Style",
+ "childType": "Docs Space Style",
"autoAdd": true
},
{
- "name": "spaceSettings",
+ "name": "docsSpaceSettings",
"type": "node",
- "childType": "Space Settings",
+ "childType": "Docs Space Settings",
"autoAdd": true
}
]
diff --git a/Projects/Education/Schemas/App-Schema/education-project.json b/Projects/Education/Schemas/App-Schema/education-project.json
new file mode 100644
index 000000000..83546485c
--- /dev/null
+++ b/Projects/Education/Schemas/App-Schema/education-project.json
@@ -0,0 +1,45 @@
+{
+ "type": "Education Project",
+ "menuItems": [
+ {
+ "action": "Add UI Object",
+ "actionProject": "Foundations",
+ "label": "Add Tutorial",
+ "iconProject": "Education",
+ "relatedUiObject": "Tutorial",
+ "actionFunction": "payload.executeAction"
+ },
+ {
+ "action": "Add UI Object",
+ "actionProject": "Foundations",
+ "label": "Add Docs Space",
+ "relatedUiObject": "Docs Space",
+ "actionFunction": "payload.executeAction"
+ },
+ {
+ "action": "Delete UI Object",
+ "actionProject": "Foundations",
+ "askConfirmation": true,
+ "confirmationLabel": "Confirm to Delete",
+ "actionFunction": "payload.executeAction",
+ "label": "Delete",
+ "iconPathOn": "delete-entity",
+ "iconPathOff": "delete-entity"
+ }
+ ],
+ "isProjectHead": true,
+ "isTitleAllwaysVisible": false,
+ "addLeftIcons": true,
+ "isPinned": true,
+ "positionLocked": true,
+ "childrenNodesProperties": [
+ {
+ "name": "projectDefinition",
+ "type": "node",
+ "childType": "Project Definition",
+ "project": "Foundations",
+ "autoAdd": true
+ }
+ ],
+ "icon": "education"
+}
\ No newline at end of file
diff --git a/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json
new file mode 100644
index 000000000..6f6f5c4a6
--- /dev/null
+++ b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json
@@ -0,0 +1,18 @@
+{
+ "type": "Docs Space Settings",
+ "definition": {
+ "text": "This node allows the user to determine how the docs space will be loaded by the current workspace.",
+ "updated": 1631587592724
+ },
+ "paragraphs": [
+ {
+ "style": "Subtitle",
+ "text": "Properties",
+ "updated": 1631587516173
+ },
+ {
+ "style": "List",
+ "text": "indexContent defines whether the contents of the docs space will be indexed for searching upon loading the workspace. If false docs space will be disabled allowing faster load times for development."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json
new file mode 100644
index 000000000..470ca9b6f
--- /dev/null
+++ b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json
@@ -0,0 +1,13 @@
+{
+ "type": "Docs Space Style",
+ "definition": {
+ "text": "This node is currently a place holder that will eventually allow users to adjust the visual apperance of the docs space.",
+ "updated": 1631589004055
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and select the pencil button to enter edit mode."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js b/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js
index 88c80fa97..584e5fa31 100644
--- a/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js
+++ b/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js
@@ -23,8 +23,8 @@ function newFoundationsDocsSearchEngine() {
*/
let docsSpaceNode = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Docs Space')
if (docsSpaceNode !== undefined) {
- if (docsSpaceNode.spaceSettings !== undefined) {
- let indexContent = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(docsSpaceNode.spaceSettings.payload, 'indexContent')
+ if (docsSpaceNode.docsSpaceSettings !== undefined) {
+ let indexContent = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(docsSpaceNode.docsSpaceSettings.payload, 'indexContent')
if (indexContent === false) {
callbackFunction()
return
diff --git a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js
index 11d44df78..8bc9531a2 100644
--- a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js
+++ b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js
@@ -12,6 +12,7 @@ function newEducationTutorialSpace() {
playTutorialStep: playTutorialStep,
resumeTutorialStep: resumeTutorialStep,
resetTutorialProgress: resetTutorialProgress,
+ sidePanelTab: undefined,
container: undefined,
physics: physics,
draw: draw,
@@ -37,6 +38,8 @@ function newEducationTutorialSpace() {
resize()
let browserResizedEventSubscriptionId
+ let openingEventSubscriptionId
+ let closingEventSubscriptionId
let tutorialRootNode
let currentNode
@@ -104,6 +107,8 @@ function newEducationTutorialSpace() {
batchConfigChangesCounter = 0
workspacesCounter = 0
+ setupSidePanelTab()
+
browserResizedEventSubscriptionId = canvas.eventHandler.listenToEvent('Browser Resized', resize)
let workspace = UI.projects.foundations.spaces.designSpace.workspace
workspace.executeAction({ name: 'Play Tutorials', project: 'Foundations' })
@@ -112,6 +117,8 @@ function newEducationTutorialSpace() {
function finalize() {
canvas.eventHandler.stopListening(browserResizedEventSubscriptionId)
+ thisObject.sidePanelTab.container.eventHandler.stopListening(openingEventSubscriptionId)
+ thisObject.sidePanelTab.container.eventHandler.stopListening(closingEventSubscriptionId)
tutorialRootNode = undefined
currentNode = undefined
@@ -130,8 +137,14 @@ function newEducationTutorialSpace() {
}
function getContainer(point, purpose) {
+
+ if (thisObject.sidePanelTab === undefined) { return }
+
let container
+ container = thisObject.sidePanelTab.getContainer(point, purpose)
+ if (container !== undefined) { return container }
+
if (thisObject.container.frame.isThisPointHere(point, true) === true) {
return thisObject.container
} else {
@@ -145,11 +158,13 @@ function newEducationTutorialSpace() {
switch (currentStatus) {
case 'Stopped': {
makeInvisible()
+ thisObject.sidePanelTab.close()
currentNode = undefined
break
}
case 'Playing Tutorial': {
makeVsible()
+ thisObject.sidePanelTab.open()
break
}
case 'Playing Topic': {
@@ -287,18 +302,28 @@ function newEducationTutorialSpace() {
function checkImage() {
let tutorialImageDiv = document.getElementById('tutorialImageDiv')
- if (tutorialImageDiv !== null && tutorialImageDiv !== undefined) {
+ if (tutorialImageDiv !== null && tutorialImageDiv !== undefined) {
tutorialImageDiv.appendChild(htmlImage)
}
if (newImageName === undefined) { return }
if (currentImageName === newImageName) { return }
currentImageName = newImageName
- let webParam = 'Icons/' + newImageProject + '/' + newImageName + '.png'
-
- htmlImage.src = webParam
- htmlImage.width = "100"
- htmlImage.height = "100"
+
+ // If gathering Icon by Project and Name get it now
+ let icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName(newImageProject, newImageName)
+ if (icon !== undefined) {
+ htmlImage.src = icon.src
+ htmlImage.width = "100"
+ htmlImage.height = "100"
+ } else if (icon === undefined) {
+ // Legacy Code to handle icons being fetched by literal path
+ // Note: This if statment should be removed once all tutoials have been refactored
+ let webParam = 'Icons/' + newImageProject + '/' + newImageName + '.png'
+ htmlImage.src = webParam
+ htmlImage.width = "100"
+ htmlImage.height = "100"
+ }
}
function checkDocumentation() {
@@ -968,8 +993,8 @@ function newEducationTutorialSpace() {
function resumeTutorial(node) {
if (UI.projects.foundations.spaces.designSpace.workspace.isInitialized !== true) { return }
-
- navigationStack = []
+ //Testing if removing the navigationStack reset here fixes the tutorial resume issues
+ //navigationStack = []
node.payload.uiObject.isPlaying = true
tutorialRootNode = node
currentNode = node
@@ -990,7 +1015,8 @@ function newEducationTutorialSpace() {
}
function resumeTutorialTopic(node) {
- navigationStack = []
+ //Testing if removing the navigationStack reset here fixes the tutorial resume issues
+ //navigationStack = []
currentTopicNode = node
currentNode = node
currentStatus = 'Playing Topic'
@@ -1010,7 +1036,8 @@ function newEducationTutorialSpace() {
}
function resumeTutorialStep(node) {
- navigationStack = []
+ //Testing if removing the navigationStack reset here fixes the tutorial resume issues
+ //navigationStack = []
currentStepNode = node
currentNode = node
currentStatus = 'Playing Step'
@@ -1499,4 +1526,36 @@ function newEducationTutorialSpace() {
function draw() {
if (isInitialized === false) { return }
}
+
+ function setupSidePanelTab() {
+ thisObject.sidePanelTab = UI.projects.foundations.spaces.sideSpace.createSidePanelTab(thisObject.container, 'Education', 'tutorial', 'Tutorial', 'left')
+
+ openingEventSubscriptionId = thisObject.sidePanelTab.container.eventHandler.listenToEvent('opening', onOpening)
+ closingEventSubscriptionId = thisObject.sidePanelTab.container.eventHandler.listenToEvent('closing', onClosing)
+ }
+
+ function onOpening() {
+ //console.log('onOpening');
+ let nodeResume = navigationStack.pop()
+
+ switch (nodeResume.type) {
+ case 'Tutorial': {
+ resumeTutorial(nodeResume)
+ break
+ }
+ case 'Tutorial Topic': {
+ resumeTutorialTopic(nodeResume)
+ break
+ }
+ case 'Tutorial Step': {
+ resumeTutorialStep(nodeResume)
+ break
+ }
+ }
+ }
+
+ function onClosing() {
+ //console.log('onClosing');
+ stop()
+ }
}
diff --git a/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg b/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg
new file mode 100644
index 000000000..5c68bcd28
--- /dev/null
+++ b/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg b/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg
new file mode 100644
index 000000000..a272ad69d
--- /dev/null
+++ b/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/Projects/Foundations/Icons/copy-position.png b/Projects/Foundations/Icons/copy-position.png
new file mode 100644
index 000000000..fe9d7f13d
Binary files /dev/null and b/Projects/Foundations/Icons/copy-position.png differ
diff --git a/Projects/Foundations/Icons/snap-position.png b/Projects/Foundations/Icons/snap-position.png
new file mode 100644
index 000000000..267719511
Binary files /dev/null and b/Projects/Foundations/Icons/snap-position.png differ
diff --git a/Projects/Foundations/Plugins/Data-Mines/Sparta.json b/Projects/Foundations/Plugins/Data-Mines/Sparta.json
index 41371d69c..5c9127b28 100644
--- a/Projects/Foundations/Plugins/Data-Mines/Sparta.json
+++ b/Projects/Foundations/Plugins/Data-Mines/Sparta.json
@@ -19330,7 +19330,7 @@
},
{
"type": "Indicator Bot",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"config": "{\n\"codeName\": \"RSI\"\n}",
"project": "Foundations",
"processes": [
@@ -19383,7 +19383,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -19535,7 +19535,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -19829,7 +19829,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -19920,7 +19920,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -20717,7 +20717,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -38266,7 +38266,7 @@
},
{
"type": "Plotter",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"config": "{\n\"codeName\": \"Plotter RSI\"\n}",
"project": "Foundations",
"modules": [
@@ -39291,7 +39291,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39363,7 +39363,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39435,7 +39435,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39507,7 +39507,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39664,7 +39664,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39736,7 +39736,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39808,7 +39808,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -39880,7 +39880,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40037,7 +40037,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40109,7 +40109,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40181,7 +40181,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40253,7 +40253,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40410,7 +40410,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40482,7 +40482,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40554,7 +40554,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40626,7 +40626,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40783,7 +40783,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -40855,7 +40855,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41012,7 +41012,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41084,7 +41084,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41241,7 +41241,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41313,7 +41313,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41470,7 +41470,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41542,7 +41542,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41699,7 +41699,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41771,7 +41771,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -41985,7 +41985,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -42057,7 +42057,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -42214,7 +42214,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -42286,7 +42286,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -42358,7 +42358,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
@@ -42430,7 +42430,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Plotter",
"Foundations",
"d87c1a49-c376-404b-98ff-62feac714c64"
diff --git a/Projects/Foundations/Plugins/Data-Mines/quantum.json b/Projects/Foundations/Plugins/Data-Mines/quantum.json
new file mode 100755
index 000000000..4b55a5aeb
--- /dev/null
+++ b/Projects/Foundations/Plugins/Data-Mines/quantum.json
@@ -0,0 +1,6330 @@
+{
+ "type": "Data Mine",
+ "name": "quantum",
+ "config": "{\"codeName\":\"quantum\"}",
+ "project": "Foundations",
+ "sensorBots": [],
+ "apiDataFetcherBots": [],
+ "indicatorBots": [
+ {
+ "type": "Indicator Bot",
+ "name": "Keltner Channel",
+ "config": "{\n \"codeName\": \"Keltner-Channel\"\n}",
+ "project": "Foundations",
+ "processes": [
+ {
+ "type": "Process Definition",
+ "name": "Multi-Time-Frame-Market",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Produces the Keltner Channel.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}",
+ "project": "Foundations",
+ "processOutput": {
+ "type": "Process Output",
+ "name": "New Process Output",
+ "project": "Foundations",
+ "outputDatasets": [
+ {
+ "type": "Output Dataset",
+ "name": "Multi-Time-Frame-Market Keltner Channel",
+ "project": "Foundations",
+ "id": "5d2742b2-010f-4c8e-a3b9-353144fa718d",
+ "savedPayload": {
+ "position": {
+ "x": 35682.7308681976,
+ "y": 17706.066132856835
+ },
+ "targetPosition": {
+ "x": 35760.37658172835,
+ "y": 17995.843880743556
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "id": "d76a7b97-f8ec-4565-bb08-b9c96e527061"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Indicator Bot",
+ "Foundations",
+ "2d67d9ca-7a6e-42af-ae67-a573f77fde43"
+ ],
+ [
+ "Keltner Channel",
+ "Product Definition",
+ "Foundations",
+ "f41eab39-d10c-4335-95a7-64978fb51631"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Dataset Definition",
+ "Foundations",
+ "d76a7b97-f8ec-4565-bb08-b9c96e527061"
+ ]
+ ]
+ }
+ }
+ ],
+ "outputDatasetFolders": [],
+ "id": "c90fe480-880a-41bf-991d-ee9a7b1491ce",
+ "savedPayload": {
+ "position": {
+ "x": 35760.37658172835,
+ "y": 17995.843880743556
+ },
+ "targetPosition": {
+ "x": 35838.02229525911,
+ "y": 18285.621628630277
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "processDependencies": {
+ "type": "Process Dependencies",
+ "name": "New Process Dependencies",
+ "project": "Foundations",
+ "statusDependencies": [
+ {
+ "type": "Status Dependency",
+ "name": "Candles Volumes Multi-Time-Frame-Market",
+ "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}",
+ "project": "Foundations",
+ "id": "54773d03-d7e6-446b-8650-96ced7179a74",
+ "savedPayload": {
+ "position": {
+ "x": 35765.668008789864,
+ "y": 17736.036259608227
+ },
+ "targetPosition": {
+ "x": 35915.668008789864,
+ "y": 17995.843880743556
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "Candles Volumes Multi-Time-Frame-Market Status Report",
+ "id": "a0a61ba9-91cb-4ec7-92fe-134ff079de2d"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "9f683143-a33f-42c1-9fa8-c601f01ee4e1"
+ ],
+ [
+ "Candles Volumes Multi-Time-Frame-Market Status Report",
+ "Status Report",
+ "Foundations",
+ "a0a61ba9-91cb-4ec7-92fe-134ff079de2d"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Self Reference\"\n}",
+ "project": "Foundations",
+ "id": "3c180aa1-836b-41ca-a367-5d57065d04fe",
+ "savedPayload": {
+ "position": {
+ "x": 35954.49086555524,
+ "y": 17850.955006800195
+ },
+ "targetPosition": {
+ "x": 35915.668008789864,
+ "y": 17995.843880743556
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "1f010d2c-20aa-42c1-a8aa-09cb10108a7b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Indicator Bot",
+ "Foundations",
+ "2d67d9ca-7a6e-42af-ae67-a573f77fde43"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "38d95fbc-1062-43c5-b619-6c62d0ddcc0b"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "1f010d2c-20aa-42c1-a8aa-09cb10108a7b"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataDependencies": [
+ {
+ "type": "Data Dependency",
+ "name": "Candles Multi-Time-Frame-Market",
+ "project": "Foundations",
+ "id": "2bbd3c13-d32c-4046-aa20-00e985771c2f",
+ "savedPayload": {
+ "position": {
+ "x": 36045.57181935753,
+ "y": 17920.843880743556
+ },
+ "targetPosition": {
+ "x": 35915.668008789864,
+ "y": 17995.843880743556
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "id": "2b03494a-67d6-47f1-89b6-53fc4c9116a8"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Candles",
+ "Product Definition",
+ "Foundations",
+ "fe6065ec-4d2d-47a0-bae0-8647f0e195d7"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Dataset Definition",
+ "Foundations",
+ "2b03494a-67d6-47f1-89b6-53fc4c9116a8"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataMineDataDependencies": [],
+ "id": "2c833913-2571-489d-8c0b-35c76775dfa1",
+ "savedPayload": {
+ "position": {
+ "x": 35915.668008789864,
+ "y": 17995.843880743556
+ },
+ "targetPosition": {
+ "x": 35838.02229525911,
+ "y": 18285.621628630277
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "statusReport": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "project": "Foundations",
+ "id": "1f010d2c-20aa-42c1-a8aa-09cb10108a7b",
+ "savedPayload": {
+ "position": {
+ "x": 36050.15432961507,
+ "y": 18073.489594274313
+ },
+ "targetPosition": {
+ "x": 35838.02229525911,
+ "y": 18285.621628630277
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "executionStartedEvent": {
+ "type": "Execution Started Event",
+ "name": "",
+ "project": "Foundations",
+ "id": "fb175b54-cd7e-4338-95ec-2ee630b15d4e",
+ "savedPayload": {
+ "position": {
+ "x": 35982.91116920247,
+ "y": 18246.7987718649
+ },
+ "targetPosition": {
+ "x": 35838.02229525911,
+ "y": 18285.621628630277
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "id": "1824fa00-dd30-4cdc-acc0-01c2f29056c5"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "9f683143-a33f-42c1-9fa8-c601f01ee4e1"
+ ],
+ [
+ "New Execution Finished Event",
+ "Execution Finished Event",
+ "Foundations",
+ "1824fa00-dd30-4cdc-acc0-01c2f29056c5"
+ ]
+ ]
+ }
+ },
+ "executionFinishedEvent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "project": "Foundations",
+ "id": "8427c40d-1223-459c-84a5-f1d2e99e439f",
+ "savedPayload": {
+ "position": {
+ "x": 35982.91116920247,
+ "y": 18324.444485395656
+ },
+ "targetPosition": {
+ "x": 35838.02229525911,
+ "y": 18285.621628630277
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "38d95fbc-1062-43c5-b619-6c62d0ddcc0b",
+ "savedPayload": {
+ "position": {
+ "x": 35509.02229525911,
+ "y": 18236.621628630277
+ },
+ "targetPosition": {
+ "x": 35296.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Process Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Produces the Keltner Channel.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}",
+ "project": "Foundations",
+ "processOutput": {
+ "type": "Process Output",
+ "name": "New Process Output",
+ "project": "Foundations",
+ "outputDatasets": [
+ {
+ "type": "Output Dataset",
+ "name": "Multi-Time-Frame-Daily Keltner Channel",
+ "project": "Foundations",
+ "id": "2262ff71-db72-4278-9725-f68ab4e6b3fe",
+ "savedPayload": {
+ "position": {
+ "x": 36225.89026090314,
+ "y": 17978.13842071558
+ },
+ "targetPosition": {
+ "x": 36075.89026090314,
+ "y": 18237.94604185091
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "id": "80454a5a-c87b-47f6-b71e-f0466c864634"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Indicator Bot",
+ "Foundations",
+ "2d67d9ca-7a6e-42af-ae67-a573f77fde43"
+ ],
+ [
+ "Keltner Channel",
+ "Product Definition",
+ "Foundations",
+ "f41eab39-d10c-4335-95a7-64978fb51631"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Dataset Definition",
+ "Foundations",
+ "80454a5a-c87b-47f6-b71e-f0466c864634"
+ ]
+ ]
+ }
+ }
+ ],
+ "outputDatasetFolders": [],
+ "id": "5dc92f26-e6f7-43f4-86b0-9cd7bd7b443b",
+ "savedPayload": {
+ "position": {
+ "x": 36075.89026090314,
+ "y": 18237.94604185091
+ },
+ "targetPosition": {
+ "x": 35925.89026090314,
+ "y": 18497.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "processDependencies": {
+ "type": "Process Dependencies",
+ "name": "New Process Dependencies",
+ "project": "Foundations",
+ "statusDependencies": [
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Self Reference\"\n}",
+ "project": "Foundations",
+ "id": "1ccbc557-37d4-4b36-8260-88b7fd029762",
+ "savedPayload": {
+ "position": {
+ "x": 36335.697882038476,
+ "y": 18087.94604185091
+ },
+ "targetPosition": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "0b3ee02f-edd5-4ff0-aa1f-c687e6583098"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Indicator Bot",
+ "Foundations",
+ "2d67d9ca-7a6e-42af-ae67-a573f77fde43"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "97681a8b-876b-4f01-9f02-16bb06408ed1"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "0b3ee02f-edd5-4ff0-aa1f-c687e6583098"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}",
+ "project": "Foundations",
+ "id": "3e907f0c-40fb-430e-a013-39fe4f44284b",
+ "savedPayload": {
+ "position": {
+ "x": 36397.82991639444,
+ "y": 18135.621628630277
+ },
+ "targetPosition": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "2a021da8-9feb-475e-90ab-1586968c17c7"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "980ceb1d-7be6-454f-90d9-01ba1fd4a65d"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "2a021da8-9feb-475e-90ab-1586968c17c7"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "Exchange Raw Data Historic-OHLCVs",
+ "config": "{\n \"mainUtility\": \"Market Starting Point\"\n}",
+ "project": "Foundations",
+ "id": "77d0f477-eb24-44c9-b29c-efe946b0c4a0",
+ "savedPayload": {
+ "position": {
+ "x": 36445.5055031738,
+ "y": 18197.75366298624
+ },
+ "targetPosition": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "Exchange-Raw-Data Historic-OHLCVs Status Report",
+ "id": "181c7c34-7243-497a-9ddb-1b0067c6d66e"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Exchange Raw Data",
+ "Sensor Bot",
+ "Foundations",
+ "af924204-66a2-47d4-9910-66ab78acb06f"
+ ],
+ [
+ "Historic-OHLCVs",
+ "Process Definition",
+ "Foundations",
+ "5eb11d6a-022e-4f60-97c4-d6cf90b249dc"
+ ],
+ [
+ "Exchange-Raw-Data Historic-OHLCVs Status Report",
+ "Status Report",
+ "Foundations",
+ "181c7c34-7243-497a-9ddb-1b0067c6d66e"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataDependencies": [
+ {
+ "type": "Data Dependency",
+ "name": "Candles Multi-Time-Frame-Daily",
+ "project": "Foundations",
+ "id": "7e4330fe-cff7-410f-949d-9bc74ab234b8",
+ "savedPayload": {
+ "position": {
+ "x": 36475.4756299252,
+ "y": 18270.107949455487
+ },
+ "targetPosition": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "id": "678a567c-f08d-49b9-813b-4e54fd6afadb"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Candles",
+ "Product Definition",
+ "Foundations",
+ "fe6065ec-4d2d-47a0-bae0-8647f0e195d7"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Dataset Definition",
+ "Foundations",
+ "678a567c-f08d-49b9-813b-4e54fd6afadb"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataMineDataDependencies": [
+ {
+ "type": "Data Mine Data Dependencies",
+ "name": "Candles",
+ "project": "Foundations",
+ "botDataDependencies": [],
+ "id": "85d0a208-d797-4073-921f-171e59d4c290",
+ "savedPayload": {
+ "position": {
+ "x": 36504.697882038476,
+ "y": 18653.75366298624
+ },
+ "targetPosition": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Data Mine",
+ "name": "Candles",
+ "id": "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "470f0399-a571-4dae-960d-1e6ecaad88e7",
+ "savedPayload": {
+ "position": {
+ "x": 36185.697882038476,
+ "y": 18347.75366298624
+ },
+ "targetPosition": {
+ "x": 35925.89026090314,
+ "y": 18497.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "statusReport": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "project": "Foundations",
+ "id": "0b3ee02f-edd5-4ff0-aa1f-c687e6583098",
+ "savedPayload": {
+ "position": {
+ "x": 36075.89026090314,
+ "y": 18497.75366298624
+ },
+ "targetPosition": {
+ "x": 35925.89026090314,
+ "y": 18497.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "executionStartedEvent": {
+ "type": "Execution Started Event",
+ "name": "",
+ "project": "Foundations",
+ "id": "1326f776-09db-4750-bce6-8d8c1734f3a0",
+ "savedPayload": {
+ "position": {
+ "x": 36055.79407147081,
+ "y": 18572.75366298624
+ },
+ "targetPosition": {
+ "x": 35925.89026090314,
+ "y": 18497.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "id": "f29d08f9-e7c8-490c-8fca-14851a0d3dc3"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "980ceb1d-7be6-454f-90d9-01ba1fd4a65d"
+ ],
+ [
+ "New Execution Finished Event",
+ "Execution Finished Event",
+ "Foundations",
+ "f29d08f9-e7c8-490c-8fca-14851a0d3dc3"
+ ]
+ ]
+ }
+ },
+ "executionFinishedEvent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "project": "Foundations",
+ "id": "f3c494f1-ac4e-4cb2-a8d3-bebee8c1639a",
+ "savedPayload": {
+ "position": {
+ "x": 36000.89026090314,
+ "y": 18627.657473553907
+ },
+ "targetPosition": {
+ "x": 35925.89026090314,
+ "y": 18497.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "97681a8b-876b-4f01-9f02-16bb06408ed1",
+ "savedPayload": {
+ "position": {
+ "x": 35596.89026090314,
+ "y": 18448.75366298624
+ },
+ "targetPosition": {
+ "x": 35296.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "products": [
+ {
+ "type": "Product Definition",
+ "name": "Keltner Channel",
+ "config": "{\n \"codeName\": \"Keltner-Channel\",\n \"singularVariableName\": \"keltner\",\n \"pluralVariableName\": \"keltners\"\n}",
+ "project": "Foundations",
+ "datasets": [
+ {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\"\n}",
+ "project": "Foundations",
+ "id": "d76a7b97-f8ec-4565-bb08-b9c96e527061",
+ "savedPayload": {
+ "position": {
+ "x": 35837.318189071,
+ "y": 18731.753959886133
+ },
+ "targetPosition": {
+ "x": 35615.08831243709,
+ "y": 18766.951714520186
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n }\n}",
+ "project": "Foundations",
+ "id": "80454a5a-c87b-47f6-b71e-f0466c864634",
+ "savedPayload": {
+ "position": {
+ "x": 35815.56478037947,
+ "y": 18869.099576961584
+ },
+ "targetPosition": {
+ "x": 35615.08831243709,
+ "y": 18766.951714520186
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "record": {
+ "type": "Record Definition",
+ "name": "New Record Definition",
+ "project": "Foundations",
+ "properties": [
+ {
+ "type": "Record Property",
+ "name": "Begin",
+ "config": "{\n \"codeName\": \"begin\",\n \"isString\": false,\n \"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "record.current.begin",
+ "project": "Foundations",
+ "id": "acd5b5fc-b7f7-46e3-b278-9c984c130581",
+ "savedPayload": {
+ "position": {
+ "x": 37127.45110003115,
+ "y": 19412.421228731037
+ },
+ "targetPosition": {
+ "x": 36790.99149989621,
+ "y": 19438.901173539183
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "236f093d-9061-4363-a2ed-6150a13ebe4e",
+ "savedPayload": {
+ "position": {
+ "x": 36790.99149989621,
+ "y": 19438.901173539183
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "End",
+ "config": "{ \n\"codeName\": \"end\",\n\"isString\": false,\n\"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "record.current.end",
+ "project": "Foundations",
+ "id": "11bf2a1d-1c00-4876-af81-4c4effa5cda8",
+ "savedPayload": {
+ "position": {
+ "x": 37096.49504826051,
+ "y": 19673.967589550422
+ },
+ "targetPosition": {
+ "x": 36775.5134740109,
+ "y": 19569.674353948878
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "b5f38833-a07e-42ce-893a-9bc05c70ca86",
+ "savedPayload": {
+ "position": {
+ "x": 36775.5134740109,
+ "y": 19569.674353948878
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "Upper",
+ "config": "{\n \"codeName\": \"Upper\",\n \"isString\": false,\n \"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "variable.Upper",
+ "project": "Foundations",
+ "id": "4646a964-3da9-46b0-b650-e1096ecf3174",
+ "savedPayload": {
+ "position": {
+ "x": 36839.4874198463,
+ "y": 19794.16419281449
+ },
+ "targetPosition": {
+ "x": 36711.1689131513,
+ "y": 19684.56983465877
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1f54fec9-389b-4173-9035-2f9e122e8530",
+ "savedPayload": {
+ "position": {
+ "x": 36711.1689131513,
+ "y": 19684.56983465877
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "Lower",
+ "config": "{\n \"codeName\": \"Lower\",\n \"isString\": false,\n \"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "variable.Lower",
+ "project": "Foundations",
+ "id": "01c7c929-8aee-4284-b305-717dabfc74f8",
+ "savedPayload": {
+ "position": {
+ "x": 36684.36459025443,
+ "y": 19916.453171217694
+ },
+ "targetPosition": {
+ "x": 36607.75369342338,
+ "y": 19766.095820260907
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "6779bd73-6b00-4af0-b1ff-5dbb14edb178",
+ "savedPayload": {
+ "position": {
+ "x": 36607.75369342338,
+ "y": 19766.095820260907
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "Mid Point",
+ "config": "{\n \"codeName\": \"midPoint\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "variable.midPoint",
+ "project": "Foundations",
+ "id": "f95f8041-8b26-4295-b95e-b32d06066ab5",
+ "savedPayload": {
+ "position": {
+ "x": 36494.251816973505,
+ "y": 19970.070518549728
+ },
+ "targetPosition": {
+ "x": 36481.01184456943,
+ "y": 19801.840718482264
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "b96c8034-d6ba-4459-af39-b0104ff2061f",
+ "savedPayload": {
+ "position": {
+ "x": 36481.01184456943,
+ "y": 19801.840718482264
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "AverageTrueRange",
+ "config": "{\n \"codeName\": \"AverageTrueRange\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Record Formula",
+ "code": "variable.AverageTrueRange",
+ "project": "Foundations",
+ "id": "e38a745b-46e9-4b67-ab92-e6bf636b8213",
+ "savedPayload": {
+ "position": {
+ "x": 36298.092046358965,
+ "y": 19946.853479721754
+ },
+ "targetPosition": {
+ "x": 36350.23866415974,
+ "y": 19786.362692596947
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "aa0fabd3-2b99-4c5b-8b28-719adbe6f4ba",
+ "savedPayload": {
+ "position": {
+ "x": 36350.23866415974,
+ "y": 19786.362692596947
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "Average ATR",
+ "config": "{\n \"codeName\": \"AverageATR\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Record Formula",
+ "code": "variable.AverageATR",
+ "project": "Foundations",
+ "id": "c893e0c2-6e4c-41d7-a277-32e1b2457596",
+ "savedPayload": {
+ "position": {
+ "x": 36125.748825294126,
+ "y": 19850.33663843235
+ },
+ "targetPosition": {
+ "x": 36235.34318344985,
+ "y": 19722.018131737343
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3e8458a5-1b5a-4093-af89-724d331dcb9c",
+ "savedPayload": {
+ "position": {
+ "x": 36235.34318344985,
+ "y": 19722.018131737343
+ },
+ "targetPosition": {
+ "x": 36454.531899761285,
+ "y": 19465.381118347334
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "cd647632-deaa-4e46-aed3-2f74e171f208",
+ "savedPayload": {
+ "position": {
+ "x": 35819.384037319884,
+ "y": 19167.90465040495
+ },
+ "targetPosition": {
+ "x": 35615.08831243709,
+ "y": 18766.951714520186
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "dataBuilding": {
+ "type": "Data Building Procedure",
+ "name": "New Data Building Procedure",
+ "project": "Foundations",
+ "loop": {
+ "type": "Procedure Loop",
+ "name": "New Procedure Loop",
+ "project": "Foundations",
+ "procedureJavascriptCode": {
+ "type": "Procedure Javascript Code",
+ "name": "New Procedure Javascript Code",
+ "code": "/* Loop Code */\n\nlet kcLen = 20 // Channel length\nlet candle = record.current\nlet multiplier = 1.5\nlet ATR_LEN = 14\n\n//Calculate EMA20 for midpoint\nvariable.midPoint = calculateEMA(20, candle.close, variable.previousMidPoint)\nvariable.previousMidPoint = variable.midPoint \n\n\n//////////////////////\nvariable.lastTR.push(calculateTR()) // Add the current true range value to last 20 array\n\nif (variable.lastTR.length > 20) {\n variable.lastTR.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements\n}\n\nvariable.AverageTrueRange = calculateATR(20)\nvariable.prevClose = candle.close\n\nvariable.Upper = variable.midPoint + multiplier * variable.AverageTrueRange\nvariable.Lower = variable.midPoint - multiplier * variable.AverageTrueRange\n\n//Calculate EMA for ATR\nvariable.AverageATR = calculateEMA(ATR_LEN, variable.AverageTrueRange, variable.previousAverageATR)\nvariable.previousAverageATR = variable.AverageATR \n\n//////////////////\n/* Calculate True Range */\nfunction calculateTR() {\n let hl = candle.max - candle.min\n \n if (variable.prevClose === 0) { return hl } // Return High-Low when previous Close is 0\n \n let hcp = Math.abs(candle.max - variable.prevClose)\n let lcp = Math.abs(candle.min - variable.prevClose)\n \n return Math.max(hl, hcp, lcp)\n}\n\n/* Calculate Average True Range - Smoothing Function SMA */\nfunction calculateATR(length) {\n /* We check we have enough values to make the calculation */\n if (variable.lastTR.length < length) { return 0 } // If not, define the value as zero.\n\n let sum = 0 // Initialise sum variable. \n for (let i = variable.lastTR.length - length; i < variable.lastTR.length; i++) { // Iterate through the last periods\n sum = sum + variable.lastTR[i]\n }\n \n let atr = sum / length\n return atr\n}\n\nfunction calculateEMA(periods, price, previousEMA) {\n let k = 2 / (1 + periods)\n return price * k + previousEMA * (1-k)\n}",
+ "project": "Foundations",
+ "id": "fb0e9c1d-a054-41f5-bef5-41c267e77735",
+ "savedPayload": {
+ "position": {
+ "x": 35656.043747081414,
+ "y": 19187.567431784748
+ },
+ "targetPosition": {
+ "x": 35620.206952126886,
+ "y": 19094.209389135027
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "325b96d4-7ca6-4ee9-b42c-1a4b147ca71b",
+ "savedPayload": {
+ "position": {
+ "x": 35620.206952126886,
+ "y": 19094.209389135027
+ },
+ "targetPosition": {
+ "x": 35579.89055780304,
+ "y": 18989.18159115409
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "initialization": {
+ "type": "Procedure Initialization",
+ "name": "New Procedure Initialization",
+ "project": "Foundations",
+ "procedureJavascriptCode": {
+ "type": "Procedure Javascript Code",
+ "name": "New Procedure Javascript Code",
+ "code": "/* Initialization Code*/\n\nvariable.lastHighs = []\nvariable.lastLows = []\nvariable.previousMidPoint = 0\npreviousAverageATR = 0\n\nvariable.lastTR = []\nvariable.prevClose = 0",
+ "project": "Foundations",
+ "id": "6d4b35c8-4c76-41ef-af19-fc77ece6e188",
+ "savedPayload": {
+ "position": {
+ "x": 35446.15997470495,
+ "y": 19154.325107963698
+ },
+ "targetPosition": {
+ "x": 35509.09201380993,
+ "y": 19076.610511818002
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f24dc0b0-b88b-428a-9d1a-38b233b38232",
+ "savedPayload": {
+ "position": {
+ "x": 35509.09201380993,
+ "y": 19076.610511818002
+ },
+ "targetPosition": {
+ "x": 35579.89055780304,
+ "y": 18989.18159115409
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "bf66fcaa-471d-439e-b4cc-de7191b4777c",
+ "savedPayload": {
+ "position": {
+ "x": 35579.89055780304,
+ "y": 18989.18159115409
+ },
+ "targetPosition": {
+ "x": 35615.08831243709,
+ "y": 18766.951714520186
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f41eab39-d10c-4335-95a7-64978fb51631",
+ "savedPayload": {
+ "position": {
+ "x": 35615.08831243709,
+ "y": 18766.951714520186
+ },
+ "targetPosition": {
+ "x": 35296.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Plotter Module",
+ "name": "Keltner Channel",
+ "id": "32f94206-6147-48df-9860-c94793356f85"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "2d67d9ca-7a6e-42af-ae67-a573f77fde43",
+ "savedPayload": {
+ "position": {
+ "x": 35296.89026090314,
+ "y": 18448.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Indicator Bot",
+ "name": "MVWAP",
+ "config": "{\n \"codeName\": \"Moving-VWAP\"\n}",
+ "project": "Foundations",
+ "processes": [
+ {
+ "type": "Process Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Produces the MVWAP.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}",
+ "project": "Foundations",
+ "processOutput": {
+ "type": "Process Output",
+ "name": "New Process Output",
+ "project": "Foundations",
+ "outputDatasets": [
+ {
+ "type": "Output Dataset",
+ "name": "Multi-Time-Frame-Daily MVWAP",
+ "project": "Foundations",
+ "id": "5704bcf4-154b-4358-aabe-8783cd7ef1e0",
+ "savedPayload": {
+ "position": {
+ "x": 36061.57779103255,
+ "y": 18923.594270280693
+ },
+ "targetPosition": {
+ "x": 35771.80004314583,
+ "y": 19001.23998381145
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "id": "d84addaf-b023-4ea8-8e15-b7576c911bb5"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Indicator Bot",
+ "Foundations",
+ "053d6fd9-217c-4469-9796-91021f2f0d53"
+ ],
+ [
+ "MVWAP",
+ "Product Definition",
+ "Foundations",
+ "0d93e7b6-08f8-4b07-b959-ee2f70d79e70"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Dataset Definition",
+ "Foundations",
+ "d84addaf-b023-4ea8-8e15-b7576c911bb5"
+ ]
+ ]
+ }
+ }
+ ],
+ "outputDatasetFolders": [],
+ "id": "f0863ec3-6de8-43d3-a886-560391d4a212",
+ "savedPayload": {
+ "position": {
+ "x": 35771.80004314583,
+ "y": 19001.23998381145
+ },
+ "targetPosition": {
+ "x": 35482.02229525911,
+ "y": 19078.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "processDependencies": {
+ "type": "Process Dependencies",
+ "name": "New Process Dependencies",
+ "project": "Foundations",
+ "statusDependencies": [
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Self Reference\"\n}",
+ "project": "Foundations",
+ "id": "63cd0d4a-fb74-4276-9b97-16b8dd134973",
+ "savedPayload": {
+ "position": {
+ "x": 35187.37890022213,
+ "y": 19293.54672890347
+ },
+ "targetPosition": {
+ "x": 34920.07694296562,
+ "y": 19157.349578981608
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "fa60009c-41d9-4873-a2c8-189bc92ab157"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Indicator Bot",
+ "Foundations",
+ "053d6fd9-217c-4469-9796-91021f2f0d53"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "2b16d149-2eea-4cab-8632-a4cffd5c6bf1"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "fa60009c-41d9-4873-a2c8-189bc92ab157"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}",
+ "project": "Foundations",
+ "id": "dec327a6-495e-4788-97de-362c3c110366",
+ "savedPayload": {
+ "position": {
+ "x": 35202.7820412781,
+ "y": 19505.666533870153
+ },
+ "targetPosition": {
+ "x": 34920.07694296562,
+ "y": 19157.349578981608
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "2a021da8-9feb-475e-90ab-1586968c17c7"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "980ceb1d-7be6-454f-90d9-01ba1fd4a65d"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "2a021da8-9feb-475e-90ab-1586968c17c7"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "Exchange Raw Data Historic-OHLCVs",
+ "config": "{\n \"mainUtility\": \"Market Starting Point\"\n}",
+ "project": "Foundations",
+ "id": "f1a1606f-0c3f-4fb1-9cf9-2de43920fc40",
+ "savedPayload": {
+ "position": {
+ "x": 35028.777729838504,
+ "y": 19595.938439407983
+ },
+ "targetPosition": {
+ "x": 34920.07694296562,
+ "y": 19157.349578981608
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "Exchange-Raw-Data Historic-OHLCVs Status Report",
+ "id": "181c7c34-7243-497a-9ddb-1b0067c6d66e"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Exchange Raw Data",
+ "Sensor Bot",
+ "Foundations",
+ "af924204-66a2-47d4-9910-66ab78acb06f"
+ ],
+ [
+ "Historic-OHLCVs",
+ "Process Definition",
+ "Foundations",
+ "5eb11d6a-022e-4f60-97c4-d6cf90b249dc"
+ ],
+ [
+ "Exchange-Raw-Data Historic-OHLCVs Status Report",
+ "Status Report",
+ "Foundations",
+ "181c7c34-7243-497a-9ddb-1b0067c6d66e"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataDependencies": [
+ {
+ "type": "Data Dependency",
+ "name": "Candles Multi-Time-Frame-Daily",
+ "project": "Foundations",
+ "id": "5f6c8325-9256-4578-86d8-ad9984ccb4b1",
+ "savedPayload": {
+ "position": {
+ "x": 34857.703435720294,
+ "y": 19450.79385920175
+ },
+ "targetPosition": {
+ "x": 34920.07694296562,
+ "y": 19157.349578981608
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "id": "678a567c-f08d-49b9-813b-4e54fd6afadb"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Candles",
+ "Product Definition",
+ "Foundations",
+ "fe6065ec-4d2d-47a0-bae0-8647f0e195d7"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Dataset Definition",
+ "Foundations",
+ "678a567c-f08d-49b9-813b-4e54fd6afadb"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Data Dependency",
+ "name": "Volumes Multi-Time-Frame-Daily",
+ "project": "Foundations",
+ "id": "3ecd2b4a-8339-4a90-bc57-771405c2fac6",
+ "savedPayload": {
+ "position": {
+ "x": 34649.17474508969,
+ "y": 19378.121956834537
+ },
+ "targetPosition": {
+ "x": 34920.07694296562,
+ "y": 19157.349578981608
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "id": "2e683057-f911-4105-bc77-16f2706d1915"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Volumes",
+ "Product Definition",
+ "Foundations",
+ "1a366aef-efef-470e-88e0-2a6fbe4dd91f"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Dataset Definition",
+ "Foundations",
+ "2e683057-f911-4105-bc77-16f2706d1915"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataMineDataDependencies": [],
+ "id": "9bd52f0c-2575-425c-97b4-91e00ccaa7b6",
+ "savedPayload": {
+ "position": {
+ "x": 35771.80004314583,
+ "y": 19156.531410872958
+ },
+ "targetPosition": {
+ "x": 35482.02229525911,
+ "y": 19078.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "statusReport": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "project": "Foundations",
+ "id": "fa60009c-41d9-4873-a2c8-189bc92ab157",
+ "savedPayload": {
+ "position": {
+ "x": 35694.15432961507,
+ "y": 19291.017731698168
+ },
+ "targetPosition": {
+ "x": 35482.02229525911,
+ "y": 19078.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "executionStartedEvent": {
+ "type": "Execution Started Event",
+ "name": "",
+ "project": "Foundations",
+ "id": "ffc31467-3fae-4842-ba76-dd22fd2b33c7",
+ "savedPayload": {
+ "position": {
+ "x": 35520.845152024485,
+ "y": 19223.774571285565
+ },
+ "targetPosition": {
+ "x": 35482.02229525911,
+ "y": 19078.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "id": "f29d08f9-e7c8-490c-8fca-14851a0d3dc3"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Daily",
+ "Process Definition",
+ "Foundations",
+ "980ceb1d-7be6-454f-90d9-01ba1fd4a65d"
+ ],
+ [
+ "New Execution Finished Event",
+ "Execution Finished Event",
+ "Foundations",
+ "f29d08f9-e7c8-490c-8fca-14851a0d3dc3"
+ ]
+ ]
+ }
+ },
+ "executionFinishedEvent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "project": "Foundations",
+ "id": "52fc064f-0ee1-41cb-9a78-5440e7e3e41b",
+ "savedPayload": {
+ "position": {
+ "x": 35404.37658172835,
+ "y": 19368.663445228925
+ },
+ "targetPosition": {
+ "x": 35482.02229525911,
+ "y": 19078.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "2b16d149-2eea-4cab-8632-a4cffd5c6bf1",
+ "savedPayload": {
+ "position": {
+ "x": 35209.02229525911,
+ "y": 18960.885697342204
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18748.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Process Definition",
+ "name": "Multi-Time-Frame-Market",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Produces the MVWAP.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}",
+ "project": "Foundations",
+ "processOutput": {
+ "type": "Process Output",
+ "name": "New Process Output",
+ "project": "Foundations",
+ "outputDatasets": [
+ {
+ "type": "Output Dataset",
+ "name": "Multi-Time-Frame-Market MVWAP",
+ "project": "Foundations",
+ "id": "c46a9d4a-ece8-457f-a57d-114a63fb71e4",
+ "savedPayload": {
+ "position": {
+ "x": 34630.5093366354,
+ "y": 19270.052420051492
+ },
+ "targetPosition": {
+ "x": 34692.882843880725,
+ "y": 18976.60813983135
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "id": "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Indicator Bot",
+ "Foundations",
+ "053d6fd9-217c-4469-9796-91021f2f0d53"
+ ],
+ [
+ "MVWAP",
+ "Product Definition",
+ "Foundations",
+ "0d93e7b6-08f8-4b07-b959-ee2f70d79e70"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Dataset Definition",
+ "Foundations",
+ "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2"
+ ]
+ ]
+ }
+ }
+ ],
+ "outputDatasetFolders": [],
+ "id": "74f07f4a-b353-4001-aee7-53ee538123d2",
+ "savedPayload": {
+ "position": {
+ "x": 35420.697882038476,
+ "y": 19309.75366298624
+ },
+ "targetPosition": {
+ "x": 35160.89026090314,
+ "y": 19159.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "processDependencies": {
+ "type": "Process Dependencies",
+ "name": "New Process Dependencies",
+ "project": "Foundations",
+ "statusDependencies": [
+ {
+ "type": "Status Dependency",
+ "name": "",
+ "config": "{\n \"mainUtility\": \"Self Reference\"\n}",
+ "project": "Foundations",
+ "id": "13bbfc30-1df3-43ec-bf3b-a7190ff5a2ca",
+ "savedPayload": {
+ "position": {
+ "x": 35562.49143128677,
+ "y": 19582.95299462608
+ },
+ "targetPosition": {
+ "x": 35310.89026090314,
+ "y": 19419.56128412157
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "id": "990cc769-d7dc-4cb3-af94-7e8815d69b8f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Indicator Bot",
+ "Foundations",
+ "053d6fd9-217c-4469-9796-91021f2f0d53"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "9789d117-c9bf-4525-a5a2-06faf5d974c4"
+ ],
+ [
+ "New Status Report",
+ "Status Report",
+ "Foundations",
+ "990cc769-d7dc-4cb3-af94-7e8815d69b8f"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Status Dependency",
+ "name": "Candles Volumes Multi-Time-Frame-Market",
+ "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}",
+ "project": "Foundations",
+ "id": "036ef5a5-6dab-42ec-b6f6-1919418fe3ad",
+ "savedPayload": {
+ "position": {
+ "x": 35499.686378218095,
+ "y": 19652.705072558663
+ },
+ "targetPosition": {
+ "x": 35310.89026090314,
+ "y": 19419.56128412157
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Status Report",
+ "name": "Candles Volumes Multi-Time-Frame-Market Status Report",
+ "id": "a0a61ba9-91cb-4ec7-92fe-134ff079de2d"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "9f683143-a33f-42c1-9fa8-c601f01ee4e1"
+ ],
+ [
+ "Candles Volumes Multi-Time-Frame-Market Status Report",
+ "Status Report",
+ "Foundations",
+ "a0a61ba9-91cb-4ec7-92fe-134ff079de2d"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataDependencies": [
+ {
+ "type": "Data Dependency",
+ "name": "Candles Multi-Time-Frame-Market",
+ "project": "Foundations",
+ "id": "cea62d1a-fb40-45b2-88af-7b864038e9e6",
+ "savedPayload": {
+ "position": {
+ "x": 35373.26376814847,
+ "y": 19713.005564341714
+ },
+ "targetPosition": {
+ "x": 35310.89026090314,
+ "y": 19419.56128412157
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "id": "2b03494a-67d6-47f1-89b6-53fc4c9116a8"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Candles",
+ "Product Definition",
+ "Foundations",
+ "fe6065ec-4d2d-47a0-bae0-8647f0e195d7"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Dataset Definition",
+ "Foundations",
+ "2b03494a-67d6-47f1-89b6-53fc4c9116a8"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Data Dependency",
+ "name": "Volumes Multi-Time-Frame-Market",
+ "project": "Foundations",
+ "id": "674a69ff-e1ec-4294-8b80-fa69ef2bfdc2",
+ "savedPayload": {
+ "position": {
+ "x": 35188.8692679804,
+ "y": 19693.624921414354
+ },
+ "targetPosition": {
+ "x": 35310.89026090314,
+ "y": 19419.56128412157
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "id": "9bf0483c-4825-4a46-9cf4-1b5262579fc1"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Volumes",
+ "Product Definition",
+ "Foundations",
+ "1a366aef-efef-470e-88e0-2a6fbe4dd91f"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Dataset Definition",
+ "Foundations",
+ "9bf0483c-4825-4a46-9cf4-1b5262579fc1"
+ ]
+ ]
+ }
+ }
+ ],
+ "dataMineDataDependencies": [],
+ "id": "91868fea-6d88-4aee-b326-41a1fdf17b0c",
+ "savedPayload": {
+ "position": {
+ "x": 35310.89026090314,
+ "y": 19419.56128412157
+ },
+ "targetPosition": {
+ "x": 35160.89026090314,
+ "y": 19159.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "statusReport": {
+ "type": "Status Report",
+ "name": "New Status Report",
+ "project": "Foundations",
+ "id": "990cc769-d7dc-4cb3-af94-7e8815d69b8f",
+ "savedPayload": {
+ "position": {
+ "x": 35160.89026090314,
+ "y": 19459.75366298624
+ },
+ "targetPosition": {
+ "x": 35160.89026090314,
+ "y": 19159.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "executionStartedEvent": {
+ "type": "Execution Started Event",
+ "name": "",
+ "project": "Foundations",
+ "id": "84c49f41-9da1-4566-b4c1-5c5b5151df2b",
+ "savedPayload": {
+ "position": {
+ "x": 35010.89026090314,
+ "y": 19419.56128412157
+ },
+ "targetPosition": {
+ "x": 35160.89026090314,
+ "y": 19159.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "id": "1824fa00-dd30-4cdc-acc0-01c2f29056c5"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Candles",
+ "Data Mine",
+ "Foundations",
+ "70c7eea3-a786-4dda-b526-0514e2cb14cc"
+ ],
+ [
+ "Candles Volumes",
+ "Indicator Bot",
+ "Foundations",
+ "285a4618-0423-4ac9-9df9-7a78be6fd915"
+ ],
+ [
+ "Multi-Time-Frame-Market",
+ "Process Definition",
+ "Foundations",
+ "9f683143-a33f-42c1-9fa8-c601f01ee4e1"
+ ],
+ [
+ "New Execution Finished Event",
+ "Execution Finished Event",
+ "Foundations",
+ "1824fa00-dd30-4cdc-acc0-01c2f29056c5"
+ ]
+ ]
+ }
+ },
+ "executionFinishedEvent": {
+ "type": "Execution Finished Event",
+ "name": "New Execution Finished Event",
+ "project": "Foundations",
+ "id": "633725a5-7f2d-4912-8804-1a7d927584dc",
+ "savedPayload": {
+ "position": {
+ "x": 34901.08263976781,
+ "y": 19309.75366298624
+ },
+ "targetPosition": {
+ "x": 35160.89026090314,
+ "y": 19159.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "9789d117-c9bf-4525-a5a2-06faf5d974c4",
+ "savedPayload": {
+ "position": {
+ "x": 34996.89026090314,
+ "y": 19048.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18748.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "products": [
+ {
+ "type": "Product Definition",
+ "name": "MVWAP",
+ "config": "{\n \"codeName\": \"Moving-VWAP\",\n \"singularVariableName\": \"MVWAP\",\n \"pluralVariableName\": \"MVWAPs\"\n}",
+ "project": "Foundations",
+ "datasets": [
+ {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Daily",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n }\n}",
+ "project": "Foundations",
+ "id": "d84addaf-b023-4ea8-8e15-b7576c911bb5",
+ "savedPayload": {
+ "position": {
+ "x": 34831.68856605925,
+ "y": 19257.192199520745
+ },
+ "targetPosition": {
+ "x": 34784.75822654718,
+ "y": 18960.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Dataset Definition",
+ "name": "Multi-Time-Frame-Market",
+ "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\"\n}",
+ "project": "Foundations",
+ "id": "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2",
+ "savedPayload": {
+ "position": {
+ "x": 34648.561076625316,
+ "y": 19228.187654598714
+ },
+ "targetPosition": {
+ "x": 34784.75822654718,
+ "y": 18960.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "record": {
+ "type": "Record Definition",
+ "name": "New Record Definition",
+ "project": "Foundations",
+ "properties": [
+ {
+ "type": "Record Property",
+ "name": "MVWAP1",
+ "config": "{\n \"codeName\": \"mvwap1\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Record Formula",
+ "code": "variable.mvwap1",
+ "project": "Foundations",
+ "id": "ef6bfa96-40e6-4474-8aa7-7cf4d548953e",
+ "savedPayload": {
+ "position": {
+ "x": 34504.37228022993,
+ "y": 19346.74023095271
+ },
+ "targetPosition": {
+ "x": 34509.60587585423,
+ "y": 19246.87727747725
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 1,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "8e4bfd43-e63d-4bfd-aa53-47c3da245ea4",
+ "savedPayload": {
+ "position": {
+ "x": 34509.60587585423,
+ "y": 19246.87727747725
+ },
+ "targetPosition": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "Begin",
+ "config": "{\n \"codeName\": \"begin\",\n \"isString\": false,\n \"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "record.current.begin",
+ "project": "Foundations",
+ "id": "3df0ae24-b1f6-4cea-9792-d7f1b447bfcc",
+ "savedPayload": {
+ "position": {
+ "x": 34354.064558786165,
+ "y": 19348.684017647694
+ },
+ "targetPosition": {
+ "x": 34435.760414038414,
+ "y": 19222.88343245588
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "479d4112-5211-4626-83b0-5232e294f516",
+ "savedPayload": {
+ "position": {
+ "x": 34435.760414038414,
+ "y": 19222.88343245588
+ },
+ "targetPosition": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "End",
+ "config": "{ \n\"codeName\": \"end\",\n\"isString\": false,\n\"isCalculated\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "record.current.end",
+ "project": "Foundations",
+ "id": "7f3e837f-97d1-4cdc-9c58-9c746b3f8720",
+ "savedPayload": {
+ "position": {
+ "x": 34250.15431203416,
+ "y": 19233.27999718593
+ },
+ "targetPosition": {
+ "x": 34383.805290662414,
+ "y": 19165.181422225
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "08003b07-39ee-4abf-8b87-3ae817d9d166",
+ "savedPayload": {
+ "position": {
+ "x": 34383.805290662414,
+ "y": 19165.181422225
+ },
+ "targetPosition": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "MVWAP2",
+ "config": "{\n \"codeName\": \"mvwap2\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Formula",
+ "code": "variable.mvwap2",
+ "project": "Foundations",
+ "id": "b8cc2197-7ef0-42d5-80f7-255a93151296",
+ "savedPayload": {
+ "position": {
+ "x": 34267.798885602024,
+ "y": 19083.998858203333
+ },
+ "targetPosition": {
+ "x": 34367.66183907748,
+ "y": 19089.232453827626
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "6ecdcfd8-804a-4ea4-97f6-aaa854f5453e",
+ "savedPayload": {
+ "position": {
+ "x": 34367.66183907748,
+ "y": 19089.232453827626
+ },
+ "targetPosition": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Record Property",
+ "name": "MVWAP3",
+ "config": "{\n \"codeName\": \"mvwap3\",\n \"isString\": false\n}",
+ "project": "Foundations",
+ "recordFormula": {
+ "type": "Record Formula",
+ "name": "New Record Formula",
+ "code": "variable.mvwap3",
+ "project": "Foundations",
+ "id": "368a40de-2142-4b5c-8992-483a4ab89f1a",
+ "savedPayload": {
+ "position": {
+ "x": 34307.78862730431,
+ "y": 18960.92308851031
+ },
+ "targetPosition": {
+ "x": 34391.655684098856,
+ "y": 19015.386992011816
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "5166bb7d-6d46-4c7c-a56f-ae4536d3114e",
+ "savedPayload": {
+ "position": {
+ "x": 34391.655684098856,
+ "y": 19015.386992011816
+ },
+ "targetPosition": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "f3a59ecc-efe7-4f0b-afdc-3eb2277247a6",
+ "savedPayload": {
+ "position": {
+ "x": 34517.45626929067,
+ "y": 19097.082847264068
+ },
+ "targetPosition": {
+ "x": 34784.75822654718,
+ "y": 18960.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "dataBuilding": {
+ "type": "Data Building Procedure",
+ "name": "New Data Building Procedure",
+ "project": "Foundations",
+ "loop": {
+ "type": "Procedure Loop",
+ "name": "New Procedure Loop",
+ "project": "Foundations",
+ "procedureJavascriptCode": {
+ "type": "Procedure Javascript Code",
+ "name": "New Procedure Javascript Code",
+ "code": "/* Loop Code */\nlet movingAvLen1 = 10;\nlet movingAvLen2 = 5;\t\t\nlet movingAvLen3 = 20;\nlet candle = record.current;\nlet volume = getElement('volumes', candle);\nlet AllVolume = volume.buy; // + volume.sell;\nlet MaxLen = Math.max(movingAvLen1, movingAvLen2, movingAvLen3);\n//variable.volBuy = AllVolume;\n\n\n// Calculate PriceVolume\nvariable.PVSum.push(calculatePV() );\n\nif (variable.PVSum.length > MaxLen) {\n variable.PVSum.splice(0, 1); // Remove the first element of the array to keep it at a maximum of movingAvLen1 elements (default 10) \n}\n\n// Add current volume to array\nvariable.VolSum.push(AllVolume);\n\nif (variable.VolSum.length > MaxLen) {\n variable.VolSum.splice(0, 1) // Remove the first element of the array to keep it at a maximum of movingAvLen1 elements (default 10) \n}\n\nvariable.mvwap1 = calculateVolSum(movingAvLen1);\nvariable.mvwap2 = calculateVolSum(movingAvLen2);\nvariable.mvwap3 = calculateVolSum(movingAvLen3);\n\n//////////////////\n// new functions\n\nfunction calculatePV()\t{\n\treturn (candle.close + candle.max + candle.min) / 3 * AllVolume;\n}\n\nfunction calculateVolSum(length) {\n\t/* We check we have enough values to make the calculation */\n if (variable.PVSum.length < length) { return 0 } // If not, define the value as zero.\n\t\n\tlet sum1 = 0 // Initialise sum variables. \n\tlet sum2 = 0 \n for (let i = variable.PVSum.length - length; i < variable.PVSum.length; i++) { // Iterate through the array\n sum1 = sum1 + variable.PVSum[i];\n\t\tsum2 = sum2 + variable.VolSum[i];\n }\n \n let MVWAP = sum1 / sum2;\n return MVWAP;\n}\n",
+ "project": "Foundations",
+ "id": "17c38500-0967-4ed8-8133-471b7ae8cdf9",
+ "savedPayload": {
+ "position": {
+ "x": 33928.303468470316,
+ "y": 19128.976127557315
+ },
+ "targetPosition": {
+ "x": 34208.37759641948,
+ "y": 19021.465742693726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "63ee4a6c-4ef7-4c90-b985-b7563e87f56f",
+ "savedPayload": {
+ "position": {
+ "x": 34208.37759641948,
+ "y": 19021.465742693726
+ },
+ "targetPosition": {
+ "x": 34488.45172436864,
+ "y": 18913.955357830135
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "initialization": {
+ "type": "Procedure Initialization",
+ "name": "New Procedure Initialization",
+ "project": "Foundations",
+ "procedureJavascriptCode": {
+ "type": "Procedure Javascript Code",
+ "name": "New Procedure Javascript Code",
+ "code": "variable.PVSum = []\nvariable.VolSum= []",
+ "project": "Foundations",
+ "id": "70e750a1-cd0b-4017-bb43-f6f98a61b3ba",
+ "savedPayload": {
+ "position": {
+ "x": 34022.164147494455,
+ "y": 18536.363123200234
+ },
+ "targetPosition": {
+ "x": 34255.307935931545,
+ "y": 18725.159240515182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "b04ba3ae-16ee-4885-b362-9cce885b61df",
+ "savedPayload": {
+ "position": {
+ "x": 34255.307935931545,
+ "y": 18725.159240515182
+ },
+ "targetPosition": {
+ "x": 34488.45172436864,
+ "y": 18913.955357830135
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1a1df272-90a1-49e6-92df-f05c376e9cc4",
+ "savedPayload": {
+ "position": {
+ "x": 34488.45172436864,
+ "y": 18913.955357830135
+ },
+ "targetPosition": {
+ "x": 34784.75822654718,
+ "y": 18960.885697342204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "0d93e7b6-08f8-4b07-b959-ee2f70d79e70",
+ "savedPayload": {
+ "position": {
+ "x": 34784.75822654718,
+ "y": 18960.885697342204
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18748.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Plotter Module",
+ "name": "MVWAP",
+ "id": "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "053d6fd9-217c-4469-9796-91021f2f0d53",
+ "savedPayload": {
+ "position": {
+ "x": 34996.89026090314,
+ "y": 18748.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "plotters": [
+ {
+ "type": "Plotter",
+ "name": "Keltner Channel",
+ "config": "{\n \"codeName\": \"PlotterKeltnerChannel\"\n}",
+ "project": "Foundations",
+ "modules": [
+ {
+ "type": "Plotter Module",
+ "name": "Keltner Channel",
+ "config": "{\n \"codeName\": \"keltner\",\n \"icon\": \"oscillator\"\n}",
+ "project": "Foundations",
+ "shapes": {
+ "type": "Shapes",
+ "name": "New Shapes",
+ "project": "Foundations",
+ "chartPoints": [
+ {
+ "type": "Chart Points",
+ "name": "New Chart Points",
+ "project": "Foundations",
+ "points": [
+ {
+ "type": "Point",
+ "name": "Upper Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.Upper",
+ "project": "Foundations",
+ "id": "1fe6c54b-965a-490e-aaa0-9e91d42e1225",
+ "savedPayload": {
+ "position": {
+ "x": 34661.85906606672,
+ "y": 18814.701890036642
+ },
+ "targetPosition": {
+ "x": 34472.246850369556,
+ "y": 18935.830778657044
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "eadadd34-a8fc-4fbf-96ea-89d6ff20504f",
+ "savedPayload": {
+ "position": {
+ "x": 34472.246850369556,
+ "y": 18935.830778657044
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "Upper End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.Upper",
+ "project": "Foundations",
+ "id": "e94919ff-a90f-48ad-9ae0-499da910e8db",
+ "savedPayload": {
+ "position": {
+ "x": 34708.48195738203,
+ "y": 19202.404013131956
+ },
+ "targetPosition": {
+ "x": 34495.558296027215,
+ "y": 19129.681840204703
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "a3126212-4048-4e00-8bdd-af5c33b8e291",
+ "savedPayload": {
+ "position": {
+ "x": 34495.558296027215,
+ "y": 19129.681840204703
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "Lower Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.Lower",
+ "project": "Foundations",
+ "id": "15981871-4e85-470a-a00d-36720fd49a62",
+ "savedPayload": {
+ "position": {
+ "x": 34396.4835054141,
+ "y": 19374.677599775503
+ },
+ "targetPosition": {
+ "x": 34358.53388183354,
+ "y": 19268.771622276152
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "092721ff-a16d-44a4-a396-89e7926d3625",
+ "savedPayload": {
+ "position": {
+ "x": 34358.53388183354,
+ "y": 19268.771622276152
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "Lower End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.Lower",
+ "project": "Foundations",
+ "id": "fb5be4b7-1000-47c6-a94d-b2dbbfbaca47",
+ "savedPayload": {
+ "position": {
+ "x": 34105.21636236135,
+ "y": 19344.064189446926
+ },
+ "targetPosition": {
+ "x": 34164.355786465036,
+ "y": 19248.3626820571
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "95ff8e74-7261-433c-9b0f-78a6f2f633a5",
+ "savedPayload": {
+ "position": {
+ "x": 34164.355786465036,
+ "y": 19248.3626820571
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "Mid Point Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.midPoint",
+ "project": "Foundations",
+ "id": "e2ccbb12-3d7e-4acb-844b-f9b301130178",
+ "savedPayload": {
+ "position": {
+ "x": 33947.548797032025,
+ "y": 19097.25521805978
+ },
+ "targetPosition": {
+ "x": 34059.244076245486,
+ "y": 19083.823367799007
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "d56911f2-08d6-47a3-81ad-418a915a8d6c",
+ "savedPayload": {
+ "position": {
+ "x": 34059.244076245486,
+ "y": 19083.823367799007
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "Mid Point End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.midPoint",
+ "project": "Foundations",
+ "id": "7d7be680-07e5-4224-8368-31823bd15e56",
+ "savedPayload": {
+ "position": {
+ "x": 34042.20770195132,
+ "y": 18820.1028750541
+ },
+ "targetPosition": {
+ "x": 34122.35001285835,
+ "y": 18899.05513912855
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7ddf6ba1-b696-44ea-a0df-9717f0ce94db",
+ "savedPayload": {
+ "position": {
+ "x": 34122.35001285835,
+ "y": 18899.05513912855
+ },
+ "targetPosition": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 2,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "9aaac874-f08b-4253-b9bc-a7f3541a1f08",
+ "savedPayload": {
+ "position": {
+ "x": 34282.6346346724,
+ "y": 19056.95966727745
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18609.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "polygons": [
+ {
+ "type": "Polygon",
+ "name": "Upper",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.3,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}",
+ "project": "Foundations",
+ "id": "72efdcea-34cc-4b0f-b81d-baad3222185e",
+ "savedPayload": {
+ "position": {
+ "x": 34160.33483498095,
+ "y": 19431.54598285769
+ },
+ "targetPosition": {
+ "x": 34144.63404810807,
+ "y": 19131.95712243132
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "566b1429-a7e9-4cdf-9701-50daac479e24",
+ "savedPayload": {
+ "position": {
+ "x": 34144.63404810807,
+ "y": 19131.95712243132
+ },
+ "targetPosition": {
+ "x": 34128.93326123519,
+ "y": 18832.368262004944
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " Upper Begin",
+ "project": "Foundations",
+ "id": "c3d21569-eebe-4eb8-a142-5315f87ab4ca",
+ "savedPayload": {
+ "position": {
+ "x": 33928.19407932753,
+ "y": 19055.311709648162
+ },
+ "targetPosition": {
+ "x": 34128.93326123519,
+ "y": 18832.368262004944
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Upper Begin",
+ "id": "eadadd34-a8fc-4fbf-96ea-89d6ff20504f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Upper Begin",
+ "Point",
+ "Foundations",
+ "eadadd34-a8fc-4fbf-96ea-89d6ff20504f"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " Upper End",
+ "project": "Foundations",
+ "id": "9b7d10f2-1d9e-40e8-b7b4-f91493db86fe",
+ "savedPayload": {
+ "position": {
+ "x": 33829.34440080881,
+ "y": 18848.069048877827
+ },
+ "targetPosition": {
+ "x": 34128.93326123519,
+ "y": 18832.368262004944
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Upper End",
+ "id": "a3126212-4048-4e00-8bdd-af5c33b8e291"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Upper End",
+ "Point",
+ "Foundations",
+ "a3126212-4048-4e00-8bdd-af5c33b8e291"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "eae5b9d1-5f86-4669-9fac-c656b84ac4f1",
+ "savedPayload": {
+ "position": {
+ "x": 34128.93326123519,
+ "y": 18832.368262004944
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18609.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Polygon",
+ "name": "Lower",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.3,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}",
+ "project": "Foundations",
+ "id": "53e41ab6-14b1-425e-82a0-394103315285",
+ "savedPayload": {
+ "position": {
+ "x": 33709.444741913685,
+ "y": 19175.000662374307
+ },
+ "targetPosition": {
+ "x": 33872.836452418196,
+ "y": 18923.39949199068
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "9ed21a92-a6c0-4f9e-b22c-23f528b0b0a0",
+ "savedPayload": {
+ "position": {
+ "x": 33872.836452418196,
+ "y": 18923.39949199068
+ },
+ "targetPosition": {
+ "x": 34036.2281629227,
+ "y": 18671.798321607053
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " Lower Begin",
+ "project": "Foundations",
+ "id": "e778c4d5-975b-4821-9483-6e41ddf283a1",
+ "savedPayload": {
+ "position": {
+ "x": 33742.78388270256,
+ "y": 18734.17182885238
+ },
+ "targetPosition": {
+ "x": 34036.2281629227,
+ "y": 18671.798321607053
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Lower Begin",
+ "id": "092721ff-a16d-44a4-a396-89e7926d3625"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Lower Begin",
+ "Point",
+ "Foundations",
+ "092721ff-a16d-44a4-a396-89e7926d3625"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " Lower End",
+ "project": "Foundations",
+ "id": "05347dbc-3075-4967-b5a8-666d4cdb131f",
+ "savedPayload": {
+ "position": {
+ "x": 33784.62699253907,
+ "y": 18508.406611102546
+ },
+ "targetPosition": {
+ "x": 34036.2281629227,
+ "y": 18671.798321607053
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Lower End",
+ "id": "95ff8e74-7261-433c-9b0f-78a6f2f633a5"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Lower End",
+ "Point",
+ "Foundations",
+ "95ff8e74-7261-433c-9b0f-78a6f2f633a5"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "983dd24c-8dfd-4e9b-94ae-be479e59e37d",
+ "savedPayload": {
+ "position": {
+ "x": 34036.2281629227,
+ "y": 18671.798321607053
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18609.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Polygon",
+ "name": "Mid Point",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 5,\n 5\n ],\n \"paletteColor\": \"UI_COLOR.MANGANESE_PURPLE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.5,\n \"lineWidth\": 2,\n \"lineDash\": [\n 5,\n 5\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}",
+ "project": "Foundations",
+ "id": "e8131923-c3b3-4d53-a68d-fafcb47e7e5c",
+ "savedPayload": {
+ "position": {
+ "x": 54129.8707465767,
+ "y": 24314.753439790686
+ },
+ "targetPosition": {
+ "x": 54409.94487452586,
+ "y": 24207.243054927094
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "5f090d8f-b443-4c66-959a-d9ad8bfc346f",
+ "savedPayload": {
+ "position": {
+ "x": 33911.94487452587,
+ "y": 18633.24305492709
+ },
+ "targetPosition": {
+ "x": 34192.01900247503,
+ "y": 18525.732670063502
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " Mid Point Begin",
+ "project": "Foundations",
+ "id": "13b06082-50cc-4e47-bf9c-ae32e4a2751b",
+ "savedPayload": {
+ "position": {
+ "x": 33917.95536518225,
+ "y": 18403.71167714076
+ },
+ "targetPosition": {
+ "x": 34192.01900247503,
+ "y": 18525.732670063502
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Mid Point Begin",
+ "id": "d56911f2-08d6-47a3-81ad-418a915a8d6c"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Mid Point Begin",
+ "Point",
+ "Foundations",
+ "d56911f2-08d6-47a3-81ad-418a915a8d6c"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " Mid Point End",
+ "project": "Foundations",
+ "id": "004812f4-c081-4e03-867f-a81d982cc412",
+ "savedPayload": {
+ "position": {
+ "x": 34084.50861761144,
+ "y": 18245.65854211434
+ },
+ "targetPosition": {
+ "x": 34192.01900247503,
+ "y": 18525.732670063502
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "Mid Point End",
+ "id": "7ddf6ba1-b696-44ea-a0df-9717f0ce94db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter",
+ "Foundations",
+ "964976a0-0546-434f-994b-36c5cd03437e"
+ ],
+ [
+ "Keltner Channel",
+ "Plotter Module",
+ "Foundations",
+ "32f94206-6147-48df-9860-c94793356f85"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "8f211d0d-ea26-4f02-8135-4ecc38675f56"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "9aaac874-f08b-4253-b9bc-a7f3541a1f08"
+ ],
+ [
+ "Mid Point End",
+ "Point",
+ "Foundations",
+ "7ddf6ba1-b696-44ea-a0df-9717f0ce94db"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "8047e156-7d45-43ff-ba7a-df4057a2aae9",
+ "savedPayload": {
+ "position": {
+ "x": 34055.60880585006,
+ "y": 18487.403821438988
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18609.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "images": [],
+ "texts": [],
+ "id": "8f211d0d-ea26-4f02-8135-4ecc38675f56",
+ "savedPayload": {
+ "position": {
+ "x": 34137.08263976781,
+ "y": 18598.75366298624
+ },
+ "targetPosition": {
+ "x": 34396.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "panels": [
+ {
+ "type": "Plotter Panel",
+ "name": "Keltner Channel",
+ "config": "{\n \"codeName\": \"keltner\"\n}",
+ "project": "Foundations",
+ "panelData": [
+ {
+ "type": "Panel Data",
+ "name": "Upper",
+ "config": "{\n \"valueDecimals\": 2\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "Upper",
+ "code": "record.Upper",
+ "project": "Foundations",
+ "id": "b7357217-4ca8-411b-9790-bb9a75e6fd41",
+ "savedPayload": {
+ "position": {
+ "x": 33919.86482200751,
+ "y": 18719.232435497055
+ },
+ "targetPosition": {
+ "x": 34069.86482200751,
+ "y": 18459.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "e7d9afb8-d1c5-430f-bd37-e89fe36354e4",
+ "savedPayload": {
+ "position": {
+ "x": 33769.86482200751,
+ "y": 18459.424814361726
+ },
+ "targetPosition": {
+ "x": 34069.86482200751,
+ "y": 18459.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3de77949-632a-4d45-a6b1-5f1bc76e3b77",
+ "savedPayload": {
+ "position": {
+ "x": 34069.86482200751,
+ "y": 18459.424814361726
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "Lower",
+ "config": "{\n \"valueDecimals\": 2\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.Lower",
+ "project": "Foundations",
+ "id": "251be44e-7fd5-48d6-a8cb-3c61e8daff55",
+ "savedPayload": {
+ "position": {
+ "x": 33769.86482200751,
+ "y": 18459.424814361726
+ },
+ "targetPosition": {
+ "x": 34029.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "3ff98377-3435-47c6-9b5d-f88a7085658e",
+ "savedPayload": {
+ "position": {
+ "x": 33769.86482200751,
+ "y": 18159.424814361726
+ },
+ "targetPosition": {
+ "x": 34029.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "43b20f0f-aafa-4b13-9efc-902be33ea670",
+ "savedPayload": {
+ "position": {
+ "x": 34029.672443142845,
+ "y": 18309.424814361726
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "Mid Point",
+ "config": "{\n \"valueDecimals\": 2\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.midPoint",
+ "project": "Foundations",
+ "id": "537702dd-be3f-44e5-91d9-965c03724606",
+ "savedPayload": {
+ "position": {
+ "x": 33769.86482200751,
+ "y": 18159.424814361726
+ },
+ "targetPosition": {
+ "x": 34069.86482200751,
+ "y": 18159.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.MANGANESE_PURPLE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "dd9e76aa-d927-47cb-b230-fd7d9b3de354",
+ "savedPayload": {
+ "position": {
+ "x": 33982.275018632485,
+ "y": 18083.94604185091
+ },
+ "targetPosition": {
+ "x": 34069.86482200751,
+ "y": 18159.424814361726
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "9dc52956-ac8d-4fa6-a1fc-439cce8f308e",
+ "savedPayload": {
+ "position": {
+ "x": 34069.86482200751,
+ "y": 18159.424814361726
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "ATR",
+ "config": "{\n \"valueDecimals\": 2\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.AverageTrueRange",
+ "project": "Foundations",
+ "id": "274174dd-5c5c-4d98-bfc3-45b7500b4a5a",
+ "savedPayload": {
+ "position": {
+ "x": 33919.86482200751,
+ "y": 17899.617193226397
+ },
+ "targetPosition": {
+ "x": 34179.672443142845,
+ "y": 18049.617193226397
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "e7589228-eb40-4902-abbf-616189293c6f",
+ "savedPayload": {
+ "position": {
+ "x": 34071.08263976781,
+ "y": 17743.94604185091
+ },
+ "targetPosition": {
+ "x": 34179.672443142845,
+ "y": 18049.617193226397
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3b6eea1b-4151-4534-9bc0-dc485c46ce68",
+ "savedPayload": {
+ "position": {
+ "x": 34179.672443142845,
+ "y": 18049.617193226397
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "Average ATR",
+ "config": "{\n \"valueDecimals\": 2\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.AverageATR",
+ "project": "Foundations",
+ "id": "926ae312-9817-44ff-aef3-c19d7ffc0eba",
+ "savedPayload": {
+ "position": {
+ "x": 34179.672443142845,
+ "y": 17749.617193226397
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18009.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.GREEN\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "c383e9ad-56cf-4c54-bbf9-72f4224cab8b",
+ "savedPayload": {
+ "position": {
+ "x": 34479.672443142845,
+ "y": 17749.617193226397
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18009.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "c56b9c1c-27ea-4d47-93ae-2e5f9f3b4692",
+ "savedPayload": {
+ "position": {
+ "x": 34329.672443142845,
+ "y": 18009.424814361726
+ },
+ "targetPosition": {
+ "x": 34329.672443142845,
+ "y": 18309.424814361726
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "3c346f09-ed7c-4011-aa5f-d82a6ee4c595",
+ "savedPayload": {
+ "position": {
+ "x": 34137.08263976781,
+ "y": 18298.75366298624
+ },
+ "targetPosition": {
+ "x": 34396.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "32f94206-6147-48df-9860-c94793356f85",
+ "savedPayload": {
+ "position": {
+ "x": 34396.89026090314,
+ "y": 18448.75366298624
+ },
+ "targetPosition": {
+ "x": 34696.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "964976a0-0546-434f-994b-36c5cd03437e",
+ "savedPayload": {
+ "position": {
+ "x": 34696.89026090314,
+ "y": 18448.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Plotter",
+ "name": "MVWAP",
+ "config": "{\n \"codeName\": \"Plotter MVWAP\"\n}",
+ "project": "Foundations",
+ "modules": [
+ {
+ "type": "Plotter Module",
+ "name": "MVWAP",
+ "config": "{\n \"codeName\": \"Module-MVWAP\",\n \"icon\": \"moving-average\"\n}",
+ "project": "Foundations",
+ "shapes": {
+ "type": "Shapes",
+ "name": "New Shapes",
+ "project": "Foundations",
+ "chartPoints": [
+ {
+ "type": "Chart Points",
+ "name": "New Chart Points",
+ "project": "Foundations",
+ "points": [
+ {
+ "type": "Point",
+ "name": "1 End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.mvwap1",
+ "project": "Foundations",
+ "id": "a3d71d3f-4bb7-45ee-bdef-b60e43c7f7be",
+ "savedPayload": {
+ "position": {
+ "x": 34165.74006624955,
+ "y": 17966.083362207424
+ },
+ "targetPosition": {
+ "x": 34361.42628963299,
+ "y": 17738.69184526379
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b",
+ "savedPayload": {
+ "position": {
+ "x": 34361.42628963299,
+ "y": 17738.69184526379
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "1 Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.mvwap1",
+ "project": "Foundations",
+ "id": "1e6af709-0c5a-411e-9d05-eee0a664c8ce",
+ "savedPayload": {
+ "position": {
+ "x": 34007.175159494436,
+ "y": 17751.235542912
+ },
+ "targetPosition": {
+ "x": 34282.14383625543,
+ "y": 17631.267935616077
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3f51f704-9795-4dca-bcee-da5c73744ae8",
+ "savedPayload": {
+ "position": {
+ "x": 34282.14383625543,
+ "y": 17631.267935616077
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "2 End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.mvwap2",
+ "project": "Foundations",
+ "id": "1ea966a8-127d-4d1e-a21b-b9e985dff279",
+ "savedPayload": {
+ "position": {
+ "x": 33957.53209014339,
+ "y": 17488.865611754358
+ },
+ "targetPosition": {
+ "x": 34257.3223015799,
+ "y": 17500.082970037256
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "8af146a1-40e2-44dd-b39f-bc72d644bb9e",
+ "savedPayload": {
+ "position": {
+ "x": 34257.3223015799,
+ "y": 17500.082970037256
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "2 Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.mvwap2",
+ "project": "Foundations",
+ "id": "639a2427-aa2b-4562-b5c1-534d21e55c11",
+ "savedPayload": {
+ "position": {
+ "x": 34026.64327691366,
+ "y": 17230.939151356317
+ },
+ "targetPosition": {
+ "x": 34291.87789496504,
+ "y": 17371.119739838236
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "6ee287b5-0e14-4661-b213-bc195cb30b46",
+ "savedPayload": {
+ "position": {
+ "x": 34291.87789496504,
+ "y": 17371.119739838236
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "3 End",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.end\ny = record.mvwap3",
+ "project": "Foundations",
+ "id": "4c18fc30-3ca6-4c7e-a872-3ec3bb712627",
+ "savedPayload": {
+ "position": {
+ "x": 34200.82040167232,
+ "y": 17028.541660460152
+ },
+ "targetPosition": {
+ "x": 34378.96645734437,
+ "y": 17269.92099439015
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "44bf5bf5-deb5-418b-8e01-1f88b5b4b179",
+ "savedPayload": {
+ "position": {
+ "x": 34378.96645734437,
+ "y": 17269.92099439015
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Point",
+ "name": "3 Begin",
+ "project": "Foundations",
+ "pointFormula": {
+ "type": "Point Formula",
+ "name": "New Point Formula",
+ "code": "x = record.begin\ny = record.previous.mvwap3",
+ "project": "Foundations",
+ "id": "dab80706-b152-494d-888b-2bb6ef77e82d",
+ "savedPayload": {
+ "position": {
+ "x": 34445.565548718674,
+ "y": 16921.760444380183
+ },
+ "targetPosition": {
+ "x": 34501.339030867544,
+ "y": 17216.53038635017
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1e16fe95-ec92-4e66-b06d-744b71f127ca",
+ "savedPayload": {
+ "position": {
+ "x": 34501.339030867544,
+ "y": 17216.53038635017
+ },
+ "targetPosition": {
+ "x": 34557.11251301642,
+ "y": 17511.300328320154
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "70e90fe5-e95e-4d30-8f3f-5f85c2450203",
+ "savedPayload": {
+ "position": {
+ "x": 34548.533692292665,
+ "y": 17557.587502870614
+ },
+ "targetPosition": {
+ "x": 34846.89026090314,
+ "y": 17588.94604185091
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "polygons": [
+ {
+ "type": "Polygon",
+ "name": "VWAP1",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.ULTRAMARINE_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}",
+ "project": "Foundations",
+ "id": "4f2953f0-0568-4ba5-98e6-793c04e124a2",
+ "savedPayload": {
+ "position": {
+ "x": 34024.76909240718,
+ "y": 17419.60843368902
+ },
+ "targetPosition": {
+ "x": 34324.357952833554,
+ "y": 17403.907646816137
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "b9b9e753-b188-42c7-8351-8bb69c04b5ef",
+ "savedPayload": {
+ "position": {
+ "x": 34324.357952833554,
+ "y": 17403.907646816137
+ },
+ "targetPosition": {
+ "x": 34623.94681325993,
+ "y": 17388.206859943253
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " 1 Begin",
+ "project": "Foundations",
+ "id": "740f091b-f0b4-431a-9e4a-bb81b3ce5fd6",
+ "savedPayload": {
+ "position": {
+ "x": 34401.00336561671,
+ "y": 17187.467678035595
+ },
+ "targetPosition": {
+ "x": 34623.94681325993,
+ "y": 17388.206859943253
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "1 Begin",
+ "id": "3f51f704-9795-4dca-bcee-da5c73744ae8"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "1 Begin",
+ "Point",
+ "Foundations",
+ "3f51f704-9795-4dca-bcee-da5c73744ae8"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " 1 End",
+ "project": "Foundations",
+ "id": "e7e2a2ec-86e9-4557-8e83-a1533169fdd0",
+ "savedPayload": {
+ "position": {
+ "x": 34608.246026387045,
+ "y": 17088.61799951688
+ },
+ "targetPosition": {
+ "x": 34623.94681325993,
+ "y": 17388.206859943253
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "1 End",
+ "id": "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "1 End",
+ "Point",
+ "Foundations",
+ "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "9610197b-2ee3-4216-a64f-c39426662712",
+ "savedPayload": {
+ "position": {
+ "x": 34623.94681325993,
+ "y": 17388.206859943253
+ },
+ "targetPosition": {
+ "x": 34846.89026090314,
+ "y": 17588.94604185091
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Polygon",
+ "name": "VWAP2",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 1.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.SKY_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}",
+ "project": "Foundations",
+ "id": "534dfc19-1446-4c09-8fb6-580559cadc02",
+ "savedPayload": {
+ "position": {
+ "x": 34281.31441289056,
+ "y": 16968.718340621752
+ },
+ "targetPosition": {
+ "x": 34532.91558327419,
+ "y": 17132.110051126263
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "6459ae72-d0f5-40ce-8626-a658ebe6bc86",
+ "savedPayload": {
+ "position": {
+ "x": 34532.91558327419,
+ "y": 17132.110051126263
+ },
+ "targetPosition": {
+ "x": 34784.516753657816,
+ "y": 17295.501761630767
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " 2 Begin",
+ "project": "Foundations",
+ "id": "dfdf6655-f57d-4df4-9281-f56c25505b11",
+ "savedPayload": {
+ "position": {
+ "x": 34722.14324641249,
+ "y": 17002.05748141063
+ },
+ "targetPosition": {
+ "x": 34784.516753657816,
+ "y": 17295.501761630767
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "2 Begin",
+ "id": "6ee287b5-0e14-4661-b213-bc195cb30b46"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "2 Begin",
+ "Point",
+ "Foundations",
+ "6ee287b5-0e14-4661-b213-bc195cb30b46"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " 2 End",
+ "project": "Foundations",
+ "id": "36e094da-e034-49f8-9214-0aab6a237fb8",
+ "savedPayload": {
+ "position": {
+ "x": 34947.90846416232,
+ "y": 17043.90059124714
+ },
+ "targetPosition": {
+ "x": 34784.516753657816,
+ "y": 17295.501761630767
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "2 End",
+ "id": "8af146a1-40e2-44dd-b39f-bc72d644bb9e"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "2 End",
+ "Point",
+ "Foundations",
+ "8af146a1-40e2-44dd-b39f-bc72d644bb9e"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "07060d0d-1f1e-4f86-a1ad-1eb257d2da08",
+ "savedPayload": {
+ "position": {
+ "x": 34784.516753657816,
+ "y": 17295.501761630767
+ },
+ "targetPosition": {
+ "x": 34846.89026090314,
+ "y": 17588.94604185091
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Polygon",
+ "name": "VWAP3",
+ "project": "Foundations",
+ "polygonBorder": {
+ "type": "Polygon Border",
+ "name": "New Polygon Border",
+ "project": "Foundations",
+ "style": {
+ "type": "Style",
+ "name": "New Style",
+ "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 2.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.TRUE_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2.75,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}",
+ "project": "Foundations",
+ "id": "783ce799-6d4d-4375-87e3-5ac1fb63ed35",
+ "savedPayload": {
+ "position": {
+ "x": 34753.8904840987,
+ "y": 16754.73414865981
+ },
+ "targetPosition": {
+ "x": 34861.40086896229,
+ "y": 17034.80827660897
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "styleConditions": [],
+ "id": "b69d8381-bdae-4cda-ae70-628a4c3d3b07",
+ "savedPayload": {
+ "position": {
+ "x": 34861.40086896229,
+ "y": 17034.80827660897
+ },
+ "targetPosition": {
+ "x": 34968.911253825885,
+ "y": 17314.882404558128
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "polygonVertexes": [
+ {
+ "type": "Polygon Vertex",
+ "name": " 3 Begin",
+ "project": "Foundations",
+ "id": "a7d90d47-a1ed-4515-879d-cb7a47d3d538",
+ "savedPayload": {
+ "position": {
+ "x": 35090.93224674862,
+ "y": 17040.81876726535
+ },
+ "targetPosition": {
+ "x": 34968.911253825885,
+ "y": 17314.882404558128
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "3 Begin",
+ "id": "1e16fe95-ec92-4e66-b06d-744b71f127ca"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "3 Begin",
+ "Point",
+ "Foundations",
+ "1e16fe95-ec92-4e66-b06d-744b71f127ca"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Polygon Vertex",
+ "name": " 3 End",
+ "project": "Foundations",
+ "id": "33600057-d3ae-46c1-a4e6-2a9eadb841cc",
+ "savedPayload": {
+ "position": {
+ "x": 35248.98538177504,
+ "y": 17207.37201969454
+ },
+ "targetPosition": {
+ "x": 34968.911253825885,
+ "y": 17314.882404558128
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Point",
+ "name": "3 End",
+ "id": "44bf5bf5-deb5-418b-8e01-1f88b5b4b179"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "quantum",
+ "Data Mine",
+ "Foundations",
+ "c605cc22-976a-4661-afbd-f735d6f8f8d9"
+ ],
+ [
+ "MVWAP",
+ "Plotter",
+ "Foundations",
+ "d9335835-0c95-4a98-9c42-bad2fb3e8625"
+ ],
+ [
+ "MVWAP",
+ "Plotter Module",
+ "Foundations",
+ "6acec7f3-960f-4747-a675-e5961a67d2fd"
+ ],
+ [
+ "New Shapes",
+ "Shapes",
+ "Foundations",
+ "337b350d-42df-441e-b6fa-1f42901dd52b"
+ ],
+ [
+ "New Chart Points",
+ "Chart Points",
+ "Foundations",
+ "70e90fe5-e95e-4d30-8f3f-5f85c2450203"
+ ],
+ [
+ "3 End",
+ "Point",
+ "Foundations",
+ "44bf5bf5-deb5-418b-8e01-1f88b5b4b179"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "4ac279a5-f593-4e57-975e-a6cd3beea1ff",
+ "savedPayload": {
+ "position": {
+ "x": 34968.911253825885,
+ "y": 17314.882404558128
+ },
+ "targetPosition": {
+ "x": 34846.89026090314,
+ "y": 17588.94604185091
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "images": [],
+ "texts": [],
+ "id": "337b350d-42df-441e-b6fa-1f42901dd52b",
+ "savedPayload": {
+ "position": {
+ "x": 34846.89026090314,
+ "y": 17588.94604185091
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 17848.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "panels": [
+ {
+ "type": "Plotter Panel",
+ "name": "MVWAP",
+ "config": "{\n \"codeName\": \"MVWAP\",\n \"isLegacy\": false\n}",
+ "project": "Foundations",
+ "panelData": [
+ {
+ "type": "Panel Data",
+ "name": "MVWAP10",
+ "config": "{\n \"valueDecimals\": 0\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.mvwap1",
+ "project": "Foundations",
+ "id": "4cbc5c03-82be-4db7-b5bf-460291f33a4c",
+ "savedPayload": {
+ "position": {
+ "x": 35334.343595569226,
+ "y": 17108.97591509952
+ },
+ "targetPosition": {
+ "x": 35334.343595569226,
+ "y": 17408.97591509952
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.ULTRAMARINE_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "d6eb5d47-59f1-424c-963f-f8cfc3852a56",
+ "savedPayload": {
+ "position": {
+ "x": 35484.343595569226,
+ "y": 17149.16829396419
+ },
+ "targetPosition": {
+ "x": 35334.343595569226,
+ "y": 17408.97591509952
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "48e7bb41-87eb-44b4-9b6b-12d550dfdcc3",
+ "savedPayload": {
+ "position": {
+ "x": 35334.343595569226,
+ "y": 17408.97591509952
+ },
+ "targetPosition": {
+ "x": 35256.697882038476,
+ "y": 17698.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "MVWAP5",
+ "config": "{\n \"valueDecimals\": 0\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.mvwap2",
+ "project": "Foundations",
+ "id": "d268e7dd-6ca5-4c60-bffe-78a3a2061d5d",
+ "savedPayload": {
+ "position": {
+ "x": 35666.5055031738,
+ "y": 17288.94604185091
+ },
+ "targetPosition": {
+ "x": 35516.5055031738,
+ "y": 17548.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.SKY_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "b8931bdd-e69e-4eda-9401-c3d2efa5148e",
+ "savedPayload": {
+ "position": {
+ "x": 35816.5055031738,
+ "y": 17548.75366298624
+ },
+ "targetPosition": {
+ "x": 35516.5055031738,
+ "y": 17548.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "aa49c607-112f-49bf-88df-4e3fe6d653c6",
+ "savedPayload": {
+ "position": {
+ "x": 35516.5055031738,
+ "y": 17548.75366298624
+ },
+ "targetPosition": {
+ "x": 35256.697882038476,
+ "y": 17698.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Panel Data",
+ "name": "MVWAP20",
+ "config": "{\n \"valueDecimals\": 0\n}",
+ "project": "Foundations",
+ "dataFormula": {
+ "type": "Data Formula",
+ "name": "New Data Formula",
+ "code": "record.mvwap3",
+ "project": "Foundations",
+ "id": "0b605c7c-5b89-4296-8271-283aebd45f43",
+ "savedPayload": {
+ "position": {
+ "x": 35836.25337781192,
+ "y": 17698.75366298624
+ },
+ "targetPosition": {
+ "x": 35546.4756299252,
+ "y": 17776.399376516994
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "textStyle": {
+ "type": "Text Style",
+ "name": "New Text Style",
+ "config": "{\n \"paletteColor\": \"UI_COLOR.TRUE_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}",
+ "project": "Foundations",
+ "id": "5f40143c-249d-405a-80b4-6f10b1027ed5",
+ "savedPayload": {
+ "position": {
+ "x": 35758.60766428116,
+ "y": 17988.531410872958
+ },
+ "targetPosition": {
+ "x": 35546.4756299252,
+ "y": 17776.399376516994
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "5ec16890-5aee-47ae-904e-9ca9bbd485d0",
+ "savedPayload": {
+ "position": {
+ "x": 35546.4756299252,
+ "y": 17776.399376516994
+ },
+ "targetPosition": {
+ "x": 35256.697882038476,
+ "y": 17698.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "4b891f79-86a4-43ab-8e04-6041602d6c10",
+ "savedPayload": {
+ "position": {
+ "x": 35256.697882038476,
+ "y": 17698.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 17848.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "6acec7f3-960f-4747-a675-e5961a67d2fd",
+ "savedPayload": {
+ "position": {
+ "x": 34996.89026090314,
+ "y": 17848.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18148.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "d9335835-0c95-4a98-9c42-bad2fb3e8625",
+ "savedPayload": {
+ "position": {
+ "x": 34996.89026090314,
+ "y": 18148.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "id": "c605cc22-976a-4661-afbd-f735d6f8f8d9",
+ "savedPayload": {
+ "position": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "targetPosition": {
+ "x": 34996.89026090314,
+ "y": 18448.75366298624
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/Plugins/Trading-Mines/Masters.json b/Projects/Foundations/Plugins/Trading-Mines/Masters.json
index 36d3009b3..028f14daf 100644
--- a/Projects/Foundations/Plugins/Trading-Mines/Masters.json
+++ b/Projects/Foundations/Plugins/Trading-Mines/Masters.json
@@ -9604,7 +9604,7 @@
},
{
"type": "Bot Data Dependencies",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"dataDependencies": [
{
@@ -9646,7 +9646,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -9706,7 +9706,7 @@
"63b3bd4b-97da-47a7-8f72-b9eaf0632ebb"
],
[
- "Relative Strenght Index (RSI)",
+ "Relative Strength Index (RSI)",
"Indicator Bot",
"Foundations",
"b2fc1830-30e3-407a-9cd2-ab93a9e36cc7"
@@ -16872,7 +16872,7 @@
"botDataDependencies": [
{
"type": "Bot Data Dependencies",
- "name": "Relative Strenght Index - Wilder Method (RSI-W)",
+ "name": "Relative Strength Index - Wilder Method (RSI-W)",
"project": "Foundations",
"dataDependencies": [
{
diff --git a/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json b/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json
index 9f0835618..444a563c0 100644
--- a/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json
+++ b/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json
@@ -166,11 +166,11 @@
},
{
"type": "Task",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"bot": {
"type": "Indicator Bot Instance",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
"project": "Foundations",
"processes": [
@@ -2736,7 +2736,7 @@
},
{
"type": "Bot Products",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"dataProducts": [
{
@@ -21362,7 +21362,7 @@
},
{
"type": "Bot Layers",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"layers": [
{
@@ -31933,7 +31933,7 @@
},
{
"type": "Bot Layers",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"layers": [
{
diff --git a/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json b/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json
index 3116aedf9..0147bfaed 100644
--- a/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json
+++ b/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json
@@ -408,17 +408,17 @@
},
{
"type": "Task",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"bot": {
"type": "Indicator Bot Instance",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}",
"project": "Foundations",
"processes": [
{
"type": "Indicator Process Instance",
- "name": "Relative Strenght Index (RSI) Multi-Time-Frame-Market",
+ "name": "Relative Strength Index (RSI) Multi-Time-Frame-Market",
"project": "Foundations",
"id": "ffa5490a-b87c-4d25-a0bf-3a978ba22521",
"savedPayload": {
@@ -450,7 +450,7 @@
},
{
"type": "Indicator Process Instance",
- "name": "Relative Strenght Index (RSI) Multi-Time-Frame-Daily",
+ "name": "Relative Strength Index (RSI) Multi-Time-Frame-Daily",
"project": "Foundations",
"id": "69ff12a5-65b8-4d00-ad9d-329f502aab42",
"savedPayload": {
@@ -3601,7 +3601,7 @@
},
{
"type": "Bot Products",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"dataProducts": [
{
@@ -25409,7 +25409,7 @@
},
{
"type": "Bot Layers",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"layers": [
{
@@ -39990,7 +39990,7 @@
},
{
"type": "Bot Layers",
- "name": "Relative Strenght Index (RSI)",
+ "name": "Relative Strength Index (RSI)",
"project": "Foundations",
"layers": [
{
diff --git a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js
index 2f7bc485b..4ebe10379 100644
--- a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js
+++ b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js
@@ -2,7 +2,9 @@ exports.newFoundationsUtilitiesFilesAndDirectories = function () {
let thisObject = {
getDirectories: getDirectories,
- getAllFilesInDirectoryAndSubdirectories: getAllFilesInDirectoryAndSubdirectories
+ getAllFilesInDirectoryAndSubdirectories: getAllFilesInDirectoryAndSubdirectories,
+ pathFromDate: pathFromDate,
+ mkDirByPathSync: mkDirByPathSync
}
return thisObject
@@ -51,4 +53,49 @@ exports.newFoundationsUtilitiesFilesAndDirectories = function () {
return files.reduce((a, f) => a.concat(f), []);
}
}
+
+ function pathFromDate(timestamp) {
+ let file = { date: new Date(timestamp) }
+ file.year = file.date.getUTCFullYear()
+ file.month = file.date.getUTCMonth() + 1
+ file.day = file.date.getUTCDate()
+ return file.year + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2)
+ }
+
+ /* Function to create folders of missing folders at any path. */
+ function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
+ const path = require('path')
+
+ targetDir = targetDir.substring(0, targetDir.lastIndexOf('/') + 1);
+
+ const sep = '/';
+ const initDir = path.isAbsolute(targetDir) ? sep : '';
+ const baseDir = isRelativeToScript ? __dirname : '.';
+
+ return targetDir.split(sep).reduce((parentDir, childDir) => {
+ const curDir = path.resolve(baseDir, parentDir, childDir);
+ try {
+ const fs = require('fs')
+ fs.mkdirSync(curDir);
+ } catch (err) {
+ if (err.code === 'EEXIST') { // curDir already exists!
+ return curDir;
+ }
+
+ // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
+ if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
+ throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
+ }
+
+ const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
+ if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
+ throw err; // Throw if it's just the last created dir.
+ }
+ }
+
+ return curDir;
+ }, initDir);
+ }
}
\ No newline at end of file
diff --git a/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js
index 27c00cff2..992619b39 100644
--- a/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js
+++ b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js
@@ -1,7 +1,8 @@
exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
let thisObject = {
- genereteUniqueId: genereteUniqueId
+ genereteUniqueId: genereteUniqueId,
+ pad: pad
}
return thisObject
@@ -12,4 +13,9 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
return v.toString(16)
})
}
+
+ function pad(str, max) {
+ str = str.toString();
+ return str.length < max ? pad("0" + str, max) : str;
+ }
}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json b/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json
index 3a505ceef..f08aa1ce2 100644
--- a/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json
+++ b/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json
@@ -7,13 +7,6 @@
"relatedUiObject": "Network",
"actionFunction": "payload.executeAction"
},
- {
- "action": "Add UI Object",
- "label": "Add Tutorial",
- "iconProject": "Education",
- "relatedUiObject": "Tutorial",
- "actionFunction": "payload.executeAction"
- },
{
"action": "Add UI Object",
"label": "Add Plugins",
diff --git a/Projects/Foundations/Schemas/App-Schema/space-settings.json b/Projects/Foundations/Schemas/App-Schema/space-settings.json
index 079349f18..d4d21f643 100644
--- a/Projects/Foundations/Schemas/App-Schema/space-settings.json
+++ b/Projects/Foundations/Schemas/App-Schema/space-settings.json
@@ -9,7 +9,7 @@
"config": true
},
"initialValues": {
- "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"}}"
+ "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"} \n }"
},
"menuItems": [
{
diff --git a/Projects/Foundations/Schemas/App-Schema/spaces.json b/Projects/Foundations/Schemas/App-Schema/spaces.json
index 3da28cce9..c3bc5754d 100644
--- a/Projects/Foundations/Schemas/App-Schema/spaces.json
+++ b/Projects/Foundations/Schemas/App-Schema/spaces.json
@@ -13,12 +13,6 @@
"relatedUiObject": "Design Space",
"actionFunction": "payload.executeAction"
},
- {
- "action": "Add UI Object",
- "label": "Add Docs Space",
- "relatedUiObject": "Docs Space",
- "actionFunction": "payload.executeAction"
- },
{
"action": "Delete UI Object",
"askConfirmation": true,
diff --git a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json
index 5aecde6da..c39e88e0e 100644
--- a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json
+++ b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json
@@ -16,26 +16,50 @@
{
"style": "Subtitle",
"text": "Properties",
- "updated": 1609863924784
+ "updated": 1631554214199
},
{
"style": "List",
- "text": "node refers to every node in the design space."
+ "text": "\"physics\" determines whether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes.",
+ "updated": 1631588883144
},
{
"style": "List",
- "text": "radiusPercentage is the radius of the circular nodes' menu applied as a percentage of an arbitrary default radius.",
- "updated": 1609863960583
+ "text": "detachUsingMouse defines if you can detach nodes from it's parent or reference parents only using the mouse (when true) or if you can not use the mouse for that and can only do it using the detach buttons on the icon's menu (when false)."
+ },
+ {
+ "style": "Subtitle",
+ "text": "Node Properties"
},
{
"style": "List",
- "text": "massPercentage is the refernce mass of nodes that affect the attraction and repulsion of the environment's pysics whe the physics setting is set to true.",
- "updated": 1609863964761
+ "text": "\"node\" here refers to every node in the design space. This collection of properties adjusts the settings of all nodes in the design space.",
+ "updated": 1631588871268
},
{
"style": "List",
- "text": "menuItem refers to the items on the right-hand side of nodes' menus.",
- "updated": 1609863969621
+ "text": "distancePercentage adjusts the baseline distance between nodes.",
+ "updated": 1631588124341
+ },
+ {
+ "style": "List",
+ "text": "radiusPercentage is the radius of the circular nodes' menu applied as a percentage of an arbitrary default radius. A higher value will lead to a larger node menu.",
+ "updated": 1631588202567
+ },
+ {
+ "style": "List",
+ "text": "massPercentage is the reference mass of nodes that affects the attraction and repulsion of the environment's physics when the physics setting is set to true.",
+ "updated": 1631588798797
+ },
+ {
+ "style": "List",
+ "text": "animationSteps adjusts the amount of steps the animation takes to open a node menu upon hovering over it. A higher value leads to smoother transtion.",
+ "updated": 1631588728860
+ },
+ {
+ "style": "List",
+ "text": "menuItem refers to the items on the right-hand side of a node's menus and has the following three properties.",
+ "updated": 1631588761551
},
{
"style": "List",
@@ -50,15 +74,7 @@
{
"style": "List",
"text": "radiusPercentage is the reference radious of the circular matrix that governs the distribution of items in the circular menu. Larger numbers cause items to spread appart while smaller numbers makes items lie closer to each other.",
- "updated": 1609863985113
- },
- {
- "style": "List",
- "text": "physics determines wether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes."
- },
- {
- "style": "List",
- "text": "detachUsingMouse defines if you can detach nodes from it's parent or reference parents only using the mouse (when true) or if you can not use the mouse for that and can only do it using the detach buttons on the icon's menu (when false)."
+ "updated": 1631554041849
},
{
"style": "Subtitle",
diff --git a/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json b/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json
index 45e9fe125..113a9beaf 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json
@@ -160,8 +160,8 @@
},
{
"style": "Javascript",
- "text": "productPluralVariable[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-n].propertyName",
- "updated": 1624868076284
+ "text": "productName[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-n].propertyName",
+ "updated": 1625193412334
},
{
"style": "Text",
@@ -175,8 +175,8 @@
},
{
"style": "Javascript",
- "text": "chart.at01hs.candles[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-5].max",
- "updated": 1624868093927
+ "text": "chart.at01hs.candle[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-5].max",
+ "updated": 1625193408514
},
{
"style": "Text",
diff --git a/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js b/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js
index a928504a8..d45ca4cc6 100644
--- a/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js
+++ b/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js
@@ -922,8 +922,8 @@ exports.newFoundationsBotModulesFetchingProcess = function (processIndex) {
file.month = file.date.getUTCMonth() + 1
file.day = file.date.getUTCDate()
let dateForPath = file.year + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2)
/* We will need to save this at the Status Report */
contextVariables.lastFile = file.date
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js
index 8bd814581..7fdba9a41 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js
@@ -270,8 +270,8 @@
/* Telling the world we are alive and doing well */
let currentDateString =
processDate.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
let currentDate = new Date(processDate)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage)
@@ -322,8 +322,8 @@
try {
let dateForPath =
previousDay.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2);
let fileName = "Data.json"
let filePathRoot =
'Project/' +
@@ -368,8 +368,8 @@
try {
let dateForPath =
processDate.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
let fileName = "Data.json"
let filePathRoot =
'Project/' +
@@ -584,8 +584,8 @@
let dateForPath =
processDate.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
let fileName = 'Data.json';
let filePath =
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT +
@@ -654,8 +654,8 @@
let dateForPath =
processDate.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2);
let fileName = 'Data.json';
let filePath =
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT +
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js
index a5f2add12..77415d46e 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js
@@ -406,7 +406,7 @@
}
/* Telling the world we are alive and doing well */
- let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2);
+ let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2);
let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(
processIndex,
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js
index cb7d5f138..83cf08131 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js
@@ -232,8 +232,8 @@
/* Telling the world we are alive and doing well */
let currentDateString =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let currentDate = new Date(contextVariables.datetimeLastProducedFile)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage)
@@ -272,8 +272,8 @@
function nextCandleFile() {
let dateForPath =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let fileName = "Data.json"
let filePathRoot =
@@ -396,7 +396,7 @@
function nextVolumeFile() {
try {
- let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
+ let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
let fileName = "Data.json"
let filePathRoot =
'Project/' +
@@ -540,8 +540,8 @@
let fileName = 'Data.json';
let dateForPath =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let filePath =
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT +
"/Output/" +
@@ -588,8 +588,8 @@
let fileName = 'Data.json';
let dateForPath =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let filePath =
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT +
"/Output/" +
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js
index 1449400ed..0ca8fa025 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js
@@ -412,8 +412,8 @@
/* Telling the world we are alive and doing well */
let currentDateString =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
let currentDate = new Date(contextVariables.datetimeLastProducedFile)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage)
@@ -509,7 +509,7 @@
nextCandleFile();
function nextCandleFile() {
- let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
+ let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
let fileName = "Data.json"
let filePathRoot =
@@ -635,8 +635,8 @@
let dateForPath =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2);
let fileName = "Data.json"
let filePathRoot =
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js
index c0bd82e22..93c384207 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js
@@ -160,8 +160,8 @@ exports.newFoundationsBotModulesFromOneMinToMultiTimeFrameDaily = function (proc
file.month = file.date.getUTCMonth() + 1
file.day = file.date.getUTCDate()
let dateForPath = file.year + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2)
let fileName = 'Data.json'
let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT +
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js
index de57bc8ba..681896424 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js
@@ -275,8 +275,8 @@
/* Telling the world we are alive and doing well */
let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2)
let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage)
@@ -360,8 +360,8 @@
function getPreviousFile() {
let dateForPath = previousDay.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2)
let filePath
if (dependency.referenceParent.config.codeName === "Multi-Time-Frame-Daily") {
filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath;
@@ -412,8 +412,8 @@
function getCurrentFile() {
let dateForPath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2)
let filePath
if (dependency.referenceParent.config.codeName === "Multi-Time-Frame-Daily") {
filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath;
diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js
index efe597995..739a7dc5d 100644
--- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js
+++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js
@@ -224,7 +224,7 @@
}
/* Telling the world we are alive and doing well */
- let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2)
+ let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2)
let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(
processIndex,
diff --git a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js
index ab8b96dcf..7e2548f3f 100644
--- a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js
+++ b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js
@@ -317,7 +317,7 @@ exports.newFoundationsBotModulesLearningSimulation = function (processIndex) {
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
- let currentDateString = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
+ let currentDateString = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
let currentDate = new Date(heartBeatDate)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
/*
@@ -327,7 +327,7 @@ exports.newFoundationsBotModulesLearningSimulation = function (processIndex) {
if (heartBeatDate.valueOf() !== previousHeartBeatDate) {
previousHeartBeatDate = heartBeatDate.valueOf()
- let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
+ let processingDate = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.learningCurrent.learningEpisode.candle.index.value + ' @ ' + processingDate)
diff --git a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js
index a1f6f0253..527115ad3 100644
--- a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js
+++ b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js
@@ -258,8 +258,8 @@
let fileName = "Data.json"
let datetime = new Date(lastFile.valueOf())
let dateForPath = datetime.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + OHLCVS_FOLDER_NAME + '/' + dateForPath;
let fullFileName = filePath + '/' + fileName
fileStorage.getTextFile(fullFileName, onFileReceived)
@@ -368,7 +368,7 @@
/* Reporting we are doing well */
function heartBeat(noNewInternalLoop) {
let processingDate = new Date(since)
- processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
+ processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> Fetching OHLCVs @ " + processingDate + "-> exchange = " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name + " -> symbol = " + symbol + " -> since = " + since + " -> limit = " + limit)
let heartBeatText = "Fetching " + rawDataArray.length.toFixed(0) + " OHLCVs from " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name + " " + symbol + " @ " + processingDate
@@ -476,7 +476,7 @@
}
let processingDate = new Date(earliestMarketSince)
- processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
+ processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, "Invalid or No Start Date. Finding Market Start @ " + processingDate, 0)
}
}
@@ -494,6 +494,10 @@
while (foundDate !== true) {
+ if (new Date(since).valueOf() >= (new Date).setSeconds(0,0)) {
+ return OHLCVs
+ }
+
await new Promise(resolve => setTimeout(resolve, rateLimit)) // rate limit
const nextValidOHLCVs = useFetchTradesForFetchOHLCVs ?
await fetchTradesForOHLCV(symbol, '1m', since, limit, params) :
@@ -509,7 +513,7 @@
}
let processingDate = new Date(since)
- processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
+ processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, "No Data Found. Fast-Forwarding to Next Data @ " + processingDate, 0)
}
}
@@ -945,8 +949,8 @@
let processingDate = new Date(candle.begin)
processingDate =
processingDate.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> saveOHLCVs -> Before Fetch -> Saving OHLCVs @ " + processingDate + " -> ohlcvArrayIndex = " + ohlcvArrayIndex + " -> total = " + rawDataArray.length)
@@ -1048,8 +1052,8 @@
function getFilePath(timestamp, folderName) {
let datetime = new Date(timestamp)
let dateForPath = datetime.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + folderName + '/' + dateForPath;
return filePath
}
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js
index 35f3bf21b..4de4e1bb5 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js
@@ -1,7 +1,7 @@
-exports.newFoundationsBotModulesSnapshots = function (processIndex) {
+exports.newFoundationsBotModulesSnapshots = function(processIndex) {
/*
- This module encapsulates the snapshots functionality.
- */
+ This module encapsulates the snapshots functionality.
+ */
const MODULE_NAME = 'Snapshots'
let thisObject = {
@@ -28,20 +28,21 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
positions: []
}
- let positionKeys = new Map() // This is to prevent adding the same indicator / variable to the output collection.
+ let positionKeys = new Map() // This is to prevent adding the same indicator / variable to the output collection.
let strategyKeys = new Map()
- let createHeaders = true // This is going to be true only once
- let createCloseHeaders = true // This is going to be true only once
+ let createHeaders = true // This is going to be true only once
+ let createCloseHeaders = true // This is going to be true only once
let closeValues
let strategyValues
let addToStrategyValues
let positionValues
let addToPositionValues
+ let snapshotAvailable = false
/*
- These 3 are the main data structures available to users
- when writing conditions and formulas.
- */
+ These 3 are the main data structures available to users
+ when writing conditions and formulas.
+ */
let chart
let exchange
let market
@@ -52,6 +53,12 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
tradingEngine = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine
tradingSystem = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingSystem
sessionParameters = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters
+ // first trade forces overwrite of the existing file
+ if (tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value > 1) {
+ snapshotAvailable = true
+ createHeaders = false // This is going to be true only once
+ createCloseHeaders = false
+ }
}
function finalize() {
@@ -70,9 +77,9 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
function updateChart(pChart, pExchange, pMarket) {
/*
- We need these 3 data structures to be a local objects
- accessible while evaluating conditions and formulas.
- */
+ We need these 3 data structures to be a local objects
+ accessible while evaluating conditions and formulas.
+ */
chart = pChart
exchange = pExchange
market = pMarket
@@ -80,9 +87,9 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
function strategyEntry() {
/*
- We will record here a snapshot of all values used in conditions and formulas within the Trading System.
- If the strategy exists with a trade, this information will be added to the snapshots file.
- */
+ We will record here a snapshot of all values used in conditions and formulas within the Trading System.
+ If the strategy exists with a trade, this information will be added to the snapshots file.
+ */
strategyKeys = new Map()
strategyValues = []
@@ -147,24 +154,26 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
let property = schemaDocument.childrenNodesProperties[i]
switch (property.type) {
- case 'node': {
- if (property.name !== previousPropertyName) {
+ case 'node':
+ {
+ if (property.name !== previousPropertyName) {
+ if (node[property.name] !== undefined) {
+ evalNode(node[property.name])
+ }
+ previousPropertyName = property.name
+ }
+ break
+ }
+ case 'array':
+ {
if (node[property.name] !== undefined) {
- evalNode(node[property.name])
+ let nodePropertyArray = node[property.name]
+ for (let m = 0; m < nodePropertyArray.length; m++) {
+ evalNode(nodePropertyArray[m])
+ }
}
- previousPropertyName = property.name
+ break
}
- break
- }
- case 'array': {
- if (node[property.name] !== undefined) {
- let nodePropertyArray = node[property.name]
- for (let m = 0; m < nodePropertyArray.length; m++) {
- evalNode(nodePropertyArray[m])
- }
- }
- break
- }
}
}
}
@@ -173,10 +182,10 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
function evalCondition(node) {
/*
- The code can be at the condition node if it was done with the Conditions Editor, or it can also be
- at a Javascript Code node. If there is a Javascript object we will give it preference and take the code
- from there. Otherwise we will take the code from the Condition node.
- */
+ The code can be at the condition node if it was done with the Conditions Editor, or it can also be
+ at a Javascript Code node. If there is a Javascript object we will give it preference and take the code
+ from there. Otherwise we will take the code from the Condition node.
+ */
let nodeWithCode = node
if (node.javascriptCode !== undefined) {
@@ -211,14 +220,15 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
instruction = instruction.replace(/!==/g, '')
instruction = instruction.replace(/==/g, '')
instruction = instruction.replace(/===/g, '')
- instruction = instruction.replace(/{/g, '')
- instruction = instruction.replace(/}/g, '')
+ instruction = instruction.replace(/{/g, '') //this wrecks something in JS markup?
+ instruction = instruction.replace(/}/g, '') //this wrecks something in JS markup?
if (instruction.indexOf('chart') >= 0) {
let parts = instruction.split('.')
let timeFrame = parts[1]
let product = parts[2]
let property
checkPrevious(3)
+
function checkPrevious(index) {
property = parts[index]
if (property === 'previous') {
@@ -295,17 +305,17 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type']
closeValues = [
- tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value, // Position Number
- (new Date(openDatetime)).toISOString(), // Open Datetime
- (new Date(closeDatetime)).toISOString(), // Open Datetime
- tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name
- tradingEngine.tradingCurrent.strategy.situationName.value, // Trigger On Situation
- tradingEngine.tradingCurrent.position.situationName.value, // Take Position Situation
- tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value, // Result in Base Asset
- tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value, // Result in Base Asset
- tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, // ROI in Base Asseet
- tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset
- tradingEngine.tradingCurrent.position.exitType.value // Exit Type
+ tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value, // Position Number
+ (new Date(openDatetime)).toISOString(), // Open Datetime
+ (new Date(closeDatetime)).toISOString(), // Open Datetime
+ tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name
+ tradingEngine.tradingCurrent.strategy.situationName.value, // Trigger On Situation
+ tradingEngine.tradingCurrent.position.situationName.value, // Take Position Situation
+ tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value, // Result in Base Asset
+ tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value, // Result in Base Asset
+ tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, // ROI in Base Asseet
+ tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset
+ tradingEngine.tradingCurrent.position.exitType.value // Exit Type
]
if (createCloseHeaders === true) {
@@ -333,46 +343,95 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) {
try {
let fileStorage = TS.projects.foundations.taskModules.fileStorage.newFileStorage(processIndex);
- let fileContent = "";
- let separator = "\r\n";
+ let fileName = pFileName + '.csv'
- parseRecord(snapshots.headers)
-
- for (let i = 0; i < snapshotArray.length; i++) {
- let record = snapshotArray[i];
- parseRecord(record)
- }
-
- function parseRecord(record) {
- for (let j = 0; j < record.length; j++) {
- let property = record[j]
-
- fileContent = fileContent + '' + property
- if (j !== record.length - 1) {
- fileContent = fileContent + ","
- }
- }
- fileContent = fileContent + separator
- }
-
- fileContent = "" + fileContent + "";
-
- let fileName = pFileName + '.csv';
- let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + "/" + SNAPSHOTS_FOLDER_NAME;
+ let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + SNAPSHOTS_FOLDER_NAME;
filePath += '/' + fileName
- fileStorage.createTextFile(filePath, fileContent + '\n', onFileCreated);
+ //Get contents of current file if available, otherwise start empty file
+ if (snapshotAvailable) {
+ getSnapShotFile(filePath)
+ } else {
+ writeOutput('')
+ }
- function onFileCreated(err) {
- if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
- TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> err = " + err.stack);
- TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> filePath = " + filePath);
- TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> market = " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "_" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName);
+ function writeOutput(fileContent) {
+ let separator = '\r\n';
+
+ parseRecord(snapshots.headers)
+
+ for (let i = 0; i < snapshotArray.length; i++) {
+ let record = snapshotArray[i];
+ parseRecord(record)
+ }
+
+ function parseRecord(record) {
+ for (let j = 0; j < record.length; j++) {
+ let property = record[j]
+
+ fileContent = fileContent + '' + property
+ if (j !== record.length - 1) {
+ fileContent = fileContent + ","
+ }
+ }
+ fileContent = fileContent + separator
+ }
+
+ fileContent = "" + fileContent + "";
+
+ fileStorage.createTextFile(filePath, fileContent + '\n', onFileCreated)
+
+ function onFileCreated(err) {
+ if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> err = ' + err.stack);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> filePath = ' + filePath);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> market = ' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + '_' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName);
+ }
}
}
+
+ } catch (err) {
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(
+ processIndex
+ ).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(
+ MODULE_NAME,
+ '[ERROR] writeSnapshotFile -> err = ' + err.stack
+ )
}
- catch (err) {
- TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> err = " + err.stack);
+ //get file contents
+ function getSnapShotFile(filePath) {
+
+ try {
+
+ let fileStorage = TS.projects.foundations.taskModules.fileStorage.newFileStorage(processIndex);
+
+ fileStorage.getTextFile(filePath, onFileReceived)
+
+ function onFileReceived(err, text) {
+ if (err.result === TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
+ try {
+ writeOutput(text)
+ } catch (err) {
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> fileName = ' + filePath);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.');
+ callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
+ }
+ } else {
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath);
+ TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err;
+ callBackFunction(err)
+ }
+ }
+
+ } catch (error) {
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack);
+ TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath);
+ TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err;
+ callBackFunction(err);
+ }
}
}
}
\ No newline at end of file
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js
index 0be553078..bcc9a2a6a 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js
@@ -88,7 +88,8 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) {
This will happen when the sessionParameters.timeRange.config.initialDatetime is beyond the last candle available,
meaning that the dataSet needs to be updated with more up-to-date data.
*/
- TS.projects.foundations.functionLibraries.sessionFunctions.stopSession(processIndex, 'Data is not up-to-date enough. Please start the Masters Data Mining Operation.')
+ console.log('DEBUGGING ..................', initialCandle, candles.length)
+ TS.projects.foundations.functionLibraries.sessionFunctions.stopSession(processIndex, 'Data is not up-to-date enough. Please start the Data Mining Operation.')
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[IMPORTANT] runSimulation -> Data is not up-to-date enough. Stopping the Session now. ')
return
@@ -307,7 +308,7 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) {
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
- let currentDateString = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
+ let currentDateString = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
let currentDate = new Date(heartBeatDate)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
/*
@@ -317,7 +318,7 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) {
if (heartBeatDate.valueOf() !== previousHeartBeatDate) {
previousHeartBeatDate = heartBeatDate.valueOf()
- let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
+ let processingDate = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + ' @ ' + processingDate)
diff --git a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js
index df57c8548..d80fb517a 100644
--- a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js
+++ b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js
@@ -241,7 +241,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
processDate
) {
/* Telling the world we are alive and doing well and which date we are processing right now. */
- let processingDateString = processDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2)
+ let processingDateString = processDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, processingDateString, undefined, "Running...")
/*
@@ -327,7 +327,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
async function getDataFileFromDate(dataFileDate) {
- let dateForPath = dataFileDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCDate(), 2)
+ let dateForPath = dataFileDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCDate(), 2)
let filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath
let fileName = "Data.json"
diff --git a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js
index 17358b319..7300d33b0 100644
--- a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js
+++ b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js
@@ -329,8 +329,8 @@ exports.newFoundationsFunctionLibrariesFromOneMinToMultiTimeFrameFunctions = fun
/* Telling the world we are alive and doing well */
let currentDateString =
contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let currentDate = new Date(contextVariables.datetimeLastProducedFile)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage)
@@ -360,8 +360,8 @@ exports.newFoundationsFunctionLibrariesFromOneMinToMultiTimeFrameFunctions = fun
const ONE_MIN_DATASET_TYPE = "One-Min"
let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
- TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' +
+ SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2)
let fileName = "Data.json"
diff --git a/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js b/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js
index 6efcdbe5e..35daf7769 100644
--- a/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js
+++ b/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js
@@ -117,7 +117,7 @@ exports.newFoundationsFunctionLibrariesOutputManagementFunctions = function () {
if (dataset.config.type === 'Daily Files') {
- let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2);
+ let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2);
let fileName = 'Data.json'
let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + dataset.parentNode.config.codeName + '/' + dataset.config.codeName + '/' + timeFrameLabel + "/" + dateForPath
@@ -181,7 +181,7 @@ exports.newFoundationsFunctionLibrariesOutputManagementFunctions = function () {
if (dataset.config.type === 'Daily Files') {
- let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2);
+ let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2);
let fileName = 'Data.json'
let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + dataset.parentNode.config.codeName + '/' + dataset.config.codeName + '/' + timeFrameLabel + "/" + dateForPath
diff --git a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js
index fe7426af1..b0904da95 100644
--- a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js
+++ b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js
@@ -563,7 +563,7 @@
let dateForPath = ''
if (processingDailyFiles === true) {
- dateForPath = "/" + currentDay.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCDate(), 2);
+ dateForPath = "/" + currentDay.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCDate(), 2);
}
let filePathRoot = 'Project/' + contextSummary.project + "/" + contextSummary.mineType + "/" + contextSummary.dataMine + "/" + contextSummary.bot + '/' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
diff --git a/Projects/Foundations/TS/Task-Modules/FileStorage.js b/Projects/Foundations/TS/Task-Modules/FileStorage.js
index 0d3cb7c62..a680fd6ab 100644
--- a/Projects/Foundations/TS/Task-Modules/FileStorage.js
+++ b/Projects/Foundations/TS/Task-Modules/FileStorage.js
@@ -8,16 +8,17 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
let thisObject = {
asyncGetTextFile: asyncGetTextFile,
- asyncCreateTextFile: asyncCreateTextFile,
+ asyncCreateTextFile: asyncCreateTextFile,
getTextFile: getTextFile,
createTextFile: createTextFile,
deleteTextFile: deleteTextFile
}
-
+
let logger
if (TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT === undefined) { // Dummy logger
logger = {}
+
function write() {
}
@@ -31,16 +32,17 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
/* This function allows its caller to work with async / await instead of callbacks */
let promise = new Promise((resolve, reject) => {
- getTextFile(filePath, onFileRead, noRetry, canUsePrevious)
+ getTextFile(filePath, onFileRead, noRetry, canUsePrevious)
+
function onFileRead(err, text) {
-
+
let response = {
err: err,
text: text
}
resolve(response)
}
- })
+ })
return promise
}
@@ -49,15 +51,16 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
/* This function allows its caller to work with async / await instead of callbacks */
let promise = new Promise((resolve, reject) => {
- createTextFile(filePath, fileContent, onFileWriten, keepPrevious, noTemp)
+ createTextFile(filePath, fileContent, onFileWriten, keepPrevious, noTemp)
+
function onFileWriten(err) {
-
+
let response = {
err: err
}
resolve(response)
}
- })
+ })
return promise
}
@@ -78,8 +81,13 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
fileLocation = global.env.PATH_TO_PROJECTS + '/' + filePath
mustBeJason = false
} else {
+ if (filePath.indexOf('.csv') > 0) {
+ mustBeJason = false
+ } else {
+ mustBeJason = true
+ }
fileLocation = global.env.PATH_TO_DATA_STORAGE + '/' + filePath
- mustBeJason = true
+
}
try {
@@ -145,7 +153,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
}
/*
- We are going to check if the file is a valir JSON object
+ We are going to check if the file is a valid JSON object
*/
try {
let jsonCheck = JSON.parse(text.toString())
@@ -244,7 +252,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
logger.write(MODULE_NAME, '[INFO] FileStorage -> createTextFile -> fileLocation: ' + fileLocation)
/* If necesary a folder or folders are created before writing the file to disk. */
- TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(fileLocation)
+ SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(fileLocation)
/*
Here we write the file with a temporary name so as to avoid dirty read from other processes.
@@ -457,7 +465,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
let request = http.get(url, onResponse);
- request.on('error', function (err) {
+ request.on('error', function(err) {
logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> err = " + err.stack);
logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> Failed to fetch file via HTTP. Will retry later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -498,4 +506,4 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) {
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
}
}
-}
+}
\ No newline at end of file
diff --git a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
index 502378e7d..98d21a40d 100644
--- a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
+++ b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
@@ -2,9 +2,7 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
let thisObject = {
truncateToThisPrecision: truncateToThisPrecision,
- pad: pad,
- asyncGetDatasetFile: asyncGetDatasetFile,
- mkDirByPathSync: mkDirByPathSync
+ asyncGetDatasetFile: asyncGetDatasetFile
}
return thisObject
@@ -13,11 +11,6 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
return parseFloat(floatNumber.toFixed(precision))
}
- function pad(str, max) {
- str = str.toString();
- return str.length < max ? pad("0" + str, max) : str;
- }
-
async function asyncGetDatasetFile(datasetModule, filePath, fileName) {
/*
This function helps a caller to use await syntax while the called
@@ -39,38 +32,4 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
return promise
}
- /* Function to create folders of missing folders at any path. */
- function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
- const path = require('path')
-
- targetDir = targetDir.substring(0, targetDir.lastIndexOf('/') + 1);
-
- const sep = '/';
- const initDir = path.isAbsolute(targetDir) ? sep : '';
- const baseDir = isRelativeToScript ? __dirname : '.';
-
- return targetDir.split(sep).reduce((parentDir, childDir) => {
- const curDir = path.resolve(baseDir, parentDir, childDir);
- try {
- const fs = require('fs')
- fs.mkdirSync(curDir);
- } catch (err) {
- if (err.code === 'EEXIST') { // curDir already exists!
- return curDir;
- }
-
- // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
- if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
- throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
- }
-
- const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
- if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
- throw err; // Throw if it's just the last created dir.
- }
- }
-
- return curDir;
- }, initDir);
- }
}
\ No newline at end of file
diff --git a/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js b/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js
index b37988487..52103191d 100644
--- a/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js
+++ b/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js
@@ -779,6 +779,50 @@ function newFoundationsActionSwitch() {
UI.projects.foundations.functionLibraries.socialBotsFunctions.sendSlackTestMessage(action.node, action.callBackFunction)
}
break
+ case 'Copy Position':
+ {
+ UI.projects.foundations.utilities.clipboard.copyTextToClipboard( action.node.payload.position.x + ';' + action.node.payload.position.y)
+ action.node.payload.uiObject.setInfoMessage('Position copied')
+ }
+ break
+ case 'Snap to Position':
+ {
+ navigator.clipboard.readText()
+ .then(text => {
+ //console.log('Pasted content: ', text);
+ let newPosition = {
+ x: 0,
+ y: 0
+ }
+ let newVector = {
+ x: 0,
+ y: 0
+ }
+ let positionArray = text.split(";",2)
+
+ newPosition.x = positionArray[0]
+ newPosition.y = positionArray[1]
+
+ if (newPosition.x >= 0 && newPosition.x <= UI.projects.foundations.spaces.floatingSpace.container.frame.width) {
+ newVector.x = newPosition.x - action.node.payload.position.x
+
+ if (newPosition.y >= 0 && newPosition.y <= UI.projects.foundations.spaces.floatingSpace.container.frame.height) {
+
+ newVector.y = newPosition.y - action.node.payload.position.y
+ action.node.payload.floatingObject.container.displace(newVector)
+ action.node.payload.uiObject.setInfoMessage('Snapped to new position')
+ }
+ }
+ else {
+ action.node.payload.uiObject.setErrorMessage('[Error]:Failed to read clipboard contents')
+ }
+ })
+ .catch(err => {
+ console.error('[Error]:Failed to read clipboard contents: ', err);
+ action.node.payload.uiObject.setErrorMessage('[Error]:Failed to read clipboard contents')
+ });
+ }
+ break
}
}
}
diff --git a/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js b/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js
index ea882f97e..719ca6569 100644
--- a/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js
@@ -129,7 +129,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
if (environment.id !== node.payload.referenceParent.id) { continue }
let market = UI.projects.foundations.utilities.meshes.findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false)
if (market.payload.referenceParent === undefined) { continue }
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, session, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, session, true) === true) {
createTimeMachine(node, session, market.payload.referenceParent, networkNode, rootNodes)
}
}
@@ -320,13 +320,13 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
let testingTradingTasks = UI.projects.foundations.utilities.branches.findInBranch(networkNode, 'Testing Trading Tasks', node, true)
let productionTradingTasks = UI.projects.foundations.utilities.branches.findInBranch(networkNode, 'Production Trading Tasks', node, true)
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, testingTradingTasks, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, testingTradingTasks, true) === true) {
let dashboard = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard')
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dashboard, testingTradingTasks)
dashboard.name = testingTradingTasks.type + ' ' + networkNode.name
}
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, productionTradingTasks, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, productionTradingTasks, true) === true) {
let dashboard = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard')
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dashboard, productionTradingTasks)
dashboard.name = productionTradingTasks.type + ' ' + networkNode.name
@@ -345,7 +345,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
if (rootNode.type === project + ' Project') {
let projectDefinition = rootNode.projectDefinition
if (projectDefinition !== undefined) {
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Project Dashboards', undefined, project)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
diff --git a/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js b/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js
index 209017880..a1d60b35d 100644
--- a/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js
@@ -290,9 +290,9 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
function installTheRestOfTheBranch(projectDataTasks) {
- let exchangeDataTasks = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectDataTasks, 'Exchange Data Tasks', cryptoExchange)
+ let exchangeDataTasks = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectDataTasks, 'Exchange Data Tasks', cryptoExchange)
exchangeDataTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketDataTask = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeDataTasks, 'Market Data Tasks', market, rootNodes)
+ let marketDataTask = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeDataTasks, 'Market Data Tasks', market, rootNodes)
UI.projects.foundations.utilities.menu.menuClick(marketDataTask, 'Add Missing Data Mine Tasks', true)
UI.projects.foundations.utilities.menu.menuClickOfNodeArray(marketDataTask.dataMineTasks, 'Add All Tasks', true)
@@ -323,9 +323,9 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
function installTheRestOfTheBranch(projectLearningTasks) {
- let exchangeLearningTasks = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectLearningTasks, 'Exchange Learning Tasks', cryptoExchange)
+ let exchangeLearningTasks = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectLearningTasks, 'Exchange Learning Tasks', cryptoExchange)
exchangeLearningTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketLearningTask = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeLearningTasks, 'Market Learning Tasks', market, rootNodes)
+ let marketLearningTask = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeLearningTasks, 'Market Learning Tasks', market, rootNodes)
UI.projects.foundations.utilities.menu.menuClick(marketLearningTask, 'Add Missing Learning Mine Tasks', true)
UI.projects.foundations.utilities.menu.menuClickOfNodeArray(marketLearningTask.learningMineTasks, 'Add All Tasks', true)
@@ -377,9 +377,9 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
function installTheRestOfTheBranch(projectTradingTasks) {
- let exchangeTradingTasks = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectTradingTasks, 'Exchange Trading Tasks', cryptoExchange)
+ let exchangeTradingTasks = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectTradingTasks, 'Exchange Trading Tasks', cryptoExchange)
exchangeTradingTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketTradingTask = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeTradingTasks, 'Market Trading Tasks', market, rootNodes)
+ let marketTradingTask = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeTradingTasks, 'Market Trading Tasks', market, rootNodes)
UI.projects.foundations.utilities.menu.menuClick(marketTradingTask, 'Add Missing Trading Mine Tasks', true)
UI.projects.foundations.utilities.menu.menuClickOfNodeArray(marketTradingTask.tradingMineTasks, 'Add All Tasks', true)
@@ -429,9 +429,9 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
function installTheRestOfTheBranch(projectDataProducts) {
- let exchangeDataProducts = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectDataProducts, 'Exchange Data Products', cryptoExchange)
+ let exchangeDataProducts = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectDataProducts, 'Exchange Data Products', cryptoExchange)
exchangeDataProducts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketDataProducts = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeDataProducts, 'Market Data Products', market, rootNodes)
+ let marketDataProducts = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeDataProducts, 'Market Data Products', market, rootNodes)
marketDataProducts.payload.floatingObject.collapseToggle()
UI.projects.foundations.utilities.menu.menuClick(marketDataProducts, 'Add All Data Mine Products', true)
@@ -469,16 +469,16 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
function installTheRestOfTheBranch(projectLearningProducts) {
- let exchangeLearningProducts = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectLearningProducts, 'Exchange Learning Products', cryptoExchange)
+ let exchangeLearningProducts = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectLearningProducts, 'Exchange Learning Products', cryptoExchange)
exchangeLearningProducts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketLearningProducts = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeLearningProducts, 'Market Learning Products', market, rootNodes)
+ let marketLearningProducts = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeLearningProducts, 'Market Learning Products', market, rootNodes)
marketLearningProducts.payload.floatingObject.collapseToggle()
/*
Create the new session references.
*/
for (let i = 0; i < learningSessionsCreatedArray.length; i++) {
let session = learningSessionsCreatedArray[i]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(marketLearningProducts, session, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(marketLearningProducts, session, true) === true) {
UI.projects.foundations.functionLibraries.dataStorageFunctions.createSessionReference(marketLearningProducts, session, 'Learning Session Reference')
}
}
@@ -524,16 +524,16 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
function installTheRestOfTheBranch(projectTradingProducts) {
- let exchangeTradingProducts = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectTradingProducts, 'Exchange Trading Products', cryptoExchange)
+ let exchangeTradingProducts = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectTradingProducts, 'Exchange Trading Products', cryptoExchange)
exchangeTradingProducts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
- let marketTradingProducts = UI.projects.foundations.utilities.children.findAndRecreateChildWithReference(exchangeTradingProducts, 'Market Trading Products', market, rootNodes)
+ let marketTradingProducts = UI.projects.foundations.utilities.nodeChildren.findAndRecreateChildWithReference(exchangeTradingProducts, 'Market Trading Products', market, rootNodes)
marketTradingProducts.payload.floatingObject.collapseToggle()
/*
Create the new session references.
*/
for (let i = 0; i < tradingSessionsCreatedArray.length; i++) {
let session = tradingSessionsCreatedArray[i]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(marketTradingProducts, session, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(marketTradingProducts, session, true) === true) {
UI.projects.foundations.functionLibraries.dataStorageFunctions.createSessionReference(marketTradingProducts, session, 'Trading Session Reference')
}
}
@@ -574,7 +574,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
If the Dashboard we need is not already there we create a new one.
*/
let arrayItem = dashboardsArray[i]
- let dashboard = UI.projects.foundations.utilities.children.findOrCreateChildWithReference(projectDashboards, 'Dashboard', arrayItem.environmentNode)
+ let dashboard = UI.projects.foundations.utilities.nodeChildren.findOrCreateChildWithReference(projectDashboards, 'Dashboard', arrayItem.environmentNode)
dashboard.name = arrayItem.environmentNode.type + ' ' + arrayItem.networkNode.name
/*
We delete all the existing Time Machines related to the market we are currently installing.
diff --git a/Projects/Foundations/UI/Function-Libraries/DataStorageFunctions.js b/Projects/Foundations/UI/Function-Libraries/DataStorageFunctions.js
index a7462281e..394789321 100644
--- a/Projects/Foundations/UI/Function-Libraries/DataStorageFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/DataStorageFunctions.js
@@ -123,7 +123,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
/* We will filter out all the sessions that does not belong to the market we are in */
let marketTradingTasks = UI.projects.foundations.utilities.meshes.findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false)
if (node.payload.referenceParent.id !== marketTradingTasks.payload.referenceParent.id) { continue }
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, session, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, session, true) === true) {
createSessionReference(node, session, 'Trading Session Reference')
}
}
@@ -146,7 +146,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
/* We will filter out all the sessions that does not belong to the market we are in */
let marketLearningTasks = UI.projects.foundations.utilities.meshes.findNodeInNodeMesh(session, 'Market Learning Tasks', undefined, true, false, true, false)
if (node.payload.referenceParent.id !== marketLearningTasks.payload.referenceParent.id) { continue }
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, session, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, session, true) === true) {
createSessionReference(node, session, 'Learning Session Reference')
}
}
@@ -177,7 +177,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
for (let i = 0; i < marketsArray.length; i++) {
let market = marketsArray[i]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, market, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, market, true) === true) {
let marketDataProducts = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(marketDataProducts, market)
}
@@ -205,7 +205,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
let cryptoExchanges = cryptoEcosystem.cryptoExchanges[j]
for (let k = 0; k < cryptoExchanges.exchanges.length; k++) {
let cryptoExchange = cryptoExchanges.exchanges[k]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, cryptoExchange, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, cryptoExchange, true) === true) {
let exchange = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(exchange, cryptoExchange)
}
@@ -238,7 +238,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
if (rootNode.type === project + ' Project') {
let projectDefinition = rootNode.projectDefinition
if (projectDefinition !== undefined) {
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType, undefined, project)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
diff --git a/Projects/Foundations/UI/Function-Libraries/PluginsFunctions.js b/Projects/Foundations/UI/Function-Libraries/PluginsFunctions.js
index 6ea796a76..7e4db38a0 100644
--- a/Projects/Foundations/UI/Function-Libraries/PluginsFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/PluginsFunctions.js
@@ -22,7 +22,7 @@ function newFoundationsFunctionLibraryPluginsFunctions() {
for (let k = 0; k < PROJECTS_SCHEMA.length; k++) {
let projectDefinition = PROJECTS_SCHEMA[k]
let project = projectDefinition.name
- if (UI.projects.foundations.utilities.children.isMissingChildrenByName(node, project) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenByName(node, project) === true) {
let child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Plugin Project')
child.name = project
let config = JSON.parse(child.config)
@@ -42,7 +42,7 @@ function newFoundationsFunctionLibraryPluginsFunctions() {
for (let i = 0; i < projectDefinition.plugins.length; i++) {
let pluginType = "Plugin" + " " + projectDefinition.plugins[i]
- if (UI.projects.foundations.utilities.children.isMissingChildrenByType(node, pluginType) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenByType(node, pluginType) === true) {
UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, pluginType, undefined, project)
}
}
@@ -209,10 +209,10 @@ function newFoundationsFunctionLibraryPluginsFunctions() {
function installAsPlugin(node, rootNodes) {
let plugins = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Plugins')
- let pluginProject = UI.projects.foundations.utilities.children.findChildByCodeName(plugins, node.project)
+ let pluginProject = UI.projects.foundations.utilities.nodeChildren.findChildByCodeName(plugins, node.project)
let pluginFolderName = UI.projects.foundations.utilities.plugins.getPluginFolderNamesByNodeType(node.type)
let pluginForlderNodeType = 'Plugin ' + pluginFolderName.replaceAll('-', ' ')
- let pluginFolderNode = UI.projects.foundations.utilities.children.findChildByType(pluginProject, pluginForlderNodeType)
+ let pluginFolderNode = UI.projects.foundations.utilities.nodeChildren.findChildByType(pluginProject, pluginForlderNodeType)
let pluginFile = UI.projects.foundations.utilities.plugins.addMissingPluginFile(pluginFolderNode, node.name, pluginFolderName, node.type, true)
node.isPlugin = true
diff --git a/Projects/Foundations/UI/Function-Libraries/ReferenceAttachDetach.js b/Projects/Foundations/UI/Function-Libraries/ReferenceAttachDetach.js
index fd6338f3b..0e82a6356 100644
--- a/Projects/Foundations/UI/Function-Libraries/ReferenceAttachDetach.js
+++ b/Projects/Foundations/UI/Function-Libraries/ReferenceAttachDetach.js
@@ -1,5 +1,5 @@
// These function are used across the system to establish and remove references between nodes
-function newFoundationsFunctionLibraryAttachDetach() {
+function newFoundationsFunctionLibraryReferenceAttachDetach() {
let thisObject = {
referenceDetachNode: referenceDetachNode,
referenceAttachNode: referenceAttachNode
diff --git a/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js b/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js
index f48704df1..e1198c7da 100644
--- a/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js
@@ -609,7 +609,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
if (rootNode.type === project + ' Project') {
let projectDefinition = rootNode.projectDefinition
if (projectDefinition !== undefined) {
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType, undefined, project)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
@@ -640,7 +640,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
let cryptoExchanges = cryptoEcosystem.cryptoExchanges[j]
for (let k = 0; k < cryptoExchanges.exchanges.length; k++) {
let cryptoExchange = cryptoExchanges.exchanges[k]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, cryptoExchange, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, cryptoExchange, true) === true) {
let exchangeTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(exchangeTasks, cryptoExchange)
}
@@ -672,7 +672,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
for (let i = 0; i < markets.length; i++) {
let market = markets[i]
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, market, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, market, true) === true) {
let marketDataTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(marketDataTasks, market)
}
@@ -697,7 +697,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
if (rootNode.type === rootNodeType) {
let mine = rootNode
- if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, mine, true) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenById(node, mine, true) === true) {
let dataMineTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dataMineTasks, mine)
}
diff --git a/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js b/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js
index e3576dc9c..23dab5ef5 100644
--- a/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js
+++ b/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js
@@ -21,6 +21,7 @@ function newFoundationsFunctionLibraryWorkspaceFunctions() {
if (alreadyExist === false) {
let child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, project + ' Project', rootNodes, project)
+ if (child === undefined) { continue }
child.project = project
child.projectDefinition.name = project
child.projectDefinition.config = "{ \n \"codeName\": \"" + project + "\"\n}"
diff --git a/Projects/Foundations/UI/Spaces/Charting-Space/TimeMachine.js b/Projects/Foundations/UI/Spaces/Charting-Space/TimeMachine.js
index 635f16fc7..c37eb295c 100644
--- a/Projects/Foundations/UI/Spaces/Charting-Space/TimeMachine.js
+++ b/Projects/Foundations/UI/Spaces/Charting-Space/TimeMachine.js
@@ -163,8 +163,8 @@ function newTimeMachine() {
function setInitialPosition() {
if (thisObject.container.frame.position.x === 0 && thisObject.container.frame.position.y === 0) {
- let timeMachineIndex = UI.projects.foundations.utilities.children.findChildIndexAtParentNode(thisObject.payload.node)
- let dashboardIndex = UI.projects.foundations.utilities.children.findChildIndexAtParentNode(thisObject.payload.parentNode)
+ let timeMachineIndex = UI.projects.foundations.utilities.nodeChildren.findChildIndexAtParentNode(thisObject.payload.node)
+ let dashboardIndex = UI.projects.foundations.utilities.nodeChildren.findChildIndexAtParentNode(thisObject.payload.parentNode)
thisObject.container.frame.position.x = thisObject.container.frame.width * timeMachineIndex * 2
thisObject.container.frame.position.y = thisObject.container.frame.height * dashboardIndex * 2
diff --git a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js
index 29032cbc9..67fe1cd7c 100644
--- a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js
+++ b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js
@@ -301,6 +301,13 @@ function newCircularMenuItem() {
function onMouseOver(point) {
if (thisObject.container.frame.isThisPointHere(point, true, false) === true) {
+ let text = thisObject.action
+
+ if(thisObject.payload.uiObject.payload.referenceParent !== undefined && thisObject.action === 'Reference Detach'){
+ text = text + ' -> [Existing Reference] Type : [' + thisObject.payload.uiObject.payload.referenceParent.type + '] , Name : [' + thisObject.payload.uiObject.payload.referenceParent.name + ']'
+ }
+
+ thisObject.payload.uiObject.setInfoMessage(text)
isMouseOver = true
} else {
isMouseOver = false
diff --git a/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js b/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js
index 1a5c0c8bd..32cbf727d 100644
--- a/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js
+++ b/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js
@@ -365,6 +365,38 @@ function newUiObjectConstructor() {
}
)
}
+ menuItemsInitialValues.push(
+ {
+ action: 'Copy Position',
+ actionFunction: floatingObject.payload.executeAction,
+ actionProject: 'Foundations',
+ label: undefined,
+ visible: true,
+ //placeholder icon : https://www.iconpacks.net/free-icon/pin-48.html
+ iconPathOn: 'copy-position',
+ iconPathOff: 'copy-position',
+ rawRadius: 12,
+ targetRadius: 0,
+ currentRadius: 0,
+ ring: 2
+ }
+ )
+ menuItemsInitialValues.push(
+ {
+ action: 'Snap to Position',
+ actionFunction: floatingObject.payload.executeAction,
+ actionProject: 'Foundations',
+ label: undefined,
+ visible: true,
+ //placeholder icon: https://www.iconpacks.net/free-icon/pins-53.html
+ iconPathOn: 'snap-position',
+ iconPathOff: 'snap-position',
+ rawRadius: 12,
+ targetRadius: 0,
+ currentRadius: 0,
+ ring: 2
+ }
+ )
menuItemsInitialValues.push(
{
action: 'Parent Detach',
diff --git a/Projects/Foundations/UI/Utilities/Plugins.js b/Projects/Foundations/UI/Utilities/Plugins.js
index 69597dfd2..70fb48ac1 100644
--- a/Projects/Foundations/UI/Utilities/Plugins.js
+++ b/Projects/Foundations/UI/Utilities/Plugins.js
@@ -33,7 +33,7 @@ function newFoundationsUtilitiesPlugins() {
}
function addMissingPluginFile(node, fileName, pluginFolder, nodeType, saveWithWorkspace) {
- if (UI.projects.foundations.utilities.children.isMissingChildrenByName(node, fileName) === true) {
+ if (UI.projects.foundations.utilities.nodeChildren.isMissingChildrenByName(node, fileName) === true) {
let child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Plugin File', undefined, 'Foundations')
child.name = fileName
child.config = JSON.stringify({
diff --git a/Projects/Governance/Plugins/User-Profiles/9808us.json b/Projects/Governance/Plugins/User-Profiles/9808us.json
index fd65057e3..e7334cd0f 100644
--- a/Projects/Governance/Plugins/User-Profiles/9808us.json
+++ b/Projects/Governance/Plugins/User-Profiles/9808us.json
@@ -6,13 +6,13 @@
"tokenPowerSwitch": {
"type": "Token Power Switch",
"name": "New Token Power Switch",
- "config": "{\n \"percentage\": 90\n}",
+ "config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"onboardingPrograms": {
"type": "Onboarding Programs",
"name": "New Onboarding Programs",
- "config": "{\n \"percentage\": 10\n}",
+ "config": "{\n \"percentage\": 0\n }",
"project": "Governance",
"airdropProgram": {
"type": "Airdrop Program",
@@ -26,12 +26,12 @@
"id": "85d3b184-0122-4cb3-a83c-b3c00d626767",
"savedPayload": {
"position": {
- "x": 24761.40800640108,
- "y": 24813.204681296138
+ "x": 13397.771642764716,
+ "y": 17563.204681296138
},
"targetPosition": {
- "x": 24984.3514540443,
- "y": 25013.943863203796
+ "x": 13620.715090407934,
+ "y": 17763.943863203796
},
"floatingObject": {
"isPinned": false,
@@ -49,12 +49,12 @@
"id": "9163e52d-f77c-40b7-b139-960681b28171",
"savedPayload": {
"position": {
- "x": 24984.3514540443,
- "y": 25013.943863203796
+ "x": 13620.715090407934,
+ "y": 17763.943863203796
},
"targetPosition": {
- "x": 25207.294901687517,
- "y": 25214.683045111455
+ "x": 13843.658538051151,
+ "y": 17964.683045111455
},
"floatingObject": {
"isPinned": false,
@@ -81,12 +81,12 @@
"id": "5ebe2e87-295e-42cc-98f1-c70ee2efa4a3",
"savedPayload": {
"position": {
- "x": 25332.041916178172,
- "y": 24627.794484671173
+ "x": 13968.405552541806,
+ "y": 17377.794484671173
},
"targetPosition": {
- "x": 25269.668408932845,
- "y": 24921.238764891314
+ "x": 13906.032045296479,
+ "y": 17671.238764891314
},
"floatingObject": {
"isPinned": false,
@@ -104,12 +104,12 @@
"id": "d38054ef-3c0b-43fd-986d-27dd39f72f2c",
"savedPayload": {
"position": {
- "x": 25269.668408932845,
- "y": 24921.238764891314
+ "x": 13906.032045296479,
+ "y": 17671.238764891314
},
"targetPosition": {
- "x": 25207.294901687517,
- "y": 25214.683045111455
+ "x": 13843.658538051151,
+ "y": 17964.683045111455
},
"floatingObject": {
"isPinned": false,
@@ -127,12 +127,12 @@
"id": "975175a5-fbf2-4775-80c3-175af1bf27ae",
"savedPayload": {
"position": {
- "x": 25207.294901687517,
- "y": 25214.683045111455
+ "x": 13843.658538051151,
+ "y": 17964.683045111455
},
"targetPosition": {
- "x": 25300,
- "y": 25500
+ "x": 13936.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -155,23 +155,23 @@
"referralProgram": {
"type": "Referral Program",
"name": "New Referral Program",
- "config": "{\n \"percentage\": 30\n}",
+ "config": "{}",
"project": "Governance",
"userReferrers": [
{
"type": "User Referrer",
- "name": "",
+ "name": "Luis-Fernando-Molina",
"config": "{}",
"project": "Governance",
- "id": "46674b25-ed29-4c00-90be-3dc849e2af9f",
+ "id": "10938918-7341-47fd-84ea-ddc86904ec58",
"savedPayload": {
"position": {
- "x": 25672.579175727584,
- "y": 24749.70358952681
+ "x": 14285.388940725978,
+ "y": 17500.011926593106
},
"targetPosition": {
- "x": 25664.72609123522,
- "y": 25049.600787019477
+ "x": 14301.089727598861,
+ "y": 17799.600787019477
},
"floatingObject": {
"isPinned": false,
@@ -183,7 +183,61 @@
},
"uiObject": {
"isRunning": false
- }
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile",
+ "Governance",
+ "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Referrer",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "d004c04d-aa54-4805-9e92-c7783e0cab0a",
+ "savedPayload": {
+ "position": {
+ "x": 14378.735441129616,
+ "y": 17509.823039132756
+ },
+ "targetPosition": {
+ "x": 14301.089727598861,
+ "y": 17799.600787019477
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ ]
+ ]
}
}
],
@@ -194,18 +248,18 @@
"id": "1d484ca6-1fc2-4a6f-b6c1-f30ef07dc820",
"savedPayload": {
"position": {
- "x": 25786.74708415796,
- "y": 24775.537149726697
+ "x": 14501.828909506517,
+ "y": 17576.65733937626
},
"targetPosition": {
- "x": 25664.72609123522,
- "y": 25049.600787019477
+ "x": 14301.089727598861,
+ "y": 17799.600787019477
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 3,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -221,12 +275,12 @@
"id": "4849966e-c897-4222-9c46-b2e425f53810",
"savedPayload": {
"position": {
- "x": 25882.338402538906,
- "y": 24843.094414311352
+ "x": 14534.233516035953,
+ "y": 17610.804669704525
},
"targetPosition": {
- "x": 25664.72609123522,
- "y": 25049.600787019477
+ "x": 14301.089727598861,
+ "y": 17799.600787019477
},
"floatingObject": {
"isPinned": false,
@@ -244,12 +298,12 @@
"id": "e6e043a7-e486-4c7f-a686-8a031db4c7c5",
"savedPayload": {
"position": {
- "x": 25664.72609123522,
- "y": 25049.600787019477
+ "x": 14301.089727598861,
+ "y": 17799.600787019477
},
"targetPosition": {
- "x": 25542.705098312483,
- "y": 25323.664424312257
+ "x": 14179.06873467612,
+ "y": 18073.664424312257
},
"floatingObject": {
"isPinned": false,
@@ -272,18 +326,18 @@
"userSupporters": [
{
"type": "User Supporter",
- "name": "",
+ "name": "cozed-gh",
"config": "{}",
"project": "Governance",
"id": "554c93e4-0de9-4ce2-a6ff-e8ce272e71cc",
"savedPayload": {
"position": {
- "x": 25991.061666922964,
- "y": 25032.498264196627
+ "x": 14578.62429950145,
+ "y": 17759.88994533369
},
"targetPosition": {
- "x": 25841.061666922964,
- "y": 25292.30588533196
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
},
"floatingObject": {
"isPinned": false,
@@ -295,23 +349,36 @@
},
"uiObject": {
"isRunning": false
- }
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "cozed-gh",
+ "id": "07f0b13a-a50f-4488-8a2c-a3f8f08e889d"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "cozed-gh",
+ "User Profile",
+ "Governance",
+ "07f0b13a-a50f-4488-8a2c-a3f8f08e889d"
+ ]
+ ]
}
},
{
"type": "User Supporter",
- "name": "",
+ "name": "Smidy13",
"config": "{}",
"project": "Governance",
- "id": "0d18e74f-dae9-4672-b00a-c997909494ee",
+ "id": "dab5a34d-1b55-4916-9ef6-a86133e3c4ad",
"savedPayload": {
"position": {
- "x": 26115.125304215744,
- "y": 25170.28489240922
+ "x": 14691.138132372005,
+ "y": 17831.766514466763
},
"targetPosition": {
- "x": 25841.061666922964,
- "y": 25292.30588533196
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
},
"floatingObject": {
"isPinned": false,
@@ -323,7 +390,98 @@
},
"uiObject": {
"isRunning": false
- }
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Smidy13",
+ "id": "4b5eca40-4d97-454d-91f3-8627a98ef682"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Smidy13",
+ "User Profile",
+ "Governance",
+ "4b5eca40-4d97-454d-91f3-8627a98ef682"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "PLuv",
+ "config": "{}",
+ "project": "Governance",
+ "id": "af6e4663-d24b-4684-913c-4821312d359a",
+ "savedPayload": {
+ "position": {
+ "x": 14761.32351842635,
+ "y": 17945.34298809562
+ },
+ "targetPosition": {
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "PLuv",
+ "id": "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "PLuv",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "harrellbm",
+ "config": "{}",
+ "project": "Governance",
+ "id": "b5af4689-9931-49da-bc07-690c0deb4351",
+ "savedPayload": {
+ "position": {
+ "x": 14775.279381189153,
+ "y": 18078.124152694032
+ },
+ "targetPosition": {
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "harrellbm",
+ "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "harrellbm",
+ "User Profile"
+ ]
+ ]
}
}
],
@@ -334,12 +492,12 @@
"id": "37f0b912-de8f-4b79-98ad-b5aaf08f838b",
"savedPayload": {
"position": {
- "x": 26134.505947143105,
- "y": 25354.679392577287
+ "x": 14730.241590882813,
+ "y": 18203.811070159165
},
"targetPosition": {
- "x": 25841.061666922964,
- "y": 25292.30588533196
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
},
"floatingObject": {
"isPinned": false,
@@ -361,12 +519,12 @@
"id": "f3fb13a2-b1f4-4b02-b925-c68f504fd2ac",
"savedPayload": {
"position": {
- "x": 26041.800848830622,
- "y": 25515.249332975178
+ "x": 14635.130434229754,
+ "y": 18297.50990503816
},
"targetPosition": {
- "x": 25841.061666922964,
- "y": 25292.30588533196
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
},
"floatingObject": {
"isPinned": false,
@@ -384,12 +542,12 @@
"id": "65a48301-5bc1-4a5c-a50a-f429f44db4b8",
"savedPayload": {
"position": {
- "x": 25841.061666922964,
- "y": 25292.30588533196
+ "x": 14477.425303286602,
+ "y": 18042.30588533196
},
"targetPosition": {
- "x": 25542.705098312483,
- "y": 25323.664424312257
+ "x": 14179.06873467612,
+ "y": 18073.664424312257
},
"floatingObject": {
"isPinned": false,
@@ -407,12 +565,12 @@
"id": "410de3ee-3b6a-4e67-a6f0-130e29cd0a79",
"savedPayload": {
"position": {
- "x": 25542.705098312483,
- "y": 25323.664424312257
+ "x": 14179.06873467612,
+ "y": 18073.664424312257
},
"targetPosition": {
- "x": 25300,
- "y": 25500
+ "x": 13936.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -430,7 +588,7 @@
"votesAndClaimsPrograms": {
"type": "Votes And Claims Programs",
"name": "New Votes And Claims Programs",
- "config": "{\n \"percentage\": 20\n}",
+ "config": "{}",
"project": "Governance",
"votingProgram": {
"type": "Voting Program",
@@ -445,12 +603,12 @@
"id": "8b8039e0-c042-4dde-87ca-61ac8019a49e",
"savedPayload": {
"position": {
- "x": 26139.418235533445,
- "y": 25739.052653648338
+ "x": 14775.781871897083,
+ "y": 18489.052653648338
},
"targetPosition": {
- "x": 25841.061666922964,
- "y": 25707.69411466804
+ "x": 14477.425303286602,
+ "y": 18457.69411466804
},
"floatingObject": {
"isPinned": false,
@@ -468,12 +626,12 @@
"id": "1ca2a7f8-4dad-40a5-9a0b-70e4e6b0e037",
"savedPayload": {
"position": {
- "x": 25841.061666922964,
- "y": 25707.69411466804
+ "x": 14477.425303286602,
+ "y": 18457.69411466804
},
"targetPosition": {
- "x": 25542.705098312483,
- "y": 25676.335575687743
+ "x": 14179.06873467612,
+ "y": 18426.335575687743
},
"floatingObject": {
"isPinned": false,
@@ -493,102 +651,9 @@
"name": "New Claims Program",
"config": "{}",
"project": "Governance",
- "assetClaimsFolders": [
- {
- "type": "Asset Claims Folder",
- "name": "New Asset Claims Folder",
- "config": "{}",
- "project": "Governance",
- "assetClaimsFolders": [],
- "assetContributionClaims": [],
- "id": "c0bb67cf-ed97-445f-b3b6-8ef181c386c0",
- "savedPayload": {
- "position": {
- "x": 31844.903008026802,
- "y": 18200.741292494906
- },
- "targetPosition": {
- "x": 31404.73658769659,
- "y": 18107.181031626915
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- }
- ],
- "featureClaimsFolders": [
- {
- "type": "Feature Claims Folder",
- "name": "New Feature Claims Folder",
- "config": "{}",
- "project": "Governance",
- "featureClaimsFolders": [],
- "featureContributionClaims": [],
- "id": "81dc6357-893d-4361-9692-ef5d5e32a31e",
- "savedPayload": {
- "position": {
- "x": 31705.845360558076,
- "y": 18441.596203091744
- },
- "targetPosition": {
- "x": 31404.73658769659,
- "y": 18107.181031626915
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- }
- ],
- "positionClaimsFolders": [
- {
- "type": "Position Claims Folder",
- "name": "New Position Claims Folder",
- "config": "{}",
- "project": "Governance",
- "positionClaimsFolders": [],
- "positionContributionClaims": [],
- "id": "32dec8a2-71c0-45f0-b1c3-8ea6f3b99b6d",
- "savedPayload": {
- "position": {
- "x": 31451.77439616703,
- "y": 18554.71588454264
- },
- "targetPosition": {
- "x": 31404.73658769659,
- "y": 18107.181031626915
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- }
- ],
+ "assetClaimsFolders": [],
+ "featureClaimsFolders": [],
+ "positionClaimsFolders": [],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
@@ -596,18 +661,18 @@
"id": "b3a93cc0-0801-4f6e-9488-435a1d272bff",
"savedPayload": {
"position": {
- "x": 31179.73658769659,
- "y": 18496.892463329914
+ "x": 14423.110720521601,
+ "y": 18974.462850273303
},
"targetPosition": {
- "x": 31404.73658769659,
- "y": 18107.181031626915
+ "x": 14301.089727598861,
+ "y": 18700.399212980523
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 2,
+ "angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -619,19 +684,19 @@
"id": "98125357-80c3-4d3b-9b91-059298515c11",
"savedPayload": {
"position": {
- "x": 31404.73658769659,
- "y": 18107.181031626915
+ "x": 14301.089727598861,
+ "y": 18700.399212980523
},
"targetPosition": {
- "x": 25542.705098312483,
- "y": 25676.335575687743
+ "x": 14179.06873467612,
+ "y": 18426.335575687743
},
"floatingObject": {
- "isPinned": true,
+ "isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
- "distanceToParent": 4,
+ "distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
@@ -642,12 +707,12 @@
"id": "a79ace48-ae15-4359-95c1-371df5e41291",
"savedPayload": {
"position": {
- "x": 25542.705098312483,
- "y": 25676.335575687743
+ "x": 14179.06873467612,
+ "y": 18426.335575687743
},
"targetPosition": {
- "x": 25300,
- "y": 25500
+ "x": 13936.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -665,7 +730,7 @@
"financialPrograms": {
"type": "Financial Programs",
"name": "New Financial Programs",
- "config": "{\n \"percentage\": 20\n}",
+ "config": "{}",
"project": "Governance",
"stakingProgram": {
"type": "Staking Program",
@@ -679,12 +744,12 @@
"id": "77071bb6-dbda-4a2a-a8da-83ea6aa4155d",
"savedPayload": {
"position": {
- "x": 25332.041916178172,
- "y": 26372.205515328827
+ "x": 13968.405552541806,
+ "y": 19122.205515328827
},
"targetPosition": {
- "x": 25269.668408932845,
- "y": 26078.761235108686
+ "x": 13906.032045296479,
+ "y": 18828.761235108686
},
"floatingObject": {
"isPinned": false,
@@ -702,12 +767,12 @@
"id": "4087d58e-e684-4651-8849-4e194d5cc934",
"savedPayload": {
"position": {
- "x": 25269.668408932845,
- "y": 26078.761235108686
+ "x": 13906.032045296479,
+ "y": 18828.761235108686
},
"targetPosition": {
- "x": 25207.294901687517,
- "y": 25785.316954888545
+ "x": 13843.658538051151,
+ "y": 18535.316954888545
},
"floatingObject": {
"isPinned": false,
@@ -727,38 +792,7 @@
"name": "New Delegation Program",
"config": "{}",
"project": "Governance",
- "delegatePowerSwitch": [
- {
- "type": "Delegate Power Switch",
- "name": "New Delegate Power Switch",
- "config": "{}",
- "project": "Governance",
- "delegatePowerSwitch": [],
- "userDelegates": [],
- "id": "41e5e919-43b5-43d1-b0c1-7b388b4cd1bf",
- "savedPayload": {
- "position": {
- "x": 24891.646355731817,
- "y": 26271.37309168475
- },
- "targetPosition": {
- "x": 24984.3514540443,
- "y": 25986.056136796204
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- }
- ],
+ "delegatePowerSwitch": [],
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
@@ -766,18 +800,18 @@
"id": "ef6f8b6c-6e85-4d6c-ad64-b1e6ddd1248f",
"savedPayload": {
"position": {
- "x": 24690.90717382416,
- "y": 26048.42964404153
+ "x": 13397.771642764716,
+ "y": 18936.795318703862
},
"targetPosition": {
- "x": 24984.3514540443,
- "y": 25986.056136796204
+ "x": 13620.715090407934,
+ "y": 18736.056136796204
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 2,
+ "angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -789,12 +823,12 @@
"id": "ee380273-eced-4761-b91e-94b542beb5de",
"savedPayload": {
"position": {
- "x": 24984.3514540443,
- "y": 25986.056136796204
+ "x": 13620.715090407934,
+ "y": 18736.056136796204
},
"targetPosition": {
- "x": 25207.294901687517,
- "y": 25785.316954888545
+ "x": 13843.658538051151,
+ "y": 18535.316954888545
},
"floatingObject": {
"isPinned": false,
@@ -812,12 +846,12 @@
"id": "c09288a3-64fb-489d-8e7d-c8d72a56c535",
"savedPayload": {
"position": {
- "x": 25207.294901687517,
- "y": 25785.316954888545
+ "x": 13843.658538051151,
+ "y": 18535.316954888545
},
"targetPosition": {
- "x": 25300,
- "y": 25500
+ "x": 13936.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -835,12 +869,12 @@
"id": "d7571db7-acfc-4d8c-aa91-582ff7f5dbb3",
"savedPayload": {
"position": {
- "x": 25300,
- "y": 25500
+ "x": 13936.363636363636,
+ "y": 18250
},
"targetPosition": {
- "x": 25000,
- "y": 25500
+ "x": 13636.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -862,12 +896,12 @@
"id": "a72ec234-c5dc-425e-9ace-95ffed7c0542",
"savedPayload": {
"position": {
- "x": 24700,
- "y": 25500
+ "x": 13336.363636363636,
+ "y": 18250
},
"targetPosition": {
- "x": 25000,
- "y": 25500
+ "x": 13636.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -885,12 +919,12 @@
"id": "280f0baf-bc13-497c-b255-618c1a146442",
"savedPayload": {
"position": {
- "x": 25000,
- "y": 25500
+ "x": 13636.363636363636,
+ "y": 18250
},
"targetPosition": {
- "x": 25000,
- "y": 25500
+ "x": 13636.363636363636,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
diff --git a/Projects/Governance/Plugins/User-Profiles/Ferrox85.json b/Projects/Governance/Plugins/User-Profiles/Ferrox85.json
new file mode 100644
index 000000000..d6a17bcf9
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/Ferrox85.json
@@ -0,0 +1,539 @@
+{
+ "type": "User Profile",
+ "name": "Ferrox85",
+ "config": "{\"signature\":{\"message\":\"Ferrox85\",\"messageHash\":\"0x6b9dff8767b58b146a3c641d6042eefccd0d9c307177db4f47fefff2653e12bf\",\"v\":\"0x1c\",\"r\":\"0x837324e0bf3c675f6d280bbf60da40d1bee39688a4af7aac63c63d6cbf36b8e1\",\"s\":\"0x5d2bd1a5a9e74eff00cab80ae424f8c2babe2bded104787598d4ec8bd883cfb7\",\"signature\":\"0x837324e0bf3c675f6d280bbf60da40d1bee39688a4af7aac63c63d6cbf36b8e15d2bd1a5a9e74eff00cab80ae424f8c2babe2bded104787598d4ec8bd883cfb71c\"},\"codeName\":\"Ferrox85\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 0\n }",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "90e5d1ca-8e7f-4c2b-9d63-592c55115782",
+ "savedPayload": {
+ "position": {
+ "x": 22877.272727272724,
+ "y": 23470.577136594
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 23730.384757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "b463f377-cc54-4bcd-8b5d-4c3c9c4686c1",
+ "savedPayload": {
+ "position": {
+ "x": 23027.272727272724,
+ "y": 23730.384757729335
+ },
+ "targetPosition": {
+ "x": 23177.272727272724,
+ "y": 23990.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "eeb00048-018d-4512-a3cf-067ca647b500",
+ "savedPayload": {
+ "position": {
+ "x": 23777.272727272724,
+ "y": 23990.192378864667
+ },
+ "targetPosition": {
+ "x": 23477.272727272724,
+ "y": 23990.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "53fb2ec1-41cc-4c55-aae7-a8277a724c27",
+ "savedPayload": {
+ "position": {
+ "x": 23477.272727272724,
+ "y": 23990.192378864667
+ },
+ "targetPosition": {
+ "x": 23177.272727272724,
+ "y": 23990.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "e2689c81-1efa-4326-8889-9e4c60994322",
+ "savedPayload": {
+ "position": {
+ "x": 23177.272727272724,
+ "y": 23990.192378864667
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "e766efaf-df09-40d0-9d45-47ad25ea453f",
+ "savedPayload": {
+ "position": {
+ "x": 23477.272727272724,
+ "y": 24209.807621135333
+ },
+ "targetPosition": {
+ "x": 23477.272727272724,
+ "y": 24509.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "9e220b16-a589-4b5b-b9b8-babb15e95bce",
+ "savedPayload": {
+ "position": {
+ "x": 23777.272727272724,
+ "y": 24509.807621135333
+ },
+ "targetPosition": {
+ "x": 23477.272727272724,
+ "y": 24509.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "bc91ee16-f7aa-4ab0-aa72-aa6ff5459f63",
+ "savedPayload": {
+ "position": {
+ "x": 23477.272727272724,
+ "y": 24809.807621135333
+ },
+ "targetPosition": {
+ "x": 23477.272727272724,
+ "y": 24509.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7bd4b18d-cd7f-40e1-a928-9d1a89ff7337",
+ "savedPayload": {
+ "position": {
+ "x": 23477.272727272724,
+ "y": 24509.807621135333
+ },
+ "targetPosition": {
+ "x": 23177.272727272724,
+ "y": 24509.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "83907129-6c04-47b1-ab06-2b2ad451fa29",
+ "savedPayload": {
+ "position": {
+ "x": 23320.717007492865,
+ "y": 24831.988749515993
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24769.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "e9a04400-84d6-4652-b0d8-afa7b85c78e3",
+ "savedPayload": {
+ "position": {
+ "x": 23058.63126625302,
+ "y": 25067.971810881147
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24769.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "393c8a9d-24a6-4ea2-a1ab-8e85cc9d9c10",
+ "savedPayload": {
+ "position": {
+ "x": 22753.209089979944,
+ "y": 24891.636235193404
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24769.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "7331beda-d2d5-423d-bd2f-c7d22bdc1945",
+ "savedPayload": {
+ "position": {
+ "x": 22826.533545365066,
+ "y": 24546.671794627448
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24769.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f0c3aed4-c21b-4c23-96cd-5b95dc35c2ea",
+ "savedPayload": {
+ "position": {
+ "x": 23027.272727272724,
+ "y": 24769.615242270665
+ },
+ "targetPosition": {
+ "x": 23177.272727272724,
+ "y": 24509.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "a2137ff3-6504-47ed-9e2e-3875de641d52",
+ "savedPayload": {
+ "position": {
+ "x": 23177.272727272724,
+ "y": 24509.807621135333
+ },
+ "targetPosition": {
+ "x": 23027.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "e0af057e-af90-4f4f-9261-75e860eeb00e",
+ "savedPayload": {
+ "position": {
+ "x": 23027.272727272724,
+ "y": 24250
+ },
+ "targetPosition": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "a2d062af-5fd1-4e95-971b-132727a5b02f",
+ "savedPayload": {
+ "position": {
+ "x": 22427.272727272724,
+ "y": 24250
+ },
+ "targetPosition": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "200cfc7e-800e-4670-9c23-37adc34af02d",
+ "savedPayload": {
+ "position": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "targetPosition": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/NAmorim.json b/Projects/Governance/Plugins/User-Profiles/NAmorim.json
new file mode 100644
index 000000000..3cac3e7c5
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/NAmorim.json
@@ -0,0 +1,485 @@
+{
+ "type": "User Profile",
+ "name": "NAmorim",
+ "config": "{\n \"signature\": {\n \"message\": \"NAmorim\",\n \"messageHash\": \"0xd7fc194bfd83696ca9404e75ac4958a23e7b9204e9cefefd6b6a9d29953ebbaa\",\n \"v\": \"0x1b\",\n \"r\": \"0x91266021e1be8deaf8cfe2ac7893d6ce2bddad47459e7ba71b584ac29d25e449\",\n \"s\": \"0x2e06590f5eb90ad96683508cbad5349963621ce2babc394accd880c4530c0968\",\n \"signature\": \"0x91266021e1be8deaf8cfe2ac7893d6ce2bddad47459e7ba71b584ac29d25e4492e06590f5eb90ad96683508cbad5349963621ce2babc394accd880c4530c09681b\"\n }\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\"percentage\": 0}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "46bee27c-95f4-4ab9-8c1a-d46efcc05244",
+ "savedPayload": {
+ "position": {
+ "x": 13662,
+ "y": 16698.077136594
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 16957.884757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "27083db5-024d-4457-857a-88394a7b5118",
+ "savedPayload": {
+ "position": {
+ "x": 13812,
+ "y": 16957.884757729335
+ },
+ "targetPosition": {
+ "x": 13962,
+ "y": 17217.692378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "43a4f00c-eec3-464d-868b-13f480cc7e11",
+ "savedPayload": {
+ "position": {
+ "x": 14562,
+ "y": 17217.692378864667
+ },
+ "targetPosition": {
+ "x": 14262,
+ "y": 17217.692378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3d762541-5bf7-4647-a545-f545cef7ef8b",
+ "savedPayload": {
+ "position": {
+ "x": 14262,
+ "y": 17217.692378864667
+ },
+ "targetPosition": {
+ "x": 13962,
+ "y": 17217.692378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f88e2ac9-88e0-4816-b765-be4c4d1b400d",
+ "savedPayload": {
+ "position": {
+ "x": 13962,
+ "y": 17217.692378864667
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 17477.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "7491735f-f040-4483-8f74-8694c0759c81",
+ "savedPayload": {
+ "position": {
+ "x": 14262,
+ "y": 17437.307621135333
+ },
+ "targetPosition": {
+ "x": 14262,
+ "y": 17737.307621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "22664cdf-92cf-4102-8ccb-22a9f6f99801",
+ "savedPayload": {
+ "position": {
+ "x": 14562,
+ "y": 17737.307621135333
+ },
+ "targetPosition": {
+ "x": 14262,
+ "y": 17737.307621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "ee42c455-97f3-4624-b47a-ddd225ff8331",
+ "savedPayload": {
+ "position": {
+ "x": 14262,
+ "y": 18037.307621135333
+ },
+ "targetPosition": {
+ "x": 14262,
+ "y": 17737.307621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3a8ef207-973f-4579-8acc-c98271e770ed",
+ "savedPayload": {
+ "position": {
+ "x": 14262,
+ "y": 17737.307621135333
+ },
+ "targetPosition": {
+ "x": 13962,
+ "y": 17737.307621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "",
+ "config": "{}",
+ "project": "Governance",
+ "id": "09c6fe47-e4c1-46dd-8825-b62e0524aab9",
+ "savedPayload": {
+ "position": {
+ "x": 14071.807621135331,
+ "y": 18147.115242270665
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 17997.115242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "1874837c-6e22-460d-8847-6b884f7292aa",
+ "savedPayload": {
+ "position": {
+ "x": 13662,
+ "y": 18256.922863406
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 17997.115242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "483b5f57-da5d-4583-b1cf-410c9fb40ae3",
+ "savedPayload": {
+ "position": {
+ "x": 13552.192378864669,
+ "y": 17847.115242270665
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 17997.115242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "d2e657d3-e189-40a3-bd8d-b9c3bf152694",
+ "savedPayload": {
+ "position": {
+ "x": 13812,
+ "y": 17997.115242270665
+ },
+ "targetPosition": {
+ "x": 13962,
+ "y": 17737.307621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1f6187e8-4878-43d1-a7df-9b33a73ccb57",
+ "savedPayload": {
+ "position": {
+ "x": 13962,
+ "y": 17737.307621135333
+ },
+ "targetPosition": {
+ "x": 13812,
+ "y": 17477.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "2d11ec65-8e01-49af-910c-1d6151e1ebe9",
+ "savedPayload": {
+ "position": {
+ "x": 13812,
+ "y": 17477.5
+ },
+ "targetPosition": {
+ "x": 13512,
+ "y": 17477.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "5fb7a0f5-034b-4ce1-9052-c02cee1f6a38",
+ "savedPayload": {
+ "position": {
+ "x": 13212,
+ "y": 17477.5
+ },
+ "targetPosition": {
+ "x": 13512,
+ "y": 17477.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "d611eda3-4202-438a-af65-8981a90e742a",
+ "savedPayload": {
+ "position": {
+ "x": 13512,
+ "y": 17477.5
+ },
+ "targetPosition": {
+ "x": 13512,
+ "y": 17477.5
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/Tentacule23.json b/Projects/Governance/Plugins/User-Profiles/Tentacule23.json
new file mode 100644
index 000000000..8575568f6
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/Tentacule23.json
@@ -0,0 +1,492 @@
+{
+ "type": "User Profile",
+ "name": "Tentacule23",
+ "config": "{\"signature\":{\"message\":\"Tentacule23\",\"messageHash\":\"0x0fd9a76978281b0f3dfb6dfa25ce897698cb16ab7658fd127d0b2ee4a93856dc\",\"v\":\"0x1b\",\"r\":\"0x37ac59d105477fc0166075a89bc417c647c42e6c7a9117d85e34dd10470b30d7\",\"s\":\"0x425fb9fecb360a0ba183dce2a043e463511c7a57efac6529840473e199aaed45\",\"signature\":\"0x37ac59d105477fc0166075a89bc417c647c42e6c7a9117d85e34dd10470b30d7425fb9fecb360a0ba183dce2a043e463511c7a57efac6529840473e199aaed451b\"},\"codeName\":\"Tentacule23\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 0\n}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "deaea400-fa7f-48fd-a3fe-653b1bd18650",
+ "savedPayload": {
+ "position": {
+ "x": 9240.90909090909,
+ "y": 20471.577136594
+ },
+ "targetPosition": {
+ "x": 9390.90909090909,
+ "y": 20731.384757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "97ae26ad-542d-4373-806a-593e979e1a1b",
+ "savedPayload": {
+ "position": {
+ "x": 9390.90909090909,
+ "y": 20731.384757729335
+ },
+ "targetPosition": {
+ "x": 9540.90909090909,
+ "y": 20991.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "54a2fcd6-e80c-4a30-84c0-d80ae9d197e9",
+ "savedPayload": {
+ "position": {
+ "x": 10140.90909090909,
+ "y": 20991.192378864667
+ },
+ "targetPosition": {
+ "x": 9840.90909090909,
+ "y": 20991.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "786e62d1-6b32-49d9-8046-9c8577dbcd87",
+ "savedPayload": {
+ "position": {
+ "x": 9840.90909090909,
+ "y": 20991.192378864667
+ },
+ "targetPosition": {
+ "x": 9540.90909090909,
+ "y": 20991.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7e7f3e6e-30f4-400d-a1f6-b3611498b7bf",
+ "savedPayload": {
+ "position": {
+ "x": 9540.90909090909,
+ "y": 20991.192378864667
+ },
+ "targetPosition": {
+ "x": 9390.90909090909,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "PLuv",
+ "config": "{}",
+ "project": "Governance",
+ "id": "bdf5f1d1-8441-4171-859f-d6e13f56ebd5",
+ "savedPayload": {
+ "position": {
+ "x": 9990.070230063444,
+ "y": 21748.196214194737
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "PLuv",
+ "id": "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "PLuv",
+ "User Profile",
+ "Governance",
+ "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Referrer",
+ "name": "harrellbm",
+ "config": "{}",
+ "project": "Governance",
+ "id": "67c981c9-f18b-4476-911e-9761b375386a",
+ "savedPayload": {
+ "position": {
+ "x": 9970.17121550235,
+ "y": 21880.217549580582
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "harrellbm",
+ "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "harrellbm",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Referrer",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "2ca043e2-2332-4d61-b950-1e66fd360914",
+ "savedPayload": {
+ "position": {
+ "x": 9894.960912240365,
+ "y": 21990.530803819613
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Referrer",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "b53f989c-8771-4000-81f3-aef821170101",
+ "savedPayload": {
+ "position": {
+ "x": 9713.328118985017,
+ "y": 22069.77638142502
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "4f6ba6d0-501c-40ec-be81-806d505ca60f",
+ "savedPayload": {
+ "position": {
+ "x": 9470.993529360143,
+ "y": 21974.66706360194
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "a364c990-fdaa-4b29-9c66-bd365d857532",
+ "savedPayload": {
+ "position": {
+ "x": 9394.259843041551,
+ "y": 21725.902562417814
+ },
+ "targetPosition": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "4894f190-0535-4e91-b61f-9f74cbc273fb",
+ "savedPayload": {
+ "position": {
+ "x": 9690.90909090909,
+ "y": 21770.615242270665
+ },
+ "targetPosition": {
+ "x": 9540.90909090909,
+ "y": 21510.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "db99bd94-cded-4ef0-bfb2-979cac295f7f",
+ "savedPayload": {
+ "position": {
+ "x": 9540.90909090909,
+ "y": 21510.807621135333
+ },
+ "targetPosition": {
+ "x": 9390.90909090909,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "5683e2bf-45ca-4dd6-9ade-53b4cad76ed0",
+ "savedPayload": {
+ "position": {
+ "x": 9390.90909090909,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 9090.90909090909,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "96f1c595-f94e-4207-9828-4199c74c4bfd",
+ "savedPayload": {
+ "position": {
+ "x": 8790.90909090909,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 9090.90909090909,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7af21baa-ebc0-436f-94a7-a1746209418e",
+ "savedPayload": {
+ "position": {
+ "x": 9090.90909090909,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 9090.90909090909,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json
index 3279c2cd7..ca0070a33 100644
--- a/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json
+++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json
@@ -62,12 +62,12 @@
"id": "baa2f02c-2920-4edb-a103-d452fc61d82f",
"savedPayload": {
"position": {
- "x": 20588.235294117643,
- "y": 18250
+ "x": 30769.230769230762,
+ "y": 21250
},
"targetPosition": {
- "x": 20588.235294117643,
- "y": 18250
+ "x": 30769.230769230762,
+ "y": 21250
},
"floatingObject": {
"isPinned": false,
diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json
index 10d3ae958..2ef8dfc42 100644
--- a/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json
+++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json
@@ -62,12 +62,12 @@
"id": "36c2b050-631f-4291-987c-418adc94317d",
"savedPayload": {
"position": {
- "x": 17647.05882352941,
- "y": 21251
+ "x": 28846.15384615384,
+ "y": 18250
},
"targetPosition": {
- "x": 17647.05882352941,
- "y": 21251
+ "x": 28846.15384615384,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
diff --git a/Projects/Governance/Plugins/User-Profiles/a-r-1.json b/Projects/Governance/Plugins/User-Profiles/a-r-1.json
new file mode 100644
index 000000000..8e64d0446
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/a-r-1.json
@@ -0,0 +1,222 @@
+{
+ "type": "User Profile",
+ "name": "a-r-1",
+ "config": "{\n \"signature\": {\n \"message\": \"a-r-1\",\n \"messageHash\": \"0x9745bbf104bba5e739d256eb99244e777e1c7e071ccef5721ce4d2d1b23530e7\",\n \"v\": \"0x1b\",\n \"r\": \"0xf3cb4ffd98a4b690b15ae6185ae3b90e371ebfa94a801782a4225b40ae05bd7e\",\n \"s\": \"0x08368b4695b28f74e6379f66e7bd98295f68a5616a1977386bf41c80ff832722\",\n \"signature\": \"0xf3cb4ffd98a4b690b15ae6185ae3b90e371ebfa94a801782a4225b40ae05bd7e08368b4695b28f74e6379f66e7bd98295f68a5616a1977386bf41c80ff8327221b\"\n }\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "97dac6d9-abe3-407d-a695-bf0e78fb9338",
+ "savedPayload": {
+ "position": {
+ "x": 14202,
+ "y": 9998.884757729338
+ },
+ "targetPosition": {
+ "x": 14052,
+ "y": 10258.692378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "06f2a2d5-4e0a-4229-a452-5cb77a90ca25",
+ "savedPayload": {
+ "position": {
+ "x": 14052,
+ "y": 10258.692378864669
+ },
+ "targetPosition": {
+ "x": 13902,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "769bca90-9994-42ff-8253-8b49394ff583",
+ "savedPayload": {
+ "position": {
+ "x": 14202,
+ "y": 11038.115242270662
+ },
+ "targetPosition": {
+ "x": 14052,
+ "y": 10778.307621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "ac196cef-a8b5-432b-8bbf-8122bc27fb04",
+ "savedPayload": {
+ "position": {
+ "x": 14052,
+ "y": 10778.307621135331
+ },
+ "targetPosition": {
+ "x": 13902,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "224f5e96-0309-4d0e-885d-d900e40ed060",
+ "savedPayload": {
+ "position": {
+ "x": 13902,
+ "y": 10518.5
+ },
+ "targetPosition": {
+ "x": 13602,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "99859f48-0e69-4fba-a93a-97156bf20b04",
+ "savedPayload": {
+ "position": {
+ "x": 13602,
+ "y": 10518.5
+ },
+ "targetPosition": {
+ "x": 13302,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "3d0935b7-80b5-4b41-a0b8-77bf805f3d82",
+ "savedPayload": {
+ "position": {
+ "x": 13002,
+ "y": 10518.5
+ },
+ "targetPosition": {
+ "x": 13302,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "41c45cfb-3877-4b74-8526-0958300596b3",
+ "savedPayload": {
+ "position": {
+ "x": 13302,
+ "y": 10518.5
+ },
+ "targetPosition": {
+ "x": 13302,
+ "y": 10518.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/alexbacanu.json b/Projects/Governance/Plugins/User-Profiles/alexbacanu.json
new file mode 100644
index 000000000..3af051aa0
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/alexbacanu.json
@@ -0,0 +1,625 @@
+{
+ "type": "User Profile",
+ "name": "alexbacanu",
+ "config": "{\n \"signature\": {\n \"message\": \"alexbacanu\",\n \"messageHash\": \"0x82893d94bbeef59c79191b46b55e3b02ebf06138e914152b13de5633f26699d0\",\n \"v\": \"0x1b\",\n \"r\": \"0x9f2bec070af89bfde331a6f06c623c876133da647eb5657ccd83ee7af0e714dd\",\n \"s\": \"0x5c6af340c2febc2dbe3fac50e3a8e1dee226e2994613ea52a6b33089b59c7c30\",\n \"signature\": \"0x9f2bec070af89bfde331a6f06c623c876133da647eb5657ccd83ee7af0e714dd5c6af340c2febc2dbe3fac50e3a8e1dee226e2994613ea52a6b33089b59c7c301b\"\n },\n \"codeName\": \"alexbacanu\"\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 0\n}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "febe4283-b7d6-4bbf-a2e2-5733b1715abe",
+ "savedPayload": {
+ "position": {
+ "x": 11831.807621135331,
+ "y": 10098.884757729338
+ },
+ "targetPosition": {
+ "x": 11681.807621135331,
+ "y": 10358.692378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "370792a3-ab0d-4dc0-83bc-a48633923f99",
+ "savedPayload": {
+ "position": {
+ "x": 11681.807621135331,
+ "y": 10358.692378864669
+ },
+ "targetPosition": {
+ "x": 11531.807621135331,
+ "y": 10618.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "40385ee3-3d90-414d-b54e-22024ae8166f",
+ "savedPayload": {
+ "position": {
+ "x": 12131.807621135331,
+ "y": 10618.5
+ },
+ "targetPosition": {
+ "x": 11831.807621135331,
+ "y": 10618.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "24e27fdf-111e-4f37-ace8-d980638dcd7a",
+ "savedPayload": {
+ "position": {
+ "x": 11831.807621135331,
+ "y": 10618.5
+ },
+ "targetPosition": {
+ "x": 11531.807621135331,
+ "y": 10618.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1ecb2c89-e7e8-485c-9f98-98428c78a02a",
+ "savedPayload": {
+ "position": {
+ "x": 11531.807621135331,
+ "y": 10618.5
+ },
+ "targetPosition": {
+ "x": 11272,
+ "y": 10768.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "5ff1e995-2b2e-40fd-8de0-e9b4fcdeb69f",
+ "savedPayload": {
+ "position": {
+ "x": 11971.585369022052,
+ "y": 10581.046665333914
+ },
+ "targetPosition": {
+ "x": 11821.585369022052,
+ "y": 10840.854286469244
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile",
+ "Governance",
+ "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "8b8e990a-3458-4400-95da-d6232e24bf4a",
+ "savedPayload": {
+ "position": {
+ "x": 12111.363116908773,
+ "y": 10763.208572938489
+ },
+ "targetPosition": {
+ "x": 11821.585369022052,
+ "y": 10840.854286469244
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "ebc8ef82-ddec-41ab-9eed-2017f6e7b183",
+ "savedPayload": {
+ "position": {
+ "x": 12081.392990157383,
+ "y": 10990.854286469244
+ },
+ "targetPosition": {
+ "x": 11821.585369022052,
+ "y": 10840.854286469244
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "8f9aaa46-d804-4c10-a54b-92c2061dc858",
+ "savedPayload": {
+ "position": {
+ "x": 11821.585369022052,
+ "y": 10840.854286469244
+ },
+ "targetPosition": {
+ "x": 11531.807621135331,
+ "y": 10918.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "harrellbm",
+ "config": "{}",
+ "project": "Governance",
+ "id": "0e12f022-9c73-4dfc-ae01-679792d745c6",
+ "savedPayload": {
+ "position": {
+ "x": 12356.18567466841,
+ "y": 11027.031429703866
+ },
+ "targetPosition": {
+ "x": 11921.519052838328,
+ "y": 11143.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "harrellbm",
+ "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "harrellbm",
+ "User Profile",
+ "Governance",
+ "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "9a79cf1a-b9da-4f50-8ef0-39c151233c09",
+ "savedPayload": {
+ "position": {
+ "x": 12311.230484541325,
+ "y": 11368.5
+ },
+ "targetPosition": {
+ "x": 11921.519052838328,
+ "y": 11143.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "bbd18748-77f8-481b-a3d2-4bed02907cd2",
+ "savedPayload": {
+ "position": {
+ "x": 12037.987623134462,
+ "y": 11578.166621830082
+ },
+ "targetPosition": {
+ "x": 11921.519052838328,
+ "y": 11143.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "bc56de66-7e54-4b59-beb0-69cb612b4b71",
+ "savedPayload": {
+ "position": {
+ "x": 11921.519052838328,
+ "y": 11143.5
+ },
+ "targetPosition": {
+ "x": 11531.807621135331,
+ "y": 10918.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "mentorshipProgram": {
+ "type": "Mentorship Program",
+ "name": "New Mentorship Program",
+ "config": "{}",
+ "project": "Governance",
+ "userMentors": [
+ {
+ "type": "User Mentor",
+ "name": "PLuv",
+ "config": "{}",
+ "project": "Governance",
+ "id": "4d568744-258e-45a1-949c-0ea69e6683ef",
+ "savedPayload": {
+ "position": {
+ "x": 11869.260955801417,
+ "y": 11358.277747886721
+ },
+ "targetPosition": {
+ "x": 11609.453334666086,
+ "y": 11208.277747886721
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "PLuv",
+ "id": "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "PLuv",
+ "User Profile",
+ "Governance",
+ "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "9b6fd291-940b-48aa-9c9c-fc48487c72c9",
+ "savedPayload": {
+ "position": {
+ "x": 11687.099048196842,
+ "y": 11498.055495773442
+ },
+ "targetPosition": {
+ "x": 11609.453334666086,
+ "y": 11208.277747886721
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "550e7a42-80f5-44c1-b866-40187888aec4",
+ "savedPayload": {
+ "position": {
+ "x": 11459.453334666086,
+ "y": 11468.085369022052
+ },
+ "targetPosition": {
+ "x": 11609.453334666086,
+ "y": 11208.277747886721
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f158e082-bb8e-4d01-abf7-a8b504551b0a",
+ "savedPayload": {
+ "position": {
+ "x": 11609.453334666086,
+ "y": 11208.277747886721
+ },
+ "targetPosition": {
+ "x": 11531.807621135331,
+ "y": 10918.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "4f885985-7142-4cb8-a863-ef8e9ee7acec",
+ "savedPayload": {
+ "position": {
+ "x": 11531.807621135331,
+ "y": 10918.5
+ },
+ "targetPosition": {
+ "x": 11272,
+ "y": 10768.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "bfd6fc8e-8c79-4f63-90ab-b565348444ca",
+ "savedPayload": {
+ "position": {
+ "x": 11272,
+ "y": 10768.5
+ },
+ "targetPosition": {
+ "x": 10972,
+ "y": 10768.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "2d4b83f8-b6d4-4555-9b1c-48a86442c077",
+ "savedPayload": {
+ "position": {
+ "x": 10672,
+ "y": 10768.5
+ },
+ "targetPosition": {
+ "x": 10972,
+ "y": 10768.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "ec022964-1f09-49e1-a147-3ba00abab9db",
+ "savedPayload": {
+ "position": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "targetPosition": {
+ "x": 22727.272727272724,
+ "y": 24250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json b/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json
new file mode 100644
index 000000000..87d80c125
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json
@@ -0,0 +1,362 @@
+{
+ "type": "User Profile",
+ "name": "hellarnasstrom",
+ "config": "{\n \"signature\": {\n \"message\": \"hellarnasstrom\",\n \"messageHash\": \"0xdaf65d25729a9dea1d942565fe97a77a3d0ad39748ba97d4e75edbd6cfb3ba69\",\n \"v\": \"0x1b\",\n \"r\": \"0x2ae23edd6239dfbafe72632cb550225a3daa4a6b5fe9b2256a987d66e21d1836\",\n \"s\": \"0x5d9645529959dd53eb8043d07900fb71997d47328963221ece85a64ae374a080\",\n \"signature\": \"0x2ae23edd6239dfbafe72632cb550225a3daa4a6b5fe9b2256a987d66e21d18365d9645529959dd53eb8043d07900fb71997d47328963221ece85a64ae374a0801b\"\n }\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "ce3d6b8b-140c-486c-b81d-2867d8f91bf3",
+ "savedPayload": {
+ "position": {
+ "x": 14594,
+ "y": 9958.077136594007
+ },
+ "targetPosition": {
+ "x": 14744,
+ "y": 10217.884757729338
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "53473ffb-9cd1-47a6-bf2d-91589f9ac1b0",
+ "savedPayload": {
+ "position": {
+ "x": 14744,
+ "y": 10217.884757729338
+ },
+ "targetPosition": {
+ "x": 14894,
+ "y": 10477.692378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "86265f29-a7e5-4e8e-b5c7-a7dc408c6d75",
+ "savedPayload": {
+ "position": {
+ "x": 15494,
+ "y": 10477.692378864669
+ },
+ "targetPosition": {
+ "x": 15194,
+ "y": 10477.692378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "c7b309cd-aca8-4fde-b89d-46de14ff8da9",
+ "savedPayload": {
+ "position": {
+ "x": 15194,
+ "y": 10477.692378864669
+ },
+ "targetPosition": {
+ "x": 14894,
+ "y": 10477.692378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "c02ba517-8246-43da-942c-f0299549370f",
+ "savedPayload": {
+ "position": {
+ "x": 14894,
+ "y": 10477.692378864669
+ },
+ "targetPosition": {
+ "x": 14744,
+ "y": 10737.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "",
+ "config": "{Julian-Molina}",
+ "project": "Governance",
+ "id": "c5d2130b-dab9-43f2-adcb-c3faef332073",
+ "savedPayload": {
+ "position": {
+ "x": 15303.807621135331,
+ "y": 11107.115242270662
+ },
+ "targetPosition": {
+ "x": 15044,
+ "y": 11257.115242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "6c3c64e5-b2ac-425b-a5f0-8fc871a107cf",
+ "savedPayload": {
+ "position": {
+ "x": 15194,
+ "y": 11516.922863405993
+ },
+ "targetPosition": {
+ "x": 15044,
+ "y": 11257.115242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "c5df6b99-450d-4dd6-a1b4-f4333d12536b",
+ "savedPayload": {
+ "position": {
+ "x": 14784.192378864669,
+ "y": 11407.115242270662
+ },
+ "targetPosition": {
+ "x": 15044,
+ "y": 11257.115242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "a66cfd08-f566-4bee-a4f7-e2fdc3ec4dde",
+ "savedPayload": {
+ "position": {
+ "x": 15044,
+ "y": 11257.115242270662
+ },
+ "targetPosition": {
+ "x": 14894,
+ "y": 10997.307621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "77faf241-5d51-4e7f-9b2b-e996eb942c44",
+ "savedPayload": {
+ "position": {
+ "x": 14894,
+ "y": 10997.307621135331
+ },
+ "targetPosition": {
+ "x": 14744,
+ "y": 10737.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "cc676344-5fc3-44f9-bd61-9d9a0045c510",
+ "savedPayload": {
+ "position": {
+ "x": 14744,
+ "y": 10737.5
+ },
+ "targetPosition": {
+ "x": 14444,
+ "y": 10737.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "9d88be19-af2f-4305-8fa8-2722f8fbe0cb",
+ "savedPayload": {
+ "position": {
+ "x": 14144,
+ "y": 10737.5
+ },
+ "targetPosition": {
+ "x": 14444,
+ "y": 10737.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f93bb5da-dd98-4dcf-92b2-95d86e0e0ed2",
+ "savedPayload": {
+ "position": {
+ "x": 14444,
+ "y": 10737.5
+ },
+ "targetPosition": {
+ "x": 14444,
+ "y": 10737.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/narkxx.json b/Projects/Governance/Plugins/User-Profiles/narkxx.json
new file mode 100644
index 000000000..8a69f4f87
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/narkxx.json
@@ -0,0 +1,697 @@
+{
+ "type": "User Profile",
+ "name": "narkxx",
+ "config": "{\n \"signature\": {\n \"message\": \"narkxx\",\n \"messageHash\": \"0x9b2dbaa8f93d181e9ecead93dd3310217c50774828a0deb2b83a71d81f49ff4c\",\n \"v\": \"0x1b\",\n \"r\": \"0x0e65fdd697bf412f412669823bea7f76231c5fff1319d2c41c0568daa33d7f1c\",\n \"s\": \"0x2dfdf2361a34ca33f587dff4f2d89519f20f77ee1f49500a05ccc3ffb477187e\",\n \"signature\": \"0x0e65fdd697bf412f412669823bea7f76231c5fff1319d2c41c0568daa33d7f1c2dfdf2361a34ca33f587dff4f2d89519f20f77ee1f49500a05ccc3ffb477187e1b\"\n }\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 0\n }",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "e32a0924-c240-4e8e-a68b-0f1c313137d3",
+ "savedPayload": {
+ "position": {
+ "x": 25196,
+ "y": 14402.577136594007
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 14662.384757729338
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "11f2e881-196c-466c-9de9-ec5ed0eb31d1",
+ "savedPayload": {
+ "position": {
+ "x": 25346,
+ "y": 14662.384757729338
+ },
+ "targetPosition": {
+ "x": 25496,
+ "y": 14922.192378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "ff131c9a-a1f5-477c-b753-d24f2d22d10d",
+ "savedPayload": {
+ "position": {
+ "x": 26096,
+ "y": 14922.192378864669
+ },
+ "targetPosition": {
+ "x": 25796,
+ "y": 14922.192378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "06cc86de-ad48-401e-98e6-b0a7e0f57257",
+ "savedPayload": {
+ "position": {
+ "x": 25796,
+ "y": 14922.192378864669
+ },
+ "targetPosition": {
+ "x": 25496,
+ "y": 14922.192378864669
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "93ba13e0-c631-4280-a011-fbffc30efb22",
+ "savedPayload": {
+ "position": {
+ "x": 25496,
+ "y": 14922.192378864669
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "f2e7b4ac-314d-4e7f-a06e-a6bce2e6e1c1",
+ "savedPayload": {
+ "position": {
+ "x": 25905.807621135333,
+ "y": 15551.615242270662
+ },
+ "targetPosition": {
+ "x": 25646,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "c5021290-55dd-4a92-a73b-a41fbaedf849",
+ "savedPayload": {
+ "position": {
+ "x": 25796,
+ "y": 15961.422863405993
+ },
+ "targetPosition": {
+ "x": 25646,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "5952d507-52e6-461e-b875-309934d387d4",
+ "savedPayload": {
+ "position": {
+ "x": 25386.192378864667,
+ "y": 15851.615242270662
+ },
+ "targetPosition": {
+ "x": 25646,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "572e1b74-1cc8-4736-89a7-15c67bcb8849",
+ "savedPayload": {
+ "position": {
+ "x": 25755.807621135333,
+ "y": 15291.807621135331
+ },
+ "targetPosition": {
+ "x": 25496,
+ "y": 15441.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "df9a319d-ecc9-452f-9fa3-d1d89c5b405c",
+ "savedPayload": {
+ "position": {
+ "x": 25639.44428022014,
+ "y": 15763.98874951599
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "f3df7582-d059-4cfe-b827-e7012d25b82e",
+ "savedPayload": {
+ "position": {
+ "x": 25377.358538980297,
+ "y": 15999.971810881143
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "fb4c58a8-c4e5-4a4b-bc52-5f525f838c26",
+ "savedPayload": {
+ "position": {
+ "x": 25071.93636270722,
+ "y": 15823.636235193402
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "2ae24fce-2b7a-4406-83d4-709d16539c8f",
+ "savedPayload": {
+ "position": {
+ "x": 25145.26081809234,
+ "y": 15478.671794627444
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15701.615242270662
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f30a7db2-7f93-4fcc-8cc1-72fb9e5b6b4c",
+ "savedPayload": {
+ "position": {
+ "x": 25646,
+ "y": 15701.615242270662
+ },
+ "targetPosition": {
+ "x": 25496,
+ "y": 15441.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "mentorshipProgram": {
+ "type": "Mentorship Program",
+ "name": "New Mentorship Program",
+ "config": "{}",
+ "project": "Governance",
+ "userMentors": [
+ {
+ "type": "User Mentor",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "ce7cd9bb-3e22-4951-ac92-93f1d74631c8",
+ "savedPayload": {
+ "position": {
+ "x": 25459.135826507885,
+ "y": 15792.54680304299
+ },
+ "targetPosition": {
+ "x": 25236.192378864667,
+ "y": 15591.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Mentor",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "1c6ddf3d-2ef5-49f2-96ed-20f025a22a0e",
+ "savedPayload": {
+ "position": {
+ "x": 25114.17138594193,
+ "y": 15865.871258428111
+ },
+ "targetPosition": {
+ "x": 25236.192378864667,
+ "y": 15591.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "8c7da4b0-f06d-49f4-90b4-4327b6ceb21f",
+ "savedPayload": {
+ "position": {
+ "x": 24937.835810254186,
+ "y": 15560.449082155035
+ },
+ "targetPosition": {
+ "x": 25236.192378864667,
+ "y": 15591.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "e79084f0-78cc-4869-8010-cd9b698c0a90",
+ "savedPayload": {
+ "position": {
+ "x": 25173.81887161934,
+ "y": 15298.36334091519
+ },
+ "targetPosition": {
+ "x": 25236.192378864667,
+ "y": 15591.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "6bbb7865-cf57-4053-8e74-a9af2f8affa4",
+ "savedPayload": {
+ "position": {
+ "x": 25236.192378864667,
+ "y": 15591.807621135331
+ },
+ "targetPosition": {
+ "x": 25496,
+ "y": 15441.807621135331
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "260426a5-fb81-49aa-a6e7-8bf166c7d639",
+ "savedPayload": {
+ "position": {
+ "x": 25496,
+ "y": 15441.807621135331
+ },
+ "targetPosition": {
+ "x": 25346,
+ "y": 15182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "adf950d7-547a-4028-a23b-dbc10991daa7",
+ "savedPayload": {
+ "position": {
+ "x": 25346,
+ "y": 15182
+ },
+ "targetPosition": {
+ "x": 25046,
+ "y": 15182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "1d9e6e80-030a-4dbe-97ed-819876bccf33",
+ "savedPayload": {
+ "position": {
+ "x": 24746,
+ "y": 15182
+ },
+ "targetPosition": {
+ "x": 25046,
+ "y": 15182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7bde7f01-4c03-48a4-9944-710b213ef414",
+ "savedPayload": {
+ "position": {
+ "x": 25046,
+ "y": 15182
+ },
+ "targetPosition": {
+ "x": 25046,
+ "y": 15182
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/quantum8.json b/Projects/Governance/Plugins/User-Profiles/quantum8.json
new file mode 100644
index 000000000..746cc1265
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/quantum8.json
@@ -0,0 +1,539 @@
+{
+ "type": "User Profile",
+ "name": "quantum8",
+ "config": "{\"signature\":{\"message\":\"quantum8\",\"messageHash\":\"0x9eb09f3e33aa12ba004cec8f8b825ea0960c0bb2571c93c20e447e56be0f76a3\",\"v\":\"0x1b\",\"r\":\"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f\",\"s\":\"0x79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca2\",\"signature\":\"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca21b\"},\"codeName\":\"quantum8\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 0\n}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "6565417c-961c-44a8-806b-75464582451b",
+ "savedPayload": {
+ "position": {
+ "x": 28132.5348938626,
+ "y": 20581.384757729335
+ },
+ "targetPosition": {
+ "x": 27982.5348938626,
+ "y": 20841.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3a1f75fa-aa2c-4460-b986-b03e67cdc45f",
+ "savedPayload": {
+ "position": {
+ "x": 27982.5348938626,
+ "y": 20841.192378864667
+ },
+ "targetPosition": {
+ "x": 27832.5348938626,
+ "y": 21101
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "f757ff52-6168-495f-81d4-0c60ead02ff5",
+ "savedPayload": {
+ "position": {
+ "x": 28432.5348938626,
+ "y": 21101
+ },
+ "targetPosition": {
+ "x": 28132.5348938626,
+ "y": 21101
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "bc18c9e2-3142-4e2a-9724-a190f79d88dd",
+ "savedPayload": {
+ "position": {
+ "x": 28132.5348938626,
+ "y": 21101
+ },
+ "targetPosition": {
+ "x": 27832.5348938626,
+ "y": 21101
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "5a1c7d96-3077-4ea6-9300-36ccd234290b",
+ "savedPayload": {
+ "position": {
+ "x": 27832.5348938626,
+ "y": 21101
+ },
+ "targetPosition": {
+ "x": 27572.72727272727,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{\n \"percentage\": 10\n}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "31721402-7e62-4d72-9037-d2535567c941",
+ "savedPayload": {
+ "position": {
+ "x": 28344.666928218565,
+ "y": 21188.867965644036
+ },
+ "targetPosition": {
+ "x": 28132.5348938626,
+ "y": 21401
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile",
+ "Governance",
+ "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "ca9e4046-d3f3-4bd9-85a2-852c67a8c4f8",
+ "savedPayload": {
+ "position": {
+ "x": 28432.5348938626,
+ "y": 21401
+ },
+ "targetPosition": {
+ "x": 28132.5348938626,
+ "y": 21401
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "ed5ec5af-a544-4ad2-b7f8-72228e814c20",
+ "savedPayload": {
+ "position": {
+ "x": 28344.666928218565,
+ "y": 21613.132034355964
+ },
+ "targetPosition": {
+ "x": 28132.5348938626,
+ "y": 21401
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3648a9b1-b3bc-4348-b940-1b868ea884d3",
+ "savedPayload": {
+ "position": {
+ "x": 28132.5348938626,
+ "y": 21401
+ },
+ "targetPosition": {
+ "x": 27832.5348938626,
+ "y": 21401
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{\n \"percentage\": 10\n}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "013d635e-71ae-4376-86a7-97eaa6a788b5",
+ "savedPayload": {
+ "position": {
+ "x": 28280.891462473082,
+ "y": 21692.16616011563
+ },
+ "targetPosition": {
+ "x": 27982.5348938626,
+ "y": 21660.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "harrellbm",
+ "config": "{}",
+ "project": "Governance",
+ "id": "d96cd4df-2cda-4ff8-a54d-5d81b1fabca7",
+ "savedPayload": {
+ "position": {
+ "x": 28205.47834150582,
+ "y": 21861.54680304299
+ },
+ "targetPosition": {
+ "x": 27982.5348938626,
+ "y": 21660.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "harrellbm",
+ "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "harrellbm",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "c9a059b6-8a82-4961-9c9e-54aa37ffcf08",
+ "savedPayload": {
+ "position": {
+ "x": 28044.90840110793,
+ "y": 21954.251901355474
+ },
+ "targetPosition": {
+ "x": 27982.5348938626,
+ "y": 21660.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "b17ecb03-af59-4504-83cd-a92c2ac3a0e5",
+ "savedPayload": {
+ "position": {
+ "x": 27860.513900939863,
+ "y": 21934.871258428113
+ },
+ "targetPosition": {
+ "x": 27982.5348938626,
+ "y": 21660.807621135333
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "8c881a99-9bbc-4854-b849-f9a7d5ef1016",
+ "savedPayload": {
+ "position": {
+ "x": 27982.5348938626,
+ "y": 21660.807621135333
+ },
+ "targetPosition": {
+ "x": 27832.5348938626,
+ "y": 21401
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "3fb1d37b-4db8-438a-a198-cdd2e27d4cc1",
+ "savedPayload": {
+ "position": {
+ "x": 27832.5348938626,
+ "y": 21401
+ },
+ "targetPosition": {
+ "x": 27572.72727272727,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "9af8e675-0256-4b47-bb58-ebe914eb16a3",
+ "savedPayload": {
+ "position": {
+ "x": 27572.72727272727,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 27272.72727272727,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "7b9b1c90-9101-4b09-bffd-1e5f46cee2c8",
+ "savedPayload": {
+ "position": {
+ "x": 26972.72727272727,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 27272.72727272727,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "f2ba562b-9032-4fb4-8b97-0b58d8542905",
+ "savedPayload": {
+ "position": {
+ "x": 27272.72727272727,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 27272.72727272727,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
index 2a2bcc4a9..f546b64fb 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
@@ -47,8 +47,8 @@
},
{
"style": "Success",
- "text": "No need to be an expert, but you will need some general knowledge of the system to understand what this is all about!",
- "updated": 1629720316727,
+ "text": "No need to be an expert, but you do need to know how to operate the system! Otherwise, the process may be confusing and even frustrating!",
+ "updated": 1631546896227,
"translations": [
{
"language": "ES",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
index 19371f55b..d151cd89f 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
@@ -44,6 +44,11 @@
"style": "Text"
}
]
+ },
+ {
+ "style": "Important",
+ "text": "We will use this node to build your User Profile. Later on, you will delete this node to erase all the sensitive information you may enter along with the information the constructor will generate. But no need to worry at this point! I'll let you know when to delete it!",
+ "updated": 1631547429975
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
index 757426111..19a75edc9 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
@@ -39,8 +39,8 @@
},
{
"style": "Text",
- "text": "If you want to link an address you already own, type the twelve word mnemonic associated with your address under the mnemonic property. If not, leave the property blank and the system will make a new one for you!",
- "updated": 1629706491511,
+ "text": "If you want to link an existing address, type its twelve-word mnemonic in the mnemonic property. Leave the property blank to generate a new address! You will delete this sensitive info later on. The info will not leave your computer and will not be saved to disk.",
+ "updated": 1631547921782,
"translations": [
{
"language": "ES",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json
index 16673017f..3d8a658e3 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json
@@ -21,8 +21,8 @@
"paragraphs": [
{
"style": "Note",
- "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos, which is a win for everyone, as the more developers, the faster the project advances!",
- "updated": 1630660356226,
+ "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos.",
+ "updated": 1631548798983,
"translations": [
{
"language": "ES",
@@ -70,6 +70,11 @@
"style": "List"
}
]
+ },
+ {
+ "style": "List",
+ "text": "This may not be immediately reflected in the system, as Github limits the number of queries the system makes. Don't worry, you will get your tokens anyway.",
+ "updated": 1631548891216
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json
index 63bfe7cc0..d37166f7a 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json
@@ -23,7 +23,7 @@
},
{
"style": "List",
- "text": "The Superalgos.org Webiste: Julian-Molina",
+ "text": "The Superalgos.org Website: Julian-Molina",
"updated": 1630927577105
},
{
@@ -44,4 +44,4 @@
"text": "Official Social Media Posts: Julian-Molina"
}
]
-}
\ No newline at end of file
+}
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json
index 03c883f2d..8584e102f 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json
@@ -59,7 +59,7 @@
},
{
"style": "List",
- "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this tough!",
+ "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this though!",
"updated": 1630684072593,
"translations": [
{
@@ -71,4 +71,4 @@
]
}
]
-}
\ No newline at end of file
+}
diff --git a/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js b/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
index 80b03c473..c0b331f38 100644
--- a/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
@@ -535,7 +535,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
let destinationNodeChild = destinationNode[property.name]
let originNodeChildType = getOriginNodeChildType(destinationNodeChild)
- let originNodeChild = UI.projects.foundations.utilities.children.findChildReferencingThisNode(originNode, destinationNodeChild)
+ let originNodeChild = UI.projects.foundations.utilities.nodeChildren.findChildReferencingThisNode(originNode, destinationNodeChild)
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
@@ -552,7 +552,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
let destinationNodeChild = propertyArray[m]
let originNodeChildType = getOriginNodeChildType(destinationNodeChild)
- let originNodeChild = UI.projects.foundations.utilities.children.findChildReferencingThisNode(originNode, destinationNodeChild)
+ let originNodeChild = UI.projects.foundations.utilities.nodeChildren.findChildReferencingThisNode(originNode, destinationNodeChild)
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
diff --git a/Projects/Governance/UI/Function-Libraries/VotingProgram.js b/Projects/Governance/UI/Function-Libraries/VotingProgram.js
index 1ab72bf36..7b1b6aca3 100644
--- a/Projects/Governance/UI/Function-Libraries/VotingProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/VotingProgram.js
@@ -552,7 +552,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
let destinationNodeChild = destinationNode[property.name]
let originNodeChildType = getOriginNodeChildType(destinationNodeChild)
- let originNodeChild = UI.projects.foundations.utilities.children.findChildReferencingThisNode(originNode, destinationNodeChild)
+ let originNodeChild = UI.projects.foundations.utilities.nodeChildren.findChildReferencingThisNode(originNode, destinationNodeChild)
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
@@ -569,7 +569,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
let destinationNodeChild = propertyArray[m]
let originNodeChildType = getOriginNodeChildType(destinationNodeChild)
- let originNodeChild = UI.projects.foundations.utilities.children.findChildReferencingThisNode(originNode, destinationNodeChild)
+ let originNodeChild = UI.projects.foundations.utilities.nodeChildren.findChildReferencingThisNode(originNode, destinationNodeChild)
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js
index 003e6798b..6a48a8a8a 100644
--- a/Projects/Network/NT/Modules/WebSocketsInterface.js
+++ b/Projects/Network/NT/Modules/WebSocketsInterface.js
@@ -1,6 +1,9 @@
exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSocketsInterface() {
let thisObject = {
+ networkClients: undefined,
+ networkPeers: undefined,
+ callersMap: undefined,
initialize: initialize,
finalize: finalize
}
@@ -14,6 +17,10 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
return thisObject
function finalize() {
+ thisObject.networkClients = undefined
+ thisObject.networkPeers = undefined
+ callersMap = undefined
+
socketServer = undefined
clientInterface = undefined
peerInterface = undefined
@@ -26,18 +33,35 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
clientInterface = NT.projects.socialTrading.modules.clientInterface.newSocialTradingModulesClientInterface()
peerInterface = NT.projects.socialTrading.modules.peerInterface.newSocialTradingModulesPeerInterface()
+ thisObject.networkClients = []
+ thisObject.networkPeers = []
+ thisObject.callersMap = new Map()
+
setUpWebSocketServer()
}
function setUpWebSocketServer() {
try {
- socketServer.on('connection', onConnection)
+ socketServer.on('connection', onConnectionOpened)
+
+ function onConnectionOpened(socket)
+
+ /*
+ This function is executed every time a new Websockets connection
+ is stablished.
+ */ {
+ let caller = {
+ socket: socket,
+ userProfile: undefined,
+ role: undefined
+ }
+
+ caller.socket.id = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ caller.socket.on('close', onConnectionClosed)
- function onConnection(socket) {
- let caller = {}
let calledTimestamp = (new Date()).valueOf()
- socket.on('message', onMenssage)
+ caller.socket.on('message', onMenssage)
async function onMenssage(message) {
try {
@@ -49,7 +73,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'messageHeader Not Coorrect JSON Format.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -60,13 +84,13 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'messageType Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
switch (messageHeader.messageType) {
case "Handshake": {
- handshakeProducedure(socket, caller, calledTimestamp, messageHeader)
+ handshakeProducedure(caller, calledTimestamp, messageHeader)
break
}
case "Request": {
@@ -76,22 +100,27 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'Handshake Not Done Yet.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
+ let response
switch (caller.role) {
case 'Network Client': {
- let response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile)
- socket.send(JSON.stringify(response))
+ response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile)
+ caller.socket.send(JSON.stringify(response))
break
}
case 'Network Peer': {
- let response = await peerInterface.messageReceived(messageHeader.payload)
- socket.send(JSON.stringify(response))
+ response = await peerInterface.messageReceived(messageHeader.payload)
+ caller.socket.send(JSON.stringify(response))
break
}
}
+ if (response.result === 'Ok' && messageHeader.payload.requestType === 'Event') {
+ broadcastToPeers(messageHeader, caller)
+ broadcastToClients(messageHeader, caller)
+ }
break
}
default: {
@@ -99,7 +128,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'messageType Not Supported.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
break
}
}
@@ -109,7 +138,13 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
}
}
- function handshakeProducedure(socket, caller, calledTimestamp, messageHeader) {
+ function onConnectionClosed() {
+ let socketId = this.id
+ let caller = thisObject.callersMap.get(socketId)
+ removeCaller(caller)
+ }
+
+ function handshakeProducedure(caller, calledTimestamp, messageHeader) {
/*
The handshage producedure have 2 steps, we need to know
now which one we are at.
@@ -119,7 +154,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'step Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
if (messageHeader.step !== 'One' && messageHeader.step !== 'Two') {
@@ -127,7 +162,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'step Not Supported.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
switch (messageHeader.step) {
@@ -149,7 +184,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerRole Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
@@ -158,7 +193,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerRole Not Supported.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
@@ -171,7 +206,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerProfileHandle Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
@@ -184,7 +219,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerTimestamp Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -195,7 +230,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerTimestamp Too Old.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -215,7 +250,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
message: 'Handshake Step One Complete',
signature: JSON.stringify(signature)
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
}
function handshakeStepTwo() {
@@ -227,7 +262,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'Handshake Step One Not Completed.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -238,7 +273,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'signature Not Provided.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
@@ -250,7 +285,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'Bad Signature.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -263,7 +298,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'userProfile Not Found.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -277,7 +312,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'callerProfileHandle Does Not Match witnessUserProfile.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -289,7 +324,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'calledProfileHandle Does Not Match This Network Node Handle.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -300,7 +335,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
result: 'Error',
message: 'calledTimestamp Does Not Match calledTimestamp On Record.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
return
}
/*
@@ -310,12 +345,96 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
We will remember the user profile behind this caller.
*/
caller.userProfile = witnessUserProfile
+ /*
+ We will remember the caller itself.
+ */
+ addCaller(caller)
let response = {
result: 'Ok',
message: 'Handshake Successful.'
}
- socket.send(JSON.stringify(response))
+ caller.socket.send(JSON.stringify(response))
+ }
+ }
+
+ function addCaller(caller) {
+
+ thisObject.callersMap.set(caller.socket.id, caller)
+
+ switch (caller.role) {
+ case 'Network Client': {
+ addToArray(thisObject.networkClients, caller)
+ break
+ }
+ case 'Network Peer': {
+ addToArray(thisObject.networkPeers, caller)
+ break
+ }
+ }
+
+ function addToArray(callersArray, caller) {
+ /*
+ We will add the caller to the existing array, first the ones with highest ranking.
+ */
+ for (let i = 0; i < callersArray.length; i++) {
+ let callerInArray = callersArray[i]
+ if (caller.userProfile.ranking > callerInArray.userProfile.ranking) {
+ callersArray.splice(i, 0, caller)
+ return
+ }
+ }
+ callersArray.push(caller)
+ }
+ }
+
+ function removeCaller(caller) {
+
+ thisObject.callersMap.delete(caller.socket.id)
+
+ switch (caller.role) {
+ case 'Network Client': {
+ removeFromArray(thisObject.networkClients, caller)
+ break
+ }
+ case 'Network Peer': {
+ removeFromArray(thisObject.networkPeers, caller)
+ break
+ }
+ }
+
+ function removeFromArray(callersArray, caller) {
+ for (let i = 0; i < callersArray.length; i++) {
+ let callerInArray = callersArray[i]
+ if (caller.socket.id === callerInArray.socket.id) {
+ callersArray.splice(i, 1)
+ return
+ }
+ }
+ }
+ }
+
+ function broadcastToPeers(messageHeader, caller) {
+ let callerIdToAVoid
+ if (caller.role === 'Network Peer') {
+ callerIdToAVoid = caller.socket.id
+ }
+ for (let i = 0; i < thisObject.networkPeers.length; i++) {
+ let networkPeer = thisObject.networkPeers[i]
+ if (networkPeer.socket.id === callerIdToAVoid) { continue }
+ networkPeer.socket.send(messageHeader)
+ }
+ }
+
+ function broadcastToClients(messageHeader, caller) {
+ let callerIdToAVoid
+ if (caller.role === 'Network Client') {
+ callerIdToAVoid = caller.socket.id
+ }
+ for (let i = 0; i < thisObject.networkClients.length; i++) {
+ let networkClient = thisObject.networkClients[i]
+ if (networkClient.socket.id === callerIdToAVoid) { continue }
+ networkClient.socket.send(messageHeader)
}
}
diff --git a/Projects/Network/SA/Modules/WebSocketsClient.js b/Projects/Network/SA/Modules/WebSocketsClient.js
index 150f31932..15ac176a6 100644
--- a/Projects/Network/SA/Modules/WebSocketsClient.js
+++ b/Projects/Network/SA/Modules/WebSocketsClient.js
@@ -8,7 +8,7 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets
let socketClient
- let web3 = new SA.nodeModules.web3()
+ let web3
let called = {}
let selectedNetworkNode // This is a Network Node we pick to try to connect to.
@@ -33,6 +33,8 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets
"address": "0xa153469c57A91F5a59Fc6c45A37aD8dbad85e417"
}
*/
+ web3 = new SA.nodeModules.web3()
+
selectedNetworkNode = {
userProfileHandle: "Test-Network-Node-Profile",
blockchainAccount: "0xa153469c57A91F5a59Fc6c45A37aD8dbad85e417",
@@ -185,7 +187,6 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets
reject()
return
}
- console.log('[INFO] Web Sockets Client -> stepTwoResponse -> response.message = ' + response.message)
/*
This was the end of the Handshake producere. We are connected to the
Network Node and from now on, all response messages will be received
@@ -217,6 +218,7 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets
if (socketClient.readyState !== 1) { // 1 means connected and ready.
console.log('[ERROR] Web Sockets Client -> sendMessage -> Cannot send message while connection is closed.')
reject('Websockets Connection Not Ready.')
+ return
}
let socketMessage = {
@@ -226,7 +228,7 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets
socketClient.onmessage = socketMessage => { onMenssage(socketMessage) }
socketClient.send(
JSON.stringify(socketMessage)
- )
+ )
function onMenssage(socketMessage) {
try {
diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json
index 2b8ea0bb8..b49b681e4 100644
--- a/Projects/ProjectsSchema.json
+++ b/Projects/ProjectsSchema.json
@@ -12,9 +12,9 @@
],
"functionLibraries": [
{
- "name": "Attach Detach",
+ "name": "Reference Attach Detach",
"propertyName": "attachDetach",
- "functionName": "newFoundationsFunctionLibraryAttachDetach"
+ "functionName": "newFoundationsFunctionLibraryReferenceAttachDetach"
},
{
"name": "Chain Attach Detach",
@@ -51,11 +51,6 @@
"propertyName": "onFocus",
"functionName": "newFoundationsFunctionLibraryOnFocus"
},
- {
- "name": "Super Scripts Functions",
- "propertyName": "superScriptsFunctions",
- "functionName": "newFoundationsFunctionLibrarySuperScriptsFunctions"
- },
{
"name": "Webhook Functions",
"propertyName": "webhookFunctions",
@@ -184,8 +179,8 @@
"functionName": "newFoundationsUtilitiesMeshes"
},
{
- "name": "Children",
- "propertyName": "children",
+ "name": "Node Children",
+ "propertyName": "nodeChildren",
"functionName": "newFoundationsUtilitiesNodeChildren"
},
{
@@ -1238,7 +1233,7 @@
"functionName": "newGovernanceUtilitiesTables"
},
{
- "name": "Decendent Tables",
+ "name": "Descendent Tables",
"propertyName": "decendentTables",
"functionName": "newGovernanceUtilitiesDecendentTables"
},
@@ -1344,6 +1339,12 @@
"functionName": "newSocialTradingModulesQueriesUserProfiles",
"fileName": "Queries/UserProfiles.js"
},
+ {
+ "name": "Unfollowed User Profiles",
+ "propertyName": "queriesUnfollowedUserProfiles",
+ "functionName": "newSocialTradingModulesQueriesUnfollowedUserProfiles",
+ "fileName": "Queries/UnfollowedUserProfiles.js"
+ },
{
"name": "Bot Profile Stats",
"propertyName": "queriesBotProfileStats",
@@ -1471,6 +1472,46 @@
"fileName": "EventTypes.js"
}
]
+ },
+ "DK": {
+ "globals": [],
+ "modules": [
+ {
+ "name": "Http Interface",
+ "propertyName": "httpInterface",
+ "functionName": "newDesktopModulesHttpInterface",
+ "fileName": "httpInterface.js"
+ },
+ {
+ "name": "Web Sockets Interface",
+ "propertyName": "webSocketsInterface",
+ "functionName": "newDesktopModulesWebSocketsInterface",
+ "fileName": "WebSocketsInterface.js"
+ },
+ {
+ "name": "Web App Interface",
+ "propertyName": "webAppInterface",
+ "functionName": "newSocialTradingModulesWebAppInterface",
+ "fileName": "WebAppInterface.js"
+ },
+ {
+ "name": "Social Graph",
+ "propertyName": "socialGraph",
+ "functionName": "newSocialTradingModulesSocialGraph",
+ "fileName": "SocialGraph.js"
+ }
+ ],
+ "utilities": []
+ },
+ "UI":{
+ "modules":[
+ {
+ "name": "Web Sockets Client",
+ "propertyName": "webSocketsClient",
+ "functionName": "newSocialTradingModulesWebSocketsClient",
+ "fileName": "WebSocketsClient.js"
+ }
+ ]
}
}
]
\ No newline at end of file
diff --git a/Projects/Social-Trading/DK/modules/SocialGraph.js b/Projects/Social-Trading/DK/modules/SocialGraph.js
new file mode 100644
index 000000000..1b67a534a
--- /dev/null
+++ b/Projects/Social-Trading/DK/modules/SocialGraph.js
@@ -0,0 +1,24 @@
+exports.newSocialTradingModulesSocialGraph = function newSocialTradingModulesSocialGraph() {
+ /*
+ This module mantains in memory the personal social graph for
+ the user profile of the user of the Desktop App. A personal social
+ graph is very similar to the one mantained at a Netwrok Node,
+ the mainn difference is that it only includes information relevant
+ to this particular user, and not for al the users in the system
+ as in the Network Node.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ function initialize() {
+
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/DK/modules/WebAppInterface.js b/Projects/Social-Trading/DK/modules/WebAppInterface.js
new file mode 100644
index 000000000..5c43a13e4
--- /dev/null
+++ b/Projects/Social-Trading/DK/modules/WebAppInterface.js
@@ -0,0 +1,152 @@
+exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModulesWebAppInterface() {
+ /*
+ This module handles the incomming messages from the Web App.
+ At it's current iteration, it will jusr forward those messages
+ to the Network Node it is connected to.
+ */
+ let thisObject = {
+ messageReceived: messageReceived,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ function initialize() {
+
+ }
+
+ async function messageReceived(message) {
+ let messageHeader
+ try {
+ messageHeader = JSON.parse(message)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'messageHeader Not Coorrect JSON Format.'
+ }
+ return JSON.stringify(response)
+ }
+
+ switch (messageHeader.requestType) {
+ case 'Query': {
+ let queryMessage
+ try {
+ queryMessage = JSON.parse(messageHeader.queryMessage)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'queryMessage Not Coorrect JSON Format.'
+ }
+ return JSON.stringify(response)
+ }
+ queryMessage.emitterUserProfileId = DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID
+ messageHeader.queryMessage = JSON.stringify(queryMessage)
+
+ let response = {
+ result: 'Ok',
+ message: 'Web App Interface Query Processed.',
+ data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
+ }
+ return response
+ }
+ case 'Event': {
+ let eventMessage
+ try {
+ eventMessage = JSON.parse(messageHeader.eventMessage)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'eventMessage Not Coorrect JSON Format.'
+ }
+ return JSON.stringify(response)
+ }
+
+ if (
+ eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
+ eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST ||
+ eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST
+ ) {
+ /*
+ We need to save the post at the User's storage and remove the text from the message
+ going to the Network Node.
+ */
+ let commitMessage
+ switch (eventMessage.eventType) {
+ case SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST: {
+ commitMessage = "New Post"
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST: {
+ commitMessage = "Reply to User Post"
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST: {
+ commitMessage = "Repost User Post"
+ break
+ }
+ }
+ /*
+ The post text is eliminated, since it is now at the user's storage,
+ and a hash of the content was generated, and that is what is going to
+ the Network Node.
+ */
+ eventMessage.emitterPostHash = await savePostAtStorage(eventMessage.text, commitMessage, eventMessage.timestamp)
+ eventMessage.text = undefined
+ }
+
+ eventMessage.emitterUserProfileId = DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID
+ messageHeader.eventMessage = JSON.stringify(eventMessage)
+
+ let response = {
+ result: 'Ok',
+ message: 'Web App Interface Event Processed.',
+ data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
+ }
+ return response
+ }
+ default: {
+ let response = {
+ result: 'Error',
+ message: 'requestType Not Supported.'
+ }
+ return JSON.stringify(response)
+ }
+ }
+ }
+
+ async function savePostAtStorage(text, commitMessage, timestamp) {
+ const { createHash } = await import('crypto')
+ const hash = createHash('sha256')
+ let post = {
+ timestamp: timestamp,
+ text: text
+ }
+
+ const fileContent = JSON.stringify(post, undefined, 4)
+ const fileHash = hash.update(fileContent).digest('hex')
+ const fileName = fileHash + ".json"
+
+ let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp)
+
+ SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(filePath + '/')
+ SA.nodeModules.fs.writeFileSync(filePath + '/' + fileName, fileContent)
+
+ const options = {
+ baseDir: process.cwd() + '/My-Social-Trading-Data',
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = SA.nodeModules.simpleGit(options)
+
+ await git.add('./*')
+ await git.commit(commitMessage)
+ await git.push('origin')
+
+ return fileHash
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/DK/modules/WebSocketsInterface.js b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js
new file mode 100644
index 000000000..22de639d2
--- /dev/null
+++ b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js
@@ -0,0 +1,103 @@
+exports.newDesktopModulesWebSocketsInterface = function newDesktopModulesWebSocketsInterface() {
+ /*
+ This module handles the websockets communication between the
+ Desktop App's Client and the Destop App's Web App.
+ */
+ let thisObject = {
+ sendToWebApp: sendToWebApp,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let socketServer
+ let webAppInterface
+ let webApp
+
+ return thisObject
+
+ function finalize() {
+ socketServer = undefined
+ webAppInterface = undefined
+ webApp = undefined
+ }
+
+ function initialize() {
+ socketServer = new SA.nodeModules.ws.Server({ port: global.env.DESKTOP_WEB_SOCKETS_INTERFACE_PORT })
+ webAppInterface = DK.projects.socialTrading.modules.webAppInterface.newSocialTradingModulesWebAppInterface()
+
+ setUpWebSocketServer()
+ }
+
+ function setUpWebSocketServer() {
+ try {
+ socketServer.on('connection', onConnectionOpened)
+
+ function onConnectionOpened(socket)
+ /*
+ This function is executed every time a new Websockets connection
+ is stablished.
+ */ {
+ if (webApp !== undefined) {
+ console.log('[ERROR] Only one websockets client allowed.')
+ return
+ }
+
+ webApp = {
+ socket: socket
+ }
+ console.log('Desktop Web App Connected to Web Sockets Interface ......................... Connected to port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+
+ webApp.socket.on('close', onConnectionClosed)
+ webApp.socket.on('message', onMenssage)
+
+ async function onMenssage(message) {
+ try {
+ let messageHeader
+ try {
+ messageHeader = JSON.parse(message)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'messageHeader Not Coorrect JSON Format.'
+ }
+ webApp.socket.send(JSON.stringify(response))
+ return
+ }
+
+ await webAppInterface.messageReceived(messageHeader.payload)
+ .then(sendResponseToWebApp)
+ .catch(onError)
+
+ function sendResponseToWebApp(response) {
+ webApp.socket.send(JSON.stringify(response))
+ }
+
+ function onError(errorMessage) {
+ console.log('[ERROR] Web Sockets Interface -> onMenssage -> errorMessage = ' + errorMessage)
+ let response = {
+ result: 'Error',
+ message: errorMessage
+ }
+ webApp.socket.send(JSON.stringify(response))
+ }
+
+ } catch (err) {
+ console.log('[ERROR] Web Sockets Interface -> onMenssage -> err.stack = ' + err.stack)
+ }
+ }
+ }
+
+ function onConnectionClosed() {
+ webApp = undefined
+ console.log('Desktop Web App Discoonnected from Web Sockets Interface ................... Disonnected from port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack)
+ }
+ }
+
+ function sendToWebApp(message) {
+ webApp.socket.send(JSON.stringify(message))
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/DK/modules/httpInterface.js b/Projects/Social-Trading/DK/modules/httpInterface.js
new file mode 100644
index 000000000..77bb35598
--- /dev/null
+++ b/Projects/Social-Trading/DK/modules/httpInterface.js
@@ -0,0 +1,93 @@
+exports.newDesktopModulesHttpInterface = function newDesktopModulesHttpInterface() {
+
+ /*
+ This module represent the HTTP API of the
+ Desktop App. All HTTP request are processed
+ by this module.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ }
+
+ function initialize() {
+ /*
+ We will create an HTTP Server and leave it running forever.
+ */
+ SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ /* Starting the browser now is optional */
+ if (process.argv.includes("noBrowser")) {
+ //Running Client only with no UI.
+ } else {
+ SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ }
+ }
+
+ function onHttpRequest(httpRequest, httpResponse) {
+ try {
+ let requestPathAndParameters = httpRequest.url.split('?') // Remove version information
+ let requestPath = requestPathAndParameters[0].split('/')
+ let endpointOrFile = requestPath[1]
+
+ switch (endpointOrFile) {
+ case 'Environment':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.env), httpResponse)
+ }
+ break
+ case 'ProjectsSchema':
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json'
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse)
+ }
+ break
+ case 'Projects':
+ {
+ let path = ''
+ for (let i = 2; i < 10; i++) {
+ if (requestPath[i] !== undefined) {
+ let parameter = unescape(requestPath[i])
+ path = path + '/' + parameter
+ }
+
+ }
+ let filePath = global.env.PATH_TO_PROJECTS + path
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'Images': // This means the Images folder.
+ {
+ let path = global.env.PATH_TO_DESKTOP + '/WebServer/Images/' + requestPath[2]
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ default:
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP)
+ }
+ }
+ } catch (err) {
+ console.log(err.stack)
+ }
+ }
+}
diff --git a/Projects/Social-Trading/NT/Globals/Memory.js b/Projects/Social-Trading/NT/Globals/Memory.js
index 6a42e762a..b0b2b9458 100644
--- a/Projects/Social-Trading/NT/Globals/Memory.js
+++ b/Projects/Social-Trading/NT/Globals/Memory.js
@@ -7,11 +7,12 @@ exports.newSocialTradingGlobalsMemory = function () {
USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id.
USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle.
USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map(), // Here we will store the user profiles by Blockchain Account.
- EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once.
+ EVENTS: new Map() // This is the registry of all events received that prevents processing them more than once.
},
arrays: {
NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking.
NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking.
+ EVENTS: [] // This is the registry of all events in order that prevents ordering them more than once.
}
}
diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js
index 16a1f1978..f37d898a0 100644
--- a/Projects/Social-Trading/NT/Modules/ClientInterface.js
+++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js
@@ -103,6 +103,16 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
return response
}
/*
+ We will not accept events that don't have an eventId.
+ */
+ if (eventReceived.eventId === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'eventId Not Provided.'
+ }
+ return response
+ }
+ /*
We will not accept events that have already been processed.
*/
@@ -132,6 +142,9 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
Any exception that happens while trying to change the state of the Social Graph,
will be returned to the caller without doing anything else here.
*/
+ if (err.stack !== undefined) {
+ console.log('[ERROR] Client Interface -> err.stack = ' + err.stack)
+ }
let errorMessage = err.message
if (errorMessage === undefined) { errorMessage = err }
let response = {
@@ -205,6 +218,9 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
/*
Any exception that happens while trying to execute the query.
*/
+ if (err.stack !== undefined) {
+ console.log('[ERROR] Client Interface -> err.stack = ' + err.stack)
+ }
let errorMessage = err.message
if (errorMessage === undefined) { errorMessage = err }
let response = {
diff --git a/Projects/Social-Trading/NT/Modules/Event.js b/Projects/Social-Trading/NT/Modules/Event.js
index 7db74847a..f0bf34040 100644
--- a/Projects/Social-Trading/NT/Modules/Event.js
+++ b/Projects/Social-Trading/NT/Modules/Event.js
@@ -139,8 +139,6 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
emitterUserProfile.addPost(
thisObject.emitterUserProfileId,
thisObject.targetUserProfileId,
- thisObject.emitterBotProfileId,
- thisObject.targetBotProfileId,
thisObject.emitterPostHash,
thisObject.targetPostHash,
thisObject.eventType - 10,
diff --git a/Projects/Social-Trading/NT/Modules/Queries/Events.js b/Projects/Social-Trading/NT/Modules/Queries/Events.js
index 1732fe794..b8085c5b9 100644
--- a/Projects/Social-Trading/NT/Modules/Queries/Events.js
+++ b/Projects/Social-Trading/NT/Modules/Queries/Events.js
@@ -22,7 +22,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ
function initialize(queryReceived) {
NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
- NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.memory.arrays.EVENTS)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.projects.socialTrading.globals.memory.arrays.EVENTS)
}
@@ -31,7 +31,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ
switch (thisObject.direction) {
case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
- let event = NT.memory.arrays.EVENTS[i]
+ let event = NT.projects.socialTrading.globals.memory.arrays.EVENTS[i]
if (event === undefined) { break }
checkEventContext(event)
}
@@ -39,7 +39,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ
}
case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
- let event = NT.memory.arrays.EVENTS[i]
+ let event = NT.projects.socialTrading.globals.memory.arrays.EVENTS[i]
if (event === undefined) { break }
checkEventContext(event)
}
diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js
index ce9ba104d..6fd01ef6f 100644
--- a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js
+++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js
@@ -35,7 +35,7 @@ exports.newSocialTradingModulesQueriesProfileFollowers = function newSocialTradi
let response = []
switch (thisObject.direction) {
- case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: {
for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
let arrayItem = thisObject.array[i]
if (arrayItem === undefined) { break }
@@ -43,7 +43,7 @@ exports.newSocialTradingModulesQueriesProfileFollowers = function newSocialTradi
}
break
}
- case NT.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ case NT.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: {
for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
let arrayItem = thisObject.array[i]
if (arrayItem === undefined) { break }
diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js
index a04791cac..d0c088350 100644
--- a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js
+++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js
@@ -35,7 +35,7 @@ exports.newSocialTradingModulesQueriesProfileFollowing = function newSocialTradi
let response = []
switch (thisObject.direction) {
- case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: {
for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
let arrayItem = thisObject.array[i]
if (arrayItem === undefined) { break }
@@ -43,7 +43,7 @@ exports.newSocialTradingModulesQueriesProfileFollowing = function newSocialTradi
}
break
}
- case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: {
for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
let arrayItem = thisObject.array[i]
if (arrayItem === undefined) { break }
diff --git a/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js b/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js
new file mode 100644
index 000000000..51a9b0d23
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js
@@ -0,0 +1,104 @@
+exports.newSocialTradingModulesQueriesUnfollowedUserProfiles = function newSocialTradingModulesQueriesUnfollowedUserProfiles() {
+ /*
+ This query returns a list of user profiles ordered
+ by Ranking. It filters out all the profiles that
+ are already followed by the Emitter User Profile.
+ */
+ let thisObject = {
+ emitterUserProfile: undefined,
+ profiles: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.profiles = undefined
+ thisObject.emitterUserProfile = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.emitterUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.emitterUserProfileId)
+ if (thisObject.emitterUserProfile === undefined) {
+ throw ('Emitter User Profile Not Found.')
+ }
+
+ thisObject.profiles = Array.from(
+ NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID,
+ x => x[1]
+ )
+ thisObject.profiles.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1)
+
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.profiles)
+
+ }
+
+ function execute() {
+
+ let response = []
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: {
+ let i = thisObject.initialIndex
+ let foundCount = 0
+ while (
+ foundCount < thisObject.amountRequested &&
+ i < thisObject.profiles.length
+ ) {
+ let profile = thisObject.profiles[i]
+ if (
+ thisObject.emitterUserProfile.following.get(profile.userProfileId) === undefined &&
+ thisObject.emitterUserProfile.userProfileId !== profile.userProfileId
+ ) {
+ addToResponse(profile)
+ foundCount++
+ }
+ i++
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: {
+ let i = thisObject.initialIndex
+ let foundCount = 0
+ while (
+ foundCount < thisObject.amountRequested &&
+ i >= 0
+ ) {
+ let profile = thisObject.profiles[i]
+ if (
+ thisObject.emitterUserProfile.following.get(profile.userProfileId) === undefined &&
+ thisObject.emitterUserProfile.userProfileId !== profile.userProfileId
+ ) {
+ addToResponse(profile)
+ foundCount++
+ }
+ i--
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(profile) {
+ let postResponse = {
+ "userProfileId": profile.userProfileId,
+ "userProfileHandle": profile.userProfileHandle,
+ "blockchainAccount": profile.blockchainAccount,
+ "ranking": profile.ranking,
+ "followingCount": profile.following.size,
+ "followersCount": profile.followers.size,
+ "postsCount": profile.posts.size,
+ "botsCount": profile.bots.size,
+ "emitterEventsCount": profile.emitterEventsCount,
+ "targetEventsCount": profile.targetEventsCount
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js
index bf5223624..57b93bd74 100644
--- a/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js
+++ b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js
@@ -5,7 +5,7 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo
and provide them with alternative of who to follow.
*/
let thisObject = {
- array: undefined,
+ profiles: undefined,
initialIndex: undefined,
amountRequested: undefined,
direction: undefined,
@@ -17,18 +17,18 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo
return thisObject
function finalize() {
- thisObject.array = undefined
+ thisObject.profiles = undefined
}
function initialize(queryReceived) {
- thisObject.array = Array.from(
+ thisObject.profiles = Array.from(
NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID,
x => x[1]
)
- thisObject.array.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1)
+ thisObject.profiles.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1)
- NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.profiles)
}
@@ -37,19 +37,19 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo
let response = []
switch (thisObject.direction) {
- case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: {
for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
- let arrayItem = thisObject.array[i]
- if (arrayItem === undefined) { break }
- addToResponse(arrayItem)
+ let profile = thisObject.profiles[i]
+ if (profile === undefined) { break }
+ addToResponse(profile)
}
break
}
- case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: {
for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
- let arrayItem = thisObject.array[i]
- if (arrayItem === undefined) { break }
- addToResponse(arrayItem)
+ let profile = thisObject.profiles[i]
+ if (profile === undefined) { break }
+ addToResponse(profile)
}
break
}
diff --git a/Projects/Social-Trading/NT/Modules/Query.js b/Projects/Social-Trading/NT/Modules/Query.js
index d60f1e998..9c0831118 100644
--- a/Projects/Social-Trading/NT/Modules/Query.js
+++ b/Projects/Social-Trading/NT/Modules/Query.js
@@ -34,6 +34,12 @@ exports.newSocialTradingModulesQuery = function newSocialTradingModulesQuery() {
break
}
+ case SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesUnfollowedUserProfiles.newSocialTradingModulesQueriesUnfollowedUserProfiles()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
case SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS: {
thisObject.query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
thisObject.query.initialize(queryReceived)
@@ -70,7 +76,7 @@ exports.newSocialTradingModulesQuery = function newSocialTradingModulesQuery() {
break
}
- case SA.projects.socialTrading.globals.queryTypes.maps.EVENTS: {
+ case SA.projects.socialTrading.globals.queryTypes.EVENTS: {
thisObject.query = NT.projects.socialTrading.modules.queriesEvents.newSocialTradingModulesQueriesEvents()
thisObject.query.initialize(queryReceived)
break
diff --git a/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js b/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js
new file mode 100644
index 000000000..864add3cd
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js
@@ -0,0 +1,20 @@
+exports.newSocialTradingModulesSocialGraph = function newSocialTradingModulesSocialGraph() {
+ /*
+ This object represent the entire Social Graph.
+ */
+ let thisObject = {
+
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ function initialize() {
+
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js
index dd63209ae..5dc208fb7 100644
--- a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js
+++ b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js
@@ -16,11 +16,11 @@ exports.newSocialTradingUtilitiesQueriesValidations = function newSocialTradingU
*/
if (queryReceived.targetUserProfileId !== undefined) {
thisObject.profile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
+ if (thisObject.profile === undefined) {
+ throw ('Target User Profile Not Found.')
+ }
}
- if (thisObject.profile === undefined) {
- throw ('Target User Profile Not Found.')
- }
/*
Validate Bot Profile
*/
@@ -91,7 +91,12 @@ exports.newSocialTradingUtilitiesQueriesValidations = function newSocialTradingU
throw ('Direction Undefined.')
}
- if (queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE && queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST) {
+ if (
+ queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE &&
+ queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST &&
+ queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP &&
+ queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN
+ ) {
throw ('Direction Not Supported.')
}
diff --git a/Projects/Social-Trading/SA/Globals/QueryConstants.js b/Projects/Social-Trading/SA/Globals/QueryConstants.js
index 8f62db770..d5a3e0d1b 100644
--- a/Projects/Social-Trading/SA/Globals/QueryConstants.js
+++ b/Projects/Social-Trading/SA/Globals/QueryConstants.js
@@ -6,7 +6,9 @@ exports.newSocialTradingGlobalsQueryConstants = function () {
MIN_AMOUNT_REQUESTED: 1,
MAX_AMOUNT_REQUESTED: 100,
DIRECTION_FUTURE: 'Future',
- DIRECTION_PAST: 'Past'
+ DIRECTION_PAST: 'Past',
+ DIRECTION_UP: 'Up',
+ DIRECTION_Down: 'Down'
}
return thisObject
diff --git a/Projects/Social-Trading/SA/Globals/QueryTypes.js b/Projects/Social-Trading/SA/Globals/QueryTypes.js
index ec010b230..34fa39dc6 100644
--- a/Projects/Social-Trading/SA/Globals/QueryTypes.js
+++ b/Projects/Social-Trading/SA/Globals/QueryTypes.js
@@ -2,13 +2,14 @@ exports.newSocialTradingGlobalsQueryTypes = function () {
let thisObject = {
USER_PROFILES: 0,
- USER_PROFILE_STATS: 1,
- BOT_PROFILE_STATS: 2,
- PROFILE_POSTS: 3,
- PROFILE_FOLLOWERS: 4,
- PROFILE_FOLLOWING: 5,
- POST_REPLIES: 6,
- EVENTS: 7
+ UNFOLLOWED_USER_PROFILES: 1,
+ USER_PROFILE_STATS: 2,
+ BOT_PROFILE_STATS: 3,
+ PROFILE_POSTS: 4,
+ PROFILE_FOLLOWERS: 5,
+ PROFILE_FOLLOWING: 6,
+ POST_REPLIES: 7,
+ EVENTS: 8
}
return thisObject
diff --git a/Projects/Social-Trading/UI/modules/WebSocketsClient.js b/Projects/Social-Trading/UI/modules/WebSocketsClient.js
new file mode 100644
index 000000000..aaeac8f9e
--- /dev/null
+++ b/Projects/Social-Trading/UI/modules/WebSocketsClient.js
@@ -0,0 +1,98 @@
+function newSocialTradingModulesWebSocketsClient() {
+
+ let thisObject = {
+ sendMessage: sendMessage,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let socketClient
+
+ let called = {}
+
+ return thisObject
+
+ function finalize() {
+ socketClient.close()
+ socketClient = undefined
+ clientInterface = undefined
+
+ called = undefined
+ }
+
+ async function initialize() {
+
+ socketClient = new WebSocket('ws://' + UI.environment.DESKTOP_WEB_SOCKETS_INTERFACE_HOST + ':' + UI.environment.DESKTOP_WEB_SOCKETS_INTERFACE_PORT)
+
+ await setUpWebsocketClient()
+ }
+
+ async function setUpWebsocketClient() {
+
+ return new Promise(connectToNewtwork)
+
+ function connectToNewtwork(resolve, reject) {
+
+ try {
+ socketClient.onopen = () => { onConnection() }
+ socketClient.onerror = err => { onError(err) }
+
+ function onConnection() {
+ resolve()
+ }
+
+ function onError(err) {
+ console.log('[ERROR] Web Sockets Client -> onError -> err.message = ' + err.message)
+ console.log('[ERROR] Web Sockets Client -> onError -> err.stack = ' + err.stack)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] Web Sockets Client -> setUpWebsocketClient -> err.stack = ' + err.stack)
+ }
+ }
+ }
+
+ function sendMessage(message) {
+
+ return new Promise(sendSocketMessage)
+
+ function sendSocketMessage(resolve, reject) {
+
+ if (socketClient.readyState !== 1) { // 1 means connected and ready.
+ console.log('[ERROR] Web Sockets Client -> sendMessage -> Cannot send message while connection is closed.')
+ reject('Websockets Connection Not Ready.')
+ return
+ }
+
+ let socketMessage = {
+ messageType: 'Request',
+ payload: message
+ }
+ socketClient.onmessage = socketMessage => { onMenssage(socketMessage) }
+ socketClient.send(
+ JSON.stringify(socketMessage)
+ )
+
+ function onMenssage(socketMessage) {
+ try {
+
+ let response = JSON.parse(socketMessage.data)
+ /*
+ Chack if we are waiting for the Handshake response.
+ */
+
+ if (response.result === 'Ok') {
+ resolve(response.data)
+ } else {
+ console.log('[ERROR] Web Sockets Client -> onMenssage -> response.message = ' + response.message)
+ reject(response.message)
+ }
+
+ } catch (err) {
+ callbackFunction = undefined
+ console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js
index 319a88b0b..1b17f2013 100644
--- a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js
+++ b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js
@@ -120,7 +120,7 @@ exports.newTensorFlowBotModulesTensorFlowLibrary = function (processIndex) {
async function saveModel() {
let fileLocation = getModelPath();
/* If necesary a folder or folders are created before writing the file to disk: */
- TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(fileLocation);
+ SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(fileLocation);
const savedModel = await tensorFlowModelsManager.model.save('file://' + fileLocation);
}
diff --git a/README.md b/README.md
index ce1b9f4a3..b7144fa5b 100644
--- a/README.md
+++ b/README.md
@@ -213,7 +213,7 @@ If you are having difficulty running the node setup command here are a few commo
## 1. Run the Client and GUI
-**A.** To run Superalgos, go to the Superalgos directory/folder and run this command:
+To run Superalgos, go to the Superalgos directory/folder and run this command:
```
node platform
@@ -225,7 +225,17 @@ A Welcome Tutorial pops-up automatically. You must do this Tutorial to finish th

+Alternatively, you may use any of the automatically installed desktop and start menu shortcuts to launch Superalgos.
+
+**NOTE:** Shortcuts are not currently supported on Mac. Collaborators are needed to finish this feature.
+
+
+
+
+**RUNNING THE CLIENT FOR HEADLESS RASPBERRY PI USERS**
+
If you are running a headless Raspberry Pi (one without a screen) you may need to change directories first and run Superalgos with the `minMemo` and `noBrowser` options.
+
```
cd Superalgos
```
@@ -234,11 +244,9 @@ then
node platform minMemo noBrowser
```
-In addition, you may use any of the automatically installed desktop and start menu shortcuts to launch Superalgos.
+
-**NOTE:** Shortcuts are not currently supported on Mac. Collaborators are needed to finish this feature.
-
-**B.** Enable Desktop Shortcut on Ubuntu
+**NOTE FOR UBUNTU USERS**: Enable Desktop Shortcut
The majority of shortcuts that are automatically installed will work out of the box. Desktop shortcuts on Ubuntu, however, require a few additional steps to set up.
diff --git a/TaskServer/.vscode/settings.json b/TaskServer/.vscode/settings.json
index e94f27f6f..43e1dd87f 100644
--- a/TaskServer/.vscode/settings.json
+++ b/TaskServer/.vscode/settings.json
@@ -4,14 +4,16 @@
"**/Documentation": true,
"**/Log-Files": true,
"**/node_modules": true,
- "**/Deprecated-Code": true
+ "**/Deprecated-Code": true,
+ "**/My-Social-Trading-Data": true,
},
"search.exclude": {
"**/Data-Storage": true,
"**/Documentation": true,
"**/Log-Files": true,
"**/node_modules": true,
- "**/Deprecated-Code": true
+ "**/Deprecated-Code": true,
+ "**/My-Social-Trading-Data": true
},
"search.maintainFileSearchCache": true
}
\ No newline at end of file
diff --git a/desktop.js b/desktop.js
index ced762c1a..a4ee44975 100644
--- a/desktop.js
+++ b/desktop.js
@@ -44,7 +44,9 @@ SA.nodeModules = {
web3: require('web3'),
ws: require('ws'),
open: require('open'),
- http: require('http')
+ http: require('http'),
+ octokit: require("@octokit/rest"),
+ simpleGit: require('simple-git')
}
/*
@@ -60,7 +62,10 @@ DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID = "baa2f02c-2920-4edb-a103-d452fc61d82f"
DK.TEST_NETWORK_CLIENT_USER_PROFILE_HANDLE = "Test-Network-Client-Profile"
DK.TEST_NETWORK_CLIENT_USER_PROFILE_PRIVATE_KEY = "0x5fed4817a87431c8a328d0936561e63f45b6db289adac6125b9306ded644dfe9"
-DK.app = require('./Desktop/DesktopApp.js').newDesktopApp()
-DK.app.run()
+run()
-console.log('Superalgos Desktop is Running.')
\ No newline at end of file
+async function run() {
+ DK.app = require('./Desktop/DesktopApp.js').newDesktopApp()
+ await DK.app.run()
+ console.log('Superalgos Desktop App is Running!')
+}
diff --git a/package-lock.json b/package-lock.json
index 469e05fe0..d801cc66a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -220,6 +220,145 @@
"@ethersproject/strings": "^5.4.0"
}
},
+ "@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+ "requires": {
+ "debug": "^4.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
+ },
+ "@octokit/auth-token": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
+ "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
+ "requires": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "@octokit/core": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
+ "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
+ "requires": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.0",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "requires": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/openapi-types": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.1.1.tgz",
+ "integrity": "sha512-ygp/6r25Ezb1CJuVMnFfOsScEtPF0zosdTJDZ7mZ+I8IULl7DP1BS5ZvPRwglcarGPXOvS5sHdR0bjnVDDfQdQ=="
+ },
+ "@octokit/plugin-paginate-rest": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz",
+ "integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==",
+ "requires": {
+ "@octokit/types": "^6.26.0"
+ }
+ },
+ "@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA=="
+ },
+ "@octokit/plugin-rest-endpoint-methods": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.1.tgz",
+ "integrity": "sha512-Rf1iMl40I0dIxjh1g32qZ6Ym/uT8QWZMm2vYGG5Vi8SX1MwZvbuxEGXYgmzTUWSD3PYWSLilE2+4L8kmdLGTMg==",
+ "requires": {
+ "@octokit/types": "^6.27.0",
+ "deprecation": "^2.3.1"
+ }
+ },
+ "@octokit/request": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz",
+ "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==",
+ "requires": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.1",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "@octokit/rest": {
+ "version": "18.10.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz",
+ "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==",
+ "requires": {
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.0",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^5.9.0"
+ }
+ },
+ "@octokit/types": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.27.0.tgz",
+ "integrity": "sha512-ha27f8DToxXBPEJdzHCCuqpw7AgKfjhWGdNf3yIlBAhAsaexBXTfWw36zNSsncALXGvJq4EjLy1p3Wz45Aqb4A==",
+ "requires": {
+ "@octokit/openapi-types": "^10.1.0"
+ }
+ },
"@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
@@ -357,6 +496,11 @@
"tweetnacl": "^0.14.3"
}
},
+ "before-after-hook": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
+ "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
+ },
"bignumber.js": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
@@ -807,6 +951,11 @@
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
+ "deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ },
"des.js": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
@@ -1561,6 +1710,11 @@
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
},
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ },
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -2335,6 +2489,31 @@
"simple-concat": "^1.0.0"
}
},
+ "simple-git": {
+ "version": "2.45.1",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.45.1.tgz",
+ "integrity": "sha512-NmEoThiLTJxl26WNtZxtJTue18ReTcSrf3so5vJG/O8KY9uMxH+yAhXV/DElBJyOYZrrBbVsH8JOFxgENdc9Xg==",
+ "requires": {
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "debug": "^4.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@@ -2570,6 +2749,11 @@
"which-boxed-primitive": "^1.0.2"
}
},
+ "universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+ },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
diff --git a/package.json b/package.json
index d083084f8..e59e25f2d 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,10 @@
{
"dependencies": {
+ "@octokit/rest": "^18.10.0",
"http": "0.0.1-security",
"node-fetch": "^2.6.1",
"open": "^8.2.1",
+ "simple-git": "^2.45.1",
"web3": "^1.5.2",
"ws": "^8.2.1"
}
diff --git a/run.js b/run.js
index 0c9c4b52f..358ad1df9 100644
--- a/run.js
+++ b/run.js
@@ -2,6 +2,6 @@ console.log('Superalgos is growing! In addition to the Platform for algo-traders
console.log('')
console.log('For that reason, the "node run" command has been deprecated. Please, use one of these instead:')
console.log('')
-console.log('node platform --------------- Runs the Superalgos Platform for algo-tarders.')
+console.log('node platform --------------- Runs the Superalgos Platform for algo-traders.')
console.log('node network --------------- Runs the P2P Network for social trading.')
-console.log('node desktop --------------- Runs the Desktop App for crypto users.')
\ No newline at end of file
+console.log('node desktop --------------- Runs the Desktop App for crypto users.')