diff --git a/README.md b/README.md index 6e2bc68..1afa099 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -# gfs +# GlobalFactSync + DBpedia, which frequently crawls and analyses over 120 Wikipedia language editions has near complete information about (1) which facts are in infoboxes across all Wikipedias (2) where Wikidata is already used in those infoboxes. GlobalFactSyncRE will extract all infobox facts and their references to produce a tool for Wikipedia editors that detects and displays differences across infobox facts in an intelligent way to help sync infoboxes between languages and/or Wikidata. The extracted references will also be used to enhance Wikidata. Click Join below to receive GFS updates via {{ping}} to your Wikiaccount. + +# Applications + +## Factual Consensus Finder + +**TODO** + +# Services diff --git a/factual-consensus-finder/.gitignore b/factual-consensus-finder/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/factual-consensus-finder/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/factual-consensus-finder/README.md b/factual-consensus-finder/README.md new file mode 100755 index 0000000..c6c5ff0 --- /dev/null +++ b/factual-consensus-finder/README.md @@ -0,0 +1,6 @@ +# TODO +# Usage + +``` +npm install +``` diff --git a/factual-consensus-finder/app.js b/factual-consensus-finder/app.js new file mode 100755 index 0000000..bd702a4 --- /dev/null +++ b/factual-consensus-finder/app.js @@ -0,0 +1,129 @@ +var express = require('express'); +// var createError = require('http-errors'); +// var path = require('path'); +// var cookieParser = require('cookie-parser'); +// var logger = require('morgan'); +var expressLayouts = require('express-ejs-layouts'); +// var conf = require('config') +// var indexRouter = require('./routes/index'); +// var usersRouter = require('./routes/users'); +var dateTime = require('node-datetime'); + +var conf = require('./config'); +var MongoClient = require('mongodb').MongoClient; +var util = require('util'); +var connection; + +var getJSON = require('get-json'); + +var app = express(); + +var sourceList = conf.preference.split(","); +sourceList.push("general"); +sourceList.sort(); + +app.use(expressLayouts); +//app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'ejs'); +app.use(express.static('public')); + + +MongoClient.connect(conf.mongo_url, function(err, client) { + + if (err) return console.log(err); + + connection = client.db(conf.database_name) +}); + +app.get('/', function(req, res) { + + var s = req.query.s; + var p = req.query.p; + var src = req.query.src; + + if( s == null ) s = conf.default_subject; + if( p == null ) p = conf.default_predicate; + if( src == null ) src = "general"; + + var original = s; + var locals; + + //TODO logging + if ( s.includes("wikipedia.org/wiki/") ) { + s = s.replace("https://","http://"); + s = s.replace("http://en.","http://"); + s = s.replace("wikipedia.org/wiki/","dbpedia.org/resource/"); + } + + getJSON(conf.id_management+s).then( function (idResponse) { + + if( s.startsWith("https://global.dbpedia")) { + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/\t"+original+"\t"+p); + } else { + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/\t"+original+">>"+idResponse['global']+"\t"+p); + } + + connection.collection(conf.collection).find( {"subject.@id" : idResponse['global'] }).toArray(function (mongoError, mongoResponse) { + res.render('clientbased',{jarray: mongoResponse, subject: idResponse['global'], predicate: p, + source: src, util: util, conf: conf, locals: idResponse['locals'] }); + }) + + }).catch(function (idError) { + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/\t"+original+"\t"+p+"\tunmanaged id"); + + connection.collection(conf.collection).find( {"subject.@id" : s }).toArray(function (mongoError, mongoResponse) { + res.render('clientbased',{jarray: mongoResponse, subject: s, predicate: p, + source: src, util: util, conf: conf, locals: [s] }); + }) + }); + + +}); + + +app.get('/raw', function(req, res) { + + var s = req.query.s; + var p = req.query.p; + var src = req.query.src; + + if( s == null ) s = conf.default_subject; + if( p == null ) p = conf.default_predicate; + if( src == null ) src = "general"; + + var locals = [s]; + + getJSON(conf.id_management+s).then( function (idResponse) { + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/\t"+s+"\t"+p); + s = idResponse['global']; + locals = idResponse['locals']; + }).catch(function (idError) { + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/\t"+s+"\t"+p+"\tunmanaged id"); + }); + + connection.collection(conf.collection).find( {"subject.@id" : s }).toArray(function (mongoError, mongoResponse) { + res.send(JSON.stringify({jarray: mongoResponse, subject: s, predicate: p, source: src})); + }); +}); + +app.get('/label', function (req,res) { + + var s = req.query.s; + + //TODO better conf + var p = conf.default_predicate; + + if( s == null ) s = conf.default_subject; + + console.log("[ "+dateTime.create().format('Y-m-d H:M:S')+" ]\t/label\t"+s); + + connection.collection(conf.collection) + .find( { "subject.@id" : s, "predicate.@id" : p } ) + .project( { "objects.object.@value" :1, _id: 0 } ) + .toArray(function (mongoError, mongoResponse) { + res.send(JSON.stringify(mongoResponse)); + }) +}); + + +module.exports = app; diff --git a/factual-consensus-finder/bin/www.js b/factual-consensus-finder/bin/www.js new file mode 100755 index 0000000..bcdd405 --- /dev/null +++ b/factual-consensus-finder/bin/www.js @@ -0,0 +1,93 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ +var app = require('../app'); + +var debug = require('debug')('fusion-wiki:server'); +var http = require('http'); + +var conf = require('../config') + +/** + * Get port from environment and store in Express. + */ + +// var port = normalizePort(process.env.PORT || process.argv[2]); +var port = normalizePort(process.env.PORT || conf.expose_port); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port, '0.0.0.0'); +server.on('error', onError); +server.on('listening', onListening); +console.log('listen on 0.0.0.0:'+port); +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/factual-consensus-finder/config.js b/factual-consensus-finder/config.js new file mode 100755 index 0000000..cf6323a --- /dev/null +++ b/factual-consensus-finder/config.js @@ -0,0 +1,14 @@ +module.exports = { + expose_port: "9005", + + mongo_url: "mongodb://readonly:gfs@88.99.242.78:8989/prefusion", + database_name: "prefusion", + collection: "provenance", + + id_management: "https://global.dbpedia.org/same-thing/lookup/?uri=", + + preference: "wikidata.dbpedia.org,en.dbpedia.org,de.dbpedia.org,fr.dbpedia.org,nl.dbpedia.org,sv.dbpedia.org", + + default_subject: "https://global.dbpedia.org/id/4KKSo", + default_predicate: "http://www.w3.org/2000/01/rdf-schema#label" +}; diff --git a/factual-consensus-finder/file b/factual-consensus-finder/file new file mode 100644 index 0000000..ba0fa0b --- /dev/null +++ b/factual-consensus-finder/file @@ -0,0 +1,247 @@ +<% +var othersrc = ["geonames.org","permid.org","dnb.de","kb.nl"]; +var labels = new Set(); +var ps = []; +var selected; +for(i = 0; i < jarray.length; i++) { + if ( jarray[i].predicate == "http://www.w3.org/2000/01/rdf-schema#label") { + var objectArray = jarray[i].objects; + for( k=0; k < objectArray.length; k++) { + labels.add(objectArray[k].value["@value"]) + } + } + ps.push(jarray[i].predicate) + if ( jarray[i].predicate == predicate ) { + selected = jarray[i]; + } +} +ps.sort(); +if( selected == null ) selected = jarray[0]; +var linkMap = new Map(); +var derivedFrom = [] //( iriprov == null ) ? [] : iriprov.derivedFrom; //selected == null || iriprov == null ) +if( iriprov == null ) { //selected == null || iriprov == null ) { + sourceList.forEach(function (value) { + if( value.includes("wikidata" ) ) { + linkMap.set("wikidata",' ') + } else if ( value.includes("dbpedia") ){ // HARDCODED LIST ! + linkMap.set(value,' ') + } else { + linkMap.set(value,""); + } + }) +} +derivedFrom.forEach(function (derived) { + var value = derived.value; + var tag = value.split("/").pop(); + if( value.includes("wikidata") ) { + linkMap.set("wikidata.dbpedia.org",' ') + } else if (value.includes("dbpedia") ) { + var lan = value.split("//")[1].split(".")[0]; + lan = ( lan == "dbpedia" ) ? "en" : lan; + var wikilink = ( value == "en" ) ? 'http://wikipedia.org/wiki/'+tag : 'http://'+lan+'.wikipedia.org/wiki/'+tag; + linkMap.set(lan+".dbpedia.org",' ') + } else if (value.includes("geonames.org") ) { + linkMap.set("geonames.org",'geonames.org'); + } else if (value.includes("permid.org") ) { + linkMap.set("permid.org",'permid.org'); + } else if (value.includes("d-nb.info") ) { + linkMap.set("dnb.de",'dnb.de'); + } else if (value.includes("data.bibliotheken.nl") ) { + linkMap.set("kb.nl",'kb.nl'); + } else { + linkMap.set(value,""); + } +}) +%> +
+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ <% + var labarr = Array.from(labels); + labarr.sort(); + %> +

About: <%- labarr.join(' | ') %>

+

0 different values in 0 sources

+ + + + + + + + + + + + + + <% + var objects = (jarray.length == 0 ) ? [] : selected.objects; + var maxSources = new Set(); + var counter = 0; + objects.forEach(function (x) { + var color = "white"; + var sources = []; + for( s = 0 ; s < x.source.length; s++ ) { + if(x.source[s]['@value'].includes(source) ) { + var lin = (typeof linkMap.get(source) === "undefined") ? "" : linkMap.get(source) + var sel = source.includes("dbpedia") ? source.split(".")[0] : source; + if( othersrc.indexOf(source) > -1 ) { + sel = ""; + lin = ''+lin+'' + } + sources.push(''+sel+''+lin) + maxSources.add(source) + color="lightgreen" + } else { + sourceList.forEach(function (sl) { + if(x.source[s]['@value'].includes(sl)) { + var lin = (typeof linkMap.get(sl) === "undefined") ? "" : linkMap.get(sl) + var sel = sl.includes("dbpedia") ? sl.split(".")[0] : sl; + if( othersrc.indexOf(sl) > -1 ) sel = ""; + sources.push(sel+lin) + maxSources.add(sl) + } + }) + + } + } + + var href = x.value['@id'] == null ? "" : "./?s="+encodeURIComponent(x.value['@id'])+"&src="+source; + var hrefLabel = x.value['@id'] == null ? "" : x.value['@id']; + // if( !hrefLabel.startsWith('http://id.dbpedia.org/') ) hrefLabel = ""; + sources.sort(); + %> + + + + + + + <% ++counter }) %> +
+ + + + + + + + + + + +
<%- x.value['@value'] %><%- x.value['@language'] == null ? "" : " @"+ ""+x.value['@language']+"" %> + <%- hrefLabel %><%- sources.join(' | ')%>TODO<%- sources.length %>
+
+ + +document.getElementById("info").innerText = '<%- objects.length %> different value/s in <%- Array.from(maxSources).length %> source/s'; \ No newline at end of file diff --git a/factual-consensus-finder/package-lock.json b/factual-consensus-finder/package-lock.json new file mode 100755 index 0000000..cd27b31 --- /dev/null +++ b/factual-consensus-finder/package-lock.json @@ -0,0 +1,995 @@ +{ + "name": "fusion-wiki", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "requires": { + "acorn": "^2.1.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + } + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "bson": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" + }, + "constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", + "requires": { + "acorn": "^2.1.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", + "requires": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" + }, + "css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.8.tgz", + "integrity": "sha512-QIDZL54fyV8MDcAsO91BMH1ft2qGGaHIJsJIA/+t+7uvXol1dm413fPcUgUb4k8F/9457rx4/KFE4XfDifrQxQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "express-ejs-layouts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/express-ejs-layouts/-/express-ejs-layouts-2.4.0.tgz", + "integrity": "sha512-RVQNw0tQLiRaNYoUKBqHsBbHVTrMNPUWS1D1NhKC4F0Hyf82fxCLk5pQJehUebcu5o7GWjhHBszLsaZ7SNAycg==" + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "get-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-json/-/get-json-1.0.1.tgz", + "integrity": "sha512-buUOE2bLaxIsF6zGIrwvsTVlvgU85qwAWf0Hgq/EJBBoSssUqOauXWKpsh4wgPdTlZHEVllLtphiuIzFM4UEHQ==", + "requires": { + "is-node": "0.0.0", + "jsonp": "0.0.4", + "phin": "^2.2.6" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-node": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/is-node/-/is-node-0.0.0.tgz", + "integrity": "sha1-h91lC4f7ajnFDKr+4On2g17BXkE=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "requires": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + } + }, + "jsonp": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.0.4.tgz", + "integrity": "sha1-lGZaS3caq+y4qshBNbmVlHVpGL0=", + "requires": { + "debug": "*" + } + }, + "jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + } + }, + "kareem": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", + "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mongodb": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.7.tgz", + "integrity": "sha512-n/14kMJEoARXz1qhpNPhUocqy+z5130jhqgEIX1Tsl8UVpHrndQ8et+VmgC4yPK/I8Tcgc93JEMQCHTekBUnNA==", + "requires": { + "mongodb-core": "3.0.7" + } + }, + "mongodb-core": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.7.tgz", + "integrity": "sha512-z6YufO7s40wLiv2ssFshqoLS4+Kf+huhHq6KZ7gDArsKNzXYjAwTMnhEIJ9GQ8fIfBGs5tBLNPfbIDoCKGPmOw==", + "requires": { + "bson": "~1.0.4", + "require_optional": "^1.0.1" + } + }, + "mongoose": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.5.3.tgz", + "integrity": "sha512-zlIiBhWHd5+mG3qJPcajrj9bMzjWesJeLaJsVrKVpOZy0XplphiQ8Evk9GiXJqy9IwDVDkoRFfzmBeiiVx2VYQ==", + "requires": { + "async": "2.6.1", + "bson": "~1.1.1", + "kareem": "2.3.0", + "mongodb": "3.2.2", + "mongodb-core": "3.2.2", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.5.1", + "mquery": "3.2.0", + "ms": "2.1.1", + "regexp-clone": "0.0.1", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "bson": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", + "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" + }, + "mongodb": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.2.tgz", + "integrity": "sha512-xQ6apOOV+w7VFApdaJpWhYhzartpjIDFQjG0AwgJkLh7dBs7PTsq4A3Bia2QWpDohmAzTBIdQVLMqqLy0mwt3Q==", + "requires": { + "mongodb-core": "3.2.2", + "safe-buffer": "^5.1.2" + } + }, + "mongodb-core": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.2.tgz", + "integrity": "sha512-YRgC39MuzKL0uoGoRdTmV1e9m47NbMnYmuEx4IOkgWAGXPSEzRY7cwb3N0XMmrDMnD9vp7MysNyAriIIeGgIQg==", + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "mpath": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", + "integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==" + }, + "mquery": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz", + "integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "0.0.1", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-datetime": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-datetime/-/node-datetime-2.1.2.tgz", + "integrity": "sha512-eev1F0IPKSu3zvASMtH8ic4znGpfXdq9yc8yc/EVx6bk57u7bS2iZKVZ8ll1ZeH/IEQ3qFb04FB70PCNXSIp4w==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "~0.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "requires": { + "asap": "~1.0.0" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "saslprep": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", + "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", + "requires": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + }, + "dependencies": { + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" + }, + "promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", + "requires": { + "is-promise": "~1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + } + } + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", + "requires": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + }, + "dependencies": { + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + } + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/factual-consensus-finder/package.json b/factual-consensus-finder/package.json new file mode 100755 index 0000000..ccc0099 --- /dev/null +++ b/factual-consensus-finder/package.json @@ -0,0 +1,22 @@ +{ + "name": "fusion-wiki", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.3", + "debug": "~2.6.9", + "ejs": "^2.5.8", + "express": "~4.16.0", + "express-ejs-layouts": "^2.4.0", + "get-json": "^1.0.0", + "http-errors": "~1.6.2", + "jade": "~1.11.0", + "mongodb": "^3.0.7", + "mongoose": "^5.5.3", + "morgan": "^1.9.1", + "node-datetime": "^2.1.2" + } +} diff --git a/factual-consensus-finder/public/images/200px-dbpedia.png b/factual-consensus-finder/public/images/200px-dbpedia.png new file mode 100755 index 0000000..aa605bc Binary files /dev/null and b/factual-consensus-finder/public/images/200px-dbpedia.png differ diff --git a/factual-consensus-finder/public/images/dbpedia.ico b/factual-consensus-finder/public/images/dbpedia.ico new file mode 100755 index 0000000..ba4fb0f Binary files /dev/null and b/factual-consensus-finder/public/images/dbpedia.ico differ diff --git a/factual-consensus-finder/public/images/dbpedia.png b/factual-consensus-finder/public/images/dbpedia.png new file mode 100755 index 0000000..c281183 Binary files /dev/null and b/factual-consensus-finder/public/images/dbpedia.png differ diff --git a/factual-consensus-finder/public/images/wikidata.ico b/factual-consensus-finder/public/images/wikidata.ico new file mode 100755 index 0000000..f56ae5b Binary files /dev/null and b/factual-consensus-finder/public/images/wikidata.ico differ diff --git a/factual-consensus-finder/public/images/wikipedia.ico b/factual-consensus-finder/public/images/wikipedia.ico new file mode 100755 index 0000000..e700218 Binary files /dev/null and b/factual-consensus-finder/public/images/wikipedia.ico differ diff --git a/factual-consensus-finder/public/javascripts/main.js b/factual-consensus-finder/public/javascripts/main.js new file mode 100755 index 0000000..d03e2bc --- /dev/null +++ b/factual-consensus-finder/public/javascripts/main.js @@ -0,0 +1,27 @@ +// jQuery.ajax({ +// url: "/dev4040/query", +// type: "GET", +// +// contentType: 'application/json; charset=utf-8', +// success: function(resultData) { +// response = resultData; +// }, +// error : function(jqXHR, textStatus, errorThrown) { +// }, +// +// timeout: 120000, +// }); +// +// document.getElementById("debug").innerText = response; +// function createTable(data) { +// var table = document.getElementById("fusionTable"); +// for(i=0; i< 2; i++) { +// var row = table.insertRow(); +// var cell1 = row.insertCell(0); +// var cell2 = row.insertCell(1); +// cell1.innerHTML = "NEW CELL1"; +// cell2.innerHTML = "NEW CELL2"; +// } +// } + +// <%- href == null ? "" : ''+x.value['@id']+"" %> \ No newline at end of file diff --git a/factual-consensus-finder/public/stylesheets/style.css b/factual-consensus-finder/public/stylesheets/style.css new file mode 100755 index 0000000..a9e9367 --- /dev/null +++ b/factual-consensus-finder/public/stylesheets/style.css @@ -0,0 +1,37 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #0071ff; +} + +.invis { + display: none; + border: 0; + border-bottom: 1px solid #ccc; +} + +.content { + padding-left: 70px; + padding-right: 40px; +} + +.foo { + position: fixed; + left: 0; + bottom: 0; + width: 100%; + background: whitesmoke; + text-align: right; +} + +.hidden-col { + visibility: hidden; +} + +.iconlinks { + border-radius: 50%; + height: 20px; +} \ No newline at end of file diff --git a/factual-consensus-finder/routes/index.js b/factual-consensus-finder/routes/index.js new file mode 100755 index 0000000..ecca96a --- /dev/null +++ b/factual-consensus-finder/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/factual-consensus-finder/routes/users.js b/factual-consensus-finder/routes/users.js new file mode 100755 index 0000000..623e430 --- /dev/null +++ b/factual-consensus-finder/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/factual-consensus-finder/views/clientbased.ejs b/factual-consensus-finder/views/clientbased.ejs new file mode 100755 index 0000000..fc05947 --- /dev/null +++ b/factual-consensus-finder/views/clientbased.ejs @@ -0,0 +1,380 @@ +<% + var labels = new Set() + var objects = [] + var sources = new Set() + sources.add('general') + + var color = "white"; + + var predicates = new Set() + + function getLangTag ( singleFileLocator ) { + + var langTagStartPos = String(singleFileLocator).indexOf("lang=") + + if ( langTagStartPos > -1 ) { + + var afterLang = String(singleFileLocator).substr(langTagStartPos+5) + + if ( afterLang.indexOf('_') > -1 ) { + + return afterLang.substr(0,afterLang.indexOf('_')) + + } else { + + return afterLang.substr(0,afterLang.indexOf('.')) + } + } else { + + return "wikidata" + } + } + + jarray.forEach( function (response) { + + predicates.add(response['predicate']['@id']) + + if ( response['predicate']['@id'] == predicate ) { + response.objects.forEach( function ( prov ) { + prov["source"].forEach( function ( source ) { + sources.add(getLangTag(source['@id'])) + }) + }) + objects.push(response['objects']) + } + + if ( response['predicate']['@id'] == conf.default_predicate ) { + response['objects'].forEach( function ( prov ) { + labels.add(prov['object']['@value']) + }) + } + }) + + var sourceList = Array.from(sources).sort() + var predicateList = Array.from(predicates).sort() + + var refMap = new Map(); + + locals.forEach(function (iri) { + + var tag = iri.split("/").pop(); + + if( iri.includes("www.wikidata") ) { + + refMap.set("wikidata",' ') + + } else if (iri.includes("dbpedia") ) { + + var lan = iri.split("//")[1].split(".")[0]; + lan = ( lan == "dbpedia" ) ? "en" : lan; + var wikilink = ( iri == "en" ) ? 'http://wikipedia.org/wiki/'+tag : 'http://'+lan+'.wikipedia.org/wiki/'+tag; + refMap.set(lan,' ') + + } else { + refMap.set(iri,""); + } + }) +%> + + + +

About: <%- Array.from(labels).sort().join(' | ') %>

+ + +<% if( false ) {%> +
+
+
+ +

Find latest news about Siemens
+
+
+ +

More data available on OpenCorporates
+
+
+ +

Edit on Wikidata
+
+
+ +

Test data with SHACL
+
+
+
+<% } %> + + + +
+
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+ + + +
+

0 different values from 0 sources

+ + + + + + + + + + + + + + + + <% + var possibleSources = new Set(); + var rowCount = 0; + + objects.forEach(function ( element ) { + element.forEach( function (prov) { + + var color = "white"; + var objectSources = []; + + prov['source'].forEach( function ( src ) { + + var current_source = getLangTag(src['@id']) + var refLinks = (typeof refMap.get(current_source) === "undefined") ? "" : refMap.get(current_source) + if( current_source == source) { + objectSources.push(''+current_source+''+refLinks); + possibleSources.add(current_source) + color="lightgreen" + } else { + objectSources.push(current_source+refLinks) + possibleSources.add(current_source) + } + }) + + objectSources.sort(); + + var href = '@id' in prov['object'] ? "./?s="+encodeURIComponent(prov['object']['@id'])+"&src="+source : "" ; + var hrefLabel = '@id' in prov['object'] ? prov['object']['@id'] : ""; + + %> + + <% if ( '@language' in prov['object'] ) { %> + + + + <% } else if ( '@value' in prov['object'] ) { %> + + + + <% } else { %> + + <% } %> + + + + + <% ++rowCount } ) }) %> +
+ + + + + + + + +
+ <%- + util.format( + "%s @%s", + prov['object']['@value'], + prov['object']['@language'] + ) + %> + + <%- prov['object']['@value'] %> + <%- hrefLabel %><%- objectSources.join(' | ')%><%- objectSources.length %>
+
+ + + + + + diff --git a/factual-consensus-finder/views/footer.ejs b/factual-consensus-finder/views/footer.ejs new file mode 100755 index 0000000..8d52409 --- /dev/null +++ b/factual-consensus-finder/views/footer.ejs @@ -0,0 +1,6 @@ + + + +
+ DBpedia +
\ No newline at end of file diff --git a/factual-consensus-finder/views/header.ejs b/factual-consensus-finder/views/header.ejs new file mode 100755 index 0000000..7d9d72a --- /dev/null +++ b/factual-consensus-finder/views/header.ejs @@ -0,0 +1,5 @@ +
+ +

Factual Consensus Finder

+
+
diff --git a/factual-consensus-finder/views/importhead.ejs b/factual-consensus-finder/views/importhead.ejs new file mode 100755 index 0000000..98e98a3 --- /dev/null +++ b/factual-consensus-finder/views/importhead.ejs @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/factual-consensus-finder/views/index.ejs b/factual-consensus-finder/views/index.ejs new file mode 100755 index 0000000..a86b047 --- /dev/null +++ b/factual-consensus-finder/views/index.ejs @@ -0,0 +1,40 @@ +
+ + +
+ +
+ +
+

+<% function getMethods(obj) +{ + var res = []; + for(var m in obj) { + if(typeof obj[m] == "function") { + res.push(m) + } + } + return res; +} + +%> + + + + + + + +
Fixeds,p
Urisubject
Namelabel
Property +
Statss,p
+<% for(i= 0; i < 5; i++) { %> + Test +<% }%> \ No newline at end of file diff --git a/factual-consensus-finder/views/layout.ejs b/factual-consensus-finder/views/layout.ejs new file mode 100755 index 0000000..a7fa3f2 --- /dev/null +++ b/factual-consensus-finder/views/layout.ejs @@ -0,0 +1,17 @@ + + + + <%- include importhead.ejs%> + + Factual Consensus Finder + + + + + + +<%- include header.ejs%> +<%- body %> +<%- include footer.ejs%> + + diff --git a/factual-consensus-finder/views/prop.ejs b/factual-consensus-finder/views/prop.ejs new file mode 100755 index 0000000..0a74db1 --- /dev/null +++ b/factual-consensus-finder/views/prop.ejs @@ -0,0 +1,49 @@ + +<% + var myMap = new Map(); + jarray.forEach(function (v) { + v.objects.forEach(function (o) { + o.source.forEach(function (s) { + if(myMap.has(s['@value'])) { + myMap.set(s['@value'],myMap.get(s['@value'])+1) + } else { + myMap.set(s['@value'],1) + + } + }) + + }) +}) +%> +
+
+
+ + +
+
+
+
+ + diff --git a/factual-consensus-finder/views/test.ejs b/factual-consensus-finder/views/test.ejs new file mode 100755 index 0000000..6738a7d --- /dev/null +++ b/factual-consensus-finder/views/test.ejs @@ -0,0 +1,101 @@ + +<% + +var srclist = ['general','fr','nl']; +var labels = new Set(); +var ps = []; +var selected; +for(i = 0; i < jarray.length; i++) { + if ( jarray[i].predicate == "http://www.w3.org/2000/01/rdf-schema#label") { + var objects = jarray[i].objects; + for( k=0; k < objects.length; k++) { + labels.add(objects[k].value["@value"]) + } + } + ps.push(jarray[i].predicate) + if ( jarray[i].predicate == predicate ) { + selected = jarray[i]; + } +} +ps.sort(); +%> +
+
+
+ + +
+ +
+ + +
+
+ + + +
+
+
+
+ +
+
+
+





+
+
+

About: <%- Array.from(labels).join(' | ') %>

+ + +<% +var objects = selected.objects +objects.forEach(function (x) { + var sources = []; + for( s = 0 ; s < x.source.length; s++ ) { + if(x.source[s]['@value'] == src ) { + sources.push(''+x.source[s]['@value']+"") + } else { + sources.push(x.source[s]['@value']) + } + } + var color = "white"; + if( x.selected == true ) color = "white"; + // if( x.source.contains("fr") ) color = "grey"; +%> + +<% }) %> +
valuesourceselected
<%- x.value['@value'] %><%- x.value['@id'] %><%- sources.join(' | ')%><%- x.selected %>
+ +
\ No newline at end of file