diff --git a/CHANGELOG.md b/CHANGELOG.md
index 541ca77fb..d250c0fc2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,12 +21,17 @@
- The browser-reported `Origin` header will now be checked by
default, and the ACL system can be used to restrict access
to applications for added security.
+ - Users can add `trustedApp` entries to their profile using a new databrowser pane.
+ You will see an 'A' icon added while you view a Person's profile URL
+ with the data browser (might have to hit refresh in your browser and make sure you
+ are viewing a WebId URL like https://localhost:8443/profile/card#me).
- Logging is now verbose by default so the `-v` option has been
removed and a `--quiet` option has been added to mute the log.
- To be bug compliant with 4.x releases, if a rule for public readable
root / does not exist, it will check in /index.html.acl (see issue #1063)
- Command line options are now kebab-cased rather than camelCased,
config options may be both.
+- Resource with no extension now have '$.ttl' appended in the filename (see upgrades notes below).
- Many smaller fixes.
#### 5.0.0 Upgrade Notes
diff --git a/bin/lib/cli.js b/bin/lib/cli.js
index 889903bed..9131896d8 100644
--- a/bin/lib/cli.js
+++ b/bin/lib/cli.js
@@ -25,10 +25,15 @@ function getVersion () {
// Obtain version from git
const options = { cwd: __dirname, encoding: 'utf8' }
const { stdout } = spawnSync('git', ['describe', '--tags'], options)
- return stdout.trim()
+ const version = stdout.trim()
+ if (version === '') {
+ throw new Error('No git version here')
+ }
+ return version
} catch (e) {
// Obtain version from package.json
const { version } = require(path.join(__dirname, '../../package.json'))
return version
}
}
+
diff --git a/config/defaults.js b/config/defaults.js
index 97c82f0e6..92b4ef70e 100644
--- a/config/defaults.js
+++ b/config/defaults.js
@@ -12,7 +12,7 @@ module.exports = {
'serverUri': 'https://localhost:8443',
'webid': true,
'strictOrigin': true,
- 'trustedOrigins': ['https://apps.solid.invalid'],
+ 'trustedOrigins': [],
'dataBrowserPath': 'default'
// For use in Enterprises to configure a HTTP proxy for all outbound HTTP requests from the SOLID server (we use
diff --git a/lib/acl-checker.js b/lib/acl-checker.js
index 53c41f86d..be3260582 100644
--- a/lib/acl-checker.js
+++ b/lib/acl-checker.js
@@ -16,11 +16,10 @@ class ACLChecker {
constructor (resource, options = {}) {
this.resource = resource
this.resourceUrl = new URL(resource)
- this.agentOrigin = options.agentOrigin
+ this.agentOrigin = options.strictOrigin && options.agentOrigin ? rdf.sym(options.agentOrigin) : null
this.fetch = options.fetch
this.fetchGraph = options.fetchGraph
- this.strictOrigin = options.strictOrigin
- this.trustedOrigins = options.trustedOrigins
+ this.trustedOrigins = options.strictOrigin && options.trustedOrigins ? options.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null
this.suffix = options.suffix || DEFAULT_ACL_SUFFIX
this.aclCached = {}
this.messagesCached = {}
@@ -56,17 +55,23 @@ class ACLChecker {
const aclFile = rdf.sym(acl.acl)
const agent = user ? rdf.sym(user) : null
const modes = [ACL(mode)]
- const agentOrigin = this.agentOrigin ? rdf.sym(this.agentOrigin) : null
- const trustedOrigins = this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null
- const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins)
- if (accessDenied && this.agentOrigin && this.resourceUrl.origin !== this.agentOrigin) {
- this.messagesCached[cacheKey].push(HTTPError(403, accessDenied))
- } else if (accessDenied && user) {
+ const agentOrigin = this.agentOrigin
+ const trustedOrigins = this.trustedOrigins
+ let originTrustedModes = []
+ try {
+ this.fetch(aclFile.doc().value)
+ originTrustedModes = await aclCheck.getTrustedModesForOrigin(acl.graph, resource, directory, aclFile, agentOrigin, (uriNode) => {
+ return this.fetch(uriNode.doc().value, acl.graph)
+ })
+ } catch (e) {
+ // FIXME: https://github.com/solid/acl-check/issues/23
+ // console.error(e.message)
+ }
+ const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins, originTrustedModes)
+ if (accessDenied && user) {
this.messagesCached[cacheKey].push(HTTPError(403, accessDenied))
- } else if (accessDenied && !user) {
- this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated'))
} else if (accessDenied) {
- this.messagesCached[cacheKey].push(HTTPError(401, accessDenied))
+ this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated'))
}
this.aclCached[cacheKey] = Promise.resolve(!accessDenied)
return this.aclCached[cacheKey]
diff --git a/lib/api/accounts/user-accounts.js b/lib/api/accounts/user-accounts.js
index cc5daafd0..2d58631cd 100644
--- a/lib/api/accounts/user-accounts.js
+++ b/lib/api/accounts/user-accounts.js
@@ -4,6 +4,8 @@ const express = require('express')
const bodyParser = require('body-parser').urlencoded({ extended: false })
const debug = require('../../debug').accounts
+const restrictToTopDomain = require('../../handlers/restrict-to-top-domain')
+
const CreateAccountRequest = require('../../requests/create-account-request')
const AddCertificateRequest = require('../../requests/add-cert-request')
const DeleteAccountRequest = require('../../requests/delete-account-request')
@@ -65,16 +67,16 @@ function middleware (accountManager) {
router.get('/', checkAccountExists(accountManager))
- router.post('/api/accounts/new', bodyParser, CreateAccountRequest.post)
- router.get(['/register', '/api/accounts/new'], CreateAccountRequest.get)
+ router.post('/api/accounts/new', restrictToTopDomain, bodyParser, CreateAccountRequest.post)
+ router.get(['/register', '/api/accounts/new'], restrictToTopDomain, CreateAccountRequest.get)
- router.post('/api/accounts/cert', bodyParser, newCertificate(accountManager))
+ router.post('/api/accounts/cert', restrictToTopDomain, bodyParser, newCertificate(accountManager))
- router.get('/account/delete', DeleteAccountRequest.get)
- router.post('/account/delete', bodyParser, DeleteAccountRequest.post)
+ router.get('/account/delete', restrictToTopDomain, DeleteAccountRequest.get)
+ router.post('/account/delete', restrictToTopDomain, bodyParser, DeleteAccountRequest.post)
- router.get('/account/delete/confirm', DeleteAccountConfirmRequest.get)
- router.post('/account/delete/confirm', bodyParser, DeleteAccountConfirmRequest.post)
+ router.get('/account/delete/confirm', restrictToTopDomain, DeleteAccountConfirmRequest.get)
+ router.post('/account/delete/confirm', restrictToTopDomain, bodyParser, DeleteAccountConfirmRequest.post)
return router
}
diff --git a/lib/api/authn/webid-oidc.js b/lib/api/authn/webid-oidc.js
index f48f7d3d0..798bd6d47 100644
--- a/lib/api/authn/webid-oidc.js
+++ b/lib/api/authn/webid-oidc.js
@@ -9,6 +9,8 @@ const bodyParser = require('body-parser').urlencoded({ extended: false })
const OidcManager = require('../../models/oidc-manager')
const { LoginRequest } = require('../../requests/login-request')
+const restrictToTopDomain = require('../../handlers/restrict-to-top-domain')
+
const PasswordResetEmailRequest = require('../../requests/password-reset-email-request')
const PasswordChangeRequest = require('../../requests/password-change-request')
@@ -71,11 +73,11 @@ function middleware (oidc) {
router.post('/login/tls', bodyParser, LoginRequest.loginTls)
- router.get('/account/password/reset', PasswordResetEmailRequest.get)
- router.post('/account/password/reset', bodyParser, PasswordResetEmailRequest.post)
+ router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get)
+ router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post)
- router.get('/account/password/change', PasswordChangeRequest.get)
- router.post('/account/password/change', bodyParser, PasswordChangeRequest.post)
+ router.get('/account/password/change', restrictToTopDomain, PasswordChangeRequest.get)
+ router.post('/account/password/change', restrictToTopDomain, bodyParser, PasswordChangeRequest.post)
router.get('/.well-known/solid/logout/', (req, res) => res.redirect('/logout'))
diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js
index 567ee2561..f96fe021d 100644
--- a/lib/capability-discovery.js
+++ b/lib/capability-discovery.js
@@ -3,22 +3,7 @@
* @module capability-discovery
*/
const express = require('express')
-
-const serviceConfigDefaults = {
- 'api': {
- 'accounts': {
- // 'changePassword': '/api/account/changePassword',
- // 'delete': '/api/accounts/delete',
-
- // Create new user (see IdentityProvider.post() in identity-provider.js)
- 'new': '/api/accounts/new',
- 'recover': '/api/accounts/recover',
- 'signin': '/login',
- 'signout': '/logout',
- 'validateToken': '/api/accounts/validateToken'
- }
- }
-}
+const { URL } = require('url')
module.exports = capabilityDiscovery
@@ -31,7 +16,7 @@ function capabilityDiscovery () {
const router = express.Router('/')
// Advertise the server capability discover endpoint
- router.get('/.well-known/solid', serviceCapabilityDocument(serviceConfigDefaults))
+ router.get('/.well-known/solid', serviceCapabilityDocument())
return router
}
@@ -43,12 +28,27 @@ function capabilityDiscovery () {
* @param res
* @param next
*/
-function serviceCapabilityDocument (serviceConfig) {
+function serviceCapabilityDocument () {
return (req, res) => {
- // Add the server root url
- serviceConfig.root = req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path)
- // Add the 'apps' urls section
- serviceConfig.apps = req.app.locals.appUrls
- res.json(serviceConfig)
+ const ldp = req.app.locals.ldp
+ res.json({
+ // Add the server root url
+ root: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path),
+ // Add the 'apps' urls section
+ apps: req.app.locals.appUrls,
+ api: {
+ accounts: {
+ // 'changePassword': '/api/account/changePassword',
+ // 'delete': '/api/accounts/delete',
+
+ // Create new user (see IdentityProvider.post() in identity-provider.js)
+ new: new URL('/api/accounts/new', ldp.serverUri),
+ recover: new URL('/api/accounts/recover', ldp.serverUri),
+ signin: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/login'),
+ signout: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/logout'),
+ validateToken: new URL('/api/accounts/validateToken', ldp.serverUri)
+ }
+ }
+ })
}
}
diff --git a/lib/create-app.js b/lib/create-app.js
index da2ec9980..9b4be11e8 100644
--- a/lib/create-app.js
+++ b/lib/create-app.js
@@ -42,18 +42,24 @@ function createApp (argv = {}) {
// Override default configs (defaults) with passed-in params (argv)
argv = Object.assign({}, defaults, argv)
- argv.host = SolidHost.from({ port: argv.port, serverUri: argv.serverUri })
+ argv.host = SolidHost.from(argv)
argv.resourceMapper = new ResourceMapper({
rootUrl: argv.serverUri,
rootPath: path.resolve(argv.root || process.cwd()),
includeHost: argv.multiuser,
- defaultContentType: argv.defaultContentType
+ defaultContentType: argv.defaultContentType,
+ fileSuffixes: [
+ argv.suffixAcl || '.acl',
+ argv.suffixMeta || '.meta'
+ ]
})
const configPath = config.initConfigDir(argv)
argv.templates = config.initTemplateDirs(configPath)
+ config.printDebugInfo(argv)
+
const ldp = new LDP(argv)
const app = express()
@@ -206,14 +212,27 @@ function initWebId (argv, app, ldp) {
// without permission by including the credentials set by the Solid server.
app.use((req, res, next) => {
const origin = req.get('origin')
- const trustedOrigins = argv.trustedOrigins
+ const trustedOrigins = ldp.getTrustedOrigins(req)
const userId = req.session.userId
// Exception: allow logout requests from all third-party apps
// such that OIDC client can log out via cookie auth
// TODO: remove this exception when OIDC clients
// use Bearer token to authenticate instead of cookie
// (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003)
- if (!argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) {
+ //
+ // Authentication cookies are an optimization:
+ // instead of going through the process of
+ // fully validating authentication on every request,
+ // we go through this process once,
+ // and store its successful result in a cookie
+ // that will be reused upon the next request.
+ // However, that cookie can then be sent by any server,
+ // even servers that have not gone through the proper authentication mechanism.
+ // However, if trusted origins are enabled,
+ // then any origin is allowed to take the shortcut route,
+ // since malicious origins will be banned at the ACL checking phase.
+ // https://github.com/solid/node-solid-server/issues/1117
+ if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) {
debug.authentication(`Rejecting session for ${userId} from ${origin}`)
// Destroy session data
delete req.session.userId
diff --git a/lib/create-server.js b/lib/create-server.js
index 31216c834..33411f047 100644
--- a/lib/create-server.js
+++ b/lib/create-server.js
@@ -80,20 +80,20 @@ function createServer (argv, app) {
}
// Look for port or list of ports to redirect to argv.port
- if ('redirectHTTPFrom' in argv) {
- const redirectHTTPFroms = argv.redirectHTTPFrom.constructor === Array
- ? argv.redirectHTTPFrom
- : [argv.redirectHTTPFrom]
+ if ('redirectHttpFrom' in argv) {
+ const redirectHttpFroms = argv.redirectHttpFrom.constructor === Array
+ ? argv.redirectHttpFrom
+ : [argv.redirectHttpFrom]
const portStr = argv.port === 443 ? '' : ':' + argv.port
- redirectHTTPFroms.forEach(redirectHTTPFrom => {
- debug.settings('will redirect from port ' + redirectHTTPFrom + ' to port ' + argv.port)
+ redirectHttpFroms.forEach(redirectHttpFrom => {
+ debug.settings('will redirect from port ' + redirectHttpFrom + ' to port ' + argv.port)
let redirectingServer = express()
redirectingServer.get('*', function (req, res) {
let host = req.headers.host.split(':') // ignore port
debug.server(host, '=> https://' + host + portStr + req.url)
res.redirect('https://' + host + portStr + req.url)
})
- redirectingServer.listen(redirectHTTPFrom)
+ redirectingServer.listen(redirectHttpFrom)
})
}
diff --git a/lib/handlers/patch.js b/lib/handlers/patch.js
index 3502af90d..18f5823b8 100644
--- a/lib/handlers/patch.js
+++ b/lib/handlers/patch.js
@@ -10,6 +10,7 @@ const $rdf = require('rdflib')
const crypto = require('crypto')
const overQuota = require('../utils').overQuota
const getContentType = require('../utils').getContentType
+const { lock } = require('proper-lockfile')
// Patch parsers by request body content type
const PATCH_PARSERS = {
@@ -23,6 +24,7 @@ const DEFAULT_FOR_NEW_CONTENT_TYPE = 'text/turtle'
async function patchHandler (req, res, next) {
debug(`PATCH -- ${req.originalUrl}`)
res.header('MS-Author-Via', 'SPARQL')
+ let releaseLock
try {
// Obtain details of the target resource
const ldp = req.app.locals.ldp
@@ -50,15 +52,13 @@ async function patchHandler (req, res, next) {
throw error(415, `Unsupported patch content type: ${patch.contentType}`)
}
- // Parse the target graph and the patch document,
- // and verify permission for performing this specific patch
- const [graph, patchObject] = await Promise.all([
- readGraph(resource),
- parsePatch(url, patch.uri, patch.text)
- .then(patchObject => checkPermission(req, patchObject))
- ])
+ // Parse the patch document and verify permissions
+ const patchObject = await parsePatch(url, patch.uri, patch.text)
+ await checkPermission(req, patchObject)
// Patch the graph and write it back to the file
+ releaseLock = await lock(path, { retries: 10, realpath: false })
+ const graph = await readGraph(resource)
await applyPatch(patchObject, graph, url)
const result = await writeGraph(graph, resource, ldp.resourceMapper.rootPath, ldp.serverUri)
@@ -66,6 +66,10 @@ async function patchHandler (req, res, next) {
res.send(result)
} catch (err) {
return next(err)
+ } finally {
+ if (releaseLock) {
+ await releaseLock()
+ }
}
return next()
}
diff --git a/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js
new file mode 100644
index 000000000..2b6aecc37
--- /dev/null
+++ b/lib/handlers/restrict-to-top-domain.js
@@ -0,0 +1,13 @@
+const HTTPError = require('../http-error')
+
+module.exports = function (req, res, next) {
+ const locals = req.app.locals
+ const ldp = locals.ldp
+ const serverUri = locals.host.serverUri
+ const hostname = ldp.resourceMapper.resolveUrl(req.hostname)
+ if (hostname === serverUri) {
+ return next()
+ }
+ const isLoggedIn = !!(req.session && req.session.userId)
+ return next(new HTTPError(isLoggedIn ? 403 : 401, 'Not allowed to access top-level APIs on accounts'))
+}
diff --git a/lib/ldp.js b/lib/ldp.js
index db7c6d38e..6621f0a1e 100644
--- a/lib/ldp.js
+++ b/lib/ldp.js
@@ -1,4 +1,4 @@
-const path = require('path')
+const { join, dirname } = require('path')
const url = require('url')
const fs = require('fs')
const $rdf = require('rdflib')
@@ -17,6 +17,7 @@ const parse = require('./utils').parse
const fetch = require('node-fetch')
const { promisify } = require('util')
const URI = require('urijs')
+const { lock } = require('proper-lockfile')
const RDF_MIME_TYPES = new Set([
'text/turtle', // .ttl
@@ -63,21 +64,6 @@ class LDP {
this.corsProxy = '/' + this.corsProxy
}
- debug.settings('Server URI: ' + this.serverUri)
- debug.settings('Auth method: ' + this.auth)
- debug.settings('Strict origins: ' + this.strictOrigin)
- debug.settings('Allowed origins: ' + this.trustedOrigins)
- debug.settings('Db path: ' + this.dbPath)
- debug.settings('Config path: ' + this.configPath)
- debug.settings('Suffix Acl: ' + this.suffixAcl)
- debug.settings('Suffix Meta: ' + this.suffixMeta)
- debug.settings('Filesystem Root: ' + (this.resourceMapper ? this.resourceMapper.rootPath : 'none'))
- debug.settings('Allow WebID authentication: ' + !!this.webid)
- debug.settings('Live-updates: ' + !!this.live)
- debug.settings('Multi-user: ' + !!this.multiuser)
- debug.settings('Suppress default data browser app: ' + this.suppressDataBrowser)
- debug.settings('Default data browser app file path: ' + this.dataBrowserPath)
-
return this
}
@@ -90,20 +76,18 @@ class LDP {
})
}
- createReadStream (filename, start, end) {
- if (start && end) {
- return fs.createReadStream(filename, {'start': start, 'end': end})
- } else {
- return fs.createReadStream(filename)
- }
- }
-
async readResource (url) {
+ let releaseLock
try {
const { path } = await this.resourceMapper.mapUrlToFile({ url })
- return await promisify(fs.readFile)(path, {'encoding': 'utf8'})
+ releaseLock = await lock(path, { retries: 10 })
+ return await promisify(fs.readFile)(path, {encoding: 'utf8'})
} catch (err) {
throw error(err.status, err.message)
+ } finally {
+ if (releaseLock) {
+ await releaseLock()
+ }
}
}
@@ -114,7 +98,7 @@ class LDP {
return this.readResource(url + this.suffixMeta)
}
- async listContainer (filename, reqUri, containerData, hostname) {
+ async listContainer (container, reqUri, containerData, hostname) {
const resourceGraph = $rdf.graph()
try {
@@ -126,14 +110,14 @@ class LDP {
try {
// add container stats
- await ldpContainer.addContainerStats(this, reqUri, filename, resourceGraph)
+ await ldpContainer.addContainerStats(this, reqUri, container, resourceGraph)
// read directory
- const files = await ldpContainer.readdir(filename)
+ const files = await ldpContainer.readdir(container)
// iterate through all the files
await Promise.all(files.map(async file => {
const { url: fileUri } = await this.resourceMapper.mapFileToUrl(
- { path: path.join(filename, file), hostname })
- return await ldpContainer.addFile(this, resourceGraph, reqUri, fileUri, filename, file)
+ { path: join(container, file), hostname })
+ return await ldpContainer.addFile(this, resourceGraph, reqUri, fileUri, container, file)
}))
} catch (err) {
throw error(500, "Can't list container")
@@ -169,7 +153,7 @@ class LDP {
let originalPath = resourcePath
if (container) {
// Create directory by an LDP PUT to the container's .meta resource
- resourcePath = path.join(originalPath, ldp.suffixMeta)
+ resourcePath = join(originalPath, ldp.suffixMeta)
if (originalPath && !originalPath.endsWith('/')) {
originalPath += '/'
}
@@ -241,8 +225,8 @@ class LDP {
}
// Second, create the enclosing directory, if necessary
- const { path: filePath } = await this.resourceMapper.mapUrlToFile({ url, contentType, createIfNotExists: true })
- const dirName = path.dirname(filePath)
+ const { path } = await this.resourceMapper.mapUrlToFile({ url, contentType, createIfNotExists: true })
+ const dirName = dirname(path)
try {
await promisify(mkdirp)(dirName)
} catch (err) {
@@ -252,16 +236,24 @@ class LDP {
}
// Directory created, now write the file
- return await new Promise((resolve, reject) => {
- const file = stream.pipe(fs.createWriteStream(filePath))
- file.on('error', function () {
- reject(error(500, 'Error writing data'))
- })
- file.on('finish', function () {
- debug.handlers('PUT -- Wrote data to: ' + filePath)
- resolve()
+ let releaseLock
+ try {
+ releaseLock = await lock(path, { retries: 10, realpath: false })
+ return await new Promise((resolve, reject) => {
+ const file = stream.pipe(fs.createWriteStream(path))
+ file.on('error', function () {
+ reject(error(500, 'Error writing data'))
+ })
+ file.on('finish', function () {
+ debug.handlers('PUT -- Wrote data to: ' + path)
+ resolve()
+ })
})
- })
+ } finally {
+ if (releaseLock) {
+ await releaseLock()
+ }
+ }
}
async exists (hostname, path, searchIndex = true) {
@@ -335,28 +327,28 @@ class LDP {
}
async get (options, searchIndex = true) {
- let filename, contentType, stats
+ let path, contentType, stats
try {
- ({ path: filename, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
- stats = await this.stat(filename)
+ ({ path, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
+ stats = await this.stat(path)
} catch (err) {
throw error(404, 'Can\'t find file requested: ' + options)
}
// Just return, since resource exists
if (!options.includeBody) {
- return { 'stream': stats, 'contentType': contentType, 'container': stats.isDirectory() }
+ return { stream: stats, contentType, container: stats.isDirectory() }
}
// Found a container
if (stats.isDirectory()) {
const { url: absContainerUri } = await this.resourceMapper
- .mapFileToUrl({ path: filename, hostname: options.hostname })
+ .mapFileToUrl({ path, hostname: options.hostname })
const metaFile = await this.readContainerMeta(absContainerUri)
.catch(() => '') // Default to an empty meta file if it is missing
let data
try {
- data = await this.listContainer(filename, absContainerUri, metaFile, options.hostname)
+ data = await this.listContainer(path, absContainerUri, metaFile, options.hostname)
} catch (err) {
debug.handlers('GET container -- Read error:' + err.message)
throw err
@@ -364,53 +356,57 @@ class LDP {
const stream = stringToStream(data)
// TODO 'text/turtle' is fixed, should be contentType instead
// This forces one more translation turtle -> desired
- return { 'stream': stream, 'contentType': 'text/turtle', 'container': true }
+ return { stream, contentType: 'text/turtle', container: true }
} else {
- let stream
- let chunksize
- let contentRange
+ let chunksize, contentRange, start, end
if (options.range) {
- const total = fs.statSync(filename).size
+ const total = fs.statSync(path).size
const parts = options.range.replace(/bytes=/, '').split('-')
const partialstart = parts[0]
const partialend = parts[1]
- const start = parseInt(partialstart, 10)
- const end = partialend ? parseInt(partialend, 10) : total - 1
+ start = parseInt(partialstart, 10)
+ end = partialend ? parseInt(partialend, 10) : total - 1
chunksize = (end - start) + 1
contentRange = 'bytes ' + start + '-' + end + '/' + total
- stream = this.createReadStream(filename, start, end)
- } else {
- stream = this.createReadStream(filename)
}
- return new Promise((resolve, reject) => {
- stream
- .on('error', function (err) {
- debug.handlers(`GET -- error reading ${filename}: ${err.message}`)
- return reject(error(err, "Can't read file " + err))
- })
- .on('open', function () {
- debug.handlers(`GET -- Reading ${filename}`)
- return resolve({ stream, contentType, container: false, contentRange, chunksize })
- })
- })
+ let releaseLock
+ try {
+ releaseLock = await lock(path, { retries: 10 })
+ return await new Promise((resolve, reject) => {
+ const stream = fs.createReadStream(path, start && end ? {start, end} : {})
+ stream
+ .on('error', function (err) {
+ debug.handlers(`GET -- error reading ${path}: ${err.message}`)
+ return reject(error(err, "Can't read file " + err))
+ })
+ .on('open', function () {
+ debug.handlers(`GET -- Reading ${path}`)
+ return resolve({ stream, contentType, container: false, contentRange, chunksize })
+ })
+ })
+ } finally {
+ if (releaseLock) {
+ await releaseLock()
+ }
+ }
}
}
async delete (url) {
// First check if the path points to a valid file
- let filePath, stats
+ let path, stats
try {
- ({ path: filePath } = await this.resourceMapper.mapUrlToFile({ url }))
- stats = await this.stat(filePath)
+ ({ path } = await this.resourceMapper.mapUrlToFile({ url }))
+ stats = await this.stat(path)
} catch (err) {
throw error(404, "Can't find " + err)
}
// If so, delete the directory or file
if (stats.isDirectory()) {
- return this.deleteContainer(filePath)
+ return this.deleteContainer(path)
} else {
- return this.deleteResource(filePath)
+ return this.deleteResource(path)
}
}
@@ -440,28 +436,34 @@ class LDP {
}
}
- async deleteResource (filename) {
+ async deleteResource (path) {
+ let releaseLock
try {
- return promisify(fs.unlink)(filename)
+ releaseLock = await lock(path, { retries: 10 })
+ return await promisify(fs.unlink)(path)
} catch (err) {
debug.container('DELETE -- unlink() error: ' + err)
throw error(err, 'Failed to delete resource')
+ } finally {
+ if (releaseLock) {
+ await releaseLock()
+ }
}
}
getAvailablePath (host, containerURI, { slug = uuid.v1(), extension }) {
- const filename = slug + extension
+ const path = slug + extension
function ensureNotExists (self, newPath) {
// Verify whether the new path already exists
return self.exists(host, newPath).then(
// If it does, generate another one
() => ensureNotExists(self, URI.joinPaths(containerURI,
- `${uuid.v1().split('-')[0]}-${filename}`).toString()),
+ `${uuid.v1().split('-')[0]}-${path}`).toString()),
// If not, we found an appropriate path
() => newPath
)
}
- return ensureNotExists(this, URI.joinPaths(containerURI, filename).toString())
+ return ensureNotExists(this, URI.joinPaths(containerURI, path).toString())
}
getTrustedOrigins (req) {
diff --git a/lib/models/solid-host.js b/lib/models/solid-host.js
index 51dde215d..e13f156ca 100644
--- a/lib/models/solid-host.js
+++ b/lib/models/solid-host.js
@@ -15,7 +15,12 @@ class SolidHost {
* @param [options={}]
* @param [options.port] {number}
* @param [options.serverUri] {string} Fully qualified URI that this Solid
- * server is listening on, e.g. `https://databox.me`
+ * server is listening on, e.g. `https://solid.community`
+ * @param [options.live] {boolean} Whether to turn on WebSockets / LDP live
+ * @param [options.root] {string} Path to root data directory
+ * @param [options.multiuser] {boolean} Multiuser mode
+ * @param [options.webid] {boolean} Enable WebID-related functionality
+ * (account creation and authentication)
*/
constructor (options = {}) {
this.port = options.port || defaults.port
@@ -24,6 +29,10 @@ class SolidHost {
this.parsedUri = url.parse(this.serverUri)
this.host = this.parsedUri.host
this.hostname = this.parsedUri.hostname
+ this.live = options.live
+ this.root = options.root
+ this.multiuser = options.multiuser
+ this.webid = options.webid
}
/**
diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js
index d9811400e..2abeeb1dd 100644
--- a/lib/resource-mapper.js
+++ b/lib/resource-mapper.js
@@ -14,16 +14,19 @@ class ResourceMapper {
rootPath,
includeHost = false,
defaultContentType = 'application/octet-stream',
- indexFilename = 'index',
- overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' }
+ indexFilename = 'index.html',
+ overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' },
+ fileSuffixes = ['.acl', '.meta']
}) {
this._rootUrl = this._removeTrailingSlash(rootUrl)
this._rootPath = this._removeTrailingSlash(rootPath)
this._includeHost = includeHost
this._readdir = readdir
this._defaultContentType = defaultContentType
- this._indexFilename = indexFilename
this._types = { ...types, ...overrideTypes }
+ this._indexFilename = indexFilename
+ this._indexContentType = this._getContentTypeByExtension(indexFilename)
+ this._isControlFile = new RegExp(`(?:${fileSuffixes.map(fs => fs.replace('.', '\\.')).join('|')})$`)
// If the host needs to be replaced on every call, pre-split the root URL
if (includeHost) {
@@ -39,8 +42,7 @@ class ResourceMapper {
}
// Maps the request for a given resource and representation format to a server file
- // When the URL ends with a '/', then files with the prefix 'index.' will be matched,
- // such as 'index.html' and 'index.ttl', unless searchIndex is false.
+ // When searchIndex is true and the URL ends with a '/', indexFilename will be matched.
async mapUrlToFile ({ url, contentType, createIfNotExists, searchIndex = true }) {
let fullPath = this.getFullPath(url)
let isIndex = searchIndex && fullPath.endsWith('/')
@@ -48,6 +50,9 @@ class ResourceMapper {
// Append index filename if the URL ends with a '/'
if (isIndex) {
+ if (createIfNotExists && contentType !== this._indexContentType) {
+ throw new Error(`Index file needs to have ${this._indexContentType} as content type`)
+ }
fullPath += this._indexFilename
}
@@ -56,23 +61,16 @@ class ResourceMapper {
path = fullPath
// If the extension is not correct for the content type, append the correct extension
if (searchIndex && this._getContentTypeByExtension(path) !== contentType) {
- // Append a '$', unless we map for the index
- // Because the index must _always_ have a proper extension when it is being created
- if (!isIndex) {
- path += '$'
- }
- path += contentType in extensions ? `.${extensions[contentType][0]}` : '.unknown'
+ path += `$${contentType in extensions ? `.${extensions[contentType][0]}` : '.unknown'}`
}
// Determine the path of an existing file
} else {
// Read all files in the corresponding folder
const filename = fullPath.substr(fullPath.lastIndexOf('/') + 1)
const folder = fullPath.substr(0, fullPath.length - filename.length)
- const files = await this._readdir(folder)
// Find a file with the same name (minus the dollar extension)
- let match = !searchIndex ? '' : (files.find(f => this._removeDollarExtension(f) === filename ||
- (isIndex && f.startsWith(this._indexFilename + '.'))))
+ let match = searchIndex ? await this._getMatchingFile(folder, filename, isIndex) : ''
if (match === undefined) {
// Error if no match was found,
// unless the URL ends with a '/',
@@ -90,6 +88,17 @@ class ResourceMapper {
return { path, contentType: contentType || this._defaultContentType }
}
+ async _getMatchingFile (folder, filename, isIndex) {
+ const files = await this._readdir(folder)
+ // Search for files with the same name (disregarding a dollar extension)
+ if (!isIndex) {
+ return files.find(f => this._removeDollarExtension(f) === filename)
+ // Check if the index file exists
+ } else if (files.includes(this._indexFilename)) {
+ return this._indexFilename
+ }
+ }
+
async getRepresentationUrlForResource (resourceUrl) {
let fullPath = this.getFullPath(resourceUrl)
let isIndex = fullPath.endsWith('/')
diff --git a/lib/server-config.js b/lib/server-config.js
index 664d3911f..cb49386f9 100644
--- a/lib/server-config.js
+++ b/lib/server-config.js
@@ -9,6 +9,25 @@ const path = require('path')
const templateUtils = require('./common/template-utils')
const fsUtils = require('./common/fs-utils')
+const debug = require('./debug')
+
+function printDebugInfo (options) {
+ debug.settings('Server URI: ' + options.serverUri)
+ debug.settings('Auth method: ' + options.auth)
+ debug.settings('Strict origins: ' + options.strictOrigin)
+ debug.settings('Allowed origins: ' + options.trustedOrigins)
+ debug.settings('Db path: ' + options.dbPath)
+ debug.settings('Config path: ' + options.configPath)
+ debug.settings('Suffix Acl: ' + options.suffixAcl)
+ debug.settings('Suffix Meta: ' + options.suffixMeta)
+ debug.settings('Filesystem Root: ' + (this.resourceMapper ? this.resourceMapper.rootPath : 'none'))
+ debug.settings('Allow WebID authentication: ' + !!options.webid)
+ debug.settings('Live-updates: ' + !!options.live)
+ debug.settings('Multi-user: ' + !!options.multiuser)
+ debug.settings('Suppress default data browser app: ' + options.suppressDataBrowser)
+ debug.settings('Default data browser app file path: ' + options.dataBrowserPath)
+}
+
/**
* Ensures that a directory has been copied / initialized. Used to ensure that
* account templates, email templates and default apps have been copied from
@@ -144,5 +163,6 @@ module.exports = {
ensureWelcomePage,
initConfigDir,
initDefaultViews,
- initTemplateDirs
+ initTemplateDirs,
+ printDebugInfo
}
diff --git a/package-lock.json b/package-lock.json
index fe37c825a..dfa6bd4b8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "solid-server",
- "version": "5.0.0-beta.7",
+ "version": "5.0.0-beta.11",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -14,14 +14,14 @@
}
},
"@babel/generator": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz",
- "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz",
+ "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==",
"dev": true,
"requires": {
- "@babel/types": "^7.1.6",
+ "@babel/types": "^7.3.4",
"jsesc": "^2.5.1",
- "lodash": "^4.17.10",
+ "lodash": "^4.17.11",
"source-map": "^0.5.0",
"trim-right": "^1.0.1"
},
@@ -90,9 +90,9 @@
}
},
"chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
@@ -118,9 +118,9 @@
}
},
"@babel/parser": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz",
- "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz",
+ "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==",
"dev": true
},
"@babel/runtime": {
@@ -132,46 +132,46 @@
}
},
"@babel/template": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz",
- "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+ "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.1.2",
- "@babel/types": "^7.1.2"
+ "@babel/parser": "^7.2.2",
+ "@babel/types": "^7.2.2"
}
},
"@babel/traverse": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz",
- "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz",
+ "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.1.6",
+ "@babel/generator": "^7.3.4",
"@babel/helper-function-name": "^7.1.0",
"@babel/helper-split-export-declaration": "^7.0.0",
- "@babel/parser": "^7.1.6",
- "@babel/types": "^7.1.6",
+ "@babel/parser": "^7.3.4",
+ "@babel/types": "^7.3.4",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.10"
+ "lodash": "^4.17.11"
},
"dependencies": {
"debug": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
- "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"globals": {
- "version": "11.9.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
- "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+ "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
"dev": true
},
"ms": {
@@ -183,13 +183,13 @@
}
},
"@babel/types": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz",
- "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz",
+ "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==",
"dev": true,
"requires": {
"esutils": "^2.0.2",
- "lodash": "^4.17.10",
+ "lodash": "^4.17.11",
"to-fast-properties": "^2.0.0"
},
"dependencies": {
@@ -201,10 +201,28 @@
}
}
},
+ "@snyk/dep-graph": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.4.0.tgz",
+ "integrity": "sha512-dz4Fo4L9sN0Rt8hMe+zMYZ4mAiljtyIeWvujLyCxhIT5iHSlceUYlba5TDsOFuKyuZKkuhVjORWY1oFEuRzCcA==",
+ "dev": true,
+ "requires": {
+ "graphlib": "^2.1.5",
+ "lodash": "^4",
+ "source-map-support": "^0.5.9",
+ "tslib": "^1.9.3"
+ }
+ },
+ "@snyk/gemfile": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz",
+ "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==",
+ "dev": true
+ },
"@solid/acl-check": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@solid/acl-check/-/acl-check-0.1.3.tgz",
- "integrity": "sha512-Rvdxn7SOlqo1BtiY6dcFlJAjne0QK1hrsFL1q3HUDg7yleOEXBm1ESyZ0XDM6jwqJHqKf+0l987D15k5MPyIng==",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@solid/acl-check/-/acl-check-0.2.0.tgz",
+ "integrity": "sha512-HjnwnpjvqE16k5yBNG0A7WIX9MveELv3Ge0DOJ8Cpt7e6aJ4sOpzY3A6x+ljOCOdxxT6CpGKhNGEdztZMGm1Qg==",
"requires": {
"rdflib": "^0.12.1",
"solid-namespace": "0.1.0"
@@ -474,6 +492,48 @@
"integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
"dev": true
},
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
"ansi-escapes": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
@@ -495,6 +555,15 @@
"integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
"dev": true
},
+ "append-transform": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
+ "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^2.0.0"
+ }
+ },
"archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
@@ -550,6 +619,12 @@
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
},
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -610,9 +685,9 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
},
"ast-types": {
- "version": "0.11.7",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz",
- "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==",
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz",
+ "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==",
"dev": true
},
"async": {
@@ -1462,6 +1537,89 @@
"resolved": "http://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz",
"integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
},
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^2.0.0",
+ "camelcase": "^4.0.0",
+ "chalk": "^2.0.1",
+ "cli-boxes": "^1.0.0",
+ "string-width": "^2.0.0",
+ "term-size": "^1.2.0",
+ "widest-line": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1786,9 +1944,15 @@
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
},
"caniuse-lite": {
- "version": "1.0.30000911",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000911.tgz",
- "integrity": "sha512-x/E/SNwD80I0bT+fF9Y3Kbwo7Xd1xSafCAmFlpJmaVg3SQoJJOH4Ivb9fi9S0WjfqewQ6Ydt1zEVZpmMVYNeDA=="
+ "version": "1.0.30000948",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000948.tgz",
+ "integrity": "sha512-Lw4y7oz1X5MOMZm+2IFaSISqVVQvUuD+ZUSfeYK/SlYiMjkHN/eJ2PDfJehW5NA6JjrxYSSnIWfwjeObQMEjFQ=="
+ },
+ "capture-stack-trace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+ "dev": true
},
"caseless": {
"version": "0.12.0",
@@ -1834,16 +1998,16 @@
"dev": true
},
"chat-pane": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/chat-pane/-/chat-pane-1.2.6.tgz",
- "integrity": "sha512-+zPpE2zVgg4wNhb2+NxmqhEu+OXmlAEPKoHmoKXRr8oUrQOlSFWkr8jtZKuQwukziC4FltvY2u0rYRfro4KDyQ==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/chat-pane/-/chat-pane-1.2.7.tgz",
+ "integrity": "sha512-itsMQWUNjajgdEiTNaRMl/7y9FEpCNrPNldfu+Dj+iJPE5Y0OIBOwzx6hoyItiJYsQSfMcsFiGss2Ie5U4YZtQ==",
"requires": {
"babel-preset-env": "^1.6.1",
"babel-preset-metalab": "^1.0.0",
"mime-types": "^2.1.13",
"pane-registry": ">1.0.0",
"rdflib": ">=0.17.0",
- "solid-ui": ">=0.11.3"
+ "solid-ui": ">=0.12.0"
}
},
"check-error": {
@@ -1865,6 +2029,12 @@
"parse5": "^3.0.1"
}
},
+ "ci-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+ "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+ "dev": true
+ },
"cipher-base": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
@@ -1901,6 +2071,12 @@
}
}
},
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
"cli-cursor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
@@ -2160,9 +2336,9 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
"core-js": {
- "version": "2.5.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
- "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
+ "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A=="
},
"core-util-is": {
"version": "1.0.2",
@@ -2192,6 +2368,15 @@
"elliptic": "^6.0.0"
}
},
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
"create-hash": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
@@ -2367,12 +2552,27 @@
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
"dev": true
},
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "default-require-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
+ "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^3.0.0"
+ }
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -2647,6 +2847,12 @@
}
}
},
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -2662,9 +2868,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
- "version": "1.3.84",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz",
- "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw=="
+ "version": "1.3.116",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz",
+ "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA=="
},
"elliptic": {
"version": "6.4.1",
@@ -2755,9 +2961,9 @@
},
"dependencies": {
"es6-promise": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
- "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
+ "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==",
"dev": true
}
}
@@ -2808,9 +3014,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"escodegen": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
- "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
+ "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
"dev": true,
"requires": {
"esprima": "^3.1.3",
@@ -3033,6 +3239,21 @@
"safe-buffer": "^5.1.1"
}
},
+ "execa": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
"exit-hook": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
@@ -3343,9 +3564,9 @@
}
},
"find-babel-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz",
- "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz",
+ "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==",
"requires": {
"json5": "^0.5.1",
"path-exists": "^3.0.0"
@@ -3578,6 +3799,12 @@
"integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
"dev": true
},
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
"get-uri": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz",
@@ -3650,6 +3877,15 @@
"path-is-absolute": "^1.0.0"
}
},
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4"
+ }
+ },
"global-tunnel-ng": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz",
@@ -3666,18 +3902,37 @@
"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
},
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "^3.0.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "is-redirect": "^1.0.0",
+ "is-retry-allowed": "^1.0.0",
+ "is-stream": "^1.0.0",
+ "lowercase-keys": "^1.0.0",
+ "safe-buffer": "^5.0.1",
+ "timed-out": "^4.0.0",
+ "unzip-response": "^2.0.1",
+ "url-parse-lax": "^1.0.0"
+ }
+ },
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
},
"graphlib": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz",
- "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==",
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz",
+ "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==",
"dev": true,
"requires": {
- "lodash": "^4.11.1"
+ "lodash": "^4.17.5"
}
},
"growl": {
@@ -3687,9 +3942,9 @@
"dev": true
},
"handlebars": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
- "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.13.tgz",
+ "integrity": "sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ==",
"requires": {
"async": "^2.5.0",
"optimist": "^0.6.1",
@@ -3698,11 +3953,11 @@
},
"dependencies": {
"async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
- "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
+ "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
"requires": {
- "lodash": "^4.17.10"
+ "lodash": "^4.17.11"
}
}
}
@@ -3777,23 +4032,6 @@
}
}
},
- "hasbin": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz",
- "integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=",
- "dev": true,
- "requires": {
- "async": "~1.5"
- },
- "dependencies": {
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- }
- }
- },
"hash-base": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
@@ -4002,6 +4240,12 @@
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
"dev": true
},
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -4152,6 +4396,15 @@
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
+ "is-ci": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^1.5.0"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -4213,6 +4466,16 @@
"is-extglob": "^2.1.1"
}
},
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^0.1.0",
+ "is-path-inside": "^1.0.0"
+ }
+ },
"is-ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz",
@@ -4240,6 +4503,12 @@
"xtend": "^4.0.0"
}
},
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
@@ -4264,6 +4533,15 @@
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
"dev": true
},
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -4283,12 +4561,24 @@
"integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
"dev": true
},
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
"is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -4352,28 +4642,28 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"issue-pane": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/issue-pane/-/issue-pane-1.0.3.tgz",
- "integrity": "sha512-K/r9weoQexIFiG9vvYygzHF5IPNbKZluBZ1hERDU2sTlLsAnRKGJ9ms0Xb/Yn+MF9tYt82rno3E6OE3+satpPQ==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/issue-pane/-/issue-pane-1.0.4.tgz",
+ "integrity": "sha512-wxDXpwmq4DQ2Fb6aRsNpFhaWTtcfnx6n+puOM5fHih1Im8gHy8C+qvufNgqfq1SlipFzskXOc8Cre61tj4xEuA==",
"requires": {
"babel-preset-env": "^1.6.1",
"babel-preset-metalab": "^1.0.0",
"mime-types": "^2.1.13",
- "pane-registry": ">=1.0.0",
+ "pane-registry": "^1.0.4",
"rdflib": ">=0.17.0",
"solid-ui": ">=0.11.3"
}
},
"istanbul-lib-coverage": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
- "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+ "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
"dev": true
},
"istanbul-lib-instrument": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz",
- "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz",
+ "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==",
"dev": true,
"requires": {
"@babel/generator": "^7.0.0",
@@ -4381,7 +4671,7 @@
"@babel/template": "^7.0.0",
"@babel/traverse": "^7.0.0",
"@babel/types": "^7.0.0",
- "istanbul-lib-coverage": "^2.0.1",
+ "istanbul-lib-coverage": "^2.0.3",
"semver": "^5.5.0"
}
},
@@ -4506,55 +4796,46 @@
"dev": true
},
"jszip": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
- "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz",
+ "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==",
"dev": true,
"requires": {
- "core-js": "~2.3.0",
- "es6-promise": "~3.0.2",
- "lie": "~3.1.0",
+ "lie": "~3.3.0",
"pako": "~1.0.2",
- "readable-stream": "~2.0.6"
+ "readable-stream": "~2.3.6",
+ "set-immediate-shim": "~1.0.1"
},
"dependencies": {
- "core-js": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
- "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=",
- "dev": true
- },
- "es6-promise": {
- "version": "3.0.2",
- "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
- "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
- "dev": true
- },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
- },
"readable-stream": {
- "version": "2.0.6",
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
- "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
+ "inherits": "~2.0.3",
"isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~0.10.x",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
}
}
},
@@ -4588,7 +4869,16 @@
}
}
},
- "lazy-cache": {
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "^4.0.0"
+ }
+ },
+ "lazy-cache": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
"integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
@@ -4619,9 +4909,9 @@
"integrity": "sha1-IsWbyu+qmo7zWc91l4TkvxBq6hs="
},
"lie": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
- "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"dev": true,
"requires": {
"immediate": "~3.0.5"
@@ -4704,20 +4994,34 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
"lru-cache": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz",
- "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
- "yallist": "^3.0.2"
+ "yallist": "^2.1.2"
+ },
+ "dependencies": {
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
}
},
"macos-release": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz",
- "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz",
+ "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==",
"dev": true
},
"make-dir": {
@@ -4743,12 +5047,12 @@
}
},
"mashlib": {
- "version": "0.7.17",
- "resolved": "https://registry.npmjs.org/mashlib/-/mashlib-0.7.17.tgz",
- "integrity": "sha512-asVogWGHOSaFkEb1YZZL+qOGHv26m8IaYBy83E5HYbXw0DaUA11FXxK3+hC+d1ite3y+d66JLvOZ5CyrXELQwg==",
+ "version": "0.7.18",
+ "resolved": "https://registry.npmjs.org/mashlib/-/mashlib-0.7.18.tgz",
+ "integrity": "sha512-PeZSqIX31WRq4WBmhUylguSHK4pyHmRduhvasumbO2FW5gvsG5QvypRQKkc4BBQtSBgh9ozE8C0ktOYU0fVpog==",
"requires": {
"rdflib": ">=0.19.1",
- "solid-panes": ">=1.1.19"
+ "solid-panes": ">=1.3.1"
},
"dependencies": {
"rdflib": {
@@ -4781,9 +5085,9 @@
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"meeting-pane": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/meeting-pane/-/meeting-pane-1.0.2.tgz",
- "integrity": "sha512-TKroX1nW9RTHKH0pULY38vFV0HL0Bgy600bPT6mori6YINCfyw09LgkbinJX9PYYVw6t6x0ZEwWAP4gc60p/kg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/meeting-pane/-/meeting-pane-1.0.4.tgz",
+ "integrity": "sha512-mOaWBr1p0tUfzlyDYSeZOV7M6B3kegohhqAy/auTcgi/8papnSxtME5lRyqrvmlJoXO5vsPFPDnvbeevWWfmsg==",
"requires": {
"babel-preset-env": "^1.6.1",
"babel-preset-metalab": "^1.0.0",
@@ -5259,6 +5563,15 @@
"pify": "^3.0.0"
}
},
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
"nth-check": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
@@ -5273,177 +5586,109 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"nyc": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz",
- "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==",
+ "version": "13.3.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz",
+ "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==",
"dev": true,
"requires": {
"archy": "^1.0.0",
"arrify": "^1.0.1",
- "caching-transform": "^2.0.0",
+ "caching-transform": "^3.0.1",
"convert-source-map": "^1.6.0",
- "debug-log": "^1.0.1",
"find-cache-dir": "^2.0.0",
"find-up": "^3.0.0",
"foreground-child": "^1.5.6",
"glob": "^7.1.3",
- "istanbul-lib-coverage": "^2.0.1",
- "istanbul-lib-hook": "^2.0.1",
- "istanbul-lib-instrument": "^3.0.0",
- "istanbul-lib-report": "^2.0.2",
- "istanbul-lib-source-maps": "^2.0.1",
- "istanbul-reports": "^2.0.1",
+ "istanbul-lib-coverage": "^2.0.3",
+ "istanbul-lib-hook": "^2.0.3",
+ "istanbul-lib-instrument": "^3.1.0",
+ "istanbul-lib-report": "^2.0.4",
+ "istanbul-lib-source-maps": "^3.0.2",
+ "istanbul-reports": "^2.1.1",
"make-dir": "^1.3.0",
"merge-source-map": "^1.1.0",
"resolve-from": "^4.0.0",
- "rimraf": "^2.6.2",
+ "rimraf": "^2.6.3",
"signal-exit": "^3.0.2",
"spawn-wrap": "^1.4.2",
- "test-exclude": "^5.0.0",
+ "test-exclude": "^5.1.0",
"uuid": "^3.3.2",
- "yargs": "11.1.0",
- "yargs-parser": "^9.0.2"
+ "yargs": "^12.0.5",
+ "yargs-parser": "^11.1.1"
},
"dependencies": {
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "dev": true,
- "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=",
- "dev": true
- },
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
- "append-transform": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
- "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
+ "async": {
+ "version": "2.6.2",
+ "bundled": true,
"dev": true,
"requires": {
- "default-require-extensions": "^2.0.0"
+ "lodash": "^4.17.11"
}
},
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
- "dev": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "bundled": true,
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "bundled": true,
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
- },
"caching-transform": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz",
- "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==",
+ "version": "3.0.1",
+ "bundled": true,
"dev": true,
"requires": {
- "make-dir": "^1.0.0",
- "md5-hex": "^2.0.0",
- "package-hash": "^2.0.0",
- "write-file-atomic": "^2.0.0"
+ "hasha": "^3.0.0",
+ "make-dir": "^1.3.0",
+ "package-hash": "^3.0.0",
+ "write-file-atomic": "^2.3.0"
}
},
"camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true,
- "optional": true
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "^0.1.3",
- "lazy-cache": "^1.0.3"
- }
+ "version": "5.0.0",
+ "bundled": true,
+ "dev": true
},
"cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "version": "4.1.0",
+ "bundled": true,
"dev": true,
- "optional": true,
"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=",
- "dev": true,
- "optional": true
- }
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
+ "wrap-ansi": "^2.0.0"
}
},
"code-point-at": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
+ "bundled": true
+ },
+ "commander": {
+ "version": "2.17.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
},
"commondir": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "bundled": true,
"dev": true
},
"concat-map": {
"version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "bundled": true,
"dev": true
},
"convert-source-map": {
@@ -5466,39 +5711,28 @@
}
},
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.1.1",
+ "bundled": true,
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
- "debug-log": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz",
- "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=",
- "dev": true
- },
"decamelize": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
+ "bundled": true
},
- "default-require-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
- "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
+ "end-of-stream": {
+ "version": "1.4.1",
+ "bundled": true,
"dev": true,
"requires": {
- "strip-bom": "^3.0.0"
+ "once": "^1.4.0"
}
},
"error-ex": {
"version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "bundled": true,
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
@@ -5506,18 +5740,16 @@
},
"es6-error": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "bundled": true,
"dev": true
},
"execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "version": "1.0.0",
+ "bundled": true,
"dev": true,
"requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
@@ -5526,12 +5758,13 @@
},
"dependencies": {
"cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "version": "6.0.5",
+ "bundled": true,
"dev": true,
"requires": {
- "lru-cache": "^4.0.1",
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
@@ -5540,8 +5773,7 @@
},
"find-cache-dir": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz",
- "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==",
+ "bundled": true,
"dev": true,
"requires": {
"commondir": "^1.0.1",
@@ -5551,8 +5783,7 @@
},
"find-up": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "bundled": true,
"dev": true,
"requires": {
"locate-path": "^3.0.0"
@@ -5560,8 +5791,7 @@
},
"foreground-child": {
"version": "1.5.6",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
- "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
+ "bundled": true,
"dev": true,
"requires": {
"cross-spawn": "^4",
@@ -5570,26 +5800,25 @@
},
"fs.realpath": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "bundled": true,
"dev": true
},
"get-caller-file": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "bundled": true,
"dev": true
},
"get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
+ "version": "4.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
},
"glob": {
"version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "bundled": true,
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -5601,56 +5830,65 @@
}
},
"graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "version": "4.1.15",
+ "bundled": true,
"dev": true
},
"handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "version": "4.1.0",
+ "bundled": true,
"dev": true,
"requires": {
- "async": "^1.4.0",
+ "async": "^2.5.0",
"optimist": "^0.6.1",
- "source-map": "^0.4.4",
- "uglify-js": "^2.6"
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
},
"dependencies": {
"source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "version": "0.6.1",
+ "bundled": true,
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+ "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
"dev": true,
+ "optional": true,
"requires": {
- "amdefine": ">=0.0.4"
+ "commander": "~2.17.1",
+ "source-map": "~0.6.1"
}
}
}
},
"has-flag": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "bundled": true,
"dev": true
},
+ "hasha": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "is-stream": "^1.0.1"
+ }
+ },
"hosted-git-info": {
"version": "2.7.1",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+ "bundled": true,
"dev": true
},
"imurmurhash": {
"version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "bundled": true,
"dev": true
},
"inflight": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "bundled": true,
"dev": true,
"requires": {
"once": "^1.3.0",
@@ -5659,89 +5897,74 @@
},
"inherits": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "bundled": true,
"dev": true
},
"invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "version": "2.0.0",
+ "bundled": true,
"dev": true
},
"is-arrayish": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "bundled": true,
"dev": true
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-builtin-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
- "dev": true,
- "requires": {
- "builtin-modules": "^1.0.0"
- }
- },
"is-fullwidth-code-point": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "bundled": true,
"dev": true
},
"is-stream": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "bundled": true,
"dev": true
},
"isexe": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "bundled": true,
"dev": true
},
"istanbul-lib-coverage": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
- "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==",
+ "version": "2.0.3",
+ "bundled": true,
"dev": true
},
"istanbul-lib-hook": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz",
- "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==",
+ "version": "2.0.3",
+ "bundled": true,
"dev": true,
"requires": {
"append-transform": "^1.0.0"
}
},
"istanbul-lib-report": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz",
- "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==",
+ "version": "2.0.4",
+ "bundled": true,
"dev": true,
"requires": {
- "istanbul-lib-coverage": "^2.0.1",
+ "istanbul-lib-coverage": "^2.0.3",
"make-dir": "^1.3.0",
- "supports-color": "^5.4.0"
+ "supports-color": "^6.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "6.1.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"istanbul-lib-source-maps": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz",
- "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==",
+ "version": "3.0.2",
+ "bundled": true,
"dev": true,
"requires": {
- "debug": "^3.1.0",
- "istanbul-lib-coverage": "^2.0.1",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^2.0.3",
"make-dir": "^1.3.0",
"rimraf": "^2.6.2",
"source-map": "^0.6.1"
@@ -5749,56 +5972,43 @@
"dependencies": {
"source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "bundled": true,
"dev": true
}
}
},
"istanbul-reports": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz",
- "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==",
+ "version": "2.1.1",
+ "bundled": true,
"dev": true,
"requires": {
- "handlebars": "^4.0.11"
+ "handlebars": "^4.1.0"
}
},
"json-parse-better-errors": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "bundled": true,
"dev": true
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"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=",
- "dev": true,
- "optional": true
- },
"lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "version": "2.0.0",
+ "bundled": true,
"dev": true,
"requires": {
- "invert-kv": "^1.0.0"
+ "invert-kv": "^2.0.0"
}
},
"load-json-file": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "bundled": true,
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -5809,30 +6019,26 @@
},
"locate-path": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "bundled": true,
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
- "lodash.flattendeep": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
+ "lodash": {
+ "version": "4.17.11",
+ "bundled": true,
"dev": true
},
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "bundled": true,
"dev": true
},
"lru-cache": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
- "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "version": "4.1.5",
+ "bundled": true,
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
@@ -5841,41 +6047,33 @@
},
"make-dir": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "bundled": true,
"dev": true,
"requires": {
"pify": "^3.0.0"
}
},
- "md5-hex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz",
- "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=",
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "bundled": true,
"dev": true,
"requires": {
- "md5-o-matic": "^0.1.1"
+ "p-defer": "^1.0.0"
}
},
- "md5-o-matic": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz",
- "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=",
- "dev": true
- },
"mem": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "version": "4.1.0",
+ "bundled": true,
"dev": true,
"requires": {
- "mimic-fn": "^1.0.0"
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^1.0.0",
+ "p-is-promise": "^2.0.0"
}
},
"merge-source-map": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
- "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "bundled": true,
"dev": true,
"requires": {
"source-map": "^0.6.1"
@@ -5883,22 +6081,19 @@
"dependencies": {
"source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "bundled": true,
"dev": true
}
}
},
"mimic-fn": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "bundled": true,
"dev": true
},
"minimatch": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "bundled": true,
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -5906,14 +6101,12 @@
},
"minimist": {
"version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
- "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "bundled": true,
"dev": true
},
"mkdirp": {
"version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "bundled": true,
"dev": true,
"requires": {
"minimist": "0.0.8"
@@ -5921,34 +6114,35 @@
"dependencies": {
"minimist": {
"version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "bundled": true,
"dev": true
}
}
},
"ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "bundled": true,
"dev": true
},
"normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "version": "2.5.0",
+ "bundled": true,
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
- "is-builtin-module": "^1.0.0",
+ "resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"npm-run-path": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "bundled": true,
"dev": true,
"requires": {
"path-key": "^2.0.0"
@@ -5956,14 +6150,11 @@
},
"number-is-nan": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
+ "bundled": true
},
"once": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "bundled": true,
"dev": true,
"requires": {
"wrappy": "1"
@@ -5971,8 +6162,7 @@
},
"optimist": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
- "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "bundled": true,
"dev": true,
"requires": {
"minimist": "~0.0.1",
@@ -5981,31 +6171,37 @@
},
"os-homedir": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "bundled": true,
"dev": true
},
"os-locale": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "version": "3.1.0",
+ "bundled": true,
"dev": true,
"requires": {
- "execa": "^0.7.0",
- "lcid": "^1.0.0",
- "mem": "^1.1.0"
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
}
},
+ "p-defer": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
"p-finally": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "bundled": true,
"dev": true
},
- "p-limit": {
+ "p-is-promise": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
- "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+ "bundled": true,
+ "dev": true
+ },
+ "p-limit": {
+ "version": "2.1.0",
+ "bundled": true,
"dev": true,
"requires": {
"p-try": "^2.0.0"
@@ -6013,8 +6209,7 @@
},
"p-locate": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "bundled": true,
"dev": true,
"requires": {
"p-limit": "^2.0.0"
@@ -6022,26 +6217,23 @@
},
"p-try": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
- "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+ "bundled": true,
"dev": true
},
"package-hash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz",
- "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=",
+ "version": "3.0.0",
+ "bundled": true,
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
+ "graceful-fs": "^4.1.15",
+ "hasha": "^3.0.0",
"lodash.flattendeep": "^4.4.0",
- "md5-hex": "^2.0.0",
"release-zalgo": "^1.0.0"
}
},
"parse-json": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "bundled": true,
"dev": true,
"requires": {
"error-ex": "^1.3.1",
@@ -6050,26 +6242,27 @@
},
"path-exists": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "bundled": true,
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "bundled": true,
"dev": true
},
"path-key": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "bundled": true,
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "bundled": true,
"dev": true
},
"path-type": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "bundled": true,
"dev": true,
"requires": {
"pify": "^3.0.0"
@@ -6077,14 +6270,12 @@
},
"pify": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "bundled": true,
"dev": true
},
"pkg-dir": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "bundled": true,
"dev": true,
"requires": {
"find-up": "^3.0.0"
@@ -6092,14 +6283,21 @@
},
"pseudomap": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "bundled": true,
"dev": true
},
+ "pump": {
+ "version": "3.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
"read-pkg": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "bundled": true,
"dev": true,
"requires": {
"load-json-file": "^4.0.0",
@@ -6109,8 +6307,7 @@
},
"read-pkg-up": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
- "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
+ "bundled": true,
"dev": true,
"requires": {
"find-up": "^3.0.0",
@@ -6119,78 +6316,61 @@
},
"release-zalgo": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
- "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
+ "bundled": true,
"dev": true,
"requires": {
"es6-error": "^4.0.1"
}
},
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
"require-directory": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "bundled": true,
"dev": true
},
"require-main-filename": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "bundled": true,
"dev": true
},
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "resolve": {
+ "version": "1.10.0",
+ "bundled": true,
"dev": true,
- "optional": true,
"requires": {
- "align-text": "^0.1.1"
+ "path-parse": "^1.0.6"
}
},
+ "resolve-from": {
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true
+ },
"rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "version": "2.6.3",
+ "bundled": true,
"dev": true,
"requires": {
- "glob": "^7.0.5"
+ "glob": "^7.1.3"
}
},
"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==",
+ "bundled": true,
"dev": true
},
"semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "version": "5.6.0",
+ "bundled": true,
"dev": true
},
"set-blocking": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "bundled": true,
"dev": true
},
"shebang-command": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "bundled": true,
"dev": true,
"requires": {
"shebang-regex": "^1.0.0"
@@ -6198,27 +6378,17 @@
},
"shebang-regex": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "bundled": true,
"dev": true
},
"signal-exit": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "bundled": true,
"dev": true
},
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true,
- "optional": true
- },
"spawn-wrap": {
"version": "1.4.2",
- "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz",
- "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==",
+ "bundled": true,
"dev": true,
"requires": {
"foreground-child": "^1.5.6",
@@ -6230,9 +6400,8 @@
}
},
"spdx-correct": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
- "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "version": "3.1.0",
+ "bundled": true,
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -6240,15 +6409,13 @@
}
},
"spdx-exceptions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
- "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+ "version": "2.2.0",
+ "bundled": true,
"dev": true
},
"spdx-expression-parse": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "bundled": true,
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -6256,9 +6423,8 @@
}
},
"spdx-license-ids": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
- "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+ "version": "3.0.3",
+ "bundled": true,
"dev": true
},
"string-width": {
@@ -6282,29 +6448,17 @@
},
"strip-bom": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "bundled": true,
"dev": true
},
"strip-eof": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "bundled": true,
"dev": true
},
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
"test-exclude": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz",
- "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==",
+ "version": "5.1.0",
+ "bundled": true,
"dev": true,
"requires": {
"arrify": "^1.0.1",
@@ -6317,11 +6471,7 @@
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "dev": true,
- "optional": true,
"requires": {
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
"yargs": "~3.10.0"
},
"dependencies": {
@@ -6329,34 +6479,20 @@
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "dev": true,
- "optional": true,
"requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
- "window-size": "0.1.0"
+ "decamelize": "^1.0.0"
}
}
}
},
- "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=",
- "dev": true,
- "optional": true
- },
"uuid": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "bundled": true,
"dev": true
},
"validate-npm-package-license": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
- "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "version": "3.0.4",
+ "bundled": true,
"dev": true,
"requires": {
"spdx-correct": "^3.0.0",
@@ -6365,8 +6501,7 @@
},
"which": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "bundled": true,
"dev": true,
"requires": {
"isexe": "^2.0.0"
@@ -6374,80 +6509,22 @@
},
"which-module": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "bundled": true,
"dev": true
},
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true,
- "optional": true
- },
"wordwrap": {
"version": "0.0.3",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "bundled": true,
"dev": true
},
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
"wrappy": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "bundled": true,
"dev": true
},
"write-file-atomic": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
- "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "version": "2.4.2",
+ "bundled": true,
"dev": true,
"requires": {
"graceful-fs": "^4.1.11",
@@ -6456,108 +6533,42 @@
}
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
- },
- "yargs": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz",
- "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==",
- "dev": true,
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.1.1",
- "find-up": "^2.1.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^9.0.2"
- },
- "dependencies": {
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "dev": true,
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- }
+ "version": "4.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "12.0.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
}
},
"yargs-parser": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
- "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
+ "version": "11.1.1",
+ "bundled": true,
"dev": true,
"requires": {
- "camelcase": "^4.1.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- }
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
}
}
@@ -6733,13 +6744,13 @@
}
},
"os-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz",
- "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz",
+ "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==",
"dev": true,
"requires": {
- "macos-release": "^1.0.0",
- "win-release": "^1.0.0"
+ "macos-release": "^2.0.0",
+ "windows-release": "^3.1.0"
}
},
"os-shim": {
@@ -6757,6 +6768,12 @@
"resolved": "https://registry.npmjs.org/owasp-password-strength-test/-/owasp-password-strength-test-1.3.0.tgz",
"integrity": "sha1-T2KeQpA+j20nmyMNZXq2HljkSxI="
},
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
"pac-proxy-agent": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz",
@@ -6803,6 +6820,18 @@
"thunkify": "^2.1.2"
}
},
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "^6.7.1",
+ "registry-auth-token": "^3.0.1",
+ "registry-url": "^3.0.3",
+ "semver": "^5.1.0"
+ }
+ },
"pako": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
@@ -6858,16 +6887,6 @@
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
},
- "path": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
- "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
- "dev": true,
- "requires": {
- "process": "^0.11.1",
- "util": "^0.10.3"
- }
- },
"path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
@@ -7010,6 +7029,12 @@
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true
},
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -7045,6 +7070,16 @@
"integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=",
"dev": true
},
+ "proper-lockfile": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz",
+ "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==",
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
"proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@@ -7190,6 +7225,32 @@
}
}
},
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ }
+ }
+ },
"rdf-ns": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/rdf-ns/-/rdf-ns-0.1.0.tgz",
@@ -7342,6 +7403,25 @@
"regjsparser": "^0.1.4"
}
},
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.6",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.0.1"
+ }
+ },
"regjsgen": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
@@ -7447,6 +7527,11 @@
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
},
+ "retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
+ },
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
@@ -7538,6 +7623,15 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
},
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.3"
+ }
+ },
"send": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
@@ -7576,6 +7670,12 @@
"send": "0.16.2"
}
},
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
"set-value": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
@@ -7683,8 +7783,7 @@
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"simple-concat": {
"version": "1.0.0",
@@ -7845,53 +7944,56 @@
}
},
"snyk": {
- "version": "1.110.2",
- "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.110.2.tgz",
- "integrity": "sha512-SQE4sudrscd48EoRJqy5h5S6c8YBiOw0r0Se3rfg1l6ElJGgCB9je6XEzfe+UmfES06D7ueFYepiQPxTwH4Qww==",
+ "version": "1.136.1",
+ "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.136.1.tgz",
+ "integrity": "sha512-BhUH2xUvhFR0rzHX2Zf6Eh3JiUgSt8YmLSTUSHKLkUDqyKHyXvig4cItgj/VN0v0K5XLNzzOn2+RjI/zCiAaIQ==",
"dev": true,
"requires": {
+ "@snyk/dep-graph": "1.4.0",
+ "@snyk/gemfile": "1.2.0",
"abbrev": "^1.1.1",
"ansi-escapes": "^3.1.0",
"chalk": "^2.4.1",
"configstore": "^3.1.2",
"debug": "^3.1.0",
- "hasbin": "^1.2.3",
+ "diff": "^4.0.1",
+ "get-uri": "2.0.2",
"inquirer": "^3.0.0",
- "lodash": "^4.17.5",
+ "lodash": "^4.17.11",
"needle": "^2.2.4",
- "opn": "^5.2.0",
- "os-name": "^2.0.1",
- "proxy-agent": "^2.0.0",
+ "opn": "^5.4.0",
+ "os-name": "^3.0.0",
+ "proxy-agent": "2.3.1",
"proxy-from-env": "^1.0.0",
"recursive-readdir": "^2.2.2",
- "semver": "^5.5.0",
- "snyk-config": "2.2.0",
- "snyk-docker-plugin": "1.12.3",
- "snyk-go-plugin": "1.6.0",
- "snyk-gradle-plugin": "2.1.1",
+ "semver": "^5.6.0",
+ "snyk-config": "2.2.1",
+ "snyk-docker-plugin": "1.22.0",
+ "snyk-go-plugin": "1.6.1",
+ "snyk-gradle-plugin": "2.1.4",
"snyk-module": "1.9.1",
- "snyk-mvn-plugin": "2.0.0",
- "snyk-nodejs-lockfile-parser": "1.7.1",
- "snyk-nuget-plugin": "1.6.5",
- "snyk-php-plugin": "1.5.1",
- "snyk-policy": "1.13.1",
- "snyk-python-plugin": "1.9.0",
+ "snyk-mvn-plugin": "2.0.1",
+ "snyk-nodejs-lockfile-parser": "1.11.0",
+ "snyk-nuget-plugin": "1.7.2",
+ "snyk-php-plugin": "1.5.2",
+ "snyk-policy": "1.13.3",
+ "snyk-python-plugin": "1.9.1",
"snyk-resolve": "1.0.1",
"snyk-resolve-deps": "4.0.2",
- "snyk-sbt-plugin": "2.0.0",
+ "snyk-sbt-plugin": "2.0.1",
"snyk-tree": "^1.0.0",
"snyk-try-require": "1.3.1",
- "source-map-support": "^0.5.9",
+ "source-map-support": "^0.5.10",
"tempfile": "^2.0.0",
"then-fs": "^2.0.0",
- "undefsafe": "^2.0.0",
- "uuid": "^3.2.1"
+ "update-notifier": "^2.5.0",
+ "uuid": "^3.3.2"
},
"dependencies": {
"ansi-escapes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
- "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
"dev": true
},
"ansi-regex": {
@@ -7910,9 +8012,9 @@
}
},
"chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
@@ -7938,6 +8040,12 @@
"ms": "^2.1.1"
}
},
+ "diff": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
+ "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
+ "dev": true
+ },
"external-editor": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
@@ -8017,6 +8125,12 @@
"signal-exit": "^3.0.2"
}
},
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "dev": true
+ },
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -8057,13 +8171,13 @@
}
},
"snyk-config": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.0.tgz",
- "integrity": "sha512-mq0wbP/AgjcmRq5i5jg2akVVV3iSYUPTowZwKn7DChRLDL8ySOzWAwan+ImXiyNbrWo87FNI/15O6MpOnTxOIg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.1.tgz",
+ "integrity": "sha512-eCsFKHHE4J2DpD/1NzAtCmkmVDK310OXRtmoW0RlLnld1ESprJ5A/QRJ5Zxx1JbA8gjuwERY5vfUFA8lEJeopA==",
"dev": true,
"requires": {
"debug": "^3.1.0",
- "lodash": "^4.17.5",
+ "lodash": "^4.17.11",
"nconf": "^0.10.0"
},
"dependencies": {
@@ -8085,13 +8199,14 @@
}
},
"snyk-docker-plugin": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.12.3.tgz",
- "integrity": "sha512-ZbvaFCPCd0wxhqxjzU/iyf39tKlq2nvI9nPW32uZV3RGdHrkQH55BzCtBCF9d0dapxX+PKgae/4u2BKNw8hd9Q==",
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.22.0.tgz",
+ "integrity": "sha512-bykxNtfeWQNFjF6gv8u8w+TOa4fdr+teLm+DkvYlWkdlvaw5m4yywRI5USve4X6S9p4G+Fw4/wfjXx7LgCcxrQ==",
"dev": true,
"requires": {
"debug": "^3",
"dockerfile-ast": "0.0.12",
+ "semver": "^5.6.0",
"tslib": "^1"
},
"dependencies": {
@@ -8109,13 +8224,19 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "dev": true
}
}
},
"snyk-go-plugin": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.6.0.tgz",
- "integrity": "sha512-E6aYw7XAXSs2wJR3fU+vGQ1lVyjAw8PHIQYQwBwMkTHByhJIWPcu6Hy/jT5LcjJHlhYXlpOuk53HeLVK+kcXrQ==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.6.1.tgz",
+ "integrity": "sha512-hFOMyznfcMzF1HaZP18VmjQSqK/jBOowh0lpJY4UqmaQSZyJury3Ax+44O9oVUJi8lb8A4g7RVbxhlWl6bIqlA==",
"dev": true,
"requires": {
"graphlib": "^2.1.1",
@@ -8135,9 +8256,9 @@
}
},
"snyk-gradle-plugin": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.1.tgz",
- "integrity": "sha512-aFeVC5y3XkJ5BxknHhtYo76as3xJbzSQlXACGZrQZGQ/w/UhNdM8VI1QB6Eq4uEzexleB/hcJwYxNmhI2CNCeA==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.4.tgz",
+ "integrity": "sha512-EOG4OEt9KAkMgaiG3IWi1ENkfIehMhQTd/KU+uoNbEJJ9KYk3POcB+7CsRq6kJa2Th/9aMGp+ojm6HOrOkJM4w==",
"dev": true,
"requires": {
"clone-deep": "^0.3.0"
@@ -8171,42 +8292,35 @@
}
},
"snyk-mvn-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.0.0.tgz",
- "integrity": "sha512-9jAhZhv+7YcqtoQYCYlgMoxK+dWBKlk+wkX27Ebg3vNddNop9q5jZitRXTjsXwfSUZHRt+Ptw1f8vei9kjzZVg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.0.1.tgz",
+ "integrity": "sha512-TBrdcFXHdYuRYFCvpyUeFC+mCi6SOV3vdxgHrP7JRNnJwO8PYaKCObLJyhpRWa8IaHv/8CjJTmnEbWIh7BPHAA==",
"dev": true
},
"snyk-nodejs-lockfile-parser": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.7.1.tgz",
- "integrity": "sha512-0gHELqMhzUxb/t3Tg6d6G9LTDioOXCrEMt9aetOeV8wD/ZRL5VFNjwcdrm8qILLqzDFaFjFIyMc66c0OL4zFAQ==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.11.0.tgz",
+ "integrity": "sha512-eTdq5VcaHJwGoApejebTChi5hRcIDdNbO6lMwncS0zz9ZxXskoQ0C+VMdep8ELmJa0Gcz6es1sSkABPZs7frrg==",
"dev": true,
"requires": {
"@yarnpkg/lockfile": "^1.0.2",
"graphlib": "^2.1.5",
- "lodash": "4.17.10",
+ "lodash": "^4.17.11",
"source-map-support": "^0.5.7",
"tslib": "^1.9.3",
"uuid": "^3.3.2"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
- "dev": true
- }
}
},
"snyk-nuget-plugin": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.6.5.tgz",
- "integrity": "sha512-3qIndzkxCxiaGvAwMkqChbChGdwhNePPyfi0WjhC/nJGwecqU3Fb/NeTW7lgyT+xoq/dFnzW0DgBJ4+AyNA2gA==",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.7.2.tgz",
+ "integrity": "sha512-zmYD9veH7OeIqGnZHiGv8c8mKtmYrxo2o7P4lNUkpHdCMMsar7moRJxGgO9WlcIrwAGjIhMdP9fUvJ+jVDEteQ==",
"dev": true,
"requires": {
"debug": "^3.1.0",
"jszip": "^3.1.5",
"lodash": "^4.17.10",
+ "snyk-paket-parser": "1.4.3",
"xml2js": "^0.4.17"
},
"dependencies": {
@@ -8227,15 +8341,23 @@
}
}
},
+ "snyk-paket-parser": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.3.tgz",
+ "integrity": "sha512-6m736zGVoeT/zS9KEtlmqTSPEPjAfLe8iYoQ3AwbyxDhzuLY49lTaV67MyZtGwjhi1x4KBe+XOgeWwyf6Avf/A==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.3"
+ }
+ },
"snyk-php-plugin": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.1.tgz",
- "integrity": "sha512-g5QSHBsRJ2O4cNxKC4zlWwnQYiSgQ77Y6QgGmo3ihPX3VLZrc1amaZIpPsNe1jwXirnGj2rvR5Xw+jDjbzvHFw==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.2.tgz",
+ "integrity": "sha512-s/s9s7mslHjLnzin2BNLGdy/s6tNBfJ4/T/d9JBjsjIwdJFaUKY/ciWwBLNaWt2Aqtyr3DiUcqg3j/pwTKhEDg==",
"dev": true,
"requires": {
"debug": "^3.1.0",
- "lodash": "^4.17.5",
- "path": "0.12.7"
+ "lodash": "^4.17.5"
},
"dependencies": {
"debug": {
@@ -8256,9 +8378,9 @@
}
},
"snyk-policy": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.1.tgz",
- "integrity": "sha512-l9evS3Yk70xyvajjg+I6Ij7fr7gxpVRMZl0J1xNpWps/IVu4DSGih3aMmXi47VJozr4A/eFyj7R1lIr2GhqJCA==",
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.3.tgz",
+ "integrity": "sha512-6J2a+Wt9zgvTtCwi4x8rLtkDQzFNPqubfIgs3aR35ZsEXPwI4XHGo0cxnJPDriqncp2JK72vnRpNfIZ7v0L1Mw==",
"dev": true,
"requires": {
"debug": "^3.1.0",
@@ -8290,9 +8412,9 @@
}
},
"snyk-python-plugin": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.9.0.tgz",
- "integrity": "sha512-zlyOHoCpmyVym9AwkboeepzEGrY3gHsM7eWP/nJ85TgCnQO5H5orKm3RL57PNbWRY+BnDmoQQ+udQgjym2+3sg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.9.1.tgz",
+ "integrity": "sha512-4R040DBK77NSfSy3rCndmrv85YlLrKZU1ct59oZSoGb1PYdCi8kXRuq50UpSgasp6YR0yJxT22T38hNOAjTtVw==",
"dev": true,
"requires": {
"tmp": "0.0.33"
@@ -8377,9 +8499,9 @@
}
},
"snyk-sbt-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.0.0.tgz",
- "integrity": "sha512-bOUqsQ1Lysnwfnvf4QQIBfC0M0ZVuhlshTKd7pNwgAJ41YEPJNrPEpzOePl/HfKtwilEEwHh5YHvjYGegEKx0A==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.0.1.tgz",
+ "integrity": "sha512-AsGGMP0W3mlKygXUI5jjt54qWFttZEXT1A40+u21p8rZPXLZprwnd+QH9pZDd04d9W9aofGvON8NJeOn9KS39Q==",
"dev": true
},
"snyk-tree": {
@@ -8466,36 +8588,37 @@
}
},
"solid-panes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/solid-panes/-/solid-panes-1.2.0.tgz",
- "integrity": "sha512-JjdYi0KjVYCA5aOqs4UA/aU9ZISkdO4TWpGv7btfDQQGc+cBoXdSRwlufqFGHz3SrzBnqc0JJvmHsCvEQ4FREw==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/solid-panes/-/solid-panes-1.3.1.tgz",
+ "integrity": "sha512-SGw98zxvsp9gNzi1pv7jPWC4+O3e4xySPePFipBA7WN6BlCPweOlg+7Bm6xp7kj0jFSydu3+ckdM78W/xxuKKQ==",
"requires": {
"@solid/better-simple-slideshow": "^0.1.0",
"babel-preset-env": "^1.6.1",
"babel-preset-metalab": "^1.0.0",
- "chat-pane": "^1.2.6",
+ "chat-pane": ">=1.2.7",
"contacts-pane": "^1.0.3",
"folder-pane": "^1.0.4",
- "issue-pane": "^1.0.3",
- "meeting-pane": "^1.0.2",
+ "issue-pane": "^1.0.4",
+ "meeting-pane": "^1.0.4",
"mime-types": "^2.1.13",
"pane-registry": "^1.0.4",
"rdflib": ">=0.17.1",
- "solid-ui": ">=0.11.5",
+ "solid-ui": ">=0.12.0",
"source-pane": "^1.0.3"
}
},
"solid-ui": {
- "version": "0.11.12",
- "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-0.11.12.tgz",
- "integrity": "sha512-Cw2EEbooJnOlCuny3VmPVaPZ6byaQq3EA67B/j2mUhNJvQOtT1bHtqey6veeF9e8LMzBH3ndVeBCdf2awPfD/A==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-0.12.0.tgz",
+ "integrity": "sha512-ImiLiBE0SZP61kZ5dWweDRKQPxHYTFI8Jmxsz4yQIyPVcQB9SGM0Tdchz4zmSDRPvuw8GRFsC3USIHwIuvxj2g==",
"requires": {
"escape-html": "^1.0.3",
+ "mime-types": "^2.1.20",
"node-uuid": "^1.4.7",
- "rdflib": ">=0.19.0",
- "regenerate": "^1.3.2",
- "solid-auth-client": "^2.2.6",
- "solid-auth-tls": "^0.1.2"
+ "rdflib": "^0.19.1",
+ "solid-auth-client": "^2.2.13",
+ "solid-auth-tls": "^0.1.2",
+ "solid-namespace": "0.2.0"
},
"dependencies": {
"node-uuid": {
@@ -8514,6 +8637,11 @@
"solid-auth-client": "^2.2.3",
"xmldom": "^0.1.22"
}
+ },
+ "solid-namespace": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/solid-namespace/-/solid-namespace-0.2.0.tgz",
+ "integrity": "sha512-yQGQlTNDVtcMfzLz7OwL6Z8lJy9rN1ep0MgX28DPcja0DtA5pu1MzTpBVD9kvXl9X6eSEX73I7IYt0cUim0DrA=="
}
}
},
@@ -8546,9 +8674,9 @@
}
},
"source-map-support": {
- "version": "0.5.9",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
- "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+ "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
@@ -8875,6 +9003,12 @@
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
"dev": true
},
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
"strip-json-comments": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
@@ -9066,6 +9200,43 @@
"uuid": "^3.0.1"
}
},
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ }
+ }
+ },
"text-encoder-lite": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/text-encoder-lite/-/text-encoder-lite-1.0.1.tgz",
@@ -9145,6 +9316,12 @@
"integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
"dev": true
},
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
"timers-browserify": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
@@ -9215,9 +9392,9 @@
}
},
"toml": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz",
- "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==",
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==",
"dev": true
},
"tough-cookie": {
@@ -9377,15 +9554,6 @@
"xtend": "^4.0.1"
}
},
- "undefsafe": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz",
- "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=",
- "dev": true,
- "requires": {
- "debug": "^2.2.0"
- }
- },
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
@@ -9484,6 +9652,61 @@
}
}
},
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "^1.2.1",
+ "chalk": "^2.0.1",
+ "configstore": "^3.0.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^1.0.10",
+ "is-installed-globally": "^0.1.0",
+ "is-npm": "^1.0.0",
+ "latest-version": "^3.0.0",
+ "semver-diff": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -9518,6 +9741,15 @@
}
}
},
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -9591,9 +9823,9 @@
"integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw=="
},
"vscode-languageserver-types": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz",
- "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==",
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz",
+ "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==",
"dev": true
},
"webid": {
@@ -9651,13 +9883,46 @@
"isexe": "^2.0.0"
}
},
- "win-release": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz",
- "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=",
+ "widest-line": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+ "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
"dev": true,
"requires": {
- "semver": "^5.0.1"
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
}
},
"window-size": {
@@ -9666,6 +9931,15 @@
"integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
"dev": true
},
+ "windows-release": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz",
+ "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.10.0"
+ }
+ },
"wordwrap": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
@@ -9696,9 +9970,9 @@
}
},
"write-file-atomic": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
- "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz",
+ "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.11",
@@ -9764,12 +10038,6 @@
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
"dev": true
},
- "yallist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
- "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
- "dev": true
- },
"yargs": {
"version": "3.32.0",
"resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
diff --git a/package.json b/package.json
index 8e4e7ba4b..678ca416a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "solid-server",
"description": "Solid server on top of the file-system",
- "version": "5.0.0-beta.7",
+ "version": "5.0.0-beta.11",
"author": {
"name": "Tim Berners-Lee",
"email": "timbl@w3.org"
@@ -56,7 +56,7 @@
"bugs": "https://github.com/solid/node-solid-server/issues",
"dependencies": {
"@solid/oidc-auth-manager": "^0.17.1",
- "@solid/acl-check": "^0.1.3",
+ "@solid/acl-check": "^0.2.0",
"body-parser": "^1.18.3",
"bootstrap": "^3.3.7",
"busboy": "^0.2.12",
@@ -76,13 +76,13 @@
"get-folder-size": "^2.0.0",
"glob": "^7.1.1",
"global-tunnel-ng": "^2.1.0",
- "handlebars": "^4.0.6",
+ "handlebars": "^4.0.13",
"http-proxy-middleware": "^0.18.0",
"inquirer": "^1.0.2",
"ip-range-check": "0.0.2",
"is-ip": "^2.0.0",
"li": "^1.0.1",
- "mashlib": "^0.7.15",
+ "mashlib": "^0.7.18",
"mime-types": "^2.1.11",
"negotiator": "^0.6.0",
"node-fetch": "^2.1.2",
@@ -90,6 +90,7 @@
"nodemailer": "^3.1.4",
"oidc-op-express": "^0.0.3",
"owasp-password-strength-test": "^1.3.0",
+ "proper-lockfile": "^3.2.0",
"rdflib": "^0.17.1",
"recursive-readdir": "^2.1.0",
"rimraf": "^2.5.0",
@@ -117,11 +118,11 @@
"mocha": "^5.1.1",
"nock": "^9.0.14",
"node-mocks-http": "^1.7.0",
- "nyc": "^13.0.1",
+ "nyc": "^13.3.0",
"randombytes": "^2.0.1",
"sinon": "^2.1.0",
"sinon-chai": "^2.8.0",
- "snyk": "^1.88.2",
+ "snyk": "^1.136.1",
"standard": "^8.6.0",
"supertest": "^3.0.0",
"turtle-validator": "^1.0.2",
diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js
index cda089586..6d2be533d 100644
--- a/test/integration/account-creation-oidc-test.js
+++ b/test/integration/account-creation-oidc-test.js
@@ -80,21 +80,21 @@ describe('AccountManager (OIDC account creation tests)', function () {
})
it('should not create WebID if no username is given', (done) => {
- let subdomain = supertest('https://nicola.' + host)
+ let subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=&password=12345')
.expect(400, done)
})
it('should not create WebID if no password is given', (done) => {
- let subdomain = supertest('https://nicola.' + host)
+ let subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=')
.expect(400, done)
})
it('should not create a WebID if it already exists', function (done) {
- var subdomain = supertest('https://nicola.' + host)
+ var subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=12345&acceptToc=true')
.expect(302)
@@ -112,14 +112,14 @@ describe('AccountManager (OIDC account creation tests)', function () {
})
it('should not create WebID if T&C is not accepted', (done) => {
- let subdomain = supertest('https://nicola.' + host)
+ let subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=12345&acceptToc=')
.expect(400, done)
})
it('should create the default folders', function (done) {
- var subdomain = supertest('https://nicola.' + host)
+ var subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=12345&acceptToc=true')
.expect(302)
@@ -150,14 +150,15 @@ describe('AccountManager (OIDC account creation tests)', function () {
}).timeout(20000)
it('should link WebID to the root account', function (done) {
- var subdomain = supertest('https://nicola.' + host)
- subdomain.post('/api/accounts/new')
+ const domain = supertest('https://' + host)
+ domain.post('/api/accounts/new')
.send('username=nicola&password=12345&acceptToc=true')
.expect(302)
.end(function (err) {
if (err) {
return done(err)
}
+ const subdomain = supertest('https://nicola.' + host)
subdomain.get('/.meta')
.expect(200)
.end(function (err, data) {
@@ -185,7 +186,7 @@ describe('AccountManager (OIDC account creation tests)', function () {
describe('after setting up account', () => {
beforeEach(done => {
- var subdomain = supertest('https://nicola.' + host)
+ var subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=12345&acceptToc=true')
.end(done)
@@ -294,7 +295,7 @@ describe('Signup page where Terms & Conditions are not being enforced', () => {
})
it('should not enforce T&C upon creating account', function (done) {
- var subdomain = supertest('https://nicola.' + host)
+ var subdomain = supertest('https://' + host)
subdomain.post('/api/accounts/new')
.send('username=nicola&password=12345')
.expect(302, done)
diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js
index 9d321b10d..c2103f669 100644
--- a/test/integration/acl-tls-test.js
+++ b/test/integration/acl-tls-test.js
@@ -332,7 +332,7 @@ describe('ACL with WebID+TLS', function () {
request.head(options, function (error, response, body) {
assert.equal(error, null)
- assert.equal(response.statusCode, 403)
+ assert.equal(response.statusCode, 401)
done()
})
})
@@ -354,7 +354,7 @@ describe('ACL with WebID+TLS', function () {
request.head(options, function (error, response, body) {
assert.equal(error, null)
- assert.equal(response.statusCode, 403)
+ assert.equal(response.statusCode, 401)
done()
})
})
@@ -433,7 +433,7 @@ describe('ACL with WebID+TLS', function () {
request.head(options, function (error, response, body) {
assert.equal(error, null)
- assert.equal(response.statusCode, 403)
+ assert.equal(response.statusCode, 401)
done()
})
})
@@ -455,7 +455,7 @@ describe('ACL with WebID+TLS', function () {
request.head(options, function (error, response, body) {
assert.equal(error, null)
- assert.equal(response.statusCode, 403)
+ assert.equal(response.statusCode, 401)
done()
})
})
diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js
index 54281eec3..e2153a946 100644
--- a/test/integration/authentication-oidc-test.js
+++ b/test/integration/authentication-oidc-test.js
@@ -20,7 +20,7 @@ chai.use(require('dirty-chai'))
// In this test we always assume that we are Alice
describe('Authentication API (OIDC)', () => {
- let alice, bob
+ let alice, bob // eslint-disable-line no-unused-vars
let aliceServerUri = 'https://localhost:7000'
let aliceWebId = 'https://localhost:7000/profile/card#me'
@@ -35,6 +35,8 @@ describe('Authentication API (OIDC)', () => {
let bobDbPath = path.join(__dirname,
'../resources/accounts-scenario/bob/db')
+ const trustedAppUri = 'https://trusted.app'
+
const serverConfig = {
sslKey: path.join(__dirname, '../keys/key.pem'),
sslCert: path.join(__dirname, '../keys/cert.pem'),
@@ -42,7 +44,8 @@ describe('Authentication API (OIDC)', () => {
dataBrowser: false,
webid: true,
multiuser: false,
- configPath
+ configPath,
+ trustedOrigins: ['https://apps.solid.invalid']
}
const aliceRootPath = path.join(__dirname, '../resources/accounts-scenario/alice')
@@ -178,6 +181,39 @@ describe('Authentication API (OIDC)', () => {
})
})
+ describe('with that cookie and a non-matching origin', () => {
+ let response
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .set('Origin', bobServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 403', () => {
+ expect(response).to.have.property('status', 403)
+ })
+ })
+
+ describe('without that cookie and a non-matching origin', () => {
+ let response
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', bobServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
+ })
+ })
+
describe('with that cookie but without origin', () => {
let response
before(done => {
@@ -194,6 +230,19 @@ describe('Authentication API (OIDC)', () => {
})
})
+ describe('with that cookie, private resource and no origin set', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 200', () => expect(response).to.have.property('status', 200))
+ })
+
// How Mallory might set their cookie:
describe('with malicious cookie but without origin', () => {
let response
@@ -295,8 +344,8 @@ describe('Authentication API (OIDC)', () => {
})
})
- it('should return a 403', () => {
- expect(response).to.have.property('status', 403) // TODO: Should be 401?
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
})
})
@@ -314,8 +363,8 @@ describe('Authentication API (OIDC)', () => {
})
})
- it('should return a 403', () => {
- expect(response).to.have.property('status', 403)
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
})
})
@@ -332,8 +381,8 @@ describe('Authentication API (OIDC)', () => {
})
})
- it('should return a 403', () => {
- expect(response).to.have.property('status', 403)
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
})
})
@@ -355,7 +404,24 @@ describe('Authentication API (OIDC)', () => {
})
})
- // Authenticated but origin not OK
+ describe('with malicious cookie and our origin', () => {
+ let response
+ before(done => {
+ var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;')
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', aliceServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
+ })
+ })
+
describe('with malicious cookie and a non-matching origin', () => {
let response
before(done => {
@@ -369,9 +435,51 @@ describe('Authentication API (OIDC)', () => {
})
})
- it('should return a 403', () => {
- expect(response).to.have.property('status', 403)
+ it('should return a 401', () => {
+ expect(response).to.have.property('status', 401)
+ })
+ })
+
+ describe('with trusted app and no cookie', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
})
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+
+ describe('with trusted app and malicious cookie', () => {
+ before(done => {
+ var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;')
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+
+ describe('with trusted app and correct cookie', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 200', () => expect(response).to.have.property('status', 200))
})
})
})
@@ -539,7 +647,7 @@ describe('Authentication API (OIDC)', () => {
// Step 6: Web App extracts tokens from the uri hash fragment, uses
// them to access protected resource
- it('should use id token from the callback uri to access shared resource', () => {
+ it('should use id token from the callback uri to access shared resource (no origin)', () => {
auth.window.location.href = callbackUri
let protectedResourcePath = bobServerUri + '/shared-with-alice.txt'
@@ -569,6 +677,32 @@ describe('Authentication API (OIDC)', () => {
})
})
+ it('should use id token from the callback uri to access shared resource (untrusted origin)', () => {
+ auth.window.location.href = callbackUri
+
+ let protectedResourcePath = bobServerUri + '/shared-with-alice.txt'
+
+ return auth.initUserFromResponse(auth.currentClient)
+ .then(webId => {
+ expect(webId).to.equal(aliceWebId)
+
+ return auth.issuePoPTokenFor(bobServerUri, auth.session)
+ })
+ .then(popToken => {
+ bearerToken = popToken
+
+ return fetch(protectedResourcePath, {
+ headers: {
+ 'Authorization': 'Bearer ' + bearerToken,
+ 'Origin': 'https://untrusted.example.com' // shouldn't be allowed if strictOrigin is set to true
+ }
+ })
+ })
+ .then(res => {
+ expect(res.status).to.equal(403)
+ })
+ })
+
it('should not be able to reuse the bearer token for bob server on another server', () => {
let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt'
diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js
new file mode 100644
index 000000000..7cf97db3a
--- /dev/null
+++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js
@@ -0,0 +1,605 @@
+const Solid = require('../../index')
+const path = require('path')
+const fs = require('fs-extra')
+const { UserStore } = require('@solid/oidc-auth-manager')
+const UserAccount = require('../../lib/models/user-account')
+const SolidAuthOIDC = require('@solid/solid-auth-oidc')
+
+const fetch = require('node-fetch')
+const localStorage = require('localstorage-memory')
+const URL = require('whatwg-url').URL
+global.URL = URL
+global.URLSearchParams = require('whatwg-url').URLSearchParams
+const { cleanDir, cp } = require('../utils')
+
+const supertest = require('supertest')
+const chai = require('chai')
+const expect = chai.expect
+chai.use(require('dirty-chai'))
+
+// In this test we always assume that we are Alice
+
+describe('Authentication API (OIDC) - With strict origins turned off', () => {
+ let alice, bob
+
+ const aliceServerPort = 7010
+ const aliceServerUri = `https://localhost:${aliceServerPort}`
+ const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me`
+ let configPath = path.join(__dirname, '../resources/config')
+ let aliceDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice/db')
+ let userStorePath = path.join(aliceDbPath, 'oidc/users')
+ let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 })
+ aliceUserStore.initCollections()
+
+ const bobServerPort = 7011
+ const bobServerUri = `https://localhost:${bobServerPort}`
+ let bobDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob/db')
+
+ const trustedAppUri = 'https://trusted.app'
+
+ const serverConfig = {
+ sslKey: path.join(__dirname, '../keys/key.pem'),
+ sslCert: path.join(__dirname, '../keys/cert.pem'),
+ auth: 'oidc',
+ dataBrowser: false,
+ webid: true,
+ multiuser: false,
+ configPath,
+ strictOrigin: false
+ }
+
+ const aliceRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice')
+ const alicePod = Solid.createServer(
+ Object.assign({
+ root: aliceRootPath,
+ serverUri: aliceServerUri,
+ dbPath: aliceDbPath
+ }, serverConfig)
+ )
+ const bobRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob')
+ const bobPod = Solid.createServer(
+ Object.assign({
+ root: bobRootPath,
+ serverUri: bobServerUri,
+ dbPath: bobDbPath
+ }, serverConfig)
+ )
+
+ function startServer (pod, port) {
+ return new Promise((resolve) => {
+ pod.listen(port, () => { resolve() })
+ })
+ }
+
+ before(async () => {
+ await Promise.all([
+ startServer(alicePod, aliceServerPort),
+ startServer(bobPod, bobServerPort)
+ ]).then(() => {
+ alice = supertest(aliceServerUri)
+ bob = supertest(bobServerUri)
+ })
+ cp(path.join('accounts-strict-origin-off/alice', '.acl-override'), path.join('accounts-strict-origin-off/alice', '.acl'))
+ cp(path.join('accounts-strict-origin-off/bob', '.acl-override'), path.join('accounts-strict-origin-off/bob', '.acl'))
+ })
+
+ after(() => {
+ alicePod.close()
+ bobPod.close()
+ fs.removeSync(path.join(aliceDbPath, 'oidc/users'))
+ cleanDir(aliceRootPath)
+ cleanDir(bobRootPath)
+ })
+
+ describe('Login page (GET /login)', () => {
+ it('should load the user login form', () => alice.get('/login').expect(200))
+ })
+
+ describe('Login by Username and Password (POST /login/password)', () => {
+ // Logging in as alice, to alice's pod
+ let aliceAccount = UserAccount.from({ webId: aliceWebId })
+ let alicePassword = '12345'
+
+ beforeEach(() => {
+ aliceUserStore.initCollections()
+
+ return aliceUserStore.createUser(aliceAccount, alicePassword)
+ .catch(console.error.bind(console))
+ })
+
+ afterEach(() => {
+ fs.removeSync(path.join(aliceDbPath, 'users/users'))
+ })
+
+ describe('after performing a correct login', () => {
+ let response, cookie
+ before(done => {
+ aliceUserStore.initCollections()
+ aliceUserStore.createUser(aliceAccount, alicePassword)
+ alice.post('/login/password')
+ .type('form')
+ .send({ username: 'alice' })
+ .send({ password: alicePassword })
+ .end((err, res) => {
+ response = res
+ cookie = response.headers['set-cookie'][0]
+ done(err)
+ })
+ })
+
+ it('should redirect to /authorize', () => {
+ const loginUri = response.headers.location
+ expect(response).to.have.property('status', 302)
+ expect(loginUri.startsWith(aliceServerUri + '/authorize'))
+ })
+
+ it('should set the cookie', () => {
+ expect(cookie).to.match(/connect.sid=\S{65,100}/)
+ })
+
+ it('should set the cookie with HttpOnly', () => {
+ expect(cookie).to.match(/HttpOnly/)
+ })
+
+ it('should set the cookie with Secure', () => {
+ expect(cookie).to.match(/Secure/)
+ })
+
+ describe('and performing a subsequent request', () => {
+ let response
+ describe('without cookie', () => {
+ describe('and no origin set', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and our origin', () => {
+ // Our own origin, no agent auth
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', aliceServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and trusted origin', () => {
+ // Configuration for originsAllowed but no auth
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', 'https://apps.solid.invalid')
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and untrusted origin', () => {
+ // Not authenticated but also wrong origin,
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', bobServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and trusted app', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ })
+
+ describe('with cookie', () => {
+ describe('and no origin set', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 200', () => expect(response).to.have.property('status', 200))
+ })
+ describe('and our origin', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .set('Origin', aliceServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 200', () => expect(response).to.have.property('status', 200))
+ })
+ describe('and trusted origin', () => {
+ before(done => {
+ alice.get('/')
+ .set('Cookie', cookie)
+ .set('Origin', 'https://apps.solid.invalid') // TODO: Should we configure the server with that? Should it matter?
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and untrusted origin', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .set('Origin', bobServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ // Even if origin checking is disabled, then this should return a 401 because cookies should not be trusted cross-origin
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+
+ describe('and trusted app', () => {
+ // Trusted apps are not supported when strictOrigin check is turned off
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', cookie)
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ })
+
+ describe('with malicious cookie', () => {
+ let malcookie
+ before(() => {
+ // How Mallory might set their cookie:
+ malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;')
+ })
+ describe('and no origin set', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and our origin', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', aliceServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and trusted origin', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', 'https://apps.solid.invalid')
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ describe('and untrusted origin', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', bobServerUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+
+ describe('and trusted app', () => {
+ before(done => {
+ alice.get('/private-for-alice.txt')
+ .set('Cookie', malcookie)
+ .set('Origin', trustedAppUri)
+ .end((err, res) => {
+ response = res
+ done(err)
+ })
+ })
+
+ it('should return a 401', () => expect(response).to.have.property('status', 401))
+ })
+ })
+ })
+ })
+
+ it('should throw a 400 if no username is provided', (done) => {
+ alice.post('/login/password')
+ .type('form')
+ .send({ password: alicePassword })
+ .expect(400, done)
+ })
+
+ it('should throw a 400 if no password is provided', (done) => {
+ alice.post('/login/password')
+ .type('form')
+ .send({ username: 'alice' })
+ .expect(400, done)
+ })
+
+ it('should throw a 400 if user is found but no password match', (done) => {
+ alice.post('/login/password')
+ .type('form')
+ .send({ username: 'alice' })
+ .send({ password: 'wrongpassword' })
+ .expect(400, done)
+ })
+ })
+
+ describe('Browser login workflow', () => {
+ it('401 Unauthorized asking the user to log in', (done) => {
+ bob.get('/shared-with-alice.txt')
+ .end((err, { status, text }) => {
+ expect(status).to.equal(401)
+ expect(text).to.contain('Log in')
+ done(err)
+ })
+ })
+ })
+
+ describe('Two Pods + Web App Login Workflow', () => {
+ let aliceAccount = UserAccount.from({ webId: aliceWebId })
+ let alicePassword = '12345'
+
+ let auth
+ let authorizationUri, loginUri, authParams, callbackUri
+ let loginFormFields = ''
+ let bearerToken
+
+ before(() => {
+ auth = new SolidAuthOIDC({ store: localStorage, window: { location: {} } })
+ let appOptions = {
+ redirectUri: 'https://app.example.com/callback'
+ }
+
+ aliceUserStore.initCollections()
+
+ return aliceUserStore.createUser(aliceAccount, alicePassword)
+ .then(() => {
+ return auth.registerClient(aliceServerUri, appOptions)
+ })
+ .then(registeredClient => {
+ auth.currentClient = registeredClient
+ })
+ })
+
+ after(() => {
+ fs.removeSync(path.join(aliceDbPath, 'users/users'))
+ fs.removeSync(path.join(aliceDbPath, 'oidc/op/tokens'))
+
+ let clientId = auth.currentClient.registration['client_id']
+ let registration = `_key_${clientId}.json`
+ fs.removeSync(path.join(aliceDbPath, 'oidc/op/clients', registration))
+ })
+
+ // Step 1: An app makes a GET request and receives a 401
+ it('should get a 401 error on a REST request to a protected resource', () => {
+ return fetch(bobServerUri + '/shared-with-alice.txt')
+ .then(res => {
+ expect(res.status).to.equal(401)
+
+ expect(res.headers.get('www-authenticate'))
+ .to.equal(`Bearer realm="${bobServerUri}", scope="openid webid"`)
+ })
+ })
+
+ // Step 2: App presents the Select Provider UI to user, determine the
+ // preferred provider uri (here, aliceServerUri), and constructs
+ // an authorization uri for that provider
+ it('should determine the authorization uri for a preferred provider', () => {
+ return auth.currentClient.createRequest({}, auth.store)
+ .then(authUri => {
+ authorizationUri = authUri
+
+ expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true()
+ })
+ })
+
+ // Step 3: App redirects user to the authorization uri for login
+ it('should redirect user to /authorize and /login', () => {
+ return fetch(authorizationUri, { redirect: 'manual' })
+ .then(res => {
+ // Since user is not logged in, /authorize redirects to /login
+ expect(res.status).to.equal(302)
+
+ loginUri = new URL(res.headers.get('location'))
+ expect(loginUri.toString().startsWith(aliceServerUri + '/login'))
+ .to.be.true()
+
+ authParams = loginUri.searchParams
+ })
+ })
+
+ // Step 4: Pod returns a /login page with appropriate hidden form fields
+ it('should display the /login form', () => {
+ return fetch(loginUri.toString())
+ .then(loginPage => {
+ return loginPage.text()
+ })
+ .then(pageText => {
+ // Login page should contain the relevant auth params as hidden fields
+
+ authParams.forEach((value, key) => {
+ let hiddenField = ``
+
+ let fieldRegex = new RegExp(hiddenField)
+
+ expect(pageText).to.match(fieldRegex)
+
+ loginFormFields += `${key}=` + encodeURIComponent(value) + '&'
+ })
+ })
+ })
+
+ // Step 5: User submits their username & password via the /login form
+ it('should login via the /login form', () => {
+ loginFormFields += `username=${'alice'}&password=${alicePassword}`
+
+ return fetch(aliceServerUri + '/login/password', {
+ method: 'POST',
+ body: loginFormFields,
+ redirect: 'manual',
+ headers: {
+ 'content-type': 'application/x-www-form-urlencoded'
+ },
+ credentials: 'include'
+ })
+ .then(res => {
+ expect(res.status).to.equal(302)
+ let postLoginUri = res.headers.get('location')
+ let cookie = res.headers.get('set-cookie')
+
+ // Successful login gets redirected back to /authorize and then
+ // back to app
+ expect(postLoginUri.startsWith(aliceServerUri + '/authorize'))
+ .to.be.true()
+
+ return fetch(postLoginUri, { redirect: 'manual', headers: { cookie } })
+ })
+ .then(res => {
+ // User gets redirected back to original app
+ expect(res.status).to.equal(302)
+ callbackUri = res.headers.get('location')
+ expect(callbackUri.startsWith('https://app.example.com#'))
+ })
+ })
+
+ // Step 6: Web App extracts tokens from the uri hash fragment, uses
+ // them to access protected resource
+ it('should use id token from the callback uri to access shared resource (no origin)', () => {
+ auth.window.location.href = callbackUri
+
+ let protectedResourcePath = bobServerUri + '/shared-with-alice.txt'
+
+ return auth.initUserFromResponse(auth.currentClient)
+ .then(webId => {
+ expect(webId).to.equal(aliceWebId)
+
+ return auth.issuePoPTokenFor(bobServerUri, auth.session)
+ })
+ .then(popToken => {
+ bearerToken = popToken
+
+ return fetch(protectedResourcePath, {
+ headers: {
+ 'Authorization': 'Bearer ' + bearerToken
+ }
+ })
+ })
+ .then(res => {
+ expect(res.status).to.equal(200)
+
+ return res.text()
+ })
+ .then(contents => {
+ expect(contents).to.equal('protected contents\n')
+ })
+ })
+ it('should use id token from the callback uri to access shared resource (untrusted origin)', () => {
+ auth.window.location.href = callbackUri
+
+ let protectedResourcePath = bobServerUri + '/shared-with-alice.txt'
+
+ return auth.initUserFromResponse(auth.currentClient)
+ .then(webId => {
+ expect(webId).to.equal(aliceWebId)
+
+ return auth.issuePoPTokenFor(bobServerUri, auth.session)
+ })
+ .then(popToken => {
+ bearerToken = popToken
+
+ return fetch(protectedResourcePath, {
+ headers: {
+ 'Authorization': 'Bearer ' + bearerToken,
+ 'Origin': 'https://untrusted.example.com' // shouldn't matter if strictOrigin is set to false
+ }
+ })
+ })
+ .then(res => {
+ expect(res.status).to.equal(200)
+
+ return res.text()
+ })
+ .then(contents => {
+ expect(contents).to.equal('protected contents\n')
+ })
+ })
+
+ it('should not be able to reuse the bearer token for bob server on another server', () => {
+ let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt'
+
+ return fetch(privateAliceResourcePath, {
+ headers: {
+ // This is Alice's bearer token with her own Web ID
+ 'Authorization': 'Bearer ' + bearerToken
+ }
+ })
+ .then(res => {
+ // It will get rejected; it was issued for Bob's server only
+ expect(res.status).to.equal(403)
+ })
+ })
+ })
+
+ describe('Post-logout page (GET /goodbye)', () => {
+ it('should load the post-logout page', () => {
+ return alice.get('/goodbye')
+ .expect(200)
+ })
+ })
+})
diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt b/test/resources/accounts-scenario/alice/private-for-owner.txt
deleted file mode 100644
index 5d39eb781..000000000
--- a/test/resources/accounts-scenario/alice/private-for-owner.txt
+++ /dev/null
@@ -1 +0,0 @@
-protected contents for owner
diff --git a/test/resources/accounts-scenario/alice/profile/card$.ttl b/test/resources/accounts-scenario/alice/profile/card$.ttl
new file mode 100644
index 000000000..a014d960e
--- /dev/null
+++ b/test/resources/accounts-scenario/alice/profile/card$.ttl
@@ -0,0 +1,4 @@
+@prefix acl: .
+
+<#me> acl:trustedApp [ acl:origin ;
+ acl:mode acl:Read, acl:Write, acl:Append, acl:Control].
diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl b/test/resources/accounts-strict-origin-off/alice/.acl-override
similarity index 63%
rename from test/resources/accounts-scenario/alice/private-for-owner.txt.acl
rename to test/resources/accounts-strict-origin-off/alice/.acl-override
index fbc63348b..bcdd33def 100644
--- a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl
+++ b/test/resources/accounts-strict-origin-off/alice/.acl-override
@@ -1,5 +1,5 @@
<#Owner>
a ;
- <./private-for-owner.txt>;
- ;
+ <./>;
+ ;
, , .
diff --git a/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json
new file mode 100644
index 000000000..68a3b5341
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json
@@ -0,0 +1,411 @@
+{
+ "issuer": "https://localhost:7010",
+ "authorization_endpoint": "https://localhost:7010/authorize",
+ "token_endpoint": "https://localhost:7010/token",
+ "userinfo_endpoint": "https://localhost:7010/userinfo",
+ "jwks_uri": "https://localhost:7010/jwks",
+ "registration_endpoint": "https://localhost:7010/register",
+ "response_types_supported": [
+ "code",
+ "code token",
+ "code id_token",
+ "id_token",
+ "id_token token",
+ "code id_token token",
+ "none"
+ ],
+ "response_modes_supported": [
+ "query",
+ "fragment"
+ ],
+ "grant_types_supported": [
+ "authorization_code",
+ "implicit",
+ "refresh_token",
+ "client_credentials"
+ ],
+ "subject_types_supported": [
+ "public"
+ ],
+ "id_token_signing_alg_values_supported": [
+ "RS256",
+ "RS384",
+ "RS512",
+ "none"
+ ],
+ "token_endpoint_auth_methods_supported": [
+ "client_secret_basic"
+ ],
+ "token_endpoint_auth_signing_alg_values_supported": [
+ "RS256"
+ ],
+ "display_values_supported": [],
+ "claim_types_supported": [
+ "normal"
+ ],
+ "claims_supported": [],
+ "claims_parameter_supported": false,
+ "request_parameter_supported": true,
+ "request_uri_parameter_supported": false,
+ "require_request_uri_registration": false,
+ "check_session_iframe": "https://localhost:7010/session",
+ "end_session_endpoint": "https://localhost:7010/logout",
+ "keys": {
+ "descriptor": {
+ "id_token": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ },
+ "RS384": {
+ "alg": "RS384",
+ "modulusLength": 2048
+ },
+ "RS512": {
+ "alg": "RS512",
+ "modulusLength": 2048
+ }
+ },
+ "encryption": {}
+ },
+ "token": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ },
+ "RS384": {
+ "alg": "RS384",
+ "modulusLength": 2048
+ },
+ "RS512": {
+ "alg": "RS512",
+ "modulusLength": 2048
+ }
+ },
+ "encryption": {}
+ },
+ "userinfo": {
+ "encryption": {}
+ },
+ "register": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ }
+ }
+ }
+ },
+ "jwks": {
+ "keys": [
+ {
+ "kid": "QMa5xaKOYwI",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "66gqKTPVHyA",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "zPdTDVkjms4",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "8zan03XlrmI",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "5ooqXseJdoQ",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "tfz-MRyl3GQ",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "FRI7f7sJKUg",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ ]
+ },
+ "id_token": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "hS7A2bkdhJA",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw",
+ "e": "AQAB",
+ "d": "KvDiH3e1v1XQSc15VG2JkMGJHF1jioHa7xec1P9bsjSQvA8yc4zCLHMr9EoYS9Hac1jD181Y_Du85sVyofnT_MKCYz0LCKS3deTHraY-a1w0fQqhVsLWQxBdMz55-JG4MR2xwukPqoV7W8jEAr1G9yYR6Zg3l3gYTuRZb-mAIlxBZOcZ-4DvB0GtEYLyWFRSMiaUl_EkqgQpssH5hKIIB7xtHZFG_FsbH2gnv0apZFdZCs1hpzyJ_FuUYoIupdaHUP92ojdGQ8E51J_t6SIYjZdtEoKhk6i2BHIPzSerxItVgAs-3RTbeYp1gEdyQGROz8Owyorsqzq-2S7gxXn_AQ",
+ "p": "zJtqzVrhym0DBWIK11LEIwTPU9G_prC_XYzt0H3tXuiwAlpRoFOoecAKsCJqb_bvL7mqVCjYzS-O57dzdxd36F-vpvW9xH3SgfxcoDtiVkvuoux9nGaQXLWCetjHy8jrL41SDVc55R7h4knn6KgR_yWmY2LR-w0CktrWuIlOIps",
+ "q": "yyfVYtGaJASgfkv1KL-HoA8yyP7OZrUsxxQcIXMuQoAUqKtvyl6gn2W4uW4opg_yzuN0jxK8ZM8EjOmzXs0_dhVWXWFBBvhmpI4ssXXQYVhJiq-QMm6WvDZFXtW-o3ikRXWuxwnUeOn0psxsIXtHrKQ7Wcf29KrCu64MYTvIoOE",
+ "dp": "Ptr722ww8wO8KtospGtbr7pZitFjw-yGTVHu-N7GniJzd7WRX-RzXDufzO41roG4hvvNlJ8bwyT6DLsxsIM4Jd3HU04o5wUUNzR0rBCyK_qVq91k1Tg43xIvrFeOQU9O2MPcUhbaxUVQdTjpEnMXXD-PtvZztWEQylaKIhSkOUM",
+ "dq": "oauPetaGrgcomZlk_gp9qfiuV5m_M6kWe08bm9sHg1BeIGRd0FRByteui5KIsq6acd480eb9GdRNML6CSf1YdWZBlopgr2VaebXTB15UeENEMyPHwvqS5jDiP7glv_2v7L7cWfUOqzKzyVGA85why9fei3JAqzCBS84UeASVgsE",
+ "qi": "lURMq4viaqzYCi_JF_dDZjvc6rpuiRSzhd0PyY6mdutMZqLtZJESZt8HuEqpey5GA4i481DmmUXCfNhBc-4kUOAP5PVdHJp7YttvrzpkZGtJx_xLwLLLgDn6zaheaeNnxRvHqoW0Cycx6TAAVzX2Cdsjo-vRiaRqGkOBPslOiqA",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "QMa5xaKOYwI",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS384": {
+ "privateJwk": {
+ "kid": "IN7Ur_i2gps",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw",
+ "e": "AQAB",
+ "d": "KtxZqbuiS4phu0YjmGqh2m8xp6X8ojYpE71ydA2FVUomwmCkcOOA9MFwznLDW1JpiCq3BaRLK9YBhvDTpPP4m6Gww5Vj3J63L8wW58b-3fXicX02iWwNG90w0hyuNaNLlWdSpSk0MW77c5bxn_esOg_A4lZg28aMPyfkCxGQkvaHR2EeY9eL9xlZoNtQxtLoKOIl97fJt96C9hXwRPuygDknHywRo35_Fi9nSpdu-_wfoZxBvPvRAQA-jFmwsJwLB3XaYJEZmZoBajXLfYUVEYKCOD7bsPysdbIUCY6dFBAL9FyFl5HSCjgW6yKHql0YfUf5VabQQnkdXDZxng7OiQ",
+ "p": "2ZOHQkgjfkgMC0Z6gfP-nCj_jqDI2F6MpB4HIvOvpm8z-qz02mZeC6zgHzHtichOwgCPJPapS7hN9vlQdnOTl62XBWmZ2Jbz_q3shbnRPYx7J3GSARrohOHm1bsapxeagQcXoBuScx-Kvgih4B_-u-PHvHFQHHaoEzIpR_FcK-M",
+ "q": "zABSbkRBSpayejh_y8cvTZI5YZjz8bK_n78yKYOR4bsPrC-c2TGtxsHqv5x_5Ps5ALicul59HgrN8oD8THYJiO2V7wobNIp4HDl2J8aL9me43a2VuDRPOXHeOzxtP071_p6VZWEju0kMDihwn91Vkc2RwrgkNrPClGEQstOg12U",
+ "dp": "dqxTIEH8qgpeF2BPvcX53-80xPTJ18pqZ7HBLr0_10XcUiQ4QU-IiFG4xQsUhwxseMCZUw3-9UAHtmfyDUmo_Rg_wUICGfLsDsOKuL3LdQjEu5TkkBm_LYuRvo4ZUX48VZgquLeRP526rUBEGt0Ysh7heNVNXtkRf7bicU0iewU",
+ "dq": "yGvskF7IksJZWNCXZZostBZb_7HowOYvc3_BhZ24vkAs1qr0e0Jei25K9rOHx2y2BSpa-JMKc3CEA6OLvIcfOQLKkk2oiscb2AbwOYXMTmp66ne3J4Fk8HgZsLLeVht6fQxKlI6KL19F08cRV0552kRP1zFYitGy8lomsLpQRC0",
+ "qi": "scdLHtzFy5A5nhbl6XOv_g_5LxTiebV9ifCo8A_Y8T7hEPsUwOZxkIarcREgDbgo7zdJZjpKEklWrsp6sBT6KyJZf1_e_oZWCoivr7btx05ZWq7bJdn8773y-7DjL3H_HFpqVkpx-f03OKV8_AV-VspkxsVrp0FcrRGs2hpjck0",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "66gqKTPVHyA",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS512": {
+ "privateJwk": {
+ "kid": "34CvC1I0fbk",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ",
+ "e": "AQAB",
+ "d": "RZybBe_8yWesu3qIrnMhK0kbtYCi2PZPPdwwEQK_RqzNNg6aiqXPqaHj7gN9LQR6_VAfiyLtdN6TUxDHC_AvN7ls_3_fI-sRvWb7zuGyZFcb1RWBCY_4u57FLw6N6Wj1jqMyh0Y7v-kTnCrj_J8Rk_wRQR0bKCFtlQJIrz73zu90rcPOOjWPH6W6LCN-lkmOC8vm0M08aHJtZclLSJcSO8VX6P4rDbbIadNubhtZ0_snOlc9ZctpWDgqGRqJGKL2FRldmVMnYr9vE4kv3jELCvkKtct35k1q6qd6pQQ2j3iL0nUnIRRCiuIVRmuiUKI11i2lmQoqnzQN0qGNKhAY3Q",
+ "p": "7psJPwCSpbravp7NlZQWAmvBvZEdPZ3BNk2w7_udpKZqHvnhgwr40jypwp3JdysSXsd4cDKGlzkCaCeJT3L9N26feCGbwbSjwmdf7UcSXDhlfSxAsEI2LtPPkG4SQdsAv42s3NQcPnO9Uf0ZdH-yV8tj5gwB1ibF0_MxtNcenYc",
+ "q": "wvRiS7lfGGQmJioCYHrkUyeJnwg2-GYbCD6LF2nDXFbsz_JWmgeI1lbSKuD5notoIy62p0R6FdX3mtwb_8dDDHFbjrHfPbOEp-MOd-cZ9f6XxKeC_uoXrkEdcLl5IthG2WtqKT_If5xIMRW4MYwRD3gTUs-DU255B-7YF3oT_F8",
+ "dp": "jP01QHIRNTatLLffWMRRIQsVRvNpaNA_q9vKcnOmWfUvfbA_rdQc5PWNhf8AXZco2rJZG0rvtomsP2klPLoAn_GQ70ZEp_gaT7QPvcAiPDXi2kz8yGnHZHIqEvjHdvx2e7m2bCI1sj1nn_vDP9B4zGHVXMi5iRYODUiFlYsLfx8",
+ "dq": "v1uxwDJMLVzgNUW234zA4P5GD1u42Ukf74-0Z17g65pHCDYO21HZ9slxsbTyT7T2mtIXZ0fHrfc_-zliIkYsgeIixIXDYoT7CO_OG9MzoEouHlFuO1j7tYckpqjnRlST9oWAxsxcuSVllwiCq9-YP17VWMtnVFVzZ14BrcmeJHE",
+ "qi": "4Ufn1YaM5AImU625M0Fd5r9cYU__mPw-HbJHxHoCENGDY8Mz4pB1nJqu10gI5JKgucU4y8VtV1wBzGb_s97gSS8SMmzea6of2SjoxxyR4sYcPfmJz9-1En7F8r3WahBP1IDMTDV6afbTMVPzPIbjkHowmQHyrTBmx2G3rODfStw",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "zPdTDVkjms4",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ },
+ "encryption": {}
+ },
+ "token": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "oYYAVkAOTqo",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ",
+ "e": "AQAB",
+ "d": "Jyjwq0jfCSzhO-VCBK2OwcyTKFU431W2lJQQ_D_E0QHK0TKbjmWi1jfH2Ooxsl9HgML7aNUHBlaMzxoaTUYlF4gyy13D_2BOZNZg3fUbeyJBST0Pk6TweCZvGv0BVDhu9FrirI9cnFS_I-Ob8vhrx_VhC3GglqPk13En254_PuIoEuBgTnxRHxNyIqWSiBUQNuEjqDl2CxO1dpjczKbj6YBzbPqFIV8FkJUz6HS2SMhJOgoDhrhduOFwzqqQQ_yUhfPkP2WYodgDXkyUWdgYKuCgCA3hWrQm1YJf-WoN0l_OVvetTSIlbxiNr-Br7PCPBLOpyiGTu4O3LjFHu0cWJQ",
+ "p": "6AMK_ANmxrnqgQ77Mf6A1BDopCqQWIBBZ4m_Ia4Ia3ygWpKLdjp5NNM1DL5Lnuing7wSNZvj0iyc-Ra_ilYmLeyKROkyPvwoLohk8W6AVPKotvVOZZwK5nHMIN3McSSgileai0FxxZtFG2W-ZLy4ggKQkfsGDnDQ0vWVpcSQ24M",
+ "q": "4Hn69Uev6x7nlsAV9fR6GvpjUZDD6Np_VY85BtWEw_6VxbutsMJnI0hYqCPMcmSHfdchzEiMLCUaMIRXMvigNdNxTWF1BSL3L3c7A-uZuv0iJ7X3trNmxEeuJ0EBmcqXcukJuYxW-Lb7XzernSGYOGtambMrf1oMM2ER90egyN8",
+ "dp": "WnKdPKPi1EQ0TH3XpaTO-l1hJGbHgQj29nM3xNyAwc6DAOwyXDPtfo98Fey1tEyEyZFvE-EjDpN_2odownhVR__342d5xB4vV_yqRYjLlNJIvZKiLnCHu1DPwFxXUCB0SZpfUDyCKwQeC9E9SS5dS6nOTGqs8MJAVo2Q-l_IDRs",
+ "dq": "vM2cCMW87xNVUnRJhE-WjC5hbu9F-Aoe44XNPzRDsN3mdyN92ZgJS6HD_9fsU6K-W1eg88NpMpAaUQhel16K0fr_50e7NxDLuz6bgpac_KuAGMpyiVanbxujHR0ODZ5ad6oOJeQmGpc9Ij8ettDUyU9yKqiKQ1knvec9RzEVyR0",
+ "qi": "Xamq4vSnrd6jez7YaYdCU6THSykIMrmyHcXjTMrf4WpeAXxH_Wu3F-jPIFy9zTxkZByMwmCqaBqQ_IJmFuqLBvcjpZ_NQmn-wZA4eYuPDnm2ZBhqbzS9b1jhWcAMYeIm0F744vJqqcymqEQnnHYlDyM39_cfrXtmf9gazwglRPA",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "8zan03XlrmI",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS384": {
+ "privateJwk": {
+ "kid": "2N9QAEg-94s",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw",
+ "e": "AQAB",
+ "d": "akN_oCk2AuS1weLsvYuvCe0rk3re88W4fMRY8iadpWDZdftxTql6_s6-0yWsxvgTxwu2rsYANIioRuC-Lw4m90cSa4Ho2ovbkvby2zwvOuvHETLb6JYnh8wan1VBa3XFwYf4grKaTDtslDzxvmQPzxEeK7YRFL8ql3147qXEZNhka8uIo4n-CdbMG0IazaUJp4oTjt9vId_8PDNqc70qGpCE46bh4Ee76GgF6DfWhnHn2rW5uSatjgQbvA7xJ957GVNlA4k-MC3U-S5DOi_cK6YytVdtNIkBY2EaRhtZQQSw0lRvFXxwenaXZsGAbdS9wOhkFfJYiokkxtbdlAkMgQ",
+ "p": "4-vsibMRfgglnalDkJpUxEJ1Xj4CNzAUr8FZobhqLdhKn1VPNHWIXudmsBuHT6foRLMTTS7R2kzcPWs_c5y8XeaLbETJKSgWtWDjTuBH0J7gg8_th75EInPfhzA79HKfH145DOfpIwMYAxtsDHNvGUjyBwb0Jz6r-at3oSwQncM",
+ "q": "zSkGydk2AqlUztzU7c2y2KEV8XKuHD8pxloNQEQf42Q9WS7dyYDjKFAfh75QkwHTHxLzzHR4IF83TlYoSslJ7ODiFVa9c_uYScsS9EpOlEtRgiADtlaAkg5o6iCGRPKEKVh9bWZKDcOIe1P-1E_7nw42WcaiHkWhHoV4FWTCVcE",
+ "dp": "txxX0NkYeJS7A8t1CLu01mg-OxS-WvA57mn8RL0QMPzQFupG0_KJORXXniy_rPNM28SzARNYbXXKi12agJuvihEqejVZF8OpWtcYR8pQZ_78iWmHf8MQok1NjCLoSB--T0k3tHKtDv_xTq29RNOIslu0dojTpqPnLpLfbZElWFk",
+ "dq": "d5IVtsa1x89Q8k-aeg6M0dzwoQwplaTqgAQz_OS3gRwG9VdvQ-WufuxTtBWjeEpz9YRiOyMWcCeOYEWurgeq4jgfDDjFqjdUho2oumAkdCGBm8l04GyB-p4TX4EdQEnn5QEB-STIvETd4qMNvkfvasApxSETk3kZcmRvnGhhKwE",
+ "qi": "U38wGRTDA1-NrZFFX1ipttBYz-IFo9VbniwkH0IzQh_yUOKy4iGVvcxcaQyG4X0gaVWrAVi2gUrwZa0a_BCZyX8SNYh7M8EL-9MwL0qmsEwnD6Jq0tvfxFPBll7NyZM5iTLj9I0gWOt1bdcd_WAM3Bm8xOjU8X8L_mpQ4x7WTWo",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "5ooqXseJdoQ",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS512": {
+ "privateJwk": {
+ "kid": "b3Miw_cVIr0",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw",
+ "e": "AQAB",
+ "d": "vRW0fWK9Uwe-D7JzZA0NccT8MHk8rikwzskGSe19lth314WkjNkm4Uyu6NjP57uB1dhsJwQf7mCP5bf6548gsp_BBSrKX8ee92YAjxBqvwkxGB8xaZ4C0TMMURwWBgpPjLPLCFNiprjNmGMtATXJ5WyCHDcQFxE813fpY9n477xuCieCuXbZOH0NRwviXncs_TriRFErDj3DFNUxhEnlUJBgIwiAaFNIXTOmLUVDgDX7DBL0XlHEJZ-WfIixHOwGX5WTFlDlPpqE1qXyTLc0yNaS-5P3r4q1ZgDJkEtc5M6cv6uYQmtu0lQmnR22HfuutGIhTBKiHNezpBwQYsPwQQ",
+ "p": "-R8uHmGlVW5RsOZsWU5dcWIrDgLnwNS4pFVScEwEurQR3JyFt90TZzps8tvpBvqJ3WwgTV38TVlxt31FHQzogJUTvoCmu9kvcHo7cDPKgrbwUdeLuwCQJat-ae2Ay1PHdsGo6l0k32nAwSclurJwHOPesEnYKmVz7GrEcQeakks",
+ "q": "5SS8OQOsADYKG7upakUXPMzWZVlODOF_vqDaCf1cTTg3Sz84bJsOcyuCy3y1lFepkD3jL7lRXqGFeDVyp8fSQ6O6j9GV2K7FsdTQts7S6zLyG4MmfIaTX97f28gGaMA0Vfp4XghkpJrPZp3vAVXi4vHQfcEqLOv3BfWbtT8s3yE",
+ "dp": "v4tf1HBTxUobeZ7R9CCy7DkEzbMiKjvk9EW-KyXoBP3rNesLTYGoJ5jeqCS6GWmNkzhN5e67zWVWcDTbbSi9pA_7rGAS0yB8v0jcZrsLnFG4mdTXVSNrsesYOa4pdyylkwP4MqsHbNhNIrZM5i3I0g3K7VT55i83YLH-9MFZ8d0",
+ "dq": "sr_5ZLCMmI2PTRsTiabj_bX8-Yq07C9sq5RnAqv2OPbFi5mBtpcuqoEiwwJB07qet7rPYwc5hoyRxbhL_L5QNBuhCVgBgMq1xYeyWSj2OCvB2dxxRWrlxD_keVqMRWLKcNe21gPOHun1KKPDMlOBbnAcqDzrXaelR6zVDop9woE",
+ "qi": "cl2oEYi-L2OYO5oyXJK9Kc-Oj2098Tx4o2WbfIZXQeOO48SMz7iRa03FOmh-b0G8WrtGxm7pVWIbryvBVlaLJYEhughgR1vtiSd_nJ5XCxDAF9p8h3hEQrnr8rmO0HTNE3z9PqBmVOCKvgbzOOa9S7YL3LgMMdCrs-CZLNJixio",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "tfz-MRyl3GQ",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ },
+ "encryption": {}
+ },
+ "userinfo": {
+ "encryption": {}
+ },
+ "register": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "xaDu9yTDJwA",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ",
+ "e": "AQAB",
+ "d": "MMLZvi0yn8NLNfHdSnwfgNLtNrAu0wg30CU0mAPlpVhOr4sfeQXhSnDfyf2inFROT85YrcpoFukgPKfGi6sT0uuUfyXOhllWwEYkqS2H79uk1QPdr2i0JLyQb4AmfEEj2jKtv-3drr-H05RL1SZww52lh8klOZAlu4Gah26PuDs5Oy4VcgdiiNFIaBAd1WzCmDxW7xd-tMc709s76eWXCa1F4ZJJny3uGCtJGVBUnfrao6d_RJNw4BX7pje5hYcwSFnZN3AiMmzzje4CP6JU7lSpMImwqOtKhIHbFEGSTfnCb4bPbwpQc0IBYaUlTrWCsXDQgYkNdsLaFiVdsvGWgQ",
+ "p": "7ynGMOB3sQXZ7OoW051wDUdsByiwx1_j7ecpLZ1rSTZ7-TCERMXQq0okQHkVpx6AlU8tOromhMxd_yGFEPOIHC7ZEm4o-f0-DzkDO6RPCCvhli0IaxhaGHHh0r4jAhQf7IlaTkdWt_x1wLxUTgIeS3FUiR_I3SvgeX0oBnTCPuE",
+ "q": "4KRx-LfdeI_Po7scXMqwbYobUgUdHIwGMKhrnerG_Kfv6b8K7PWNjfrjPYS9MR4OM1_9fs3I9xvr-Dc9oBNFU4AYn5bgTdxiPxLqwPemkKD-R4PswCEFn6bNqec7rDx_a0139SUjGTpLmHJEBk6GxESxc4cmy7B3uH0hpLnEAgU",
+ "dp": "GerO_XD1x4s4yIG9o4UGJYo93LC-J3zuuFM6lSTgAXkUCjcFvmYpbMaGEy6L-CZIDOYdoqWVkwKKlSFOyD173IH_KA4kBqM43HFzNj1iCyKmOZ37sY9cBBYjQLE2Hf2MUBe6X40_ioSjRhWilSmJmudXH9z_6Wfd1YyIj9qLSkE",
+ "dq": "V7R8duG6Sx7Cr6cW7LeJ6Ep6Xix28DVPGWI4GgCWzf_3MCiRaHB6YstoOxV_FBUq8C3y97X6V1gEafWPTtcXQwGJG425Z0y64utM0igeVOs2O8-q-FwsKOfj9gi8iINaMBef1Qs5x9i1uQArxNaV0T0MlxFWOUJdi573KqwIdc0",
+ "qi": "4WRsDyw9pg2iIva4THIhvg0eda_5wu-gorBCQRh5cxtJ4DwMV4GfTL-PUP6u8HRhR8Ns3XLbOk2pAfft9aPTCI9wr_ke1NUyupR1EzGOEekdfHtpgQP06hU7nhSMFbj9OMQvrw4_3k_5BXHQXsp7wqS7QtawQDWbS5BKc6O4nZA",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "FRI7f7sJKUg",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ }
+ },
+ "jwkSet": "{\"keys\":[{\"kid\":\"QMa5xaKOYwI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"66gqKTPVHyA\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"zPdTDVkjms4\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"8zan03XlrmI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"5ooqXseJdoQ\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"tfz-MRyl3GQ\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"FRI7f7sJKUg\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}"
+ }
+}
\ No newline at end of file
diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt
new file mode 100644
index 000000000..3dd4d7a1a
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt
@@ -0,0 +1 @@
+protected contents for alice
diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl
new file mode 100644
index 000000000..337ba077a
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl
@@ -0,0 +1,12 @@
+<#Alice>
+ a ;
+
+ <./private-for-alice.txt>;
+
+ # Alice web id
+ ;
+
+
+ ,
+ ,
+ .
diff --git a/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl b/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl
new file mode 100644
index 000000000..a014d960e
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl
@@ -0,0 +1,4 @@
+@prefix acl: .
+
+<#me> acl:trustedApp [ acl:origin ;
+ acl:mode acl:Read, acl:Write, acl:Append, acl:Control].
diff --git a/test/resources/accounts-strict-origin-off/bob/.acl-override b/test/resources/accounts-strict-origin-off/bob/.acl-override
new file mode 100644
index 000000000..13df41ce6
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/bob/.acl-override
@@ -0,0 +1,5 @@
+<#Owner>
+ a ;
+ <./>;
+ ;
+ , , .
diff --git a/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json
new file mode 100644
index 000000000..d77cc8409
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json
@@ -0,0 +1,411 @@
+{
+ "issuer": "https://localhost:7011",
+ "authorization_endpoint": "https://localhost:7011/authorize",
+ "token_endpoint": "https://localhost:7011/token",
+ "userinfo_endpoint": "https://localhost:7011/userinfo",
+ "jwks_uri": "https://localhost:7011/jwks",
+ "registration_endpoint": "https://localhost:7011/register",
+ "response_types_supported": [
+ "code",
+ "code token",
+ "code id_token",
+ "id_token",
+ "id_token token",
+ "code id_token token",
+ "none"
+ ],
+ "response_modes_supported": [
+ "query",
+ "fragment"
+ ],
+ "grant_types_supported": [
+ "authorization_code",
+ "implicit",
+ "refresh_token",
+ "client_credentials"
+ ],
+ "subject_types_supported": [
+ "public"
+ ],
+ "id_token_signing_alg_values_supported": [
+ "RS256",
+ "RS384",
+ "RS512",
+ "none"
+ ],
+ "token_endpoint_auth_methods_supported": [
+ "client_secret_basic"
+ ],
+ "token_endpoint_auth_signing_alg_values_supported": [
+ "RS256"
+ ],
+ "display_values_supported": [],
+ "claim_types_supported": [
+ "normal"
+ ],
+ "claims_supported": [],
+ "claims_parameter_supported": false,
+ "request_parameter_supported": true,
+ "request_uri_parameter_supported": false,
+ "require_request_uri_registration": false,
+ "check_session_iframe": "https://localhost:7011/session",
+ "end_session_endpoint": "https://localhost:7011/logout",
+ "keys": {
+ "descriptor": {
+ "id_token": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ },
+ "RS384": {
+ "alg": "RS384",
+ "modulusLength": 2048
+ },
+ "RS512": {
+ "alg": "RS512",
+ "modulusLength": 2048
+ }
+ },
+ "encryption": {}
+ },
+ "token": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ },
+ "RS384": {
+ "alg": "RS384",
+ "modulusLength": 2048
+ },
+ "RS512": {
+ "alg": "RS512",
+ "modulusLength": 2048
+ }
+ },
+ "encryption": {}
+ },
+ "userinfo": {
+ "encryption": {}
+ },
+ "register": {
+ "signing": {
+ "RS256": {
+ "alg": "RS256",
+ "modulusLength": 2048
+ }
+ }
+ }
+ },
+ "jwks": {
+ "keys": [
+ {
+ "kid": "QXv-I1cn_YU",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "TxrWAv0g4Yk",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "-tvrpKoUfPU",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "DA4MU9NJoDo",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "re686ijoKyE",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "jGE5qoPDlnI",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ },
+ {
+ "kid": "PhN1R2mze2k",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ ]
+ },
+ "id_token": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "jYjEMK74CQI",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q",
+ "e": "AQAB",
+ "d": "EDX50WWZekFsz9n3AuMYt96KB06hbcyGoDbSf3xyxvX-mncQTywSQ_74ZHhACWz5PmaTLskjiLWOmWhcbNtzHmhFb5GoKGp7hcChQzGheSETIN8mRgDOCvTDQ5MqGnRMnTRHOSoYvFQWTrnz_O69ApX8WttujpDhxp9KIgsQetHqnBohh2MWuDZ3aauxR9jdeeoZUGzRpqOgQxqXRNP7V0mHC6KrsClfbeq1jipMEW2EShopmWZdn_k7cnrKL2Aoo_Lox3XQhTnAcNiBj-l9kzls629lCoCarPQCZZaaV64NumhRqORUZ7QlG7csQrRHuxzT54ljbERRGiZfNlZ1UQ",
+ "p": "5C2Emcxi3hQ4wJOr7Vqr4nvaE0MY1TsBpfomG7h-59VDYFb11zcV4HIG1hfUd6LTwaYqMGmtS1_WFt9S-wuKZyJ1F64p76ywBOgXi6IArsV2uxG24HHO-mPoefeQU8eQtbbPkyJXZcCZJuNFlwPEP9y_NsV0ExDgVZr82U6qcpc",
+ "q": "x9uYjcsbRF6c2d3Ogb6Jcc3pfm0bocelg1tKfV87urYOFJuT-0ZYN-wPgj9l-IH1sobwhraTTCir0tkrBr77pUTQHO30B3eOScPUDl5p9NMIFpg1agl6tPp7z4jM7rPrnsFh0UjuGt5jHQGpDPQCNDpE5_DukuxCUxm04giNqIs",
+ "dp": "jRO3kH_WAQjvreGfwzj0XSvGQXKSwAOjmUN4nFsN27j313DsvwvH8uWNZIGHVBDQbEKYgyZThu7SJ4IchCs2f13Gl8WPGCjlC6OUKzkWwvhD2JWzREIZfqaW7hIqoiIZTsCgxo_NCZRzHKAYPq6NgA60CuE6Sy98BHG3M4R3zjE",
+ "dq": "OK6MLrLK8fIPdC7XMa7zVkZ7EXMqYhC4XW_XyYTn8MVPawLQznQd8wZNQ7htWDSrlU12DA7d6byjNrKG5Gvn_PBuQbYu_qsmvL8Adm7KiDgN1DKo-4Div09HLA31aUG38peQAYY4mYA3BfQBmP3fXiakgk-vqhW9ncntpimc248",
+ "qi": "raxY35RjgNgbTeIbBzD3Jm0Xz9oCW_HMf8sA3ruvx3erRqhVTeWEn3IpVwYGs_mjxO1IPGzBpGHSTTwObTiDU2Bgv8msniQHcMuld-fye50Rq1K4GBnCsv5frYM2Bw5Z3V5cTsda2zG_QczqV84gu6-vezRcLZyoWFMRXkng6hg",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "QXv-I1cn_YU",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS384": {
+ "privateJwk": {
+ "kid": "JXnna97ZRPY",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ",
+ "e": "AQAB",
+ "d": "l-OKObOifAIv2A17BC6v5qH-IE9BGxmR6DfoUKsOLdp8Yz_XWBqIPbXdJCe2egG7ycca5RkLM3kO0TeKieJVeCpfG_lqfrhzo6ijs2PUUCgvRb_ndkXZqx-P6yHrqmwiIAecaWtRy5GGZSDWdUiyjYghlrgxsjSe4tkbWdO6ll1aNvByRPiN50iy_oIWpW2hR9zt3gJmgrhJKpimZUi4HErZtS9xoUkp-9lP4cAgTs4YqhfGI6ID1dBVsvua7ouFCZqz8ldB0Tqw2qqvwnpDe6REFLe7dSPv6yzOBrTPdyALyCl391T-teiWXLFRDpONYaoJm8ATIJ_ScEncGgqeAQ",
+ "p": "-oXU6Sz1EwDLGD7D0ct4SC0zIN7fvmpJSEyL_1NlewO0BfZoMr8-gum4yRttBKbqjzWvfecGWNqXSlhuoTiEfBav76vn9Ah9CTUbWXQhz7-kebT72SB2quzib-0NUzFlHB6kyepUOXZiwbhTuAbY5OF0QcudVwVLs_rJMUVugRE",
+ "q": "8xHJJ2-MRn_Jys6xnS_ujzvWvyUVksDYUwkzcyaXR9gQSx1r7N9FPiye-r6r-6Z7T9jSiwCDzmQeu9O4oBlmLdDb7PdYweo8K_sbIIS8gdxg3fkqX3VPPGtHcRZUM6OE1euAabfo_a_SDDXo9wU2w7POpVCjYJYUqRWhwS3DzkU",
+ "dp": "dtN1yme9kpbkvgo_PUpCMhHmV2f_PkURn05XdPKshq2Z_N4ETFWzo8qSECmHCxbU2LqBE7m5o_mCmwvY5XV2OZlVN9wU-AXysKRU5ZgU1YIz1FqIvlMMlkQnnykUEeqy56SNSwxviJXjf7kbVIVC6UUarH6UkYr8flCsj0c8g9E",
+ "dq": "OcX7csUfqU4MT4kLTFotMJw_cZVF6GivwiTIttDwWiIv1Tq8AUQcOCfw7ZZOWHT8kEDv4hwQOAkyCODM3DjNQYyICW3NCeI7xRRdIUCLca5I09m6SZAfcjPpeiadgtyV4SalkfslhM66dS6HHdd-acueDUr6WiWx6XJ7zOesx6U",
+ "qi": "vvHbpuUf7IvZqsHBXXKL75yA6pEOzm_klHRoafrku40DHbddXD68MSBzsifTMyEbzNNwj2N6YygWoF7OhXbl2rET2PQrDJUBrdvoaUKdg7MqUPHKASlRt_OUV81Tt5dR-UcIvZ8JnsjR_HTC5FZd5uXvxn8VLztUhKYm1UBbVtQ",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "TxrWAv0g4Yk",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS512": {
+ "privateJwk": {
+ "kid": "iArDjqR9QcE",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ",
+ "e": "AQAB",
+ "d": "Tuh8oOVvcBaRpI5Q_KT9BaSHb6QeV2ZmUm6ZBJA2IPdUkPI959hWMJ3kahIwRrk7poagFhQlLF7H--Qc-TMpDdsejX20-_BQpPMwmX-jDmFaHp58YJCim1x9Hkz9pr8uMED58vydu38u3ip9oVV0oveKOFnMCx0LRgizQ4t0SARyvQRUTcI1_MzVufsSLO_fI_eZFN4xyxEXp-oCajhBxyf7AsYfg1LLPsziZNXU8Ept40E6MrCWII7BmZ9wKsmgr9HpPwGFr55X8EEGPtXgwVRLQ1zyQvQ65mD0vuhRiNvSFZInTrSGouRIwDW-jXM4ThuISPhfnQYDA8HZNVrsQQ",
+ "p": "4pLFRcSFgT3IjTvKS112P7o84e5VY1mJnnMZh-oPTMTrY5-gdTfbhiYR0c7hLJllclsNPLie3kai53yh7jQbs-CTdv6ZxFzmPwv_NADwm5RMSF5EfVhu0USFyI4h85b4FWbBAh7dI4ajI-I8uS3XDqyy_ENZ6wFenMsRKDHZRik",
+ "q": "x1OGU2g3yID1bFk54RJvAha2cSTWy2T48IiNHva-req_RDraNDdKZOr1QDEnnAaYxP0oT80ETSbfpC5bmU56ZuRA-aZUwiugWqMU-w_A5Oe8NtEH1X05iE3sOPzjV8wtqomgRdRDmwLHmwygV5cWEOBnoiZ0lke8nI28iY_xdvU",
+ "dp": "YOzwv3vmsPdBSEn_rGX7JCAD05MlrC6tlL8geOhES08ic6fh-MNAgg7fKKYb5fxpTZZt_z_rlqMZJXZHv6NDBpxX-VvJZBtp1CbJsfGE_MlgKMVK_2RJY_SwVq-XDqHS1zTx9HpHl98NA1jRKVbW3Uw79XbKjKI1W1XzrQJGNKE",
+ "dq": "cVbEDY84EPGLG9XMfHdv2Z8ylDlfTX4XsyXiIJYrLFdL9K8GPiSmT6XuWFba7_QsT-6nSmEILhqJliCqAw1FulXVwF7c2R_XaVJL7soxY7eFJSJMsw8mdKPiSzE40EaQPOVO1gXxfyXgfAB89_E4IdaH9wKozn7x9478grfvlDU",
+ "qi": "o6vR6kC1LTU_6D81fEAf9tXSc-01yuvWxIHc_mRcbI-h-H7BRXBgZrj5X7j3ttPe8g3aG13FZ6y8GpNSrs4LgqNc2VGhxlV8FAV_gVnbgGkpnQaUVtecaHgz03mHOH5hBWOmqBCOLqS4De1KcrwZ1bmhinVu24FVY04Tq82Dc2k",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "-tvrpKoUfPU",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ },
+ "encryption": {}
+ },
+ "token": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "mBFgdSiTnAQ",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw",
+ "e": "AQAB",
+ "d": "A-MDetWc7gwVeWDXIyjFqS6SxZa82mU24maqBE-TVLSTkZPlpdSRJy7XnJ4wzY9efSwcspOLYBkSAsTUXgaGRhm6CDHvn0LVkPPhN5mOG32Lz1srEe07jt4re0W0Sd4ah71cU9zgb-KGS6QIEw_jOBidVX8bSO6k-bbySYiP7MB8I5HM0P_bpD8Xin7pOj6QCrU3BksG0Ql_dHz1B0npvpBzK-UAwkFlBoryL59BQeN65A5f0MjSlBhsVFoXVt-2GMy-SbyY8WJI90YCY6F66LfO9RuaEVkOfL9Efux_UwB03LPKQW4gnmjx8MLMfIz_eGYplVo1Gr2R-5qeufySwQ",
+ "p": "9lyv_3EC0ihvXZ7Rmv2wXrqmlzb1qGKmx4MGk03IkGijGXdVyCIZke9O5gkGHnrxlFsl8VUy08u-FfW8fe7lpiFhp32QnImOEjRAb1gih_fRN16MWOUFDq14jcuVqS1A3Ce_wsai7QlwdAXx6J2HYvqdFqT1JvCji1N1Z-oefGE",
+ "q": "xRcsLk-icb1q7xXOhWaSIdUBQ5sxwwC8Y9n5PfSaYuoR4YNxSTp0-WzDQ_h9OigfKJBL6Nzd0_scIys4FKZ3EkxXXMM0ksi3oks2sP8Nws0wRWPRxvQSIWSxD28OH3cpJPc-u-d0p7YagBzlb1PkeZ7CcklO9XQeMGbW401byI8",
+ "dp": "BCZrkJIGyiOEPL-AKGw9nFrok4OJf9ypkpLSeYjF6CjbFoK8HzLz21F8ssNUJw9LIoSmjvowcQDtotEQ684qcDH_wyKKXRi0G_plW3rQmhnCnHwrQRQakbS6YykazE7G2O6SfGV8OSH_kvTGrnR442H1Y3xD5PQIzUAKqkV3XgE",
+ "dq": "jqMUoHeVswdJCrsXecgf3khP3-PDgcNYlFM-ZK5PxWJtim4cYMjju1gRgXGm_53l3u9_YInoKPBFDtbKgXdwGVgSqdnEhK6q59PTQwlzphXl53I0ce5V6MD8u5S9_du5dT1Ss57w-Cd8ylcfXRCz-6kARMH1WQKujoz-3AYydNU",
+ "qi": "Dcb0uVC4XaXFMFV4ansHRGnp4y5zZNuK-5cQQftLfzKVgZw3AYELw6ZYgQfLWZ_tim9TtVDc62wNQJ4KEUTb0TvsScuRhQNigQABfGDx_cfkllGx6JnDmn1x7kpLKbglhZVw0IrBBL9OiklwF4r7LnXVKP-toerHCUgbJyiv6s0",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "DA4MU9NJoDo",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS384": {
+ "privateJwk": {
+ "kid": "DCo68-1L_bA",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ",
+ "e": "AQAB",
+ "d": "peGcfDa0GaZeaDze6J74tL6WobK5ORzx5iYfw6RLZ7mmD5vrHF_6wqy4M9c63xOZZpFP-yuJ4kJMTYwKHKofqy84Gb2ammbSU6GJ8ud5_b6rG-dLx08uw__KmsctqgDdahIMBUrYlbYMfxw3yEvFOPV3JtgBBB1tKqXOywdisWmQgk54eBwA_3Mmm-Flt_a2PiibDjivVUAWxbBPd8Ug9y2bPbDiAXoMP6pOAT317LUqBqw7dhie9_aQWKAgOo2dGjBUADnCb51-Nr8syTJRpczYc9ahYlYOlk3miv3aEhXjQ9a7QosRxvqAMPtjVK2OgB0cQ2j46rzbSrZoYcogzQ",
+ "p": "z-mDM_oSHM4dhR4LAGXgKRdCmTIzBnGBCQ5Szg0yRTxlXPCqF8NrIu7mhkVB61JiGAHqgD5Y9IxPJyWj9uW9qrY21kIwuIEcEi-mTdxp4VgAjP6vaG1XOaS_fdshBfqe43seTzqHJF523vGmkF8HfOAUqhbj9bsTlCCQBBquQiM",
+ "q": "zi-ToMifbZweWX_HXu0XRMgLZ1vHYWPjgWdddAJD5wCHx_K6lRROhvTCHycV6f9Qrd-0jnauMRNnHJWlCuU0AGQo9CI-mKAnj66LpvMtfyA5i7WK89-ll5EEWXV5NFdXJd9c7d9mmQAXFQssC3mfPcq7EvGjnAMg_eGSFlLF4fc",
+ "dp": "bmxQEa_0JLZXuVaOc0SoPEqtRV4C-Z4Y8S1ZTzR1CY6dKzJqtDpG0YPejVuFOi1ECgoieMAkUKWgeGMmZT_5bwxdrYf0BloUBZinE91HorYxfLDbinPgCq50Qay7KkjEUH8YRu4HzooZSik_1JeUC3-bmgaURfN434g31OYyvM8",
+ "dq": "BzueBybiiNrQKb2Uxdy1U0FdPQv4K49wfKqemaI2tZTMLpRyPSaQNqXBZYxedW3ya5cMY28AX1JZ7KPHPWGa-GSLFz1YSsxbduvdlEa1kt8ThbYhoLp4uZ9psqWvUcm6keaLAQE0PSvGo4NX0TM8BdPlyh1V6vQlJSLTmBrhPDM",
+ "qi": "L5c_XlyLw4tTUWdrM730pvhC2eGCdSwCc6XAwnUla6q3klxJV1eNcRZoejHAN_QXLS742gpA9A_PTMBfYuBN3-lNLOe-wB3bUDJtCzwGlTthiHChkuqB0KAdq4oj8X49ZMA7Fqlr2KaTFTBsItC-ScVSbss9W2DZv8-XzyNoMyc",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "re686ijoKyE",
+ "kty": "RSA",
+ "alg": "RS384",
+ "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ },
+ "RS512": {
+ "privateJwk": {
+ "kid": "0XGSMsImQPQ",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw",
+ "e": "AQAB",
+ "d": "fO-4TQtd5z5Wp1RScKUd8KXcLh1PVmdW6FUQriwgNZDtIZKeFicoAR3ucHbPr4Y80EUHyFwEHd3zInZdwDpO_XxiWjn5jgq7wJulYOgzUXbRrx8DVVRhjxEWPDVYp43ouf9kdwdizpUbrGZFA60-T8FXFvPL3z8AnJy9eoog-wz-otG58fosrd2Zdpo3O5PlnN2HzueP7G2vabmiZcwR7WEhSaBcI-HcFCXSdZcnAeVzv2DMOoNLNNQXOQ-DtAF_-7lrZa2LKbJccPMEYybwXJlGpRB0JTMYtiLWeZY0EWkWiG2p-lBFsDisEH29JS6yBsG30WWLR55e2XwCqBp1gQ",
+ "p": "_xiXor89SL9DcybJIEcg_a9nlmnS0DPRfwlRL7fMDF_YKRCVN9x-DD6LlnDss8x9NnUB69dg17QYgLGHI1DbfpV30eOP95zswUfhoyRRgGyxCVbyfB_xwnLTsyCNE3Koi33KjNSMNmDdGKIGBKGzs7Lnbms93Ylr-m9nPizBffc",
+ "q": "-k3CSpMNknvsVgDxcyl9-U6P2Gm3COcL2NeRzCNR4sG-ffw9xJ_NGIqps9Oddx3Vu5tlEHYiDG3cy-4yOkzxWhphS8E_u8Q1wmBUBaepDjOthoXUcGaSr7-CY7d_FH_ou54WS6rN7diNJODdWATgOSlbPFNhc-he3M8U_bwI0fE",
+ "dp": "M9zAF2ph_0RDZkngYhuT7X-Xw9DH92RRl05Bnz3y0iE6RT8F11GQntSodHGI7hUI7-Vh-pzTJ4eJ48A0BU4PEfE5Zwao4mKZD8KZcR2VJFL0uz1eFzY3ZJ0LxUM861NISPPOFkuwJe4ThUqLhq2JZ2NcAerzrPKfbU7w4oce34k",
+ "dq": "mc9OpSTYIjukbvUFag8FKj3shr_vibjwvr85CIhruTv1ItXt3vWTwpDy114iVSAwRqim4ga1xY19MJOeqdS-OvAa-cI2t9tKbbdj6lWsvN1ktFVoxelCGl1EcqI_pQk0qpXqfXToNk_r682CNqRIZNfVCKz0JZWVNXrLG2CAywE",
+ "qi": "upS-Z2wbbZ_Mla0QpAlORgIr3QLBTK5W0hkhRahoAqm2aGzq269FGSIBnJNxxVkFXL4koHu7diwVCdBHOn3RtnoFYRV1V0sO52Q0B8KI0M8iHM4mVYbk80TsSYBU4lYJqy7U7OnZj1pfnrV4Ky2AAvhTjp2ZbpJCqEPRGJqQlP8",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "jGE5qoPDlnI",
+ "kty": "RSA",
+ "alg": "RS512",
+ "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ },
+ "encryption": {}
+ },
+ "userinfo": {
+ "encryption": {}
+ },
+ "register": {
+ "signing": {
+ "RS256": {
+ "privateJwk": {
+ "kid": "RiiZpS0yli8",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw",
+ "e": "AQAB",
+ "d": "AlSEM6lJgtd0Qh7XFBBOAeSh7cmhNcnhJWJaxQP9nFkDv70KpnD5GKgdxQ9kgr1oyOST1ENbTE2EePl6YHxl7CrBVsW-FQfW6FJqpHATOarglqRoMC0m55VWm-CB4nArbopl5XP_uzT9nmuoyqBfsqxmyhH_LrmonuxntusczzzmFY-0vmdE8JHQcnixa70dLd9GO4Bs6vr1SfO5bb8FFEFNm00iTKZqOnqDLx0abgzcqYA_wDBxznFg3RtwdOrVOzKsIUgAaO9C6s5XzGS3ddmggEkPGTm0kQQ9xHJkYOxMNZPNRloqMqVpy1O4JbleCMzPg_-DQ8MJzAWXy5MgkQ",
+ "p": "_-nK2E0JvckScJUcFH9eN0pJUymgAWMH2_MjE_qJb_lT4jXHLcIfzafqu1QxH2ZbHH1V-Pu2HBwk2YMpS-MQheSSrSNXo4s8Kf4nswspClVVpZnMh8pWWLiHDbib7wMhj8cUlKYTM91J6sAooicGh_8UJtFoSlyTn0sLRSG1iUU",
+ "q": "yHm3dqNtMfujFwNF9yz5Tb8cDgcDQBxox-y6QGWwogmWP2QOfX76QaBYg32Ve6WUwttixu6KK127BkvGeCReC_QaFILLwPZzI7ybQStRzKNiQg-9oki5lw7iQz66O8U1rQ8jHwSy6mC-Ka3CP1v2j3sZMwmzoWSGBuEwZHfvGNs",
+ "dp": "MeJ55vYFaxhR3t5CDgDR9ccmSe64QOzz8D0R3mgc-FXKszK2c8X-exE7YW7E8JD8O6523sT6N7qIuFmn6CIH64Gl0dgs0jVm8eyYAn-vbVM7Eb_MLcAUWtEFings9UdP-H3fFibVYWvGZ9szUIB49nOTkwmI4c3v_MIdHUm34F0",
+ "dq": "lRjZFpYC7yqMJ-BaV7OOEoFwtwoGI9c9IntwJda7YDerE6gxkqouK0K6schjtVr3YVhShUsBXbFPGCahC9dYTqGUB-8i5HcmOMzb1sMGCiD1QdZ9HcXiqXL7WjG7xhosinH4l-ghvGiI5WyCTCb0H8_YdPnhK8YcW9984yvDmgM",
+ "qi": "UUZvIyomeQkGmtQH41T3vZV_HZSzcZEmdFYPgmjiZMXkOrB3wM1FkqOnoDF51yD8dCuTLSL-Pcq6523NTKtvRLYkum0aZFGMyfPHnK6nGbdsKxjGtHgUuccOUX9XL-WoEsn0F2UGc39JNFQNcScoaIAtgGJ5A5rjfpfvIK7c-Vo",
+ "key_ops": [
+ "sign"
+ ],
+ "ext": true
+ },
+ "publicJwk": {
+ "kid": "PhN1R2mze2k",
+ "kty": "RSA",
+ "alg": "RS256",
+ "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw",
+ "e": "AQAB",
+ "key_ops": [
+ "verify"
+ ],
+ "ext": true
+ }
+ }
+ }
+ },
+ "jwkSet": "{\"keys\":[{\"kid\":\"QXv-I1cn_YU\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"TxrWAv0g4Yk\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"-tvrpKoUfPU\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"DA4MU9NJoDo\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"re686ijoKyE\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"jGE5qoPDlnI\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"PhN1R2mze2k\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}"
+ }
+}
\ No newline at end of file
diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt
new file mode 100644
index 000000000..304c0b4f3
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt
@@ -0,0 +1 @@
+protected contents
diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl
new file mode 100644
index 000000000..acdaa2eac
--- /dev/null
+++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl
@@ -0,0 +1,15 @@
+<#Alice>
+ a ;
+
+ <./shared-with-alice.txt>;
+
+ # Alice web id
+ ;
+
+ # Bob web id
+ ;
+
+
+ ,
+ ,
+ .
diff --git a/test/unit/resource-mapper-test.js b/test/unit/resource-mapper-test.js
index 0fc912c5b..bc669fdc7 100644
--- a/test/unit/resource-mapper-test.js
+++ b/test/unit/resource-mapper-test.js
@@ -237,7 +237,7 @@ describe('ResourceMapper', () => {
contentType: 'text/n3'
})
- itMapsUrl(mapper, 'a URL ending with a slash to an index file when index.html is available',
+ itMapsUrl(mapper, 'a URL ending with a slash when index.html is available',
{
url: 'http://localhost/space/'
},
@@ -250,7 +250,19 @@ describe('ResourceMapper', () => {
contentType: 'text/html'
})
- itMapsUrl(mapper, 'a URL ending with a slash to an index file when index$.html is available',
+ itMapsUrl(mapper, 'a URL ending with a slash when index.ttl is available',
+ {
+ url: 'http://localhost/space/'
+ },
+ [
+ `${rootPath}space/index.ttl`
+ ],
+ {
+ path: `${rootPath}space/`,
+ contentType: 'application/octet-stream'
+ })
+
+ itMapsUrl(mapper, 'a URL ending with a slash when index$.html is available',
{
url: 'http://localhost/space/'
},
@@ -259,8 +271,20 @@ describe('ResourceMapper', () => {
`${rootPath}space/index$.ttl`
],
{
- path: `${rootPath}space/index$.html`,
- contentType: 'text/html'
+ path: `${rootPath}space/`,
+ contentType: 'application/octet-stream'
+ })
+
+ itMapsUrl(mapper, 'a URL ending with a slash when index$.ttl is available',
+ {
+ url: 'http://localhost/space/'
+ },
+ [
+ `${rootPath}space/index$.ttl`
+ ],
+ {
+ path: `${rootPath}space/`,
+ contentType: 'application/octet-stream'
})
itMapsUrl(mapper, 'a URL ending with a slash to a folder when index.html is available but index is skipped',
@@ -286,12 +310,38 @@ describe('ResourceMapper', () => {
contentType: 'application/octet-stream'
})
- itMapsUrl(mapper, 'a URL ending with a slash to an index file for text/html when index.html not is available',
+ itMapsUrl(mapper, 'a URL of that has an accompanying acl file, but no actual file',
+ {
+ url: 'http://localhost/space/'
+ },
+ [
+ `${rootPath}space/index.acl`
+ ],
+ {
+ path: `${rootPath}space/`,
+ contentType: 'application/octet-stream'
+ })
+
+ itMapsUrl(mapper, 'a URL ending with a slash for text/html when index.html is not available',
+ {
+ url: 'http://localhost/space/',
+ contentType: 'text/html',
+ createIfNotExists: true
+ },
+ {
+ path: `${rootPath}space/index.html`,
+ contentType: 'text/html'
+ })
+
+ itMapsUrl(mapper, 'a URL of that has an accompanying meta file, but no actual file',
{
url: 'http://localhost/space/',
contentType: 'text/html',
createIfNotExists: true
},
+ [
+ `${rootPath}space/index.meta`
+ ],
{
path: `${rootPath}space/index.html`,
contentType: 'text/html'
@@ -309,16 +359,13 @@ describe('ResourceMapper', () => {
contentType: 'application/octet-stream'
})
- itMapsUrl(mapper, 'a URL ending with a slash to an index file for text/turtle when index.ttl not is available',
+ itMapsUrl(mapper, 'a URL ending with a slash for text/turtle',
{
url: 'http://localhost/space/',
contentType: 'text/turtle',
createIfNotExists: true
},
- {
- path: `${rootPath}space/index.ttl`,
- contentType: 'text/turtle'
- })
+ new Error('Index file needs to have text/html as content type'))
// Security cases
diff --git a/test/unit/solid-host-test.js b/test/unit/solid-host-test.js
index be7821bbc..fc2d77b6d 100644
--- a/test/unit/solid-host-test.js
+++ b/test/unit/solid-host-test.js
@@ -7,16 +7,24 @@ const defaults = require('../../config/defaults')
describe('SolidHost', () => {
describe('from()', () => {
- it('should init with port, serverUri and hostname', () => {
+ it('should init with provided params', () => {
let config = {
port: 3000,
- serverUri: 'https://localhost:3000'
+ serverUri: 'https://localhost:3000',
+ live: true,
+ root: '/data/solid/',
+ multiuser: true,
+ webid: true
}
let host = SolidHost.from(config)
expect(host.port).to.equal(3000)
expect(host.serverUri).to.equal('https://localhost:3000')
expect(host.hostname).to.equal('localhost')
+ expect(host.live).to.be.true
+ expect(host.root).to.equal('/data/solid/')
+ expect(host.multiuser).to.be.true
+ expect(host.webid).to.be.true
})
it('should init to default port and serverUri values', () => {