@iobroker/db-objects-file 6.0.10-alpha.0-20240803-d90cc8849 → 6.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/cjs/lib/objects/objectsInMemFileDB.js.map +1 -1
- package/build/cjs/lib/objects/objectsInMemServerClass.js.map +1 -1
- package/build/cjs/lib/objects/objectsInMemServerRedis.js.map +1 -1
- package/build/esm/lib/objects/objectsInMemFileDB.js +1 -1
- package/build/esm/lib/objects/objectsInMemServerClass.js +1 -1
- package/build/esm/lib/objects/objectsInMemServerRedis.js +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/objects/objectsInMemFileDB.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Object DB in memory - Server\n *\n * Copyright 2013-2023 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { InMemoryFileDB } from '@iobroker/db-base';\nimport { tools } from '@iobroker/db-base';\nimport { objectsUtils as utils } from '@iobroker/db-objects-redis';\nimport deepClone from 'deep-clone';\n\n/**\n * This class inherits InMemoryFileDB class and adds all relevant logic for objects\n * including the available methods for use by js-controller directly\n **/\nexport class ObjectsInMemoryFileDB extends InMemoryFileDB {\n constructor(settings) {\n settings = settings || {};\n settings.fileDB = settings.fileDB || {\n fileName: 'objects.json',\n backupDirName: 'backup-objects'\n };\n super(settings);\n\n if (!this.change) {\n this.change = id => {\n this.log.silly(`${this.namespace} objects change: ${id} ${JSON.stringify(this.change)}`);\n };\n }\n\n this.META_ID = '**META**';\n /** @type {Record<string, any>} */\n this.fileOptions = {};\n this.files = {};\n this.writeTimer = null;\n /** @type {string[]} */\n this.writeIds = [];\n this.preserveSettings = ['custom'];\n this.defaultNewAcl = this.settings.defaultNewAcl || null;\n this.namespace = this.settings.namespace || this.settings.hostname || '';\n this.writeFileInterval =\n this.settings.connection && typeof this.settings.connection.writeFileInterval === 'number'\n ? parseInt(this.settings.connection.writeFileInterval)\n : 5_000;\n if (!settings.jsonlDB) {\n this.log.silly(`${this.namespace} Objects DB uses file write interval of ${this.writeFileInterval} ms`);\n }\n\n this.objectsDir = path.join(this.dataDir, 'files');\n\n // cached meta information for file operations\n this.existingMetaObjects = {};\n\n // Handle some < js-controller 2.0 broken objects and correct them\n for (const obj of Object.values(this.dataset)) {\n if (tools.isObject(obj) && obj.acl && obj.acl.permissions && !obj.acl.object) {\n obj.acl.object = obj.acl.permissions;\n delete obj.acl.permissions;\n }\n }\n\n // init default new acl\n const configObj = this.dataset['system.config'];\n if (configObj && configObj.common && configObj.common.defaultNewAcl) {\n this.defaultNewAcl = deepClone(configObj.common.defaultNewAcl);\n }\n }\n\n // internal functionality\n _normalizeFilename(name) {\n return name ? name.replace(/[/\\\\]+/g, '/') : name;\n }\n\n // -------------- FILE FUNCTIONS -------------------------------------------\n // internal functionality\n _saveFileSettings(id, force) {\n if (typeof id === 'boolean') {\n force = id;\n id = undefined;\n }\n\n id !== undefined && !this.writeIds.includes(id) && this.writeIds.push(id);\n\n this.writeTimer && clearTimeout(this.writeTimer);\n\n // if store immediately\n if (force) {\n this.writeTimer = null;\n // Store dirs description\n for (const writeId of this.writeIds) {\n const location = path.join(this.objectsDir, writeId, '_data.json');\n try {\n if (fs.existsSync(path.join(this.objectsDir, writeId))) {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[writeId]));\n }\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n this.writeIds = [];\n } else {\n this.writeTimer = setTimeout(() => {\n // Store dirs description\n for (const writeId of this.writeIds) {\n const location = path.join(this.objectsDir, writeId, '_data.json');\n try {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[writeId]));\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n this.writeIds = [];\n }, 1_000);\n }\n }\n\n // internal functionality\n _loadFileSettings(id) {\n if (!this.fileOptions[id]) {\n const location = path.join(this.objectsDir, id, '_data.json');\n if (fs.existsSync(location)) {\n try {\n this.fileOptions[id] = fs.readJSONSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot parse ${location}: ${e.message}`);\n this.fileOptions[id] = {};\n }\n let corrected = false;\n Object.keys(this.fileOptions[id]).forEach(filename => {\n const normalized = this._normalizeFilename(filename);\n if (normalized !== filename) {\n const options = this.fileOptions[id][filename];\n delete this.fileOptions[id][filename];\n this.fileOptions[id][normalized] = options;\n corrected = true;\n }\n if (corrected) {\n try {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[id]));\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n });\n } else {\n this.fileOptions[id] = {};\n }\n }\n }\n\n // server only functionality\n syncFileDirectory(limitId) {\n const resNotifies = [];\n let resSynced = 0;\n\n function getAllFiles(dir) {\n let results = [];\n const list = fs.readdirSync(dir);\n list.forEach(file => {\n file = dir + '/' + file;\n const stat = fs.statSync(file);\n if (stat && stat.isDirectory()) {\n /* Recurse into a subdirectory */\n results = results.concat(getAllFiles(file));\n } else {\n /* Is a file */\n results.push(file);\n }\n });\n return results;\n }\n\n const res = this._getObjectView('system', 'meta', null);\n\n // collect meta ids to generate warning if non existing\n const metaIds = res.rows.map(obj => obj.id).filter(id => !limitId || limitId === id);\n\n if (!fs.existsSync(this.objectsDir)) {\n return {\n numberSuccess: resSynced,\n notifications: resNotifies\n };\n }\n const baseDirs = fs.readdirSync(this.objectsDir);\n baseDirs.forEach(dir => {\n let dirSynced = 0;\n if (dir === '..' || dir === '.') {\n return;\n }\n const dirPath = path.join(this.objectsDir, dir);\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n return;\n }\n if (limitId && dir !== limitId) {\n return;\n }\n if (!metaIds.includes(dir)) {\n resNotifies.push(\n `Ignoring Directory \"${dir}\" because officially not created as meta object. Please remove directory!`\n );\n return;\n }\n this._loadFileSettings(dir);\n const files = getAllFiles(dirPath);\n files.forEach(file => {\n const localFile = file.substr(dirPath.length + 1);\n if (localFile === '_data.json') {\n return;\n }\n if (!this.fileOptions[dir][localFile]) {\n const fileStat = fs.statSync(file);\n const ext = path.extname(localFile);\n const mime = utils.getMimeType(ext);\n const _mimeType = mime.mimeType;\n const isBinary = mime.isBinary;\n\n this.fileOptions[dir][localFile] = {\n createdAt: fileStat.ctimeMs,\n acl: {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file) ||\n utils.CONSTS.ACCESS_USER_RW |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ // 0x644\n },\n mimeType: _mimeType,\n binary: isBinary,\n modifiedAt: fileStat.mtimeMs\n };\n dirSynced++;\n }\n });\n this._saveFileSettings(dir);\n resSynced += dirSynced;\n dirSynced && resNotifies.push(`Added ${dirSynced} Files in Directory \"${dir}\"`);\n });\n return {\n numberSuccess: resSynced,\n notifications: resNotifies\n };\n }\n\n // needed by server\n _writeFile(id, name, data, options) {\n if (typeof options === 'string') {\n options = { mimeType: options };\n }\n if (options && options.acl) {\n options.acl = null;\n }\n\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n options = options || {};\n\n this._loadFileSettings(id);\n\n this.files[id] = this.files[id] || {};\n\n try {\n if (!fs.existsSync(this.objectsDir)) {\n fs.mkdirSync(this.objectsDir);\n }\n if (!fs.existsSync(path.join(this.objectsDir, id))) {\n fs.mkdirSync(path.join(this.objectsDir, id));\n }\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot create directories: ${path.join(this.objectsDir, id)}: ${e.message}`\n );\n this.log.error(\n `${this.namespace} Check the permissions! Or run installation fixer or \"iobroker fix\" command!`\n );\n throw e;\n }\n\n const ext = path.extname(name);\n const mime = utils.getMimeType(ext);\n const _mimeType = mime.mimeType;\n const isBinary = mime.isBinary;\n\n this.fileOptions[id][name] = this.fileOptions[id][name] || { createdAt: Date.now() };\n this.fileOptions[id][name].acl = this.fileOptions[id][name].acl || {\n owner: options.user || (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n options.group ||\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n options.mode ||\n (this.defaultNewAcl && this.defaultNewAcl.file) ||\n utils.CONSTS.ACCESS_USER_RW | utils.CONSTS.ACCESS_GROUP_READ | utils.CONSTS.ACCESS_EVERY_READ // 0x644\n };\n\n this.fileOptions[id][name].mimeType = options.mimeType || _mimeType;\n this.fileOptions[id][name].binary = isBinary;\n this.fileOptions[id][name].acl.ownerGroup =\n this.fileOptions[id][name].acl.ownerGroup ||\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP;\n this.fileOptions[id][name].modifiedAt = Date.now();\n\n try {\n // Create directories if complex structure\n fs.ensureDirSync(path.join(this.objectsDir, id, path.dirname(name)));\n // Store file\n fs.writeFileSync(path.join(this.objectsDir, id, name), data, {\n flag: 'w',\n encoding: isBinary ? 'binary' : 'utf8'\n });\n\n if (isBinary) {\n // Reload by read\n delete this.files[id][name];\n } else {\n this.files[id][name] = data;\n }\n\n // Store dir description\n this._saveFileSettings(id);\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot write files: ${path.join(this.objectsDir, id, name)}: ${e.message}`\n );\n throw e;\n }\n\n setImmediate(\n (name, size) => {\n // publish event in states\n this.log.silly(`${this.namespace} memory publish ${id} ${JSON.stringify({ name, file: true, size })}`);\n this.publishAll('files', `${id}$%$${name}`, size);\n },\n name,\n data.byteLength\n );\n }\n\n // needed by server\n _readFile(id, name, options) {\n if (options && options.acl) {\n options.acl = null;\n }\n\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n options = options || {};\n try {\n this._loadFileSettings(id);\n\n this.files[id] = this.files[id] || {};\n\n if (!this.files[id][name] || this.settings.connection.noFileCache || options.noFileCache) {\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n // Create description object if not exists\n this.fileOptions[id][name] = this.fileOptions[id][name] || {\n acl: {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n if (typeof this.fileOptions[id][name] !== 'object') {\n this.fileOptions[id][name] = {\n mimeType: this.fileOptions[id][name],\n acl: {\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n }\n\n this.files[id][name] = fs.readFileSync(location);\n if (this.fileOptions[id][name].binary === undefined) {\n const ext = path.extname(name);\n const mimeType = utils.getMimeType(ext);\n this.fileOptions[id][name].binary = mimeType.isBinary;\n this.fileOptions[id][name].mimeType = mimeType.mimeType;\n }\n\n if (!this.fileOptions[id][name].binary) {\n if (this.files[id][name]) {\n this.files[id][name] = this.files[id][name].toString();\n }\n }\n } else {\n if (this.fileOptions[id][name] !== undefined) {\n delete this.fileOptions[id][name];\n }\n if (this.files[id][name] !== undefined) {\n delete this.files[id][name];\n }\n }\n }\n\n if (this.fileOptions[id][name] && !this.fileOptions[id][name].acl) {\n // all files belong to admin by default, but everyone can edit it\n this.fileOptions[id][name].acl = {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) || utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL | utils.CONSTS.ACCESS_GROUP_ALL | utils.CONSTS.ACCESS_EVERY_RW // 776\n };\n }\n\n if (this.fileOptions[id][name] !== null && this.fileOptions[id][name] !== undefined) {\n if (!this.fileOptions[id][name].mimeType) {\n const _ext = path.extname(name);\n const _mimeType = utils.getMimeType(_ext);\n this.fileOptions[id][name].mimeType = _mimeType.mimeType;\n }\n return {\n fileContent: this.files[id][name],\n fileMime: this.fileOptions[id][name].mimeType\n };\n }\n } catch (e) {\n this.log.warn(`${this.namespace} Cannot read file ${id} / ${name}: ${e.message}`);\n throw e;\n }\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n /**\n * Check if given object exists\n *\n * @param {string} id id of the object\n * @param {object} [_options] optional user context\n * @return {boolean}\n */\n // needed by server\n _objectExists(id, _options) {\n if (!id || typeof id !== 'string') {\n throw new Error(`invalid id ${JSON.stringify(id)}`);\n }\n\n try {\n // check if the id exists\n return Object.prototype.hasOwnProperty.call(this.dataset, id);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot check object existence of \"${id}\": ${e.message}`);\n throw new Error(`Cannot check object existence of \"${id}\": ${e.message}`);\n }\n }\n\n /**\n * Check if given file exists\n *\n * @param {string} id id of the namespace\n * @param {string} [name] name of the file\n * @returns {boolean}\n */\n // needed by server\n _fileExists(id, name) {\n if (typeof name !== 'string') {\n name = '';\n }\n\n const location = path.join(this.objectsDir, id, name);\n\n try {\n const stat = fs.statSync(location);\n return stat.isFile();\n } catch (e) {\n if (e.code !== 'ENOENT') {\n this.log.error(`${this.namespace} Cannot check file existence of \"${location}\": ${e.message}`);\n throw new Error(`Cannot check file existence of \"${location}\": ${e.message}`);\n }\n return false;\n }\n }\n\n /**\n * Check if given directory exists\n *\n * @param {string} id id of the namespace\n * @param {string} [name] name of the directory\n * @returns {boolean}\n */\n // special functionality only for Server (used together with SyncFileDirectory)\n dirExists(id, name) {\n if (typeof name !== 'string') {\n name = '';\n }\n\n const location = path.join(this.objectsDir, id, name);\n\n try {\n const stat = fs.statSync(location);\n return stat.isDirectory();\n } catch (e) {\n if (e.code !== 'ENOENT') {\n this.log.error(`${this.namespace} Cannot check directory existence of \"${location}\": ${e.message}`);\n throw new Error(`Cannot check directory existence of \"${location}\": ${e.message}`);\n }\n return false;\n }\n }\n\n // needed by server\n _unlink(id, name) {\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n this._loadFileSettings(id);\n\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n const stat = fs.statSync(location);\n\n if (stat.isDirectory()) {\n // read all entries and delete every one\n fs.readdirSync(location).forEach(dir => this._unlink(id, name + '/' + dir));\n\n this.log.debug(`Delete directory ${path.join(id, name)}`);\n try {\n fs.removeSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot delete directory \"${path.join(id, name)}\": ${e.message}`);\n throw e;\n }\n\n if (this.fileOptions[id]) {\n delete this.fileOptions[id];\n }\n if (this.files[id] && this.files[id]) {\n delete this.files[id];\n }\n } else {\n this.log.debug('Delete file ' + path.join(id, name));\n try {\n fs.removeSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot delete file \"${path.join(id, name)}\": ${e.message}`);\n throw e;\n }\n\n if (this.fileOptions[id][name]) {\n delete this.fileOptions[id][name];\n }\n if (this.files[id] && this.files[id][name]) {\n delete this.files[id][name];\n }\n\n // Store dir description\n this._saveFileSettings(id, true);\n }\n\n setImmediate(\n (id, name) => {\n // publish event in states\n this.log.silly(\n `${this.namespace} memory publish ${id} ${JSON.stringify({ name, file: true, size: null })}`\n );\n this.publishAll('files', `${id}$%$${name}`, null);\n },\n id,\n name\n );\n }\n }\n\n // needed by server\n _readDir(id, name, options) {\n if (options && options.acl) {\n options.acl = null;\n }\n if ((id === '' || id === '/' || id === '*') && (name === '' || name === '*')) {\n // read root of xxx-data/files\n } else {\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n }\n\n options = options || {};\n // Find all files and directories starts with name\n const _files = [];\n\n if (id && id === '*') {\n id = '';\n }\n if (name && name[name.length - 1] !== '/') {\n name += '/';\n }\n\n this._loadFileSettings(id);\n\n const len = name ? name.length : 0;\n for (const f of Object.keys(this.fileOptions[id])) {\n if (!name || f.substring(0, len) === name) {\n /** @type {string|string[]} */\n let rest = f.substring(len);\n rest = rest.split('/', 2);\n if (rest[0] && _files.indexOf(rest[0]) === -1) {\n _files.push(rest[0]);\n }\n }\n }\n\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n const dirFiles = fs.readdirSync(location);\n for (let i = 0; i < dirFiles.length; i++) {\n if (dirFiles[i] === '..' || dirFiles[i] === '.') {\n continue;\n }\n if (dirFiles[i] !== '_data.json' && _files.indexOf(dirFiles[i]) === -1) {\n _files.push(dirFiles[i]);\n }\n }\n } else {\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n _files.sort();\n const res = [];\n for (const file of _files) {\n if (file === '..' || file === '.') {\n continue;\n }\n if (fs.existsSync(path.join(location, file))) {\n try {\n const stats = fs.statSync(path.join(location, file));\n const acl =\n this.fileOptions[id][name + file] && this.fileOptions[id][name + file].acl\n ? deepClone(this.fileOptions[id][name + file].acl) // copy settings\n : {\n read: true,\n write: true,\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) ||\n utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_RW |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ\n };\n\n // if filter for user\n if (options.filter && acl) {\n // If user may not write\n if (!options.acl.file.write) {\n // write\n acl.permissions &= ~(\n utils.CONSTS.ACCESS_USER_WRITE |\n utils.CONSTS.ACCESS_GROUP_WRITE |\n utils.CONSTS.ACCESS_EVERY_WRITE\n );\n }\n // If user may not read\n if (!options.acl.file.read) {\n // read\n acl.permissions &= ~(\n utils.CONSTS.ACCESS_USER_READ |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ\n );\n }\n\n if (\n options.user !== utils.CONSTS.SYSTEM_ADMIN_USER &&\n options.groups.includes(utils.CONSTS.SYSTEM_ADMIN_GROUP)\n ) {\n if (acl.owner !== options.user) {\n // Check if the user is in the group\n if (options.groups.includes(acl.ownerGroup)) {\n // Check group rights\n if (!(acl.permissions & utils.CONSTS.ACCESS_GROUP_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_GROUP_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_GROUP_WRITE);\n } else {\n // everybody\n if (!(acl.permissions & utils.CONSTS.ACCESS_EVERY_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_EVERY_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_EVERY_WRITE);\n }\n } else {\n // Check user rights\n if (!(acl.permissions & utils.CONSTS.ACCESS_USER_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_USER_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_USER_WRITE);\n }\n } else {\n acl.read = true;\n acl.write = true;\n }\n }\n\n res.push({\n file,\n stats: stats,\n isDir: stats.isDirectory(),\n acl: acl,\n modifiedAt: this.fileOptions[id][name + file]\n ? this.fileOptions[id][name + file].modifiedAt\n : undefined,\n createdAt: this.fileOptions[id][name + file]\n ? this.fileOptions[id][name + file].createdAt\n : undefined\n });\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot read permissions of ${path.join(this.objectsDir, id, name, file)}: ${\n e.message\n }`\n );\n }\n }\n }\n\n return res;\n }\n\n // needed by server\n _rename(id, oldName, newName) {\n const _path = utils.sanitizePath(id, oldName);\n id = _path.id;\n oldName = _path.name;\n if (newName[0] === '/') {\n newName = newName.substring(1);\n }\n\n this._loadFileSettings(id);\n\n if (fs.existsSync(path.join(this.objectsDir, id, oldName))) {\n fs.renameSync(path.join(this.objectsDir, id, oldName), path.join(this.objectsDir, id, newName));\n } else {\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n Object.keys(this.fileOptions[id]).forEach(name => {\n const type = this.fileOptions[id][name];\n if (name.startsWith(oldName)) {\n delete this.fileOptions[id][name];\n this.fileOptions[id][name.replace(oldName, newName)] = type;\n }\n });\n Object.keys(this.files[id]).forEach(name => {\n const data = this.files[id][name];\n if (name.startsWith(oldName)) {\n delete this.files[id][name];\n this.files[id][name.replace(oldName, newName)] = data;\n }\n });\n this._saveFileSettings(id, true);\n }\n\n // internal functionality\n _clone(obj) {\n if (obj === null || obj === undefined || !tools.isObject(obj)) {\n return obj;\n }\n\n const temp = obj.constructor(); // changed\n\n for (const key of Object.keys(obj)) {\n temp[key] = this._clone(obj[key]);\n }\n return temp;\n }\n\n _subscribeMeta(client, pattern) {\n this.handleSubscribe(client, 'meta', pattern);\n }\n\n // needed by server\n _subscribeConfigForClient(client, pattern) {\n this.handleSubscribe(client, 'objects', pattern);\n }\n\n // needed by server\n _unsubscribeConfigForClient(client, pattern) {\n this.handleUnsubscribe(client, 'objects', pattern); // ignore options => unsubscribe may everyone\n }\n\n // needed by server\n _subscribeFileForClient(client, id, pattern) {\n if (Array.isArray(pattern)) {\n pattern.forEach(pattern => this.handleSubscribe(client, 'files', `${id}$%$${pattern}`));\n } else {\n this.handleSubscribe(client, 'files', `${id}$%$${pattern}`);\n }\n }\n\n // needed by server\n _unsubscribeFileForClient(client, id, pattern) {\n if (Array.isArray(pattern)) {\n pattern.forEach(pattern => this.handleUnsubscribe(client, 'files', `${id}$%$${pattern}`));\n } else {\n this.handleUnsubscribe(client, 'files', `${id}$%$${pattern}`);\n }\n }\n\n // needed by server\n _getObject(id) {\n return this.dataset[id];\n }\n\n // needed by server\n _getKeys(pattern) {\n const r = new RegExp(tools.pattern2RegEx(pattern));\n const result = Object.keys(this.dataset).filter(id => r.test(id) && id !== this.META_ID);\n result.sort();\n return result;\n }\n\n // needed by server\n _getObjects(keys) {\n if (!keys) {\n throw new Error('no keys');\n }\n\n return keys.map(id => this.dataset[id]);\n }\n\n _ensureMetaDict() {\n let meta = this.dataset[this.META_ID];\n if (!meta) {\n meta = {};\n this.dataset[this.META_ID] = meta;\n }\n return meta;\n }\n\n /**\n * Get value of given meta id\n *\n * @param {string} id\n * @returns {*}\n */\n getMeta(id) {\n const meta = this._ensureMetaDict();\n return meta[id];\n }\n\n /**\n * Sets given value to id in metaNamespace\n *\n * @param {string} id\n * @param {string} value\n */\n setMeta(id, value) {\n const meta = this._ensureMetaDict();\n meta[id] = value;\n // Make sure the object gets re-written, especially when using an external DB\n this.dataset[this.META_ID] = meta;\n\n setImmediate(() => {\n // publish event in states\n this.log.silly(`${this.namespace} memory publish meta ${id} ${value}`);\n this.publishAll('meta', id, value);\n });\n\n if (!this.stateTimer) {\n this.stateTimer = setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n }\n\n // needed by server\n _setObjectDirect(id, obj) {\n this.dataset[id] = obj;\n\n // object updated -> if type changed to meta -> cache\n if (obj.type === 'meta' && this.existingMetaObjects[id] === false) {\n this.existingMetaObjects[id] = true;\n }\n\n setImmediate(() => this.publishAll('objects', id, obj));\n\n this.stateTimer = this.stateTimer || setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n\n /**\n * Delete the given object from the dataset\n *\n * @param {string} id unique id of the object\n * @private\n */\n _delObject(id) {\n const obj = this.dataset[id];\n if (!obj) {\n // Not existent, so goal reached :-)\n return;\n }\n\n if (obj.common?.dontDelete) {\n throw new Error('Object is marked as non deletable');\n }\n\n delete this.dataset[id];\n\n // object has been deleted -> remove from cached meta if there\n if (this.existingMetaObjects[id]) {\n this.existingMetaObjects[id] = false;\n }\n\n setImmediate(() => this.publishAll('objects', id, null));\n\n if (!this.stateTimer) {\n this.stateTimer = setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n }\n\n // internal functionality\n _applyView(func, params) {\n const result = {\n rows: []\n };\n\n // eslint-disable-next-line no-unused-vars\n function _emit_(id, obj) {\n result.rows.push({ id: id, value: obj });\n }\n\n const f = eval('(' + func.map.replace(/emit/g, '_emit_') + ')');\n\n for (const [id, obj] of Object.entries(this.dataset)) {\n if (params) {\n if (params.startkey && id < params.startkey) {\n continue;\n }\n if (params.endkey && id > params.endkey) {\n continue;\n }\n }\n\n if (obj) {\n try {\n f(obj);\n } catch (e) {\n this.log.warn(`${this.namespace} Cannot execute map: ${e.message}`);\n }\n }\n }\n // Calculate max\n if (func.reduce === '_stats') {\n let max = null;\n for (const row of result.rows) {\n if (max === null || row.value > max) {\n max = row.value;\n }\n }\n if (max !== null) {\n result.rows = [{ id: '_stats', value: { max: max } }];\n } else {\n result.rows = [];\n }\n }\n\n return result;\n }\n\n // needed by server\n _getObjectView(design, search, params) {\n const designObj = this.dataset[`_design/${design}`];\n if (!designObj) {\n this.log.error(`${this.namespace} Cannot find view \"${design}\"`);\n throw new Error(`Cannot find view \"${design}\"`);\n }\n if (!(designObj.views && designObj.views[search])) {\n this.log.warn(`${this.namespace} Cannot find search \"${search}\" in \"${design}\"`);\n throw new Error(`Cannot find search \"${search}\" in \"${design}\"`);\n }\n return this._applyView(designObj.views[search], params);\n }\n\n /**\n * Destructor of the class. Called by shutting down.\n */\n async destroy() {\n await super.destroy();\n\n this._saveFileSettings(true);\n if (this.stateTimer) {\n clearTimeout(this.stateTimer);\n this.stateTimer = null;\n }\n if (this.writeTimer) {\n clearTimeout(this.writeTimer);\n this.writeTimer = null;\n }\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Object DB in memory - Server\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { InMemoryFileDB } from '@iobroker/db-base';\nimport { tools } from '@iobroker/db-base';\nimport { objectsUtils as utils } from '@iobroker/db-objects-redis';\nimport deepClone from 'deep-clone';\n\n/**\n * This class inherits InMemoryFileDB class and adds all relevant logic for objects\n * including the available methods for use by js-controller directly\n **/\nexport class ObjectsInMemoryFileDB extends InMemoryFileDB {\n constructor(settings) {\n settings = settings || {};\n settings.fileDB = settings.fileDB || {\n fileName: 'objects.json',\n backupDirName: 'backup-objects'\n };\n super(settings);\n\n if (!this.change) {\n this.change = id => {\n this.log.silly(`${this.namespace} objects change: ${id} ${JSON.stringify(this.change)}`);\n };\n }\n\n this.META_ID = '**META**';\n /** @type {Record<string, any>} */\n this.fileOptions = {};\n this.files = {};\n this.writeTimer = null;\n /** @type {string[]} */\n this.writeIds = [];\n this.preserveSettings = ['custom'];\n this.defaultNewAcl = this.settings.defaultNewAcl || null;\n this.namespace = this.settings.namespace || this.settings.hostname || '';\n this.writeFileInterval =\n this.settings.connection && typeof this.settings.connection.writeFileInterval === 'number'\n ? parseInt(this.settings.connection.writeFileInterval)\n : 5_000;\n if (!settings.jsonlDB) {\n this.log.silly(`${this.namespace} Objects DB uses file write interval of ${this.writeFileInterval} ms`);\n }\n\n this.objectsDir = path.join(this.dataDir, 'files');\n\n // cached meta information for file operations\n this.existingMetaObjects = {};\n\n // Handle some < js-controller 2.0 broken objects and correct them\n for (const obj of Object.values(this.dataset)) {\n if (tools.isObject(obj) && obj.acl && obj.acl.permissions && !obj.acl.object) {\n obj.acl.object = obj.acl.permissions;\n delete obj.acl.permissions;\n }\n }\n\n // init default new acl\n const configObj = this.dataset['system.config'];\n if (configObj && configObj.common && configObj.common.defaultNewAcl) {\n this.defaultNewAcl = deepClone(configObj.common.defaultNewAcl);\n }\n }\n\n // internal functionality\n _normalizeFilename(name) {\n return name ? name.replace(/[/\\\\]+/g, '/') : name;\n }\n\n // -------------- FILE FUNCTIONS -------------------------------------------\n // internal functionality\n _saveFileSettings(id, force) {\n if (typeof id === 'boolean') {\n force = id;\n id = undefined;\n }\n\n id !== undefined && !this.writeIds.includes(id) && this.writeIds.push(id);\n\n this.writeTimer && clearTimeout(this.writeTimer);\n\n // if store immediately\n if (force) {\n this.writeTimer = null;\n // Store dirs description\n for (const writeId of this.writeIds) {\n const location = path.join(this.objectsDir, writeId, '_data.json');\n try {\n if (fs.existsSync(path.join(this.objectsDir, writeId))) {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[writeId]));\n }\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n this.writeIds = [];\n } else {\n this.writeTimer = setTimeout(() => {\n // Store dirs description\n for (const writeId of this.writeIds) {\n const location = path.join(this.objectsDir, writeId, '_data.json');\n try {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[writeId]));\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n this.writeIds = [];\n }, 1_000);\n }\n }\n\n // internal functionality\n _loadFileSettings(id) {\n if (!this.fileOptions[id]) {\n const location = path.join(this.objectsDir, id, '_data.json');\n if (fs.existsSync(location)) {\n try {\n this.fileOptions[id] = fs.readJSONSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot parse ${location}: ${e.message}`);\n this.fileOptions[id] = {};\n }\n let corrected = false;\n Object.keys(this.fileOptions[id]).forEach(filename => {\n const normalized = this._normalizeFilename(filename);\n if (normalized !== filename) {\n const options = this.fileOptions[id][filename];\n delete this.fileOptions[id][filename];\n this.fileOptions[id][normalized] = options;\n corrected = true;\n }\n if (corrected) {\n try {\n fs.writeFileSync(location, JSON.stringify(this.fileOptions[id]));\n } catch (e) {\n this.log.error(`${this.namespace} Cannot write files: ${location}: ${e.message}`);\n }\n }\n });\n } else {\n this.fileOptions[id] = {};\n }\n }\n }\n\n // server only functionality\n syncFileDirectory(limitId) {\n const resNotifies = [];\n let resSynced = 0;\n\n function getAllFiles(dir) {\n let results = [];\n const list = fs.readdirSync(dir);\n list.forEach(file => {\n file = dir + '/' + file;\n const stat = fs.statSync(file);\n if (stat && stat.isDirectory()) {\n /* Recurse into a subdirectory */\n results = results.concat(getAllFiles(file));\n } else {\n /* Is a file */\n results.push(file);\n }\n });\n return results;\n }\n\n const res = this._getObjectView('system', 'meta', null);\n\n // collect meta ids to generate warning if non existing\n const metaIds = res.rows.map(obj => obj.id).filter(id => !limitId || limitId === id);\n\n if (!fs.existsSync(this.objectsDir)) {\n return {\n numberSuccess: resSynced,\n notifications: resNotifies\n };\n }\n const baseDirs = fs.readdirSync(this.objectsDir);\n baseDirs.forEach(dir => {\n let dirSynced = 0;\n if (dir === '..' || dir === '.') {\n return;\n }\n const dirPath = path.join(this.objectsDir, dir);\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n return;\n }\n if (limitId && dir !== limitId) {\n return;\n }\n if (!metaIds.includes(dir)) {\n resNotifies.push(\n `Ignoring Directory \"${dir}\" because officially not created as meta object. Please remove directory!`\n );\n return;\n }\n this._loadFileSettings(dir);\n const files = getAllFiles(dirPath);\n files.forEach(file => {\n const localFile = file.substr(dirPath.length + 1);\n if (localFile === '_data.json') {\n return;\n }\n if (!this.fileOptions[dir][localFile]) {\n const fileStat = fs.statSync(file);\n const ext = path.extname(localFile);\n const mime = utils.getMimeType(ext);\n const _mimeType = mime.mimeType;\n const isBinary = mime.isBinary;\n\n this.fileOptions[dir][localFile] = {\n createdAt: fileStat.ctimeMs,\n acl: {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file) ||\n utils.CONSTS.ACCESS_USER_RW |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ // 0x644\n },\n mimeType: _mimeType,\n binary: isBinary,\n modifiedAt: fileStat.mtimeMs\n };\n dirSynced++;\n }\n });\n this._saveFileSettings(dir);\n resSynced += dirSynced;\n dirSynced && resNotifies.push(`Added ${dirSynced} Files in Directory \"${dir}\"`);\n });\n return {\n numberSuccess: resSynced,\n notifications: resNotifies\n };\n }\n\n // needed by server\n _writeFile(id, name, data, options) {\n if (typeof options === 'string') {\n options = { mimeType: options };\n }\n if (options && options.acl) {\n options.acl = null;\n }\n\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n options = options || {};\n\n this._loadFileSettings(id);\n\n this.files[id] = this.files[id] || {};\n\n try {\n if (!fs.existsSync(this.objectsDir)) {\n fs.mkdirSync(this.objectsDir);\n }\n if (!fs.existsSync(path.join(this.objectsDir, id))) {\n fs.mkdirSync(path.join(this.objectsDir, id));\n }\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot create directories: ${path.join(this.objectsDir, id)}: ${e.message}`\n );\n this.log.error(\n `${this.namespace} Check the permissions! Or run installation fixer or \"iobroker fix\" command!`\n );\n throw e;\n }\n\n const ext = path.extname(name);\n const mime = utils.getMimeType(ext);\n const _mimeType = mime.mimeType;\n const isBinary = mime.isBinary;\n\n this.fileOptions[id][name] = this.fileOptions[id][name] || { createdAt: Date.now() };\n this.fileOptions[id][name].acl = this.fileOptions[id][name].acl || {\n owner: options.user || (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n options.group ||\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n options.mode ||\n (this.defaultNewAcl && this.defaultNewAcl.file) ||\n utils.CONSTS.ACCESS_USER_RW | utils.CONSTS.ACCESS_GROUP_READ | utils.CONSTS.ACCESS_EVERY_READ // 0x644\n };\n\n this.fileOptions[id][name].mimeType = options.mimeType || _mimeType;\n this.fileOptions[id][name].binary = isBinary;\n this.fileOptions[id][name].acl.ownerGroup =\n this.fileOptions[id][name].acl.ownerGroup ||\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP;\n this.fileOptions[id][name].modifiedAt = Date.now();\n\n try {\n // Create directories if complex structure\n fs.ensureDirSync(path.join(this.objectsDir, id, path.dirname(name)));\n // Store file\n fs.writeFileSync(path.join(this.objectsDir, id, name), data, {\n flag: 'w',\n encoding: isBinary ? 'binary' : 'utf8'\n });\n\n if (isBinary) {\n // Reload by read\n delete this.files[id][name];\n } else {\n this.files[id][name] = data;\n }\n\n // Store dir description\n this._saveFileSettings(id);\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot write files: ${path.join(this.objectsDir, id, name)}: ${e.message}`\n );\n throw e;\n }\n\n setImmediate(\n (name, size) => {\n // publish event in states\n this.log.silly(`${this.namespace} memory publish ${id} ${JSON.stringify({ name, file: true, size })}`);\n this.publishAll('files', `${id}$%$${name}`, size);\n },\n name,\n data.byteLength\n );\n }\n\n // needed by server\n _readFile(id, name, options) {\n if (options && options.acl) {\n options.acl = null;\n }\n\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n options = options || {};\n try {\n this._loadFileSettings(id);\n\n this.files[id] = this.files[id] || {};\n\n if (!this.files[id][name] || this.settings.connection.noFileCache || options.noFileCache) {\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n // Create description object if not exists\n this.fileOptions[id][name] = this.fileOptions[id][name] || {\n acl: {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n if (typeof this.fileOptions[id][name] !== 'object') {\n this.fileOptions[id][name] = {\n mimeType: this.fileOptions[id][name],\n acl: {\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n }\n\n this.files[id][name] = fs.readFileSync(location);\n if (this.fileOptions[id][name].binary === undefined) {\n const ext = path.extname(name);\n const mimeType = utils.getMimeType(ext);\n this.fileOptions[id][name].binary = mimeType.isBinary;\n this.fileOptions[id][name].mimeType = mimeType.mimeType;\n }\n\n if (!this.fileOptions[id][name].binary) {\n if (this.files[id][name]) {\n this.files[id][name] = this.files[id][name].toString();\n }\n }\n } else {\n if (this.fileOptions[id][name] !== undefined) {\n delete this.fileOptions[id][name];\n }\n if (this.files[id][name] !== undefined) {\n delete this.files[id][name];\n }\n }\n }\n\n if (this.fileOptions[id][name] && !this.fileOptions[id][name].acl) {\n // all files belong to admin by default, but everyone can edit it\n this.fileOptions[id][name].acl = {\n owner: (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) || utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL | utils.CONSTS.ACCESS_GROUP_ALL | utils.CONSTS.ACCESS_EVERY_RW // 776\n };\n }\n\n if (this.fileOptions[id][name] !== null && this.fileOptions[id][name] !== undefined) {\n if (!this.fileOptions[id][name].mimeType) {\n const _ext = path.extname(name);\n const _mimeType = utils.getMimeType(_ext);\n this.fileOptions[id][name].mimeType = _mimeType.mimeType;\n }\n return {\n fileContent: this.files[id][name],\n fileMime: this.fileOptions[id][name].mimeType\n };\n }\n } catch (e) {\n this.log.warn(`${this.namespace} Cannot read file ${id} / ${name}: ${e.message}`);\n throw e;\n }\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n /**\n * Check if given object exists\n *\n * @param {string} id id of the object\n * @param {object} [_options] optional user context\n * @return {boolean}\n */\n // needed by server\n _objectExists(id, _options) {\n if (!id || typeof id !== 'string') {\n throw new Error(`invalid id ${JSON.stringify(id)}`);\n }\n\n try {\n // check if the id exists\n return Object.prototype.hasOwnProperty.call(this.dataset, id);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot check object existence of \"${id}\": ${e.message}`);\n throw new Error(`Cannot check object existence of \"${id}\": ${e.message}`);\n }\n }\n\n /**\n * Check if given file exists\n *\n * @param {string} id id of the namespace\n * @param {string} [name] name of the file\n * @returns {boolean}\n */\n // needed by server\n _fileExists(id, name) {\n if (typeof name !== 'string') {\n name = '';\n }\n\n const location = path.join(this.objectsDir, id, name);\n\n try {\n const stat = fs.statSync(location);\n return stat.isFile();\n } catch (e) {\n if (e.code !== 'ENOENT') {\n this.log.error(`${this.namespace} Cannot check file existence of \"${location}\": ${e.message}`);\n throw new Error(`Cannot check file existence of \"${location}\": ${e.message}`);\n }\n return false;\n }\n }\n\n /**\n * Check if given directory exists\n *\n * @param {string} id id of the namespace\n * @param {string} [name] name of the directory\n * @returns {boolean}\n */\n // special functionality only for Server (used together with SyncFileDirectory)\n dirExists(id, name) {\n if (typeof name !== 'string') {\n name = '';\n }\n\n const location = path.join(this.objectsDir, id, name);\n\n try {\n const stat = fs.statSync(location);\n return stat.isDirectory();\n } catch (e) {\n if (e.code !== 'ENOENT') {\n this.log.error(`${this.namespace} Cannot check directory existence of \"${location}\": ${e.message}`);\n throw new Error(`Cannot check directory existence of \"${location}\": ${e.message}`);\n }\n return false;\n }\n }\n\n // needed by server\n _unlink(id, name) {\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n\n this._loadFileSettings(id);\n\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n const stat = fs.statSync(location);\n\n if (stat.isDirectory()) {\n // read all entries and delete every one\n fs.readdirSync(location).forEach(dir => this._unlink(id, name + '/' + dir));\n\n this.log.debug(`Delete directory ${path.join(id, name)}`);\n try {\n fs.removeSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot delete directory \"${path.join(id, name)}\": ${e.message}`);\n throw e;\n }\n\n if (this.fileOptions[id]) {\n delete this.fileOptions[id];\n }\n if (this.files[id] && this.files[id]) {\n delete this.files[id];\n }\n } else {\n this.log.debug('Delete file ' + path.join(id, name));\n try {\n fs.removeSync(location);\n } catch (e) {\n this.log.error(`${this.namespace} Cannot delete file \"${path.join(id, name)}\": ${e.message}`);\n throw e;\n }\n\n if (this.fileOptions[id][name]) {\n delete this.fileOptions[id][name];\n }\n if (this.files[id] && this.files[id][name]) {\n delete this.files[id][name];\n }\n\n // Store dir description\n this._saveFileSettings(id, true);\n }\n\n setImmediate(\n (id, name) => {\n // publish event in states\n this.log.silly(\n `${this.namespace} memory publish ${id} ${JSON.stringify({ name, file: true, size: null })}`\n );\n this.publishAll('files', `${id}$%$${name}`, null);\n },\n id,\n name\n );\n }\n }\n\n // needed by server\n _readDir(id, name, options) {\n if (options && options.acl) {\n options.acl = null;\n }\n if ((id === '' || id === '/' || id === '*') && (name === '' || name === '*')) {\n // read root of xxx-data/files\n } else {\n const _path = utils.sanitizePath(id, name);\n id = _path.id;\n name = _path.name;\n }\n\n options = options || {};\n // Find all files and directories starts with name\n const _files = [];\n\n if (id && id === '*') {\n id = '';\n }\n if (name && name[name.length - 1] !== '/') {\n name += '/';\n }\n\n this._loadFileSettings(id);\n\n const len = name ? name.length : 0;\n for (const f of Object.keys(this.fileOptions[id])) {\n if (!name || f.substring(0, len) === name) {\n /** @type {string|string[]} */\n let rest = f.substring(len);\n rest = rest.split('/', 2);\n if (rest[0] && _files.indexOf(rest[0]) === -1) {\n _files.push(rest[0]);\n }\n }\n }\n\n const location = path.join(this.objectsDir, id, name);\n if (fs.existsSync(location)) {\n const dirFiles = fs.readdirSync(location);\n for (let i = 0; i < dirFiles.length; i++) {\n if (dirFiles[i] === '..' || dirFiles[i] === '.') {\n continue;\n }\n if (dirFiles[i] !== '_data.json' && _files.indexOf(dirFiles[i]) === -1) {\n _files.push(dirFiles[i]);\n }\n }\n } else {\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n _files.sort();\n const res = [];\n for (const file of _files) {\n if (file === '..' || file === '.') {\n continue;\n }\n if (fs.existsSync(path.join(location, file))) {\n try {\n const stats = fs.statSync(path.join(location, file));\n const acl =\n this.fileOptions[id][name + file] && this.fileOptions[id][name + file].acl\n ? deepClone(this.fileOptions[id][name + file].acl) // copy settings\n : {\n read: true,\n write: true,\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) ||\n utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_RW |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ\n };\n\n // if filter for user\n if (options.filter && acl) {\n // If user may not write\n if (!options.acl.file.write) {\n // write\n acl.permissions &= ~(\n utils.CONSTS.ACCESS_USER_WRITE |\n utils.CONSTS.ACCESS_GROUP_WRITE |\n utils.CONSTS.ACCESS_EVERY_WRITE\n );\n }\n // If user may not read\n if (!options.acl.file.read) {\n // read\n acl.permissions &= ~(\n utils.CONSTS.ACCESS_USER_READ |\n utils.CONSTS.ACCESS_GROUP_READ |\n utils.CONSTS.ACCESS_EVERY_READ\n );\n }\n\n if (\n options.user !== utils.CONSTS.SYSTEM_ADMIN_USER &&\n options.groups.includes(utils.CONSTS.SYSTEM_ADMIN_GROUP)\n ) {\n if (acl.owner !== options.user) {\n // Check if the user is in the group\n if (options.groups.includes(acl.ownerGroup)) {\n // Check group rights\n if (!(acl.permissions & utils.CONSTS.ACCESS_GROUP_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_GROUP_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_GROUP_WRITE);\n } else {\n // everybody\n if (!(acl.permissions & utils.CONSTS.ACCESS_EVERY_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_EVERY_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_EVERY_WRITE);\n }\n } else {\n // Check user rights\n if (!(acl.permissions & utils.CONSTS.ACCESS_USER_RW)) {\n continue;\n }\n acl.read = !!(acl.permissions & utils.CONSTS.ACCESS_USER_READ);\n acl.write = !!(acl.permissions & utils.CONSTS.ACCESS_USER_WRITE);\n }\n } else {\n acl.read = true;\n acl.write = true;\n }\n }\n\n res.push({\n file,\n stats: stats,\n isDir: stats.isDirectory(),\n acl: acl,\n modifiedAt: this.fileOptions[id][name + file]\n ? this.fileOptions[id][name + file].modifiedAt\n : undefined,\n createdAt: this.fileOptions[id][name + file]\n ? this.fileOptions[id][name + file].createdAt\n : undefined\n });\n } catch (e) {\n this.log.error(\n `${this.namespace} Cannot read permissions of ${path.join(this.objectsDir, id, name, file)}: ${\n e.message\n }`\n );\n }\n }\n }\n\n return res;\n }\n\n // needed by server\n _rename(id, oldName, newName) {\n const _path = utils.sanitizePath(id, oldName);\n id = _path.id;\n oldName = _path.name;\n if (newName[0] === '/') {\n newName = newName.substring(1);\n }\n\n this._loadFileSettings(id);\n\n if (fs.existsSync(path.join(this.objectsDir, id, oldName))) {\n fs.renameSync(path.join(this.objectsDir, id, oldName), path.join(this.objectsDir, id, newName));\n } else {\n throw new Error(utils.ERRORS.ERROR_NOT_FOUND);\n }\n\n Object.keys(this.fileOptions[id]).forEach(name => {\n const type = this.fileOptions[id][name];\n if (name.startsWith(oldName)) {\n delete this.fileOptions[id][name];\n this.fileOptions[id][name.replace(oldName, newName)] = type;\n }\n });\n Object.keys(this.files[id]).forEach(name => {\n const data = this.files[id][name];\n if (name.startsWith(oldName)) {\n delete this.files[id][name];\n this.files[id][name.replace(oldName, newName)] = data;\n }\n });\n this._saveFileSettings(id, true);\n }\n\n // internal functionality\n _clone(obj) {\n if (obj === null || obj === undefined || !tools.isObject(obj)) {\n return obj;\n }\n\n const temp = obj.constructor(); // changed\n\n for (const key of Object.keys(obj)) {\n temp[key] = this._clone(obj[key]);\n }\n return temp;\n }\n\n _subscribeMeta(client, pattern) {\n this.handleSubscribe(client, 'meta', pattern);\n }\n\n // needed by server\n _subscribeConfigForClient(client, pattern) {\n this.handleSubscribe(client, 'objects', pattern);\n }\n\n // needed by server\n _unsubscribeConfigForClient(client, pattern) {\n this.handleUnsubscribe(client, 'objects', pattern); // ignore options => unsubscribe may everyone\n }\n\n // needed by server\n _subscribeFileForClient(client, id, pattern) {\n if (Array.isArray(pattern)) {\n pattern.forEach(pattern => this.handleSubscribe(client, 'files', `${id}$%$${pattern}`));\n } else {\n this.handleSubscribe(client, 'files', `${id}$%$${pattern}`);\n }\n }\n\n // needed by server\n _unsubscribeFileForClient(client, id, pattern) {\n if (Array.isArray(pattern)) {\n pattern.forEach(pattern => this.handleUnsubscribe(client, 'files', `${id}$%$${pattern}`));\n } else {\n this.handleUnsubscribe(client, 'files', `${id}$%$${pattern}`);\n }\n }\n\n // needed by server\n _getObject(id) {\n return this.dataset[id];\n }\n\n // needed by server\n _getKeys(pattern) {\n const r = new RegExp(tools.pattern2RegEx(pattern));\n const result = Object.keys(this.dataset).filter(id => r.test(id) && id !== this.META_ID);\n result.sort();\n return result;\n }\n\n // needed by server\n _getObjects(keys) {\n if (!keys) {\n throw new Error('no keys');\n }\n\n return keys.map(id => this.dataset[id]);\n }\n\n _ensureMetaDict() {\n let meta = this.dataset[this.META_ID];\n if (!meta) {\n meta = {};\n this.dataset[this.META_ID] = meta;\n }\n return meta;\n }\n\n /**\n * Get value of given meta id\n *\n * @param {string} id\n * @returns {*}\n */\n getMeta(id) {\n const meta = this._ensureMetaDict();\n return meta[id];\n }\n\n /**\n * Sets given value to id in metaNamespace\n *\n * @param {string} id\n * @param {string} value\n */\n setMeta(id, value) {\n const meta = this._ensureMetaDict();\n meta[id] = value;\n // Make sure the object gets re-written, especially when using an external DB\n this.dataset[this.META_ID] = meta;\n\n setImmediate(() => {\n // publish event in states\n this.log.silly(`${this.namespace} memory publish meta ${id} ${value}`);\n this.publishAll('meta', id, value);\n });\n\n if (!this.stateTimer) {\n this.stateTimer = setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n }\n\n // needed by server\n _setObjectDirect(id, obj) {\n this.dataset[id] = obj;\n\n // object updated -> if type changed to meta -> cache\n if (obj.type === 'meta' && this.existingMetaObjects[id] === false) {\n this.existingMetaObjects[id] = true;\n }\n\n setImmediate(() => this.publishAll('objects', id, obj));\n\n this.stateTimer = this.stateTimer || setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n\n /**\n * Delete the given object from the dataset\n *\n * @param {string} id unique id of the object\n * @private\n */\n _delObject(id) {\n const obj = this.dataset[id];\n if (!obj) {\n // Not existent, so goal reached :-)\n return;\n }\n\n if (obj.common?.dontDelete) {\n throw new Error('Object is marked as non deletable');\n }\n\n delete this.dataset[id];\n\n // object has been deleted -> remove from cached meta if there\n if (this.existingMetaObjects[id]) {\n this.existingMetaObjects[id] = false;\n }\n\n setImmediate(() => this.publishAll('objects', id, null));\n\n if (!this.stateTimer) {\n this.stateTimer = setTimeout(() => this.saveState(), this.writeFileInterval);\n }\n }\n\n // internal functionality\n _applyView(func, params) {\n const result = {\n rows: []\n };\n\n // eslint-disable-next-line no-unused-vars\n function _emit_(id, obj) {\n result.rows.push({ id: id, value: obj });\n }\n\n const f = eval('(' + func.map.replace(/emit/g, '_emit_') + ')');\n\n for (const [id, obj] of Object.entries(this.dataset)) {\n if (params) {\n if (params.startkey && id < params.startkey) {\n continue;\n }\n if (params.endkey && id > params.endkey) {\n continue;\n }\n }\n\n if (obj) {\n try {\n f(obj);\n } catch (e) {\n this.log.warn(`${this.namespace} Cannot execute map: ${e.message}`);\n }\n }\n }\n // Calculate max\n if (func.reduce === '_stats') {\n let max = null;\n for (const row of result.rows) {\n if (max === null || row.value > max) {\n max = row.value;\n }\n }\n if (max !== null) {\n result.rows = [{ id: '_stats', value: { max: max } }];\n } else {\n result.rows = [];\n }\n }\n\n return result;\n }\n\n // needed by server\n _getObjectView(design, search, params) {\n const designObj = this.dataset[`_design/${design}`];\n if (!designObj) {\n this.log.error(`${this.namespace} Cannot find view \"${design}\"`);\n throw new Error(`Cannot find view \"${design}\"`);\n }\n if (!(designObj.views && designObj.views[search])) {\n this.log.warn(`${this.namespace} Cannot find search \"${search}\" in \"${design}\"`);\n throw new Error(`Cannot find search \"${search}\" in \"${design}\"`);\n }\n return this._applyView(designObj.views[search], params);\n }\n\n /**\n * Destructor of the class. Called by shutting down.\n */\n async destroy() {\n await super.destroy();\n\n this._saveFileSettings(true);\n if (this.stateTimer) {\n clearTimeout(this.stateTimer);\n this.stateTimer = null;\n }\n if (this.writeTimer) {\n clearTimeout(this.writeTimer);\n this.writeTimer = null;\n }\n }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_db_base", "path", "deepClone", "fs", "utils", "name", "id", "f", "pattern", "result", "params"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/objects/objectsInMemServerClass.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * States DB in memory - Server with Redis protocol\n *\n * Copyright 2013-
|
|
4
|
+
"sourcesContent": ["/**\n * States DB in memory - Server with Redis protocol\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport { Client as ObjectsInRedisClient } from '@iobroker/db-objects-redis';\nimport { ObjectsInMemoryServer } from './objectsInMemServerRedis.js';\n\nexport class ObjectsInMemoryServerClass extends ObjectsInRedisClient {\n constructor(settings) {\n settings.autoConnect = false; // delay Client connection to when we need it\n super(settings);\n\n const serverSettings = {\n namespace: settings.namespace ? `${settings.namespace}-Server` : 'Server',\n connection: settings.connection,\n logger: settings.logger,\n hostname: settings.hostname,\n connected: () => {\n this.connectDb(); // now that server is connected also connect client\n }\n };\n this.objectsServer = new ObjectsInMemoryServer(serverSettings);\n }\n\n async destroy() {\n await super.destroy(); // destroy client first\n await this.objectsServer.destroy(); // server afterwards too\n }\n\n getStatus() {\n return this.objectsServer.getStatus(); // return Status as Server\n }\n\n syncFileDirectory(limitId) {\n return this.objectsServer.syncFileDirectory(limitId);\n }\n\n dirExists(id, name) {\n return this.objectsServer.dirExists(id, name);\n }\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AASA,8BAA+C;AAC/C,qCAAsC;AAEhC,MAAO,mCAAmC,wBAAAA,OAAoB;EAChE,YAAY,UAAQ;AAChB,aAAS,cAAc;AACvB,UAAM,QAAQ;AAEd,UAAM,iBAAiB;MACnB,WAAW,SAAS,YAAY,GAAG,SAAS,qBAAqB;MACjE,YAAY,SAAS;MACrB,QAAQ,SAAS;MACjB,UAAU,SAAS;MACnB,WAAW,MAAK;AACZ,aAAK,UAAS;MAClB;;AAEJ,SAAK,gBAAgB,IAAI,qDAAsB,cAAc;EACjE;EAEA,MAAM,UAAO;AACT,UAAM,MAAM,QAAO;AACnB,UAAM,KAAK,cAAc,QAAO;EACpC;EAEA,YAAS;AACL,WAAO,KAAK,cAAc,UAAS;EACvC;EAEA,kBAAkB,SAAO;AACrB,WAAO,KAAK,cAAc,kBAAkB,OAAO;EACvD;EAEA,UAAU,IAAI,MAAI;AACd,WAAO,KAAK,cAAc,UAAU,IAAI,IAAI;EAChD;;",
|
|
6
6
|
"names": ["ObjectsInRedisClient"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/objects/objectsInMemServerRedis.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Objects DB in memory - Server with Redis protocol\n *\n * Copyright 2013-2022 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport net from 'node:net';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { objectsUtils as utils } from '@iobroker/db-objects-redis';\nimport { tools } from '@iobroker/db-base';\nimport { getLocalAddress } from '@iobroker/js-controller-common-db/tools';\nimport { EXIT_CODES } from '@iobroker/js-controller-common-db';\n\nimport { RedisHandler } from '@iobroker/db-base';\nimport { ObjectsInMemoryFileDB } from './objectsInMemFileDB.js';\n\n// settings = {\n// change: function (id, state) {},\n// connected: function (nameOfServer) {},\n// logger: {\n// silly: function (msg) {},\n// debug: function (msg) {},\n// info: function (msg) {},\n// warn: function (msg) {},\n// error: function (msg) {}\n// },\n// connection: {\n// dataDir: 'relative path'\n// },\n// auth: null, //unused\n// secure: true/false,\n// certificates: as required by createServer\n// port: 9001,\n// host: localhost\n// };\n//\n\n/**\n * This class inherits statesInMemoryFileDB class and adds redis communication layer\n * to access the methods via redis protocol\n **/\nexport class ObjectsInMemoryServer extends ObjectsInMemoryFileDB {\n /**\n * Constructor\n * @param settings State and InMem-DB settings\n */\n constructor(settings) {\n super(settings);\n\n this.serverConnections = {};\n this.namespaceObjects =\n (this.settings.redisNamespace || (settings.connection && settings.connection.redisNamespace) || 'cfg') +\n '.';\n this.namespaceFile = this.namespaceObjects + 'f.';\n this.namespaceObj = this.namespaceObjects + 'o.';\n this.namespaceSet = this.namespaceObjects + 's.';\n this.namespaceSetLen = this.namespaceSet.length;\n\n // this.namespaceObjectsLen = this.namespaceObjects.length;\n this.namespaceFileLen = this.namespaceFile.length;\n this.namespaceObjLen = this.namespaceObj.length;\n this.namespaceMeta = `${this.settings.namespaceMeta || 'meta'}.`;\n this.namespaceMetaLen = this.namespaceMeta.length;\n\n this.knownScripts = {};\n\n this.normalizeFileRegex1 = new RegExp('^(.*)\\\\$%\\\\$(.*)\\\\$%\\\\$(meta|data)$');\n this.normalizeFileRegex2 = new RegExp('^(.*)\\\\$%\\\\$(.*)\\\\/?\\\\*$');\n\n this.open()\n .then(() => {\n return this._initRedisServer(this.settings.connection);\n })\n .then(() => {\n this.log.debug(\n this.namespace +\n ' ' +\n (settings.secure ? 'Secure ' : '') +\n ' Redis inMem-objects listening on port ' +\n (settings.port || 9001)\n );\n\n if (typeof this.settings.connected === 'function') {\n setImmediate(() => this.settings.connected());\n }\n })\n .catch(e => {\n this.log.error(\n `${this.namespace} Cannot start inMem-objects on port ${settings.port || 9001}: ${e.message}`\n );\n process.exit(EXIT_CODES.NO_CONNECTION_TO_OBJ_DB);\n });\n }\n\n /**\n * Separate Namespace from ID and return both\n * @param idWithNamespace ID or Array of IDs containing a redis namespace and the real ID\n * @returns {{namespace: (string); id: string; name?: string; isMeta?: boolean}} Object with namespace and the\n * ID/Array of IDs without the namespace\n * @private\n */\n _normalizeId(idWithNamespace) {\n let ns = this.namespaceObjects;\n let id = null;\n let name = '';\n let isMeta;\n if (Array.isArray(idWithNamespace)) {\n const ids = [];\n idWithNamespace.forEach(el => {\n const { id, namespace } = this._normalizeId(el);\n ids.push(id);\n ns = namespace; // we ignore the pot. case from arrays with different namespaces\n });\n id = ids;\n } else if (typeof idWithNamespace === 'string') {\n id = idWithNamespace;\n if (idWithNamespace.startsWith(this.namespaceObjects)) {\n let idx = -1;\n if (idWithNamespace.startsWith(this.namespaceObj)) {\n idx = this.namespaceObjLen;\n } else if (idWithNamespace.startsWith(this.namespaceFile)) {\n idx = this.namespaceFileLen;\n } else if (idWithNamespace.startsWith(this.namespaceSet)) {\n idx = this.namespaceSetLen;\n }\n\n if (idx !== -1) {\n ns = idWithNamespace.substr(0, idx);\n id = idWithNamespace.substr(idx);\n }\n if (ns === this.namespaceFile) {\n let fileIdDetails = id.match(this.normalizeFileRegex1);\n if (fileIdDetails) {\n id = fileIdDetails[1];\n name = fileIdDetails[2] || '';\n isMeta = fileIdDetails[3] === 'meta';\n } else {\n fileIdDetails = id.match(this.normalizeFileRegex2);\n if (fileIdDetails) {\n id = fileIdDetails[1];\n name = fileIdDetails[2] || '';\n isMeta = undefined;\n } else {\n name = '';\n isMeta = undefined;\n }\n }\n }\n } else if (idWithNamespace.startsWith(this.namespaceMeta)) {\n const idx = this.namespaceMetaLen;\n if (idx !== -1) {\n ns = idWithNamespace.substr(0, idx);\n id = idWithNamespace.substr(idx);\n }\n }\n }\n return { id, namespace: ns, name, isMeta };\n }\n\n /**\n * Publish a subscribed value to one of the redis connections in redis format\n * @param client Instance of RedisHandler\n * @param type Type of subscribed key\n * @param id Subscribed ID\n * @param obj Object to publish\n * @returns {number} Publish counter 0 or 1 depending on if send out or not\n */\n publishToClients(client, type, id, obj) {\n if (!client._subscribe || !client._subscribe[type]) {\n return 0;\n }\n const s = client._subscribe[type];\n\n const found = s.find(sub => sub.regex.test(id));\n\n if (found) {\n if (type === 'meta') {\n this.log.silly(`${this.namespace} Redis Publish Meta ${id}=${obj}`);\n const sendPattern = this.namespaceMeta + found.pattern;\n const sendId = this.namespaceMeta + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, obj]);\n } else if (type === 'files') {\n const objString = JSON.stringify(obj);\n this.log.silly(`${this.namespace} Redis Publish File ${id}=${objString}`);\n const sendPattern = this.namespaceFile + found.pattern;\n const sendId = this.namespaceFile + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, objString]);\n } else {\n const objString = JSON.stringify(obj);\n this.log.silly(`${this.namespace} Redis Publish Object ${id}=${objString}`);\n const sendPattern = (type === 'objects' ? '' : this.namespaceObjects) + found.pattern;\n const sendId = (type === 'objects' ? this.namespaceObj : this.namespaceObjects) + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, objString]);\n }\n return 1;\n }\n return 0;\n }\n\n /**\n * Generate ID for a File\n * @param id ID of the File\n * @param name Name of the file\n * @param isMeta generate a META ID or a Data ID?\n * @returns {string} File-ID\n */\n getFileId(id, name, isMeta) {\n // e.g. ekey.admin and admin/ekey.png\n if (id.endsWith('.admin')) {\n if (name.startsWith('admin/')) {\n name = name.replace(/^admin\\//, '');\n } else if (name.match(/^iobroker.[-\\d\\w]\\/admin\\//i)) {\n // e.g. ekey.admin and iobroker.ekey/admin/ekey.png\n name = name.replace(/^iobroker.[-\\d\\w]\\/admin\\//i, '');\n }\n }\n\n return this.namespaceFile + id + '$%$' + name + (isMeta !== undefined ? (isMeta ? '$%$meta' : '$%$data') : '');\n }\n\n /**\n * Register all event listeners for Handler and implement the relevant logic\n * @param handler RedisHandler instance\n * @private\n */\n _socketEvents(handler) {\n let connectionName = null;\n let namespaceLog = this.namespace;\n\n // Handle Redis \"INFO\" request\n handler.on('info', (_data, responseId) => {\n let infoString = '# Server\\r\\n';\n infoString += 'redis_version:3.0.0-iobroker\\r\\n';\n infoString += '# Clients\\r\\n';\n infoString += '# Memory\\r\\n';\n infoString += '# Persistence\\r\\n';\n infoString += '# Stats\\r\\n';\n infoString += '# Replication\\r\\n';\n infoString += '# CPU\\r\\n';\n infoString += '# Cluster\\r\\n';\n infoString += '# Keyspace\\r\\n';\n infoString += `db0:keys=${Object.keys(this.dataset).length},expires=0,avg_ttl=98633637897`;\n handler.sendBulk(responseId, infoString);\n });\n\n // Handle Redis \"QUIT\" request\n handler.on('quit', (_data, responseId) => {\n this.log.silly(namespaceLog + ' Redis QUIT received, close connection');\n handler.sendString(responseId, 'OK');\n handler.close();\n });\n\n // Handle Redis \"SCRIPT\" request\n handler.on('script', (data, responseId) => {\n data[0] = data[0].toLowerCase();\n if (data[0] === 'exists') {\n data.shift();\n const scripts = [];\n data.forEach(checksum => scripts.push(this.knownScripts[checksum] ? 1 : 0));\n handler.sendArray(responseId, scripts);\n } else if (data[0] === 'load') {\n const shasum = crypto.createHash('sha1');\n const buf = Buffer.from(data[1]);\n shasum.update(buf);\n const scriptChecksum = shasum.digest('hex');\n\n const scriptDesign = data[1].match(/^-- design: ([a-z0-9A-Z-.]+)\\s/m);\n const scriptFunc = data[1].match(/^-- func: (.+)$/m);\n if (scriptDesign && scriptDesign[1]) {\n const design = scriptDesign[1];\n let search = null;\n const scriptSearch = data[1].match(/^-- search: ([a-z0-9A-Z-.]*)\\s/m);\n if (scriptSearch && scriptSearch[1]) {\n search = scriptSearch[1];\n }\n\n this.knownScripts[scriptChecksum] = { design: design, search: search };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register View LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else if (scriptFunc && scriptFunc[1]) {\n this.knownScripts[scriptChecksum] = { func: scriptFunc[1] };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register Func LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else if (data[1].includes('-- REDLOCK SCRIPT')) {\n // redlock scripts are currently not needed for Simulator\n this.knownScripts[scriptChecksum] = { redlock: true };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register Func LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else {\n handler.sendError(responseId, new Error(`Unknown LUA script ${data[1]}`));\n }\n } else {\n handler.sendError(responseId, new Error(`Unsupported Script command ${data[0]}`));\n }\n });\n\n // Handle Redis \"EVALSHA\" request\n handler.on('evalsha', (data, responseId) => {\n if (!this.knownScripts[data[0]]) {\n return void handler.sendError(responseId, new Error(`Unknown Script ${data[0]}`));\n }\n if (this.knownScripts[data[0]].design) {\n const scriptDesign = this.knownScripts[data[0]].design;\n if (typeof data[2] === 'string' && data[2].startsWith(this.namespaceObj) && data.length > 4) {\n let scriptSearch = this.knownScripts[data[0]].search;\n if (scriptDesign === 'system' && !scriptSearch && data[5]) {\n scriptSearch = data[5];\n }\n if (!scriptSearch) {\n scriptSearch = 'state';\n }\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Script transformed into getObjectView: design=${scriptDesign}, search=${scriptSearch}`\n );\n }\n let objs;\n try {\n objs = this._getObjectView(scriptDesign, scriptSearch, {\n startkey: data[3],\n endkey: data[4],\n include_docs: true\n });\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`_getObjectView Error for ${scriptDesign}/${scriptSearch}: ${err.message}`)\n );\n }\n\n const res = objs.rows.map(obj => JSON.stringify(this.dataset[obj.value._id || obj.id]));\n handler.sendArray(responseId, res);\n }\n } else if (this.knownScripts[data[0]].func && data.length > 4) {\n const scriptFunc = { map: this.knownScripts[data[0]].func.replace('%1', data[5]) };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(`${namespaceLog} Script transformed into _applyView: func=${scriptFunc.map}`);\n }\n const objs = this._applyView(scriptFunc, {\n startkey: data[3],\n endkey: data[4],\n include_docs: true\n });\n const res = objs.rows.map(obj => JSON.stringify(this.dataset[obj.value._id || obj.id]));\n\n return void handler.sendArray(responseId, res);\n } else if (this.knownScripts[data[0]].redlock) {\n // just return a dummy\n return void handler.sendArray(responseId, [0]);\n } else {\n handler.sendError(responseId, new Error(`Unknown LUA script eval call ${JSON.stringify(data)}`));\n }\n });\n\n // Handle Redis \"PUBLISH\" request\n handler.on('publish', (data, responseId) => {\n const { id, namespace } = this._normalizeId(data[0]);\n\n if (\n namespace === this.namespaceObj ||\n namespace === this.namespaceMeta ||\n namespace === this.namespaceFile\n ) {\n // a \"set\" always comes afterwards, so do not publish\n return void handler.sendInteger(responseId, 0); // do not publish for now\n }\n const publishCount = this.publishAll(namespace.substr(0, namespace.length - 1), id, JSON.parse(data[1]));\n handler.sendInteger(responseId, publishCount);\n });\n\n // Handle Redis \"MGET\" requests\n handler.on('mget', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendArray(responseId, []);\n }\n const { namespace, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n const keys = [];\n data.forEach(dataId => {\n const { id, namespace } = this._normalizeId(dataId);\n if (namespace !== this.namespaceObj) {\n keys.push(null);\n this.log.warn(\n `${namespaceLog} Got MGET request for non Object-ID in Objects-ID chunk for ${namespace} / ${dataId}`\n );\n return;\n }\n keys.push(id);\n });\n let result;\n try {\n result = this._getObjects(keys);\n } catch (err) {\n return void handler.sendError(responseId, new Error('ERROR _getObjects: ' + err.message));\n }\n result = result.map(el => (el ? JSON.stringify(el) : null));\n handler.sendArray(responseId, result);\n } else if (namespace === this.namespaceFile) {\n // Handle request for Meta data for files\n if (isMeta) {\n const response = [];\n data.forEach(dataId => {\n const { id, namespace, name } = this._normalizeId(dataId);\n if (namespace !== this.namespaceFile) {\n response.push(null);\n this.log.warn(\n `${namespaceLog} Got MGET request for non File ID in File-ID chunk for ${dataId}`\n );\n return;\n }\n this._loadFileSettings(id);\n if (!this.fileOptions[id] || !this.fileOptions[id][name]) {\n response.push(null);\n return;\n }\n const obj = this._clone(this.fileOptions[id][name]);\n try {\n // @ts-ignore\n obj.stats = fs.statSync(path.join(this.objectsDir, id, name));\n } catch (err) {\n if (!name.endsWith('/_data.json')) {\n this.log.warn(\n `${namespaceLog} Got MGET request for non existing file ${dataId}, err: ${err.message}`\n );\n }\n response.push(null);\n return;\n }\n response.push(JSON.stringify(obj));\n });\n handler.sendArray(responseId, response);\n } else {\n // Handle request for File data\n handler.sendError(responseId, new Error('MGET-UNSUPPORTED for file data'));\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`MGET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"GET\" requests\n handler.on('get', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n const result = this._getObject(id);\n if (!result) {\n handler.sendNull(responseId);\n } else {\n handler.sendBulk(responseId, JSON.stringify(result));\n }\n } else if (namespace === this.namespaceFile) {\n // Handle request for Meta data for files\n if (isMeta) {\n let stats;\n try {\n stats = fs.statSync(path.join(this.objectsDir, id, name));\n } catch {\n return void handler.sendNull(responseId);\n }\n if (stats.isDirectory()) {\n return void handler.sendBulk(\n responseId,\n JSON.stringify({\n file: name,\n stats: {},\n isDir: true\n })\n );\n }\n this._loadFileSettings(id);\n if (!this.fileOptions[id] || !this.fileOptions[id][name]) {\n return void handler.sendNull(responseId);\n }\n\n let obj = this._clone(this.fileOptions[id][name]);\n if (typeof obj !== 'object') {\n obj = {\n mimeType: obj,\n acl: {\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n }\n obj.stats = stats;\n handler.sendBulk(responseId, JSON.stringify(obj));\n } else {\n // Handle request for File data\n let data;\n try {\n data = this._readFile(id, name);\n } catch {\n return void handler.sendNull(responseId);\n }\n if (data.fileContent === undefined || data.fileContent === null) {\n return void handler.sendNull(responseId);\n }\n let fileData = data.fileContent;\n if (!Buffer.isBuffer(fileData) && tools.isObject(fileData)) {\n // if its an invalid object, stringify it and log warning\n fileData = JSON.stringify(fileData);\n this.log.warn(\n `${namespaceLog} Data of \"${id}/${name}\" has invalid structure at file data request: ${fileData}`\n );\n }\n handler.sendBufBulk(responseId, Buffer.from(fileData));\n }\n } else if (namespace === this.namespaceMeta) {\n // special handling for the primaryHost\n if (id === 'objects.primaryHost') {\n // we are the server -> we are primary\n handler.sendString(this.settings.hostname);\n } else {\n const result = this.getMeta(id);\n if (result === undefined || result === null) {\n handler.sendNull(responseId);\n } else {\n handler.sendBulk(responseId, result);\n }\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`GET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"SET\" requests\n handler.on('set', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n try {\n const obj = JSON.parse(data[1].toString('utf-8'));\n this._setObjectDirect(id, obj);\n } catch (err) {\n return void handler.sendError(responseId, new Error(`ERROR setObject id=${id}: ${err.message}`));\n }\n handler.sendString(responseId, 'OK');\n } else if (namespace === this.namespaceFile) {\n // Handle request to set meta-data, we ignore it because\n // will be set when data are written\n if (isMeta) {\n this._loadFileSettings(id);\n\n try {\n fs.ensureDirSync(path.join(this.objectsDir, id, path.dirname(name)));\n\n // only set if the meta-object is already/still existing\n if (this.fileOptions[id]) {\n this.fileOptions[id][name] = JSON.parse(data[1].toString('utf-8'));\n fs.writeFileSync(\n path.join(this.objectsDir, id, '_data.json'),\n JSON.stringify(this.fileOptions[id])\n );\n }\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`ERROR writeFile-Meta id=${id}: ${err.message}`)\n );\n }\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request to write the file\n try {\n this._writeFile(id, name, data[1]);\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`ERROR writeFile id=${id}: ${err.message}`)\n );\n }\n handler.sendString(responseId, 'OK');\n }\n } else if (namespace === this.namespaceMeta) {\n this.setMeta(id, data[1].toString('utf-8'));\n handler.sendString(responseId, 'OK');\n } else {\n handler.sendError(\n responseId,\n new Error(`SET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"RENAME\" requests\n handler.on('rename', (data, responseId) => {\n const oldDetails = this._normalizeId(data[0]);\n const newDetails = this._normalizeId(data[1]);\n\n if (oldDetails.namespace === this.namespaceFile) {\n if (oldDetails.id !== newDetails.id) {\n return void handler.sendError(\n responseId,\n new Error('ERROR renameObject: id needs to stay the same')\n );\n }\n\n // Handle request for Meta data for files\n if (oldDetails.isMeta) {\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request for File data\n try {\n this._rename(oldDetails.id, oldDetails.name, newDetails.name);\n } catch {\n return void handler.sendNull(responseId);\n }\n handler.sendString(responseId, 'OK');\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`RENAME-UNSUPPORTED for namespace ${oldDetails.namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"DEL\" request for state and session namespace\n handler.on('del', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n try {\n this._delObject(id);\n } catch (err) {\n return void handler.sendError(responseId, err);\n }\n handler.sendInteger(responseId, 1);\n } else if (namespace === this.namespaceFile) {\n // Handle request to delete meta-data, we ignore it because\n // will be removed when data are deleted\n if (isMeta) {\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request to remove the file\n try {\n this._unlink(id, name);\n } catch (err) {\n return void handler.sendError(responseId, err);\n }\n handler.sendString(responseId, 'OK');\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`DEL-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n handler.on('exists', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendInteger(responseId, 0);\n }\n\n // Note: we only simulate single key existence check\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n let exists;\n try {\n exists = this._objectExists(id);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n handler.sendInteger(responseId, exists ? 1 : 0);\n } else if (namespace === this.namespaceFile) {\n let exists;\n try {\n exists = this._fileExists(id, name);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n handler.sendInteger(responseId, exists ? 1 : 0);\n } else if (namespace === this.namespaceSet) {\n // we are not using sets in simulator, so just say it exists\n return void handler.sendInteger(responseId, 1);\n } else {\n handler.sendError(responseId, new Error(`EXISTS-UNSUPPORTED for namespace ${namespace}`));\n }\n });\n\n // handle Redis \"SCAN\" request for objects namespace\n handler.on('scan', (data, responseId) => {\n if (!data || data.length < 3) {\n return void handler.sendArray(responseId, ['0', []]);\n }\n\n return this._handleScanOrKeys(handler, data[2], responseId, true);\n });\n\n // Handle Redis \"KEYS\" request for state namespace\n handler.on('keys', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendArray(responseId, []);\n }\n\n return this._handleScanOrKeys(handler, data[0], responseId);\n });\n\n // commands for redis SETS, just dummies\n handler.on('sadd', (data, responseId) => {\n return void handler.sendInteger(responseId, 1);\n });\n\n handler.on('srem', (data, responseId) => {\n return void handler.sendInteger(responseId, 1);\n });\n\n handler.on('eval', (data, responseId) => {\n return void handler.sendNull(responseId);\n });\n\n handler.on('sscan', (data, responseId) => {\n // for file DB it does the same as scan but data looks different\n if (!data || data.length < 4) {\n return void handler.sendArray(responseId, ['0', []]);\n }\n\n return this._handleScanOrKeys(handler, data[3], responseId, true);\n });\n\n // Handle Redis \"PSUBSCRIBE\" request for state, log and session namespace\n handler.on('psubscribe', (data, responseId) => {\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n this._subscribeConfigForClient(handler, id);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else if (namespace === this.namespaceMeta) {\n this._subscribeMeta(handler, id);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else if (namespace === this.namespaceFile) {\n this._subscribeFileForClient(handler, id, name);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else {\n handler.sendError(\n responseId,\n new Error(`PSUBSCRIBE-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"UNSUBSCRIBE\" request for state, log and session namespace\n handler.on('punsubscribe', (data, responseId) => {\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n this._unsubscribeConfigForClient(handler, id);\n handler.sendArray(responseId, ['punsubscribe', data[0], 1]);\n } else if (namespace === this.namespaceFile) {\n this._unsubscribeFileForClient(handler, id, name);\n handler.sendArray(responseId, ['punsubscribe', data[0], 1]);\n } else {\n handler.sendError(\n responseId,\n new Error(`PUNSUBSCRIBE-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"SUBSCRIBE\" ... currently mainly ignored\n handler.on('subscribe', (data, responseId) => {\n if (data[0].startsWith('__keyevent@')) {\n // we ignore these type of events because we publish expires anyway directly\n handler.sendArray(responseId, ['subscribe', data[0], 1]);\n } else {\n handler.sendError(responseId, new Error(`SUBSCRIBE-UNSUPPORTED for ${data[0]}`));\n }\n });\n\n // Handle Redis \"CONFIG\" ... currently mainly ignored\n handler.on('config', (data, responseId) => {\n const command = typeof data[0] === 'string' ? data[0].toLowerCase() : data[0].toString().toLowerCase();\n if (command === 'set' && data[1] === 'notify-keyspace-events') {\n // we ignore these type of commands for now, should only be to subscribe to keyspace events\n handler.sendString(responseId, 'OK');\n } else if (command === 'set' && data[1] === 'lua-time-limit') {\n // we ignore these type of commands for now, irrelevant\n handler.sendString(responseId, 'OK');\n } else {\n handler.sendError(responseId, new Error('CONFIG-UNSUPPORTED for ' + JSON.stringify(data)));\n }\n });\n\n // handle client SETNAME/GETNAME\n handler.on('client', (data, responseId) => {\n if (data[0] === 'setname' && typeof data[1] === 'string') {\n if (data[1] === '') {\n // on empty string redis sets null again and sends 'OK'\n connectionName = null;\n } else {\n connectionName = data[1];\n namespaceLog = connectionName;\n }\n handler.sendString(responseId, 'OK');\n } else if (data[0] === 'getname') {\n if (typeof connectionName === 'string' && connectionName !== '') {\n handler.sendString(responseId, connectionName);\n } else {\n // redis sends null if no name defined\n handler.sendNull(responseId);\n }\n } else {\n handler.sendError(responseId, new Error(`CLIENT-UNSUPPORTED for ${JSON.stringify(data)}`));\n }\n });\n\n handler.on('error', err => this.log.warn(`${namespaceLog} Redis objects: ${err}`));\n }\n\n /**\n * Return connected RedisHandlers/Connections\n * @returns {{}|*}\n */\n getClients() {\n return this.serverConnections;\n }\n\n /**\n * Destructor of the class. Called by shutting down.\n */\n async destroy() {\n if (this.server) {\n Object.keys(this.serverConnections).forEach(s => {\n this.serverConnections[s].close();\n delete this.serverConnections[s];\n });\n\n await new Promise(resolve => {\n if (!this.server) {\n return void resolve();\n }\n try {\n this.server.close(() => resolve());\n } catch (e) {\n console.log(e.message);\n resolve();\n }\n });\n }\n\n await super.destroy();\n }\n\n /**\n * Get keys matching pattern and send it to given responseId, for \"SCAN\" and \"KEYS\" - Objects and files supported\n *\n * @param handler RedisHandler instance\n * @param {string} pattern - pattern without namespace prefix\n * @param {number} responseId - Id where response will be sent to\n * @param {boolean} isScan - if used by \"SCAN\" this flag should be true\n * @private\n */\n _handleScanOrKeys(handler, pattern, responseId, isScan = false) {\n const { id, namespace, name, isMeta } = this._normalizeId(pattern);\n\n let response = [];\n if (namespace === this.namespaceObj || namespace === this.namespaceObjects) {\n try {\n response = this._getKeys(id).map(val => this.namespaceObj + val);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n\n // if scan, we send the cursor as first argument\n if (namespace !== this.namespaceObjects) {\n // When it was not the full DB namespace send out response\n return void handler.sendArray(responseId, isScan ? ['0', response] : response);\n }\n }\n if (namespace === this.namespaceFile || namespace === this.namespaceObjects) {\n // Handle request to get meta data keys\n if (isMeta === undefined) {\n let res;\n try {\n res = this._readDir(id, name);\n if (!res || !res.length) {\n res = [\n {\n file: '_data.json',\n stats: {},\n isDir: false,\n virtualFile: true,\n notExists: true\n }\n ];\n }\n } catch (e) {\n if (!e.message.endsWith(utils.ERRORS.ERROR_NOT_FOUND)) {\n return void handler.sendError(responseId, new Error(`ERROR readDir id=${id}: ${e.message}`));\n }\n res = [];\n }\n let baseName = name || '';\n if (baseName.length && !baseName.endsWith('/')) {\n baseName += '/';\n }\n res.forEach(arr => {\n let entryId = id;\n if (arr.isDir) {\n if (entryId === '' || entryId === '*') {\n entryId = arr.file;\n arr.file = '_data.json'; // We return a \"virtual file\" to mark the directory as existing\n } else {\n arr.file += '/_data.json'; // We return a \"virtual file\" to mark the directory as existing\n }\n }\n // We need to simulate the Meta data here, so return both\n response.push(this.getFileId(entryId, baseName + arr.file, true));\n response.push(this.getFileId(entryId, baseName + arr.file, false));\n });\n handler.sendArray(responseId, isScan ? ['0', response] : response); // send out file or full db response\n } else {\n // such a request should never happen\n handler.sendArray(responseId, isScan ? ['0', []] : []); // send out file or full db response\n }\n } else if (namespace === this.namespaceSet) {\n handler.sendArray(responseId, isScan ? ['0', []] : []); // send out empty array, we have no sets\n } else {\n handler.sendError(\n responseId,\n new Error(`${isScan ? 'SCAN' : 'KEYS'}-UNSUPPORTED for namespace ${namespace}: Pattern=${pattern}`)\n );\n }\n }\n\n /**\n * Initialize RedisHandler for a new network connection\n * @param socket Network socket\n * @private\n */\n _initSocket(socket) {\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(this.namespace + ' Handling new Redis Objects connection');\n }\n const options = {\n log: this.log,\n logScope: `${this.settings.namespace || ''} Objects`,\n handleAsBuffers: true,\n enhancedLogging: this.settings.connection.enhancedLogging\n };\n const handler = new RedisHandler(socket, options);\n this._socketEvents(handler);\n\n this.serverConnections[socket.remoteAddress + ':' + socket.remotePort] = handler;\n socket.on('close', () => {\n if (this.serverConnections[socket.remoteAddress + ':' + socket.remotePort]) {\n delete this.serverConnections[socket.remoteAddress + ':' + socket.remotePort];\n }\n });\n }\n\n /**\n * Initialize Redis Server\n * @param settings Settings object\n * @private\n * @return {Promise<void>}\n */\n _initRedisServer(settings) {\n return new Promise((resolve, reject) => {\n if (settings.secure) {\n reject(new Error('Secure Redis unsupported for File-DB'));\n }\n try {\n this.server = net.createServer();\n this.server.on('error', err =>\n this.log.info(\n `${this.namespace} ${settings.secure ? 'Secure ' : ''} Error inMem-objects listening on port ${\n settings.port || 9001\n }: ${err}`\n )\n );\n this.server.on('connection', socket => this._initSocket(socket));\n\n this.server.listen(\n settings.port || 9001,\n settings.host === 'localhost' ? getLocalAddress() : settings.host ? settings.host : undefined,\n () => resolve()\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Objects DB in memory - Server with Redis protocol\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport net from 'node:net';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { objectsUtils as utils } from '@iobroker/db-objects-redis';\nimport { tools } from '@iobroker/db-base';\nimport { getLocalAddress } from '@iobroker/js-controller-common-db/tools';\nimport { EXIT_CODES } from '@iobroker/js-controller-common-db';\n\nimport { RedisHandler } from '@iobroker/db-base';\nimport { ObjectsInMemoryFileDB } from './objectsInMemFileDB.js';\n\n// settings = {\n// change: function (id, state) {},\n// connected: function (nameOfServer) {},\n// logger: {\n// silly: function (msg) {},\n// debug: function (msg) {},\n// info: function (msg) {},\n// warn: function (msg) {},\n// error: function (msg) {}\n// },\n// connection: {\n// dataDir: 'relative path'\n// },\n// auth: null, //unused\n// secure: true/false,\n// certificates: as required by createServer\n// port: 9001,\n// host: localhost\n// };\n//\n\n/**\n * This class inherits statesInMemoryFileDB class and adds redis communication layer\n * to access the methods via redis protocol\n **/\nexport class ObjectsInMemoryServer extends ObjectsInMemoryFileDB {\n /**\n * Constructor\n * @param settings State and InMem-DB settings\n */\n constructor(settings) {\n super(settings);\n\n this.serverConnections = {};\n this.namespaceObjects =\n (this.settings.redisNamespace || (settings.connection && settings.connection.redisNamespace) || 'cfg') +\n '.';\n this.namespaceFile = this.namespaceObjects + 'f.';\n this.namespaceObj = this.namespaceObjects + 'o.';\n this.namespaceSet = this.namespaceObjects + 's.';\n this.namespaceSetLen = this.namespaceSet.length;\n\n // this.namespaceObjectsLen = this.namespaceObjects.length;\n this.namespaceFileLen = this.namespaceFile.length;\n this.namespaceObjLen = this.namespaceObj.length;\n this.namespaceMeta = `${this.settings.namespaceMeta || 'meta'}.`;\n this.namespaceMetaLen = this.namespaceMeta.length;\n\n this.knownScripts = {};\n\n this.normalizeFileRegex1 = new RegExp('^(.*)\\\\$%\\\\$(.*)\\\\$%\\\\$(meta|data)$');\n this.normalizeFileRegex2 = new RegExp('^(.*)\\\\$%\\\\$(.*)\\\\/?\\\\*$');\n\n this.open()\n .then(() => {\n return this._initRedisServer(this.settings.connection);\n })\n .then(() => {\n this.log.debug(\n this.namespace +\n ' ' +\n (settings.secure ? 'Secure ' : '') +\n ' Redis inMem-objects listening on port ' +\n (settings.port || 9001)\n );\n\n if (typeof this.settings.connected === 'function') {\n setImmediate(() => this.settings.connected());\n }\n })\n .catch(e => {\n this.log.error(\n `${this.namespace} Cannot start inMem-objects on port ${settings.port || 9001}: ${e.message}`\n );\n process.exit(EXIT_CODES.NO_CONNECTION_TO_OBJ_DB);\n });\n }\n\n /**\n * Separate Namespace from ID and return both\n * @param idWithNamespace ID or Array of IDs containing a redis namespace and the real ID\n * @returns {{namespace: (string); id: string; name?: string; isMeta?: boolean}} Object with namespace and the\n * ID/Array of IDs without the namespace\n * @private\n */\n _normalizeId(idWithNamespace) {\n let ns = this.namespaceObjects;\n let id = null;\n let name = '';\n let isMeta;\n if (Array.isArray(idWithNamespace)) {\n const ids = [];\n idWithNamespace.forEach(el => {\n const { id, namespace } = this._normalizeId(el);\n ids.push(id);\n ns = namespace; // we ignore the pot. case from arrays with different namespaces\n });\n id = ids;\n } else if (typeof idWithNamespace === 'string') {\n id = idWithNamespace;\n if (idWithNamespace.startsWith(this.namespaceObjects)) {\n let idx = -1;\n if (idWithNamespace.startsWith(this.namespaceObj)) {\n idx = this.namespaceObjLen;\n } else if (idWithNamespace.startsWith(this.namespaceFile)) {\n idx = this.namespaceFileLen;\n } else if (idWithNamespace.startsWith(this.namespaceSet)) {\n idx = this.namespaceSetLen;\n }\n\n if (idx !== -1) {\n ns = idWithNamespace.substr(0, idx);\n id = idWithNamespace.substr(idx);\n }\n if (ns === this.namespaceFile) {\n let fileIdDetails = id.match(this.normalizeFileRegex1);\n if (fileIdDetails) {\n id = fileIdDetails[1];\n name = fileIdDetails[2] || '';\n isMeta = fileIdDetails[3] === 'meta';\n } else {\n fileIdDetails = id.match(this.normalizeFileRegex2);\n if (fileIdDetails) {\n id = fileIdDetails[1];\n name = fileIdDetails[2] || '';\n isMeta = undefined;\n } else {\n name = '';\n isMeta = undefined;\n }\n }\n }\n } else if (idWithNamespace.startsWith(this.namespaceMeta)) {\n const idx = this.namespaceMetaLen;\n if (idx !== -1) {\n ns = idWithNamespace.substr(0, idx);\n id = idWithNamespace.substr(idx);\n }\n }\n }\n return { id, namespace: ns, name, isMeta };\n }\n\n /**\n * Publish a subscribed value to one of the redis connections in redis format\n * @param client Instance of RedisHandler\n * @param type Type of subscribed key\n * @param id Subscribed ID\n * @param obj Object to publish\n * @returns {number} Publish counter 0 or 1 depending on if send out or not\n */\n publishToClients(client, type, id, obj) {\n if (!client._subscribe || !client._subscribe[type]) {\n return 0;\n }\n const s = client._subscribe[type];\n\n const found = s.find(sub => sub.regex.test(id));\n\n if (found) {\n if (type === 'meta') {\n this.log.silly(`${this.namespace} Redis Publish Meta ${id}=${obj}`);\n const sendPattern = this.namespaceMeta + found.pattern;\n const sendId = this.namespaceMeta + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, obj]);\n } else if (type === 'files') {\n const objString = JSON.stringify(obj);\n this.log.silly(`${this.namespace} Redis Publish File ${id}=${objString}`);\n const sendPattern = this.namespaceFile + found.pattern;\n const sendId = this.namespaceFile + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, objString]);\n } else {\n const objString = JSON.stringify(obj);\n this.log.silly(`${this.namespace} Redis Publish Object ${id}=${objString}`);\n const sendPattern = (type === 'objects' ? '' : this.namespaceObjects) + found.pattern;\n const sendId = (type === 'objects' ? this.namespaceObj : this.namespaceObjects) + id;\n client.sendArray(null, ['pmessage', sendPattern, sendId, objString]);\n }\n return 1;\n }\n return 0;\n }\n\n /**\n * Generate ID for a File\n * @param id ID of the File\n * @param name Name of the file\n * @param isMeta generate a META ID or a Data ID?\n * @returns {string} File-ID\n */\n getFileId(id, name, isMeta) {\n // e.g. ekey.admin and admin/ekey.png\n if (id.endsWith('.admin')) {\n if (name.startsWith('admin/')) {\n name = name.replace(/^admin\\//, '');\n } else if (name.match(/^iobroker.[-\\d\\w]\\/admin\\//i)) {\n // e.g. ekey.admin and iobroker.ekey/admin/ekey.png\n name = name.replace(/^iobroker.[-\\d\\w]\\/admin\\//i, '');\n }\n }\n\n return this.namespaceFile + id + '$%$' + name + (isMeta !== undefined ? (isMeta ? '$%$meta' : '$%$data') : '');\n }\n\n /**\n * Register all event listeners for Handler and implement the relevant logic\n * @param handler RedisHandler instance\n * @private\n */\n _socketEvents(handler) {\n let connectionName = null;\n let namespaceLog = this.namespace;\n\n // Handle Redis \"INFO\" request\n handler.on('info', (_data, responseId) => {\n let infoString = '# Server\\r\\n';\n infoString += 'redis_version:3.0.0-iobroker\\r\\n';\n infoString += '# Clients\\r\\n';\n infoString += '# Memory\\r\\n';\n infoString += '# Persistence\\r\\n';\n infoString += '# Stats\\r\\n';\n infoString += '# Replication\\r\\n';\n infoString += '# CPU\\r\\n';\n infoString += '# Cluster\\r\\n';\n infoString += '# Keyspace\\r\\n';\n infoString += `db0:keys=${Object.keys(this.dataset).length},expires=0,avg_ttl=98633637897`;\n handler.sendBulk(responseId, infoString);\n });\n\n // Handle Redis \"QUIT\" request\n handler.on('quit', (_data, responseId) => {\n this.log.silly(namespaceLog + ' Redis QUIT received, close connection');\n handler.sendString(responseId, 'OK');\n handler.close();\n });\n\n // Handle Redis \"SCRIPT\" request\n handler.on('script', (data, responseId) => {\n data[0] = data[0].toLowerCase();\n if (data[0] === 'exists') {\n data.shift();\n const scripts = [];\n data.forEach(checksum => scripts.push(this.knownScripts[checksum] ? 1 : 0));\n handler.sendArray(responseId, scripts);\n } else if (data[0] === 'load') {\n const shasum = crypto.createHash('sha1');\n const buf = Buffer.from(data[1]);\n shasum.update(buf);\n const scriptChecksum = shasum.digest('hex');\n\n const scriptDesign = data[1].match(/^-- design: ([a-z0-9A-Z-.]+)\\s/m);\n const scriptFunc = data[1].match(/^-- func: (.+)$/m);\n if (scriptDesign && scriptDesign[1]) {\n const design = scriptDesign[1];\n let search = null;\n const scriptSearch = data[1].match(/^-- search: ([a-z0-9A-Z-.]*)\\s/m);\n if (scriptSearch && scriptSearch[1]) {\n search = scriptSearch[1];\n }\n\n this.knownScripts[scriptChecksum] = { design: design, search: search };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register View LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else if (scriptFunc && scriptFunc[1]) {\n this.knownScripts[scriptChecksum] = { func: scriptFunc[1] };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register Func LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else if (data[1].includes('-- REDLOCK SCRIPT')) {\n // redlock scripts are currently not needed for Simulator\n this.knownScripts[scriptChecksum] = { redlock: true };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Register Func LUA Script: ${scriptChecksum} = ${JSON.stringify(\n this.knownScripts[scriptChecksum]\n )}`\n );\n }\n handler.sendBulk(responseId, scriptChecksum);\n } else {\n handler.sendError(responseId, new Error(`Unknown LUA script ${data[1]}`));\n }\n } else {\n handler.sendError(responseId, new Error(`Unsupported Script command ${data[0]}`));\n }\n });\n\n // Handle Redis \"EVALSHA\" request\n handler.on('evalsha', (data, responseId) => {\n if (!this.knownScripts[data[0]]) {\n return void handler.sendError(responseId, new Error(`Unknown Script ${data[0]}`));\n }\n if (this.knownScripts[data[0]].design) {\n const scriptDesign = this.knownScripts[data[0]].design;\n if (typeof data[2] === 'string' && data[2].startsWith(this.namespaceObj) && data.length > 4) {\n let scriptSearch = this.knownScripts[data[0]].search;\n if (scriptDesign === 'system' && !scriptSearch && data[5]) {\n scriptSearch = data[5];\n }\n if (!scriptSearch) {\n scriptSearch = 'state';\n }\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(\n `${namespaceLog} Script transformed into getObjectView: design=${scriptDesign}, search=${scriptSearch}`\n );\n }\n let objs;\n try {\n objs = this._getObjectView(scriptDesign, scriptSearch, {\n startkey: data[3],\n endkey: data[4],\n include_docs: true\n });\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`_getObjectView Error for ${scriptDesign}/${scriptSearch}: ${err.message}`)\n );\n }\n\n const res = objs.rows.map(obj => JSON.stringify(this.dataset[obj.value._id || obj.id]));\n handler.sendArray(responseId, res);\n }\n } else if (this.knownScripts[data[0]].func && data.length > 4) {\n const scriptFunc = { map: this.knownScripts[data[0]].func.replace('%1', data[5]) };\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(`${namespaceLog} Script transformed into _applyView: func=${scriptFunc.map}`);\n }\n const objs = this._applyView(scriptFunc, {\n startkey: data[3],\n endkey: data[4],\n include_docs: true\n });\n const res = objs.rows.map(obj => JSON.stringify(this.dataset[obj.value._id || obj.id]));\n\n return void handler.sendArray(responseId, res);\n } else if (this.knownScripts[data[0]].redlock) {\n // just return a dummy\n return void handler.sendArray(responseId, [0]);\n } else {\n handler.sendError(responseId, new Error(`Unknown LUA script eval call ${JSON.stringify(data)}`));\n }\n });\n\n // Handle Redis \"PUBLISH\" request\n handler.on('publish', (data, responseId) => {\n const { id, namespace } = this._normalizeId(data[0]);\n\n if (\n namespace === this.namespaceObj ||\n namespace === this.namespaceMeta ||\n namespace === this.namespaceFile\n ) {\n // a \"set\" always comes afterwards, so do not publish\n return void handler.sendInteger(responseId, 0); // do not publish for now\n }\n const publishCount = this.publishAll(namespace.substr(0, namespace.length - 1), id, JSON.parse(data[1]));\n handler.sendInteger(responseId, publishCount);\n });\n\n // Handle Redis \"MGET\" requests\n handler.on('mget', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendArray(responseId, []);\n }\n const { namespace, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n const keys = [];\n data.forEach(dataId => {\n const { id, namespace } = this._normalizeId(dataId);\n if (namespace !== this.namespaceObj) {\n keys.push(null);\n this.log.warn(\n `${namespaceLog} Got MGET request for non Object-ID in Objects-ID chunk for ${namespace} / ${dataId}`\n );\n return;\n }\n keys.push(id);\n });\n let result;\n try {\n result = this._getObjects(keys);\n } catch (err) {\n return void handler.sendError(responseId, new Error('ERROR _getObjects: ' + err.message));\n }\n result = result.map(el => (el ? JSON.stringify(el) : null));\n handler.sendArray(responseId, result);\n } else if (namespace === this.namespaceFile) {\n // Handle request for Meta data for files\n if (isMeta) {\n const response = [];\n data.forEach(dataId => {\n const { id, namespace, name } = this._normalizeId(dataId);\n if (namespace !== this.namespaceFile) {\n response.push(null);\n this.log.warn(\n `${namespaceLog} Got MGET request for non File ID in File-ID chunk for ${dataId}`\n );\n return;\n }\n this._loadFileSettings(id);\n if (!this.fileOptions[id] || !this.fileOptions[id][name]) {\n response.push(null);\n return;\n }\n const obj = this._clone(this.fileOptions[id][name]);\n try {\n // @ts-ignore\n obj.stats = fs.statSync(path.join(this.objectsDir, id, name));\n } catch (err) {\n if (!name.endsWith('/_data.json')) {\n this.log.warn(\n `${namespaceLog} Got MGET request for non existing file ${dataId}, err: ${err.message}`\n );\n }\n response.push(null);\n return;\n }\n response.push(JSON.stringify(obj));\n });\n handler.sendArray(responseId, response);\n } else {\n // Handle request for File data\n handler.sendError(responseId, new Error('MGET-UNSUPPORTED for file data'));\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`MGET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"GET\" requests\n handler.on('get', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n const result = this._getObject(id);\n if (!result) {\n handler.sendNull(responseId);\n } else {\n handler.sendBulk(responseId, JSON.stringify(result));\n }\n } else if (namespace === this.namespaceFile) {\n // Handle request for Meta data for files\n if (isMeta) {\n let stats;\n try {\n stats = fs.statSync(path.join(this.objectsDir, id, name));\n } catch {\n return void handler.sendNull(responseId);\n }\n if (stats.isDirectory()) {\n return void handler.sendBulk(\n responseId,\n JSON.stringify({\n file: name,\n stats: {},\n isDir: true\n })\n );\n }\n this._loadFileSettings(id);\n if (!this.fileOptions[id] || !this.fileOptions[id][name]) {\n return void handler.sendNull(responseId);\n }\n\n let obj = this._clone(this.fileOptions[id][name]);\n if (typeof obj !== 'object') {\n obj = {\n mimeType: obj,\n acl: {\n owner:\n (this.defaultNewAcl && this.defaultNewAcl.owner) || utils.CONSTS.SYSTEM_ADMIN_USER,\n ownerGroup:\n (this.defaultNewAcl && this.defaultNewAcl.ownerGroup) ||\n utils.CONSTS.SYSTEM_ADMIN_GROUP,\n permissions:\n (this.defaultNewAcl && this.defaultNewAcl.file.permissions) ||\n utils.CONSTS.ACCESS_USER_ALL |\n utils.CONSTS.ACCESS_GROUP_ALL |\n utils.CONSTS.ACCESS_EVERY_ALL // 777\n }\n };\n }\n obj.stats = stats;\n handler.sendBulk(responseId, JSON.stringify(obj));\n } else {\n // Handle request for File data\n let data;\n try {\n data = this._readFile(id, name);\n } catch {\n return void handler.sendNull(responseId);\n }\n if (data.fileContent === undefined || data.fileContent === null) {\n return void handler.sendNull(responseId);\n }\n let fileData = data.fileContent;\n if (!Buffer.isBuffer(fileData) && tools.isObject(fileData)) {\n // if its an invalid object, stringify it and log warning\n fileData = JSON.stringify(fileData);\n this.log.warn(\n `${namespaceLog} Data of \"${id}/${name}\" has invalid structure at file data request: ${fileData}`\n );\n }\n handler.sendBufBulk(responseId, Buffer.from(fileData));\n }\n } else if (namespace === this.namespaceMeta) {\n // special handling for the primaryHost\n if (id === 'objects.primaryHost') {\n // we are the server -> we are primary\n handler.sendString(this.settings.hostname);\n } else {\n const result = this.getMeta(id);\n if (result === undefined || result === null) {\n handler.sendNull(responseId);\n } else {\n handler.sendBulk(responseId, result);\n }\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`GET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"SET\" requests\n handler.on('set', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n try {\n const obj = JSON.parse(data[1].toString('utf-8'));\n this._setObjectDirect(id, obj);\n } catch (err) {\n return void handler.sendError(responseId, new Error(`ERROR setObject id=${id}: ${err.message}`));\n }\n handler.sendString(responseId, 'OK');\n } else if (namespace === this.namespaceFile) {\n // Handle request to set meta-data, we ignore it because\n // will be set when data are written\n if (isMeta) {\n this._loadFileSettings(id);\n\n try {\n fs.ensureDirSync(path.join(this.objectsDir, id, path.dirname(name)));\n\n // only set if the meta-object is already/still existing\n if (this.fileOptions[id]) {\n this.fileOptions[id][name] = JSON.parse(data[1].toString('utf-8'));\n fs.writeFileSync(\n path.join(this.objectsDir, id, '_data.json'),\n JSON.stringify(this.fileOptions[id])\n );\n }\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`ERROR writeFile-Meta id=${id}: ${err.message}`)\n );\n }\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request to write the file\n try {\n this._writeFile(id, name, data[1]);\n } catch (err) {\n return void handler.sendError(\n responseId,\n new Error(`ERROR writeFile id=${id}: ${err.message}`)\n );\n }\n handler.sendString(responseId, 'OK');\n }\n } else if (namespace === this.namespaceMeta) {\n this.setMeta(id, data[1].toString('utf-8'));\n handler.sendString(responseId, 'OK');\n } else {\n handler.sendError(\n responseId,\n new Error(`SET-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"RENAME\" requests\n handler.on('rename', (data, responseId) => {\n const oldDetails = this._normalizeId(data[0]);\n const newDetails = this._normalizeId(data[1]);\n\n if (oldDetails.namespace === this.namespaceFile) {\n if (oldDetails.id !== newDetails.id) {\n return void handler.sendError(\n responseId,\n new Error('ERROR renameObject: id needs to stay the same')\n );\n }\n\n // Handle request for Meta data for files\n if (oldDetails.isMeta) {\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request for File data\n try {\n this._rename(oldDetails.id, oldDetails.name, newDetails.name);\n } catch {\n return void handler.sendNull(responseId);\n }\n handler.sendString(responseId, 'OK');\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`RENAME-UNSUPPORTED for namespace ${oldDetails.namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"DEL\" request for state and session namespace\n handler.on('del', (data, responseId) => {\n const { id, namespace, name, isMeta } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n try {\n this._delObject(id);\n } catch (err) {\n return void handler.sendError(responseId, err);\n }\n handler.sendInteger(responseId, 1);\n } else if (namespace === this.namespaceFile) {\n // Handle request to delete meta-data, we ignore it because\n // will be removed when data are deleted\n if (isMeta) {\n handler.sendString(responseId, 'OK');\n } else {\n // Handle request to remove the file\n try {\n this._unlink(id, name);\n } catch (err) {\n return void handler.sendError(responseId, err);\n }\n handler.sendString(responseId, 'OK');\n }\n } else {\n handler.sendError(\n responseId,\n new Error(`DEL-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n handler.on('exists', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendInteger(responseId, 0);\n }\n\n // Note: we only simulate single key existence check\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n let exists;\n try {\n exists = this._objectExists(id);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n handler.sendInteger(responseId, exists ? 1 : 0);\n } else if (namespace === this.namespaceFile) {\n let exists;\n try {\n exists = this._fileExists(id, name);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n handler.sendInteger(responseId, exists ? 1 : 0);\n } else if (namespace === this.namespaceSet) {\n // we are not using sets in simulator, so just say it exists\n return void handler.sendInteger(responseId, 1);\n } else {\n handler.sendError(responseId, new Error(`EXISTS-UNSUPPORTED for namespace ${namespace}`));\n }\n });\n\n // handle Redis \"SCAN\" request for objects namespace\n handler.on('scan', (data, responseId) => {\n if (!data || data.length < 3) {\n return void handler.sendArray(responseId, ['0', []]);\n }\n\n return this._handleScanOrKeys(handler, data[2], responseId, true);\n });\n\n // Handle Redis \"KEYS\" request for state namespace\n handler.on('keys', (data, responseId) => {\n if (!data || !data.length) {\n return void handler.sendArray(responseId, []);\n }\n\n return this._handleScanOrKeys(handler, data[0], responseId);\n });\n\n // commands for redis SETS, just dummies\n handler.on('sadd', (data, responseId) => {\n return void handler.sendInteger(responseId, 1);\n });\n\n handler.on('srem', (data, responseId) => {\n return void handler.sendInteger(responseId, 1);\n });\n\n handler.on('eval', (data, responseId) => {\n return void handler.sendNull(responseId);\n });\n\n handler.on('sscan', (data, responseId) => {\n // for file DB it does the same as scan but data looks different\n if (!data || data.length < 4) {\n return void handler.sendArray(responseId, ['0', []]);\n }\n\n return this._handleScanOrKeys(handler, data[3], responseId, true);\n });\n\n // Handle Redis \"PSUBSCRIBE\" request for state, log and session namespace\n handler.on('psubscribe', (data, responseId) => {\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n this._subscribeConfigForClient(handler, id);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else if (namespace === this.namespaceMeta) {\n this._subscribeMeta(handler, id);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else if (namespace === this.namespaceFile) {\n this._subscribeFileForClient(handler, id, name);\n handler.sendArray(responseId, ['psubscribe', data[0], 1]);\n } else {\n handler.sendError(\n responseId,\n new Error(`PSUBSCRIBE-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"UNSUBSCRIBE\" request for state, log and session namespace\n handler.on('punsubscribe', (data, responseId) => {\n const { id, namespace, name } = this._normalizeId(data[0]);\n\n if (namespace === this.namespaceObj) {\n this._unsubscribeConfigForClient(handler, id);\n handler.sendArray(responseId, ['punsubscribe', data[0], 1]);\n } else if (namespace === this.namespaceFile) {\n this._unsubscribeFileForClient(handler, id, name);\n handler.sendArray(responseId, ['punsubscribe', data[0], 1]);\n } else {\n handler.sendError(\n responseId,\n new Error(`PUNSUBSCRIBE-UNSUPPORTED for namespace ${namespace}: Data=${JSON.stringify(data)}`)\n );\n }\n });\n\n // Handle Redis \"SUBSCRIBE\" ... currently mainly ignored\n handler.on('subscribe', (data, responseId) => {\n if (data[0].startsWith('__keyevent@')) {\n // we ignore these type of events because we publish expires anyway directly\n handler.sendArray(responseId, ['subscribe', data[0], 1]);\n } else {\n handler.sendError(responseId, new Error(`SUBSCRIBE-UNSUPPORTED for ${data[0]}`));\n }\n });\n\n // Handle Redis \"CONFIG\" ... currently mainly ignored\n handler.on('config', (data, responseId) => {\n const command = typeof data[0] === 'string' ? data[0].toLowerCase() : data[0].toString().toLowerCase();\n if (command === 'set' && data[1] === 'notify-keyspace-events') {\n // we ignore these type of commands for now, should only be to subscribe to keyspace events\n handler.sendString(responseId, 'OK');\n } else if (command === 'set' && data[1] === 'lua-time-limit') {\n // we ignore these type of commands for now, irrelevant\n handler.sendString(responseId, 'OK');\n } else {\n handler.sendError(responseId, new Error('CONFIG-UNSUPPORTED for ' + JSON.stringify(data)));\n }\n });\n\n // handle client SETNAME/GETNAME\n handler.on('client', (data, responseId) => {\n if (data[0] === 'setname' && typeof data[1] === 'string') {\n if (data[1] === '') {\n // on empty string redis sets null again and sends 'OK'\n connectionName = null;\n } else {\n connectionName = data[1];\n namespaceLog = connectionName;\n }\n handler.sendString(responseId, 'OK');\n } else if (data[0] === 'getname') {\n if (typeof connectionName === 'string' && connectionName !== '') {\n handler.sendString(responseId, connectionName);\n } else {\n // redis sends null if no name defined\n handler.sendNull(responseId);\n }\n } else {\n handler.sendError(responseId, new Error(`CLIENT-UNSUPPORTED for ${JSON.stringify(data)}`));\n }\n });\n\n handler.on('error', err => this.log.warn(`${namespaceLog} Redis objects: ${err}`));\n }\n\n /**\n * Return connected RedisHandlers/Connections\n * @returns {{}|*}\n */\n getClients() {\n return this.serverConnections;\n }\n\n /**\n * Destructor of the class. Called by shutting down.\n */\n async destroy() {\n if (this.server) {\n Object.keys(this.serverConnections).forEach(s => {\n this.serverConnections[s].close();\n delete this.serverConnections[s];\n });\n\n await new Promise(resolve => {\n if (!this.server) {\n return void resolve();\n }\n try {\n this.server.close(() => resolve());\n } catch (e) {\n console.log(e.message);\n resolve();\n }\n });\n }\n\n await super.destroy();\n }\n\n /**\n * Get keys matching pattern and send it to given responseId, for \"SCAN\" and \"KEYS\" - Objects and files supported\n *\n * @param handler RedisHandler instance\n * @param {string} pattern - pattern without namespace prefix\n * @param {number} responseId - Id where response will be sent to\n * @param {boolean} isScan - if used by \"SCAN\" this flag should be true\n * @private\n */\n _handleScanOrKeys(handler, pattern, responseId, isScan = false) {\n const { id, namespace, name, isMeta } = this._normalizeId(pattern);\n\n let response = [];\n if (namespace === this.namespaceObj || namespace === this.namespaceObjects) {\n try {\n response = this._getKeys(id).map(val => this.namespaceObj + val);\n } catch (e) {\n return void handler.sendError(responseId, e);\n }\n\n // if scan, we send the cursor as first argument\n if (namespace !== this.namespaceObjects) {\n // When it was not the full DB namespace send out response\n return void handler.sendArray(responseId, isScan ? ['0', response] : response);\n }\n }\n if (namespace === this.namespaceFile || namespace === this.namespaceObjects) {\n // Handle request to get meta data keys\n if (isMeta === undefined) {\n let res;\n try {\n res = this._readDir(id, name);\n if (!res || !res.length) {\n res = [\n {\n file: '_data.json',\n stats: {},\n isDir: false,\n virtualFile: true,\n notExists: true\n }\n ];\n }\n } catch (e) {\n if (!e.message.endsWith(utils.ERRORS.ERROR_NOT_FOUND)) {\n return void handler.sendError(responseId, new Error(`ERROR readDir id=${id}: ${e.message}`));\n }\n res = [];\n }\n let baseName = name || '';\n if (baseName.length && !baseName.endsWith('/')) {\n baseName += '/';\n }\n res.forEach(arr => {\n let entryId = id;\n if (arr.isDir) {\n if (entryId === '' || entryId === '*') {\n entryId = arr.file;\n arr.file = '_data.json'; // We return a \"virtual file\" to mark the directory as existing\n } else {\n arr.file += '/_data.json'; // We return a \"virtual file\" to mark the directory as existing\n }\n }\n // We need to simulate the Meta data here, so return both\n response.push(this.getFileId(entryId, baseName + arr.file, true));\n response.push(this.getFileId(entryId, baseName + arr.file, false));\n });\n handler.sendArray(responseId, isScan ? ['0', response] : response); // send out file or full db response\n } else {\n // such a request should never happen\n handler.sendArray(responseId, isScan ? ['0', []] : []); // send out file or full db response\n }\n } else if (namespace === this.namespaceSet) {\n handler.sendArray(responseId, isScan ? ['0', []] : []); // send out empty array, we have no sets\n } else {\n handler.sendError(\n responseId,\n new Error(`${isScan ? 'SCAN' : 'KEYS'}-UNSUPPORTED for namespace ${namespace}: Pattern=${pattern}`)\n );\n }\n }\n\n /**\n * Initialize RedisHandler for a new network connection\n * @param socket Network socket\n * @private\n */\n _initSocket(socket) {\n if (this.settings.connection.enhancedLogging) {\n this.log.silly(this.namespace + ' Handling new Redis Objects connection');\n }\n const options = {\n log: this.log,\n logScope: `${this.settings.namespace || ''} Objects`,\n handleAsBuffers: true,\n enhancedLogging: this.settings.connection.enhancedLogging\n };\n const handler = new RedisHandler(socket, options);\n this._socketEvents(handler);\n\n this.serverConnections[socket.remoteAddress + ':' + socket.remotePort] = handler;\n socket.on('close', () => {\n if (this.serverConnections[socket.remoteAddress + ':' + socket.remotePort]) {\n delete this.serverConnections[socket.remoteAddress + ':' + socket.remotePort];\n }\n });\n }\n\n /**\n * Initialize Redis Server\n * @param settings Settings object\n * @private\n * @return {Promise<void>}\n */\n _initRedisServer(settings) {\n return new Promise((resolve, reject) => {\n if (settings.secure) {\n reject(new Error('Secure Redis unsupported for File-DB'));\n }\n try {\n this.server = net.createServer();\n this.server.on('error', err =>\n this.log.info(\n `${this.namespace} ${settings.secure ? 'Secure ' : ''} Error inMem-objects listening on port ${\n settings.port || 9001\n }: ${err}`\n )\n );\n this.server.on('connection', socket => this._initSocket(socket));\n\n this.server.listen(\n settings.port || 9001,\n settings.host === 'localhost' ? getLocalAddress() : settings.host ? settings.host : undefined,\n () => resolve()\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AASA,sBAAgB;AAChB,sBAAe;AACf,uBAAiB;AACjB,yBAAmB;AACnB,8BAAsC;AACtC,qBAAsB;AACtB,mBAAgC;AAChC,qCAA2B;AAE3B,IAAAA,kBAA6B;AAC7B,gCAAsC;AA2BhC,MAAO,8BAA8B,gDAAqB;EAK5D,YAAY,UAAQ;AAChB,UAAM,QAAQ;AAEd,SAAK,oBAAoB,CAAA;AACzB,SAAK,oBACA,KAAK,SAAS,kBAAmB,SAAS,cAAc,SAAS,WAAW,kBAAmB,SAChG;AACJ,SAAK,gBAAgB,KAAK,mBAAmB;AAC7C,SAAK,eAAe,KAAK,mBAAmB;AAC5C,SAAK,eAAe,KAAK,mBAAmB;AAC5C,SAAK,kBAAkB,KAAK,aAAa;AAGzC,SAAK,mBAAmB,KAAK,cAAc;AAC3C,SAAK,kBAAkB,KAAK,aAAa;AACzC,SAAK,gBAAgB,GAAG,KAAK,SAAS,iBAAiB;AACvD,SAAK,mBAAmB,KAAK,cAAc;AAE3C,SAAK,eAAe,CAAA;AAEpB,SAAK,sBAAsB,IAAI,OAAO,qCAAqC;AAC3E,SAAK,sBAAsB,IAAI,OAAO,0BAA0B;AAEhE,SAAK,KAAI,EACJ,KAAK,MAAK;AACP,aAAO,KAAK,iBAAiB,KAAK,SAAS,UAAU;IACzD,CAAC,EACA,KAAK,MAAK;AACP,WAAK,IAAI,MACL,KAAK,YACD,OACC,SAAS,SAAS,YAAY,MAC/B,6CACC,SAAS,QAAQ,KAAK;AAG/B,UAAI,OAAO,KAAK,SAAS,cAAc,YAAY;AAC/C,qBAAa,MAAM,KAAK,SAAS,UAAS,CAAE;MAChD;IACJ,CAAC,EACA,MAAM,OAAI;AACP,WAAK,IAAI,MACL,GAAG,KAAK,gDAAgD,SAAS,QAAQ,SAAS,EAAE,SAAS;AAEjG,cAAQ,KAAK,0CAAW,uBAAuB;IACnD,CAAC;EACT;EASA,aAAa,iBAAe;AACxB,QAAI,KAAK,KAAK;AACd,QAAI,KAAK;AACT,QAAI,OAAO;AACX,QAAI;AACJ,QAAI,MAAM,QAAQ,eAAe,GAAG;AAChC,YAAM,MAAM,CAAA;AACZ,sBAAgB,QAAQ,QAAK;AACzB,cAAM,EAAE,IAAAC,KAAI,UAAS,IAAK,KAAK,aAAa,EAAE;AAC9C,YAAI,KAAKA,GAAE;AACX,aAAK;MACT,CAAC;AACD,WAAK;IACT,WAAW,OAAO,oBAAoB,UAAU;AAC5C,WAAK;AACL,UAAI,gBAAgB,WAAW,KAAK,gBAAgB,GAAG;AACnD,YAAI,MAAM;AACV,YAAI,gBAAgB,WAAW,KAAK,YAAY,GAAG;AAC/C,gBAAM,KAAK;QACf,WAAW,gBAAgB,WAAW,KAAK,aAAa,GAAG;AACvD,gBAAM,KAAK;QACf,WAAW,gBAAgB,WAAW,KAAK,YAAY,GAAG;AACtD,gBAAM,KAAK;QACf;AAEA,YAAI,QAAQ,IAAI;AACZ,eAAK,gBAAgB,OAAO,GAAG,GAAG;AAClC,eAAK,gBAAgB,OAAO,GAAG;QACnC;AACA,YAAI,OAAO,KAAK,eAAe;AAC3B,cAAI,gBAAgB,GAAG,MAAM,KAAK,mBAAmB;AACrD,cAAI,eAAe;AACf,iBAAK,cAAc;AACnB,mBAAO,cAAc,MAAM;AAC3B,qBAAS,cAAc,OAAO;UAClC,OAAO;AACH,4BAAgB,GAAG,MAAM,KAAK,mBAAmB;AACjD,gBAAI,eAAe;AACf,mBAAK,cAAc;AACnB,qBAAO,cAAc,MAAM;AAC3B,uBAAS;YACb,OAAO;AACH,qBAAO;AACP,uBAAS;YACb;UACJ;QACJ;MACJ,WAAW,gBAAgB,WAAW,KAAK,aAAa,GAAG;AACvD,cAAM,MAAM,KAAK;AACjB,YAAI,QAAQ,IAAI;AACZ,eAAK,gBAAgB,OAAO,GAAG,GAAG;AAClC,eAAK,gBAAgB,OAAO,GAAG;QACnC;MACJ;IACJ;AACA,WAAO,EAAE,IAAI,WAAW,IAAI,MAAM,OAAM;EAC5C;EAUA,iBAAiB,QAAQ,MAAM,IAAI,KAAG;AAClC,QAAI,CAAC,OAAO,cAAc,CAAC,OAAO,WAAW,OAAO;AAChD,aAAO;IACX;AACA,UAAM,IAAI,OAAO,WAAW;AAE5B,UAAM,QAAQ,EAAE,KAAK,SAAO,IAAI,MAAM,KAAK,EAAE,CAAC;AAE9C,QAAI,OAAO;AACP,UAAI,SAAS,QAAQ;AACjB,aAAK,IAAI,MAAM,GAAG,KAAK,gCAAgC,MAAM,KAAK;AAClE,cAAM,cAAc,KAAK,gBAAgB,MAAM;AAC/C,cAAM,SAAS,KAAK,gBAAgB;AACpC,eAAO,UAAU,MAAM,CAAC,YAAY,aAAa,QAAQ,GAAG,CAAC;MACjE,WAAW,SAAS,SAAS;AACzB,cAAM,YAAY,KAAK,UAAU,GAAG;AACpC,aAAK,IAAI,MAAM,GAAG,KAAK,gCAAgC,MAAM,WAAW;AACxE,cAAM,cAAc,KAAK,gBAAgB,MAAM;AAC/C,cAAM,SAAS,KAAK,gBAAgB;AACpC,eAAO,UAAU,MAAM,CAAC,YAAY,aAAa,QAAQ,SAAS,CAAC;MACvE,OAAO;AACH,cAAM,YAAY,KAAK,UAAU,GAAG;AACpC,aAAK,IAAI,MAAM,GAAG,KAAK,kCAAkC,MAAM,WAAW;AAC1E,cAAM,eAAe,SAAS,YAAY,KAAK,KAAK,oBAAoB,MAAM;AAC9E,cAAM,UAAU,SAAS,YAAY,KAAK,eAAe,KAAK,oBAAoB;AAClF,eAAO,UAAU,MAAM,CAAC,YAAY,aAAa,QAAQ,SAAS,CAAC;MACvE;AACA,aAAO;IACX;AACA,WAAO;EACX;EASA,UAAU,IAAI,MAAM,QAAM;AAEtB,QAAI,GAAG,SAAS,QAAQ,GAAG;AACvB,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC3B,eAAO,KAAK,QAAQ,YAAY,EAAE;MACtC,WAAW,KAAK,MAAM,6BAA6B,GAAG;AAElD,eAAO,KAAK,QAAQ,+BAA+B,EAAE;MACzD;IACJ;AAEA,WAAO,KAAK,gBAAgB,KAAK,QAAQ,QAAQ,WAAW,SAAa,SAAS,YAAY,YAAa;EAC/G;EAOA,cAAc,SAAO;AACjB,QAAI,iBAAiB;AACrB,QAAI,eAAe,KAAK;AAGxB,YAAQ,GAAG,QAAQ,CAAC,OAAO,eAAc;AACrC,UAAI,aAAa;AACjB,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc;AACd,oBAAc,YAAY,OAAO,KAAK,KAAK,OAAO,EAAE;AACpD,cAAQ,SAAS,YAAY,UAAU;IAC3C,CAAC;AAGD,YAAQ,GAAG,QAAQ,CAAC,OAAO,eAAc;AACrC,WAAK,IAAI,MAAM,eAAe,wCAAwC;AACtE,cAAQ,WAAW,YAAY,IAAI;AACnC,cAAQ,MAAK;IACjB,CAAC;AAGD,YAAQ,GAAG,UAAU,CAAC,MAAM,eAAc;AACtC,WAAK,KAAK,KAAK,GAAG,YAAW;AAC7B,UAAI,KAAK,OAAO,UAAU;AACtB,aAAK,MAAK;AACV,cAAM,UAAU,CAAA;AAChB,aAAK,QAAQ,cAAY,QAAQ,KAAK,KAAK,aAAa,YAAY,IAAI,CAAC,CAAC;AAC1E,gBAAQ,UAAU,YAAY,OAAO;MACzC,WAAW,KAAK,OAAO,QAAQ;AAC3B,cAAM,SAAS,mBAAAC,QAAO,WAAW,MAAM;AACvC,cAAM,MAAM,OAAO,KAAK,KAAK,EAAE;AAC/B,eAAO,OAAO,GAAG;AACjB,cAAM,iBAAiB,OAAO,OAAO,KAAK;AAE1C,cAAM,eAAe,KAAK,GAAG,MAAM,iCAAiC;AACpE,cAAM,aAAa,KAAK,GAAG,MAAM,kBAAkB;AACnD,YAAI,gBAAgB,aAAa,IAAI;AACjC,gBAAM,SAAS,aAAa;AAC5B,cAAI,SAAS;AACb,gBAAM,eAAe,KAAK,GAAG,MAAM,iCAAiC;AACpE,cAAI,gBAAgB,aAAa,IAAI;AACjC,qBAAS,aAAa;UAC1B;AAEA,eAAK,aAAa,kBAAkB,EAAE,QAAgB,OAAc;AACpE,cAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,iBAAK,IAAI,MACL,GAAG,0CAA0C,oBAAoB,KAAK,UAClE,KAAK,aAAa,eAAe,GAClC;UAEX;AACA,kBAAQ,SAAS,YAAY,cAAc;QAC/C,WAAW,cAAc,WAAW,IAAI;AACpC,eAAK,aAAa,kBAAkB,EAAE,MAAM,WAAW,GAAE;AACzD,cAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,iBAAK,IAAI,MACL,GAAG,0CAA0C,oBAAoB,KAAK,UAClE,KAAK,aAAa,eAAe,GAClC;UAEX;AACA,kBAAQ,SAAS,YAAY,cAAc;QAC/C,WAAW,KAAK,GAAG,SAAS,mBAAmB,GAAG;AAE9C,eAAK,aAAa,kBAAkB,EAAE,SAAS,KAAI;AACnD,cAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,iBAAK,IAAI,MACL,GAAG,0CAA0C,oBAAoB,KAAK,UAClE,KAAK,aAAa,eAAe,GAClC;UAEX;AACA,kBAAQ,SAAS,YAAY,cAAc;QAC/C,OAAO;AACH,kBAAQ,UAAU,YAAY,IAAI,MAAM,sBAAsB,KAAK,IAAI,CAAC;QAC5E;MACJ,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,8BAA8B,KAAK,IAAI,CAAC;MACpF;IACJ,CAAC;AAGD,YAAQ,GAAG,WAAW,CAAC,MAAM,eAAc;AACvC,UAAI,CAAC,KAAK,aAAa,KAAK,KAAK;AAC7B,eAAO,KAAK,QAAQ,UAAU,YAAY,IAAI,MAAM,kBAAkB,KAAK,IAAI,CAAC;MACpF;AACA,UAAI,KAAK,aAAa,KAAK,IAAI,QAAQ;AACnC,cAAM,eAAe,KAAK,aAAa,KAAK,IAAI;AAChD,YAAI,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,WAAW,KAAK,YAAY,KAAK,KAAK,SAAS,GAAG;AACzF,cAAI,eAAe,KAAK,aAAa,KAAK,IAAI;AAC9C,cAAI,iBAAiB,YAAY,CAAC,gBAAgB,KAAK,IAAI;AACvD,2BAAe,KAAK;UACxB;AACA,cAAI,CAAC,cAAc;AACf,2BAAe;UACnB;AACA,cAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,iBAAK,IAAI,MACL,GAAG,8DAA8D,wBAAwB,cAAc;UAE/G;AACA,cAAI;AACJ,cAAI;AACA,mBAAO,KAAK,eAAe,cAAc,cAAc;cACnD,UAAU,KAAK;cACf,QAAQ,KAAK;cACb,cAAc;aACjB;UACL,SAAS,KAAP;AACE,mBAAO,KAAK,QAAQ,UAChB,YACA,IAAI,MAAM,4BAA4B,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;UAE7F;AAEA,gBAAM,MAAM,KAAK,KAAK,IAAI,SAAO,KAAK,UAAU,KAAK,QAAQ,IAAI,MAAM,OAAO,IAAI,GAAG,CAAC;AACtF,kBAAQ,UAAU,YAAY,GAAG;QACrC;MACJ,WAAW,KAAK,aAAa,KAAK,IAAI,QAAQ,KAAK,SAAS,GAAG;AAC3D,cAAM,aAAa,EAAE,KAAK,KAAK,aAAa,KAAK,IAAI,KAAK,QAAQ,MAAM,KAAK,EAAE,EAAC;AAChF,YAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,eAAK,IAAI,MAAM,GAAG,yDAAyD,WAAW,KAAK;QAC/F;AACA,cAAM,OAAO,KAAK,WAAW,YAAY;UACrC,UAAU,KAAK;UACf,QAAQ,KAAK;UACb,cAAc;SACjB;AACD,cAAM,MAAM,KAAK,KAAK,IAAI,SAAO,KAAK,UAAU,KAAK,QAAQ,IAAI,MAAM,OAAO,IAAI,GAAG,CAAC;AAEtF,eAAO,KAAK,QAAQ,UAAU,YAAY,GAAG;MACjD,WAAW,KAAK,aAAa,KAAK,IAAI,SAAS;AAE3C,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAC,CAAC,CAAC;MACjD,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,gCAAgC,KAAK,UAAU,IAAI,GAAG,CAAC;MACnG;IACJ,CAAC;AAGD,YAAQ,GAAG,WAAW,CAAC,MAAM,eAAc;AACvC,YAAM,EAAE,IAAI,UAAS,IAAK,KAAK,aAAa,KAAK,EAAE;AAEnD,UACI,cAAc,KAAK,gBACnB,cAAc,KAAK,iBACnB,cAAc,KAAK,eACrB;AAEE,eAAO,KAAK,QAAQ,YAAY,YAAY,CAAC;MACjD;AACA,YAAM,eAAe,KAAK,WAAW,UAAU,OAAO,GAAG,UAAU,SAAS,CAAC,GAAG,IAAI,KAAK,MAAM,KAAK,EAAE,CAAC;AACvG,cAAQ,YAAY,YAAY,YAAY;IAChD,CAAC;AAGD,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,UAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;AACvB,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAA,CAAE;MAChD;AACA,YAAM,EAAE,WAAW,OAAM,IAAK,KAAK,aAAa,KAAK,EAAE;AAEvD,UAAI,cAAc,KAAK,cAAc;AACjC,cAAM,OAAO,CAAA;AACb,aAAK,QAAQ,YAAS;AAClB,gBAAM,EAAE,IAAI,WAAAC,WAAS,IAAK,KAAK,aAAa,MAAM;AAClD,cAAIA,eAAc,KAAK,cAAc;AACjC,iBAAK,KAAK,IAAI;AACd,iBAAK,IAAI,KACL,GAAG,2EAA2EA,gBAAe,QAAQ;AAEzG;UACJ;AACA,eAAK,KAAK,EAAE;QAChB,CAAC;AACD,YAAI;AACJ,YAAI;AACA,mBAAS,KAAK,YAAY,IAAI;QAClC,SAAS,KAAP;AACE,iBAAO,KAAK,QAAQ,UAAU,YAAY,IAAI,MAAM,wBAAwB,IAAI,OAAO,CAAC;QAC5F;AACA,iBAAS,OAAO,IAAI,QAAO,KAAK,KAAK,UAAU,EAAE,IAAI,IAAK;AAC1D,gBAAQ,UAAU,YAAY,MAAM;MACxC,WAAW,cAAc,KAAK,eAAe;AAEzC,YAAI,QAAQ;AACR,gBAAM,WAAW,CAAA;AACjB,eAAK,QAAQ,YAAS;AAClB,kBAAM,EAAE,IAAI,WAAAA,YAAW,KAAI,IAAK,KAAK,aAAa,MAAM;AACxD,gBAAIA,eAAc,KAAK,eAAe;AAClC,uBAAS,KAAK,IAAI;AAClB,mBAAK,IAAI,KACL,GAAG,sEAAsE,QAAQ;AAErF;YACJ;AACA,iBAAK,kBAAkB,EAAE;AACzB,gBAAI,CAAC,KAAK,YAAY,OAAO,CAAC,KAAK,YAAY,IAAI,OAAO;AACtD,uBAAS,KAAK,IAAI;AAClB;YACJ;AACA,kBAAM,MAAM,KAAK,OAAO,KAAK,YAAY,IAAI,KAAK;AAClD,gBAAI;AAEA,kBAAI,QAAQ,gBAAAC,QAAG,SAAS,iBAAAC,QAAK,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC;YAChE,SAAS,KAAP;AACE,kBAAI,CAAC,KAAK,SAAS,aAAa,GAAG;AAC/B,qBAAK,IAAI,KACL,GAAG,uDAAuD,gBAAgB,IAAI,SAAS;cAE/F;AACA,uBAAS,KAAK,IAAI;AAClB;YACJ;AACA,qBAAS,KAAK,KAAK,UAAU,GAAG,CAAC;UACrC,CAAC;AACD,kBAAQ,UAAU,YAAY,QAAQ;QAC1C,OAAO;AAEH,kBAAQ,UAAU,YAAY,IAAI,MAAM,gCAAgC,CAAC;QAC7E;MACJ,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,kCAAkC,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAE9F;IACJ,CAAC;AAGD,YAAQ,GAAG,OAAO,CAAC,MAAM,eAAc;AACnC,YAAM,EAAE,IAAI,WAAW,MAAM,OAAM,IAAK,KAAK,aAAa,KAAK,EAAE;AAEjE,UAAI,cAAc,KAAK,cAAc;AACjC,cAAM,SAAS,KAAK,WAAW,EAAE;AACjC,YAAI,CAAC,QAAQ;AACT,kBAAQ,SAAS,UAAU;QAC/B,OAAO;AACH,kBAAQ,SAAS,YAAY,KAAK,UAAU,MAAM,CAAC;QACvD;MACJ,WAAW,cAAc,KAAK,eAAe;AAEzC,YAAI,QAAQ;AACR,cAAI;AACJ,cAAI;AACA,oBAAQ,gBAAAD,QAAG,SAAS,iBAAAC,QAAK,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC;UAC5D,QAAE;AACE,mBAAO,KAAK,QAAQ,SAAS,UAAU;UAC3C;AACA,cAAI,MAAM,YAAW,GAAI;AACrB,mBAAO,KAAK,QAAQ,SAChB,YACA,KAAK,UAAU;cACX,MAAM;cACN,OAAO,CAAA;cACP,OAAO;aACV,CAAC;UAEV;AACA,eAAK,kBAAkB,EAAE;AACzB,cAAI,CAAC,KAAK,YAAY,OAAO,CAAC,KAAK,YAAY,IAAI,OAAO;AACtD,mBAAO,KAAK,QAAQ,SAAS,UAAU;UAC3C;AAEA,cAAI,MAAM,KAAK,OAAO,KAAK,YAAY,IAAI,KAAK;AAChD,cAAI,OAAO,QAAQ,UAAU;AACzB,kBAAM;cACF,UAAU;cACV,KAAK;gBACD,OACK,KAAK,iBAAiB,KAAK,cAAc,SAAU,wBAAAC,aAAM,OAAO;gBACrE,YACK,KAAK,iBAAiB,KAAK,cAAc,cAC1C,wBAAAA,aAAM,OAAO;gBACjB,aACK,KAAK,iBAAiB,KAAK,cAAc,KAAK,eAC/C,wBAAAA,aAAM,OAAO,kBACT,wBAAAA,aAAM,OAAO,mBACb,wBAAAA,aAAM,OAAO;;;UAGjC;AACA,cAAI,QAAQ;AACZ,kBAAQ,SAAS,YAAY,KAAK,UAAU,GAAG,CAAC;QACpD,OAAO;AAEH,cAAIC;AACJ,cAAI;AACA,YAAAA,QAAO,KAAK,UAAU,IAAI,IAAI;UAClC,QAAE;AACE,mBAAO,KAAK,QAAQ,SAAS,UAAU;UAC3C;AACA,cAAIA,MAAK,gBAAgB,UAAaA,MAAK,gBAAgB,MAAM;AAC7D,mBAAO,KAAK,QAAQ,SAAS,UAAU;UAC3C;AACA,cAAI,WAAWA,MAAK;AACpB,cAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,qBAAM,SAAS,QAAQ,GAAG;AAExD,uBAAW,KAAK,UAAU,QAAQ;AAClC,iBAAK,IAAI,KACL,GAAG,yBAAyB,MAAM,qDAAqD,UAAU;UAEzG;AACA,kBAAQ,YAAY,YAAY,OAAO,KAAK,QAAQ,CAAC;QACzD;MACJ,WAAW,cAAc,KAAK,eAAe;AAEzC,YAAI,OAAO,uBAAuB;AAE9B,kBAAQ,WAAW,KAAK,SAAS,QAAQ;QAC7C,OAAO;AACH,gBAAM,SAAS,KAAK,QAAQ,EAAE;AAC9B,cAAI,WAAW,UAAa,WAAW,MAAM;AACzC,oBAAQ,SAAS,UAAU;UAC/B,OAAO;AACH,oBAAQ,SAAS,YAAY,MAAM;UACvC;QACJ;MACJ,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,iCAAiC,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAE7F;IACJ,CAAC;AAGD,YAAQ,GAAG,OAAO,CAAC,MAAM,eAAc;AACnC,YAAM,EAAE,IAAI,WAAW,MAAM,OAAM,IAAK,KAAK,aAAa,KAAK,EAAE;AAEjE,UAAI,cAAc,KAAK,cAAc;AACjC,YAAI;AACA,gBAAM,MAAM,KAAK,MAAM,KAAK,GAAG,SAAS,OAAO,CAAC;AAChD,eAAK,iBAAiB,IAAI,GAAG;QACjC,SAAS,KAAP;AACE,iBAAO,KAAK,QAAQ,UAAU,YAAY,IAAI,MAAM,sBAAsB,OAAO,IAAI,SAAS,CAAC;QACnG;AACA,gBAAQ,WAAW,YAAY,IAAI;MACvC,WAAW,cAAc,KAAK,eAAe;AAGzC,YAAI,QAAQ;AACR,eAAK,kBAAkB,EAAE;AAEzB,cAAI;AACA,4BAAAH,QAAG,cAAc,iBAAAC,QAAK,KAAK,KAAK,YAAY,IAAI,iBAAAA,QAAK,QAAQ,IAAI,CAAC,CAAC;AAGnE,gBAAI,KAAK,YAAY,KAAK;AACtB,mBAAK,YAAY,IAAI,QAAQ,KAAK,MAAM,KAAK,GAAG,SAAS,OAAO,CAAC;AACjE,8BAAAD,QAAG,cACC,iBAAAC,QAAK,KAAK,KAAK,YAAY,IAAI,YAAY,GAC3C,KAAK,UAAU,KAAK,YAAY,GAAG,CAAC;YAE5C;UACJ,SAAS,KAAP;AACE,mBAAO,KAAK,QAAQ,UAChB,YACA,IAAI,MAAM,2BAA2B,OAAO,IAAI,SAAS,CAAC;UAElE;AACA,kBAAQ,WAAW,YAAY,IAAI;QACvC,OAAO;AAEH,cAAI;AACA,iBAAK,WAAW,IAAI,MAAM,KAAK,EAAE;UACrC,SAAS,KAAP;AACE,mBAAO,KAAK,QAAQ,UAChB,YACA,IAAI,MAAM,sBAAsB,OAAO,IAAI,SAAS,CAAC;UAE7D;AACA,kBAAQ,WAAW,YAAY,IAAI;QACvC;MACJ,WAAW,cAAc,KAAK,eAAe;AACzC,aAAK,QAAQ,IAAI,KAAK,GAAG,SAAS,OAAO,CAAC;AAC1C,gBAAQ,WAAW,YAAY,IAAI;MACvC,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,iCAAiC,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAE7F;IACJ,CAAC;AAGD,YAAQ,GAAG,UAAU,CAAC,MAAM,eAAc;AACtC,YAAM,aAAa,KAAK,aAAa,KAAK,EAAE;AAC5C,YAAM,aAAa,KAAK,aAAa,KAAK,EAAE;AAE5C,UAAI,WAAW,cAAc,KAAK,eAAe;AAC7C,YAAI,WAAW,OAAO,WAAW,IAAI;AACjC,iBAAO,KAAK,QAAQ,UAChB,YACA,IAAI,MAAM,+CAA+C,CAAC;QAElE;AAGA,YAAI,WAAW,QAAQ;AACnB,kBAAQ,WAAW,YAAY,IAAI;QACvC,OAAO;AAEH,cAAI;AACA,iBAAK,QAAQ,WAAW,IAAI,WAAW,MAAM,WAAW,IAAI;UAChE,QAAE;AACE,mBAAO,KAAK,QAAQ,SAAS,UAAU;UAC3C;AACA,kBAAQ,WAAW,YAAY,IAAI;QACvC;MACJ,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,oCAAoC,WAAW,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAE3G;IACJ,CAAC;AAGD,YAAQ,GAAG,OAAO,CAAC,MAAM,eAAc;AACnC,YAAM,EAAE,IAAI,WAAW,MAAM,OAAM,IAAK,KAAK,aAAa,KAAK,EAAE;AAEjE,UAAI,cAAc,KAAK,cAAc;AACjC,YAAI;AACA,eAAK,WAAW,EAAE;QACtB,SAAS,KAAP;AACE,iBAAO,KAAK,QAAQ,UAAU,YAAY,GAAG;QACjD;AACA,gBAAQ,YAAY,YAAY,CAAC;MACrC,WAAW,cAAc,KAAK,eAAe;AAGzC,YAAI,QAAQ;AACR,kBAAQ,WAAW,YAAY,IAAI;QACvC,OAAO;AAEH,cAAI;AACA,iBAAK,QAAQ,IAAI,IAAI;UACzB,SAAS,KAAP;AACE,mBAAO,KAAK,QAAQ,UAAU,YAAY,GAAG;UACjD;AACA,kBAAQ,WAAW,YAAY,IAAI;QACvC;MACJ,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,iCAAiC,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAE7F;IACJ,CAAC;AAED,YAAQ,GAAG,UAAU,CAAC,MAAM,eAAc;AACtC,UAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;AACvB,eAAO,KAAK,QAAQ,YAAY,YAAY,CAAC;MACjD;AAGA,YAAM,EAAE,IAAI,WAAW,KAAI,IAAK,KAAK,aAAa,KAAK,EAAE;AAEzD,UAAI,cAAc,KAAK,cAAc;AACjC,YAAI;AACJ,YAAI;AACA,mBAAS,KAAK,cAAc,EAAE;QAClC,SAAS,GAAP;AACE,iBAAO,KAAK,QAAQ,UAAU,YAAY,CAAC;QAC/C;AACA,gBAAQ,YAAY,YAAY,SAAS,IAAI,CAAC;MAClD,WAAW,cAAc,KAAK,eAAe;AACzC,YAAI;AACJ,YAAI;AACA,mBAAS,KAAK,YAAY,IAAI,IAAI;QACtC,SAAS,GAAP;AACE,iBAAO,KAAK,QAAQ,UAAU,YAAY,CAAC;QAC/C;AACA,gBAAQ,YAAY,YAAY,SAAS,IAAI,CAAC;MAClD,WAAW,cAAc,KAAK,cAAc;AAExC,eAAO,KAAK,QAAQ,YAAY,YAAY,CAAC;MACjD,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,oCAAoC,WAAW,CAAC;MAC5F;IACJ,CAAC;AAGD,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,UAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAC1B,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAC,KAAK,CAAA,CAAE,CAAC;MACvD;AAEA,aAAO,KAAK,kBAAkB,SAAS,KAAK,IAAI,YAAY,IAAI;IACpE,CAAC;AAGD,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,UAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;AACvB,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAA,CAAE;MAChD;AAEA,aAAO,KAAK,kBAAkB,SAAS,KAAK,IAAI,UAAU;IAC9D,CAAC;AAGD,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,aAAO,KAAK,QAAQ,YAAY,YAAY,CAAC;IACjD,CAAC;AAED,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,aAAO,KAAK,QAAQ,YAAY,YAAY,CAAC;IACjD,CAAC;AAED,YAAQ,GAAG,QAAQ,CAAC,MAAM,eAAc;AACpC,aAAO,KAAK,QAAQ,SAAS,UAAU;IAC3C,CAAC;AAED,YAAQ,GAAG,SAAS,CAAC,MAAM,eAAc;AAErC,UAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAC1B,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAC,KAAK,CAAA,CAAE,CAAC;MACvD;AAEA,aAAO,KAAK,kBAAkB,SAAS,KAAK,IAAI,YAAY,IAAI;IACpE,CAAC;AAGD,YAAQ,GAAG,cAAc,CAAC,MAAM,eAAc;AAC1C,YAAM,EAAE,IAAI,WAAW,KAAI,IAAK,KAAK,aAAa,KAAK,EAAE;AAEzD,UAAI,cAAc,KAAK,cAAc;AACjC,aAAK,0BAA0B,SAAS,EAAE;AAC1C,gBAAQ,UAAU,YAAY,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;MAC5D,WAAW,cAAc,KAAK,eAAe;AACzC,aAAK,eAAe,SAAS,EAAE;AAC/B,gBAAQ,UAAU,YAAY,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;MAC5D,WAAW,cAAc,KAAK,eAAe;AACzC,aAAK,wBAAwB,SAAS,IAAI,IAAI;AAC9C,gBAAQ,UAAU,YAAY,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;MAC5D,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,wCAAwC,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAEpG;IACJ,CAAC;AAGD,YAAQ,GAAG,gBAAgB,CAAC,MAAM,eAAc;AAC5C,YAAM,EAAE,IAAI,WAAW,KAAI,IAAK,KAAK,aAAa,KAAK,EAAE;AAEzD,UAAI,cAAc,KAAK,cAAc;AACjC,aAAK,4BAA4B,SAAS,EAAE;AAC5C,gBAAQ,UAAU,YAAY,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;MAC9D,WAAW,cAAc,KAAK,eAAe;AACzC,aAAK,0BAA0B,SAAS,IAAI,IAAI;AAChD,gBAAQ,UAAU,YAAY,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;MAC9D,OAAO;AACH,gBAAQ,UACJ,YACA,IAAI,MAAM,0CAA0C,mBAAmB,KAAK,UAAU,IAAI,GAAG,CAAC;MAEtG;IACJ,CAAC;AAGD,YAAQ,GAAG,aAAa,CAAC,MAAM,eAAc;AACzC,UAAI,KAAK,GAAG,WAAW,aAAa,GAAG;AAEnC,gBAAQ,UAAU,YAAY,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;MAC3D,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,6BAA6B,KAAK,IAAI,CAAC;MACnF;IACJ,CAAC;AAGD,YAAQ,GAAG,UAAU,CAAC,MAAM,eAAc;AACtC,YAAM,UAAU,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,YAAW,IAAK,KAAK,GAAG,SAAQ,EAAG,YAAW;AACpG,UAAI,YAAY,SAAS,KAAK,OAAO,0BAA0B;AAE3D,gBAAQ,WAAW,YAAY,IAAI;MACvC,WAAW,YAAY,SAAS,KAAK,OAAO,kBAAkB;AAE1D,gBAAQ,WAAW,YAAY,IAAI;MACvC,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,4BAA4B,KAAK,UAAU,IAAI,CAAC,CAAC;MAC7F;IACJ,CAAC;AAGD,YAAQ,GAAG,UAAU,CAAC,MAAM,eAAc;AACtC,UAAI,KAAK,OAAO,aAAa,OAAO,KAAK,OAAO,UAAU;AACtD,YAAI,KAAK,OAAO,IAAI;AAEhB,2BAAiB;QACrB,OAAO;AACH,2BAAiB,KAAK;AACtB,yBAAe;QACnB;AACA,gBAAQ,WAAW,YAAY,IAAI;MACvC,WAAW,KAAK,OAAO,WAAW;AAC9B,YAAI,OAAO,mBAAmB,YAAY,mBAAmB,IAAI;AAC7D,kBAAQ,WAAW,YAAY,cAAc;QACjD,OAAO;AAEH,kBAAQ,SAAS,UAAU;QAC/B;MACJ,OAAO;AACH,gBAAQ,UAAU,YAAY,IAAI,MAAM,0BAA0B,KAAK,UAAU,IAAI,GAAG,CAAC;MAC7F;IACJ,CAAC;AAED,YAAQ,GAAG,SAAS,SAAO,KAAK,IAAI,KAAK,GAAG,+BAA+B,KAAK,CAAC;EACrF;EAMA,aAAU;AACN,WAAO,KAAK;EAChB;EAKA,MAAM,UAAO;AACT,QAAI,KAAK,QAAQ;AACb,aAAO,KAAK,KAAK,iBAAiB,EAAE,QAAQ,OAAI;AAC5C,aAAK,kBAAkB,GAAG,MAAK;AAC/B,eAAO,KAAK,kBAAkB;MAClC,CAAC;AAED,YAAM,IAAI,QAAQ,aAAU;AACxB,YAAI,CAAC,KAAK,QAAQ;AACd,iBAAO,KAAK,QAAO;QACvB;AACA,YAAI;AACA,eAAK,OAAO,MAAM,MAAM,QAAO,CAAE;QACrC,SAAS,GAAP;AACE,kBAAQ,IAAI,EAAE,OAAO;AACrB,kBAAO;QACX;MACJ,CAAC;IACL;AAEA,UAAM,MAAM,QAAO;EACvB;EAWA,kBAAkB,SAAS,SAAS,YAAY,SAAS,OAAK;AAC1D,UAAM,EAAE,IAAI,WAAW,MAAM,OAAM,IAAK,KAAK,aAAa,OAAO;AAEjE,QAAI,WAAW,CAAA;AACf,QAAI,cAAc,KAAK,gBAAgB,cAAc,KAAK,kBAAkB;AACxE,UAAI;AACA,mBAAW,KAAK,SAAS,EAAE,EAAE,IAAI,SAAO,KAAK,eAAe,GAAG;MACnE,SAAS,GAAP;AACE,eAAO,KAAK,QAAQ,UAAU,YAAY,CAAC;MAC/C;AAGA,UAAI,cAAc,KAAK,kBAAkB;AAErC,eAAO,KAAK,QAAQ,UAAU,YAAY,SAAS,CAAC,KAAK,QAAQ,IAAI,QAAQ;MACjF;IACJ;AACA,QAAI,cAAc,KAAK,iBAAiB,cAAc,KAAK,kBAAkB;AAEzE,UAAI,WAAW,QAAW;AACtB,YAAI;AACJ,YAAI;AACA,gBAAM,KAAK,SAAS,IAAI,IAAI;AAC5B,cAAI,CAAC,OAAO,CAAC,IAAI,QAAQ;AACrB,kBAAM;cACF;gBACI,MAAM;gBACN,OAAO,CAAA;gBACP,OAAO;gBACP,aAAa;gBACb,WAAW;;;UAGvB;QACJ,SAAS,GAAP;AACE,cAAI,CAAC,EAAE,QAAQ,SAAS,wBAAAC,aAAM,OAAO,eAAe,GAAG;AACnD,mBAAO,KAAK,QAAQ,UAAU,YAAY,IAAI,MAAM,oBAAoB,OAAO,EAAE,SAAS,CAAC;UAC/F;AACA,gBAAM,CAAA;QACV;AACA,YAAI,WAAW,QAAQ;AACvB,YAAI,SAAS,UAAU,CAAC,SAAS,SAAS,GAAG,GAAG;AAC5C,sBAAY;QAChB;AACA,YAAI,QAAQ,SAAM;AACd,cAAI,UAAU;AACd,cAAI,IAAI,OAAO;AACX,gBAAI,YAAY,MAAM,YAAY,KAAK;AACnC,wBAAU,IAAI;AACd,kBAAI,OAAO;YACf,OAAO;AACH,kBAAI,QAAQ;YAChB;UACJ;AAEA,mBAAS,KAAK,KAAK,UAAU,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC;AAChE,mBAAS,KAAK,KAAK,UAAU,SAAS,WAAW,IAAI,MAAM,KAAK,CAAC;QACrE,CAAC;AACD,gBAAQ,UAAU,YAAY,SAAS,CAAC,KAAK,QAAQ,IAAI,QAAQ;MACrE,OAAO;AAEH,gBAAQ,UAAU,YAAY,SAAS,CAAC,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE;MACzD;IACJ,WAAW,cAAc,KAAK,cAAc;AACxC,cAAQ,UAAU,YAAY,SAAS,CAAC,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE;IACzD,OAAO;AACH,cAAQ,UACJ,YACA,IAAI,MAAM,GAAG,SAAS,SAAS,oCAAoC,sBAAsB,SAAS,CAAC;IAE3G;EACJ;EAOA,YAAY,QAAM;AACd,QAAI,KAAK,SAAS,WAAW,iBAAiB;AAC1C,WAAK,IAAI,MAAM,KAAK,YAAY,wCAAwC;IAC5E;AACA,UAAM,UAAU;MACZ,KAAK,KAAK;MACV,UAAU,GAAG,KAAK,SAAS,aAAa;MACxC,iBAAiB;MACjB,iBAAiB,KAAK,SAAS,WAAW;;AAE9C,UAAM,UAAU,IAAI,6BAAa,QAAQ,OAAO;AAChD,SAAK,cAAc,OAAO;AAE1B,SAAK,kBAAkB,OAAO,gBAAgB,MAAM,OAAO,cAAc;AACzE,WAAO,GAAG,SAAS,MAAK;AACpB,UAAI,KAAK,kBAAkB,OAAO,gBAAgB,MAAM,OAAO,aAAa;AACxE,eAAO,KAAK,kBAAkB,OAAO,gBAAgB,MAAM,OAAO;MACtE;IACJ,CAAC;EACL;EAQA,iBAAiB,UAAQ;AACrB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACnC,UAAI,SAAS,QAAQ;AACjB,eAAO,IAAI,MAAM,sCAAsC,CAAC;MAC5D;AACA,UAAI;AACA,aAAK,SAAS,gBAAAE,QAAI,aAAY;AAC9B,aAAK,OAAO,GAAG,SAAS,SACpB,KAAK,IAAI,KACL,GAAG,KAAK,aAAa,SAAS,SAAS,YAAY,4CAC/C,SAAS,QAAQ,SAChB,KAAK,CACb;AAEL,aAAK,OAAO,GAAG,cAAc,YAAU,KAAK,YAAY,MAAM,CAAC;AAE/D,aAAK,OAAO,OACR,SAAS,QAAQ,MACjB,SAAS,SAAS,kBAAc,8BAAe,IAAK,SAAS,OAAO,SAAS,OAAO,QACpF,MAAM,QAAO,CAAE;MAEvB,SAAS,KAAP;AACE,eAAO,GAAG;MACd;IACJ,CAAC;EACL;;",
|
|
6
6
|
"names": ["import_db_base", "id", "crypto", "namespace", "fs", "path", "utils", "data", "net"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/jsonfile/index.d.ts","../../../node_modules/@types/jsonfile/utils.d.ts","../../../node_modules/@types/fs-extra/index.d.ts","../../types-dev/utils.d.ts","../../types-dev/objects.d.ts","../../types-dev/config.d.ts","../../types-dev/index.d.ts","../../../node_modules/promisify-child-process/index.d.ts","../../../node_modules/execa/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/package-manager.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/npm/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/yarn-berry/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/yarn-classic/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/pak.d.ts","../../../node_modules/@alcalzone/pak/build/index.d.ts","../../common-db/build/esm/lib/common/maybeCallback.d.ts","../../common-db/build/esm/lib/common/tools.d.ts","../../db-base/build/esm/lib/inMemFileDB.d.ts","../../db-base/build/esm/lib/redisHandler.d.ts","../../common-db/build/esm/lib/common/exitCodes.d.ts","../../common-db/build/esm/lib/common/password.d.ts","../../../node_modules/@types/triple-beam/index.d.ts","../../../node_modules/logform/index.d.ts","../../../node_modules/winston-transport/index.d.ts","../../../node_modules/winston/lib/winston/config/index.d.ts","../../../node_modules/winston/lib/winston/transports/index.d.ts","../../../node_modules/winston/index.d.ts","../../common-db/build/esm/lib/common/logger.d.ts","../../common-db/build/esm/lib/common/interview.d.ts","../../common-db/build/esm/lib/common/session.d.ts","../../common-db/build/esm/lib/common/constants.d.ts","../../common-db/build/esm/index.d.ts","../../db-base/build/esm/index.d.ts","../../db-objects-redis/build/esm/lib/objects/constants.d.ts","../../db-objects-redis/build/esm/lib/objects/objectsUtils.d.ts","../../db-objects-redis/build/esm/lib/objects/objectsInRedisClient.d.ts","../../db-objects-redis/build/esm/lib/objects/interview.d.ts","../../db-objects-redis/build/esm/index.d.ts","../../../node_modules/deep-clone/index.d.ts","../src/lib/objects/objectsInMemFileDB.js","../src/lib/objects/objectsInMemServerRedis.js","../src/lib/objects/objectsInMemServerClass.js","../src/index.ts","../../../node_modules/@types/argparse/index.d.ts","../../../node_modules/@types/chai/index.d.ts","../../../node_modules/@types/chai-as-promised/index.d.ts","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../../../node_modules/@types/eslint/helpers.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/eslint/index.d.ts","../../../node_modules/@types/event-stream/index.d.ts","../../../node_modules/@types/glossy/index.d.ts","../../../node_modules/@types/ioredis/index.d.ts","../../../node_modules/@types/jsonwebtoken/index.d.ts","../../../node_modules/@types/mime-types/index.d.ts","../../../node_modules/@types/minimatch/index.d.ts","../../../node_modules/@types/minimist/index.d.ts","../../../node_modules/@types/mocha/index.d.ts","../../../node_modules/@types/node-forge/index.d.ts","../../../node_modules/@types/node-schedule/index.d.ts","../../../node_modules/@types/normalize-package-data/index.d.ts","../../../node_modules/@types/pidusage/index.d.ts","../../../node_modules/@types/revalidator/index.d.ts","../../../node_modules/@types/prompt/index.d.ts","../../../node_modules/@types/readline-sync/index.d.ts","../../../node_modules/@types/semver/classes/semver.d.ts","../../../node_modules/@types/semver/functions/parse.d.ts","../../../node_modules/@types/semver/functions/valid.d.ts","../../../node_modules/@types/semver/functions/clean.d.ts","../../../node_modules/@types/semver/functions/inc.d.ts","../../../node_modules/@types/semver/functions/diff.d.ts","../../../node_modules/@types/semver/functions/major.d.ts","../../../node_modules/@types/semver/functions/minor.d.ts","../../../node_modules/@types/semver/functions/patch.d.ts","../../../node_modules/@types/semver/functions/prerelease.d.ts","../../../node_modules/@types/semver/functions/compare.d.ts","../../../node_modules/@types/semver/functions/rcompare.d.ts","../../../node_modules/@types/semver/functions/compare-loose.d.ts","../../../node_modules/@types/semver/functions/compare-build.d.ts","../../../node_modules/@types/semver/functions/sort.d.ts","../../../node_modules/@types/semver/functions/rsort.d.ts","../../../node_modules/@types/semver/functions/gt.d.ts","../../../node_modules/@types/semver/functions/lt.d.ts","../../../node_modules/@types/semver/functions/eq.d.ts","../../../node_modules/@types/semver/functions/neq.d.ts","../../../node_modules/@types/semver/functions/gte.d.ts","../../../node_modules/@types/semver/functions/lte.d.ts","../../../node_modules/@types/semver/functions/cmp.d.ts","../../../node_modules/@types/semver/functions/coerce.d.ts","../../../node_modules/@types/semver/classes/comparator.d.ts","../../../node_modules/@types/semver/classes/range.d.ts","../../../node_modules/@types/semver/functions/satisfies.d.ts","../../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../../node_modules/@types/semver/ranges/min-version.d.ts","../../../node_modules/@types/semver/ranges/valid.d.ts","../../../node_modules/@types/semver/ranges/outside.d.ts","../../../node_modules/@types/semver/ranges/gtr.d.ts","../../../node_modules/@types/semver/ranges/ltr.d.ts","../../../node_modules/@types/semver/ranges/intersects.d.ts","../../../node_modules/@types/semver/ranges/simplify.d.ts","../../../node_modules/@types/semver/ranges/subset.d.ts","../../../node_modules/@types/semver/internals/identifiers.d.ts","../../../node_modules/@types/semver/index.d.ts","../../../node_modules/@types/sinonjs__fake-timers/index.d.ts","../../../node_modules/@types/sinon/index.d.ts","../../../node_modules/@types/sinon-chai/index.d.ts","../../../node_modules/minipass/index.d.ts","../../../node_modules/@types/tar/index.d.ts","../../../node_modules/@types/winston-syslog/index.d.ts","../../../node_modules/@types/yargs-parser/index.d.ts","../../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"824cb491a40f7e8fdeb56f1df5edf91b23f3e3ee6b4cde84d4a99be32338faee","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"1c0cdb8dc619bc549c3e5020643e7cf7ae7940058e8c7e5aefa5871b6d86f44b","impliedFormat":1},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"b20fe0eca9a4e405f1a5ae24a2b3290b37cf7f21eba6cbe4fc3fab979237d4f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true,"impliedFormat":1},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"8073890e29d2f46fdbc19b8d6d2eb9ea58db9a2052f8640af20baff9afbc8640","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"51e547984877a62227042850456de71a5c45e7fe86b7c975c6e68896c86fa23b","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true,"impliedFormat":1},{"version":"08a58483392df5fcc1db57d782e87734f77ae9eab42516028acbfe46f29a3ef7","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3846d0dcf468a1d1a07e6d00eaa37ec542956fb5fe0357590a6407af20d2ff90","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"49026435d21e3d7559d723af3ae48f73ec28f9cba651b41bd2ac991012836122","affectsGlobalScope":true,"impliedFormat":1},{"version":"39b1a50d543770780b0409a4caacb87f3ff1d510aedfeb7dc06ed44188256f89","impliedFormat":1},{"version":"dafc58ee47fa25dbc68b27c638bd6153dd7659021c164f64b7760757e9f5a6ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"16b872cf5432818bdbf405428b4a1d77bb2a7ab908e8bd6609f9a541cea92f81","impliedFormat":1},{"version":"304504c854c47a55ab4a89111a27a2daf8a3614740bd787cc1f2c51e5574239c","impliedFormat":1},{"version":"95f9129a37dcace36e17b061a8484952586ecfe928c9c8ce526de1a2f4aaefa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"ed3db4eb7ad0466e19df82d9ee5c057d78df954283004783932d75e8fa4058c5","impliedFormat":1},{"version":"278fe296432b9840660d6e0d1778b4b4897a591d4b910a5f7ac8db0b476a8af7","impliedFormat":1},{"version":"1c611ff373ce1958aafc40b328048ac2540ba5c7f373cf2897e0d9aeaabe90a0","impliedFormat":1},{"version":"fd7a7fc2bb1f38ba0cded7bd8088c99033365859e03ba974f7de072e9d989fde","impliedFormat":1},{"version":"6cf42fc3765241c59339047a45855c506a2f94ee5e734bbded94ddcafc66e4c5","impliedFormat":1},{"version":"c6cf9428f45f3d78b07df7d7aab1569994c177d36549e3a962f952d89f026bc4","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"cce14dcba2c2cb1059977ad65cf9caef890118cb20e35c4cf420bf1c83f27c1a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d604e6f853b64692415a61662d8490cc6057596ce7fb52a3a2ce878e376586c","impliedFormat":1},{"version":"021ca24be8eb8c46f99b4e03ebf872931f590c9b07b88d715c68bd30495b6c44","impliedFormat":1},{"version":"fb862b9a2e78754cf44b770ba6f194987d63c8d4cd103c6c05534faa4120ae98","impliedFormat":1},{"version":"91479d2a9bc09df0091b5e24af57cb462cd223e56498d16e9efdaebd587fa81d","impliedFormat":1},{"version":"e3baa0c5780c2c805ec33a999722a2f740b572eb3746fd0a5f93a0a5c3dbf7f6","impliedFormat":1},{"version":"c6f77efcc19f51c8759779b6b6ee0d88046c15c15dadac8ffed729a6620daf39","impliedFormat":1},{"version":"089867511b37a534ae71f3d9bc97acc0b925b7f5dbec113f98c4b49224c694eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0cc19f50900706e7aae038565e825f2014ac5325b99b3daabf8ecd5d3d09f1a","impliedFormat":1},{"version":"f5ce35485541e817c2d4105d3eb78e3e538bbb009515ed014694363fa3e94ceb","impliedFormat":1},{"version":"323506ce173f7f865f42f493885ee3dacd18db6359ea1141d57676d3781ce10c","impliedFormat":1},{"version":"bd88055918cf8bf30ad7c9269177f7ebeafd4c5f0d28919edccd1c1d24f7e73c","affectsGlobalScope":true,"impliedFormat":1},{"version":"645baafeaed6855c8796fcbae4e813021c65f36eaa3f6178535457a2366f6849","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea3ab3727cd6c222d94003ecafa30e8550c61eadcdabbf59514aee76e86211a5","impliedFormat":1},{"version":"d3cdd41693c5ed6bec4f1a1c399d9501372b14bd341bc46eedacf2854c5df5a7","impliedFormat":1},{"version":"2de7a21c92226fb8abbeed7a0a9bd8aa6d37e4c68a8c7ff7938c644267e9fcc1","impliedFormat":1},{"version":"6d6070c5c81ba0bfe58988c69e3ba3149fc86421fd383f253aeb071cbf29cd41","impliedFormat":1},{"version":"48dab0d6e633b8052e7eaa0efb0bb3d58a733777b248765eafcb0b0349439834","impliedFormat":1},{"version":"d3e22aaa84d935196f465fff6645f88bb41352736c3130285eea0f2489c5f183","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"5195aeb0de306d1c5ca8033457fbcab5987657112fa6d4971cfeb7644493a369","impliedFormat":1},{"version":"c5dbf0003bc9f0f643e54cd00a3868d1afe85497fecb56be6f2373dc85102924","impliedFormat":1},{"version":"5a6fc2089f515b39aaa208339421669f61935cd661e356ebee49240be85091fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"300f8e9de0b0c3482be3e749462b6ebc3dab8a316801f1da0def94aed0cd2018","affectsGlobalScope":true,"impliedFormat":1},{"version":"4e228e78c1e9b0a75c70588d59288f63a6258e8b1fe4a67b0c53fe03461421d9","impliedFormat":1},{"version":"3df5b34f3449733bc4831b8d670f958a045e7a3f5d7b0e21991ef95408dbec13","impliedFormat":1},{"version":"76a89af04f2ba1807309320dab5169c0d1243b80738b4a2005989e40a136733e","impliedFormat":1},{"version":"c045b664abf3fc2a4750fa96117ab2735e4ed45ddd571b2a6a91b9917e231a02","impliedFormat":1},{"version":"068b8ee5c2cd90d7a50f2efadbbe353cb10196a41189a48bf4b2a867363012b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"0c312a7c5dec6c616f754d3a4b16318ce8d1cb912dfb3dfa0e808f45e66cbb21","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f44a190351ab5e1811abebe007cf60518044772ccc08244f9f241706afa767f","impliedFormat":1},{"version":"fecdf44bec4ee9c5188e5f2f58c292c9689c02520900dceaaa6e76594de6da90","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"6a4a80787c57c10b3ea8314c80d9cc6e1deb99d20adca16106a337825f582420","affectsGlobalScope":true,"impliedFormat":1},{"version":"f2b9440f98d6f94c8105883a2b65aee2fce0248f71f41beafd0a80636f3a565d","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","impliedFormat":1},{"version":"211440ce81e87b3491cdf07155881344b0a61566df6e749acff0be7e8b9d1a07","impliedFormat":1},{"version":"5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","impliedFormat":1},{"version":"880da0e0f3ebca42f9bd1bc2d3e5e7df33f2619d85f18ee0ed4bd16d1800bc32","impliedFormat":1},{"version":"e12a40ba307d38757b6f0637958d945de7442dbd0986fd3e4f7a61cc65b3bc61","impliedFormat":1},{"version":"f7c6cedb3d30550bcaff98e3f7ac6e6fe45909794ae6228d36dd77a0b101f176","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f6f50154127d4da065cdc1ec3b1419b571b4864ca27921af5bb7d4e58244756","impliedFormat":1},{"version":"30e6a6a947b98cdd94ad282c3e36590b6613411f44a009a0eca9105b996e0be3","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e2f08258e671e67a177bd9057e785956c23b2542308f9559db037fe1114105","impliedFormat":1},{"version":"088703b7810394a5af823ac753cca116931df81a97183725ae1e2c4e6038268d","impliedFormat":1},{"version":"6cf45d4fd013b7c4ba1cd422555a3170946dc1d3804e135b5c4a971dbe4c1aa7","impliedFormat":1},{"version":"2fd34e1921bb7e6706b8d9fcb5d4d9f2f3e23e742e38bdb3094c83668ca09070","impliedFormat":1},{"version":"be2ab41bbfa1db74d67df1a5cb0c00b5f6d4badc0bc35cff2984880e2698bc1b","impliedFormat":1},{"version":"746b7007f5959dc155f54964ce3d1f8289e914ad480f1f7ff64f54515415a637","impliedFormat":1},{"version":"41e1718c5738cd9261acc61439f2156ed3b8a3267de9805e55b3cf7d839f5063","impliedFormat":1},{"version":"4e20f9be439bf149c8f336a7d9efb1dcc785a29d8cbb73efa279f8bf883a7058","impliedFormat":1},{"version":"07e25f754a8435121d3ba0012458e3e10ae6f3fddeffebb2b1054a0579fad3ea","impliedFormat":99},{"version":"d720ff8b68e35ff0321e4a764c1fd92c1f568f4f14b1558debc05871abff388a","impliedFormat":99},{"version":"1b6c1c1e0bb011297c88478ceb30804e15ddb86c0fb83788e3d1403202c09c48","impliedFormat":99},{"version":"617b2e0fa917ace5e1b19dcef2eae8a5888732a390c94e0b97f1afa3b6c5b52c","impliedFormat":99},{"version":"da77aa3d854b204e47ef742c4ecd71cd0b020f802e13b6a7e719367e8b9ccd18","impliedFormat":99},{"version":"04f395b82f656953ae6ccff3b26c55adb6a75e9e345991a10401696e593b0bb0","impliedFormat":99},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"201ced2ca97d71fe47afdaebc656c2fa63ef2784256e4dfc9eb83930f7aac2c2","impliedFormat":1},{"version":"d8b8a5a6bf623239d5374ad4a7ff6f3b195ab5ee61293f59f1957e90d2a22809","impliedFormat":1},{"version":"35d283eca7dc0a0c7b099f5fbbf0678b87f3d837572cd5e539ba297ad9837e68","impliedFormat":1},{"version":"03852330113bfc10a497a653f39ad9f4ee8e4ed31a44cb9981de6d9d662c5354","impliedFormat":1},{"version":"26ec2c615ee349154b9cdb180a9bbd2d3e28a2646242e936cf79c1a44847ade7","impliedFormat":1},{"version":"56471ec726edfb50d4bc87b83e52f97de74f5d385db3db214f6e3ec2d02a3fb6","impliedFormat":99},{"version":"86a6eee8858453e02abc1196b611b348f9b157d19dcd47660246ede5b6a82676","impliedFormat":99},{"version":"129c10790c7de83509b3d852a79189b475a40b128e0726bd469f96b3d5749811","impliedFormat":99},{"version":"98763329166c62fa0ca9cfc0042bf924605c78bab880dc8b06ec83a445d3d67a","impliedFormat":99},{"version":"54cb16297ded2864aa5a752ac9ff205a85931492c3bdbe8a2ec9e584acb10048","impliedFormat":99},{"version":"ad739669b8527bacfaf8493ea4552216843afd0f9a2e583dec20ee7f4e2ead6e","impliedFormat":99},{"version":"ba56e7c11bd24eca78daa7147a870697ab31f3f14a9c56158ab9c26080019ab7","impliedFormat":99},{"version":"a03c55840ce15d2323982ad48e57836f1a72d6818802167c91118f955477823b","impliedFormat":99},{"version":"e6b139475ce20dbc97ce616446d383d91641d51cf49e87fa4eceace7291f0bb0","impliedFormat":99},{"version":"36e85619f30581305cb707f60af9882474e802abed2d03125e04c07e763f7c4a","impliedFormat":99},{"version":"f0009b8cd0609df584a4c73a302e8839f6c6dc79807feac2b5f2831d12721964","impliedFormat":99},{"version":"188cae2ce1d4ac59f8527e18892de13a5aca22728f2a275a2dea370e31ded612","impliedFormat":1},{"version":"fa3bd008fb5cf62ac0f7a31cb5afaa6b5728b0a8542bb90eb1152093df84e0c0","signature":"ca7bd98691a8791dd32ffce6c205923d422b0ed0c2b199a2120b17dfb15fd2f2","impliedFormat":99},{"version":"e7390a6d0d149fe617cb8d950162571b37bb68631899435d563b783ea9354670","signature":"3b5afd9a508beb9fffd7c601c04d40f933337c728f9a37386d0f6e4cc63b2ffc","impliedFormat":99},{"version":"08552d6ee9fc372edf3715458e91c61b5db6c26c99867ac79b4c4cbea173d3ea","signature":"ec30c62718c4e8d8fe11ffb0cbea6f00c9ce1811c233b96d1640856da8f5138a","impliedFormat":99},{"version":"13613f30ce4b9784a318a398db971cacde011954b93606ac53ed1802df1f38d6","signature":"7e4ca66b0da05237cb6cb8017c64f9e21474033dc1c91dc55ea7ec158a379e90","impliedFormat":99},{"version":"dc3b172ee27054dbcedcf5007b78c256021db936f6313a9ce9a3ecbb503fd646","impliedFormat":1},{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"86e56d97b13ef0a58bc9c59aee782ae7d47d63802b5b32129ec5e5d62c20dbfa","affectsGlobalScope":true,"impliedFormat":1},{"version":"68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true,"impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"7852500a7dc3f9cb6b73d619f6e0249119211ea662fd5e16c59ee5aba3deeb80","impliedFormat":1},{"version":"c3ae6bb11d6666d56efb16b56903895ba5320c2c2b0fecaf27784ef4599ac632","impliedFormat":1},{"version":"3b43f7224c99344262753af8fc1bb66cf0dc36fb15de92a190af88502c6256f6","impliedFormat":1},{"version":"be00321090ed100e3bd1e566c0408004137e73feb19d6380eba57d68519ff6c5","impliedFormat":1},{"version":"bb4ed283cfb3db7ec1d4bb79c37f5e96d39b340f1f4de995c4b0b836c8d5fa05","impliedFormat":1},{"version":"169cc96316cacf8b489aaab4ac6bcef7b33e8779a8902bce57c737b4aa372d16","impliedFormat":1},{"version":"8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","impliedFormat":1},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"0ea93d01083b3d5863cc98cb589b5d0eac55d14417487f9e5e455dfa0b17c660","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b5402ae709d042c3530ed3506c135a967159f42aed3221267e70c5b7240b577","impliedFormat":1},{"version":"4f5269c28ed792a21efe3e2733a3398cb83f84384ccd9c5cd5a0950fdb211342","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"327fddc7dd391f1e62262dafe41fc9cabedb4a5758a5cfce979cebab1456abb8","impliedFormat":1},{"version":"ec596fa2357df1b2702e42bcba645422eb727ab5c81136f78590f21a100286e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ff2ceda3a4b66023a83964a4e2674b9778ce5255f87c5eefefd6d0f7f1967d56","impliedFormat":1},{"version":"a016d2f6c0a2c15069ec69661ad37c86a450deb629ce96a592f15f01d3a5746e","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"7d2a0ba1297be385a89b5515b88cd31b4a1eeef5236f710166dc1b36b1741e1b","impliedFormat":1},{"version":"5adc55aaebfb20914e274a1202b5c78638260364997d724dec52d7b2704b461c","impliedFormat":1},{"version":"525b52b38b44420fb1758c0917e7b67cf379f7f9477d2ba7343f3d5f50a44258","affectsGlobalScope":true,"impliedFormat":1},{"version":"58b63c0f3bfac04d639c31a9fe094089c0bdcc8cda7bc35f1f23828677aa7926","impliedFormat":1},{"version":"d51d662a37aa1f1b97ed4caf4f1c25832047b9bfffcc707b53aedd07cd245303","impliedFormat":1},{"version":"b9d02ff98f8c5da182f415c7152b0da746346b0a15e6a93d772eff0c72165b9d","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e","impliedFormat":1}],"root":[[188,191]],"options":{"allowJs":true,"checkJs":false,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"inlineSourceMap":false,"module":199,"outDir":"./esm","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"useUnknownInCatchVariables":false},"fileIdsList":[[158,162],[158],[129,148,157],[158,159,160,161],[193],[195],[197,198,199],[129,148],[112,148,149,150],[148],[111,129,137,148],[112,140,148],[111,148],[62],[98],[99,104,132],[100,111,112,119,129,140],[100,101,111,119],[102,141],[103,104,112,120],[104,129,137],[105,107,111,119],[98,106],[107,108],[111],[109,111],[98,111],[111,112,113,129,140],[111,112,113,126,129,132],[96,145],[107,111,114,119,129,140],[111,112,114,115,119,129,137,140],[114,116,129,137,140],[62,63,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147],[111,117],[118,140,145],[107,111,119,129],[120],[121],[98,122],[123,139,145],[124],[125],[111,126,127],[126,128,141,143],[99,111,129,130,131,132],[99,129,131],[129,130],[132],[133],[98,129],[111,135,136],[135,136],[104,119,129,137],[138],[119,139],[99,114,125,140],[104,141],[129,142],[118,143],[144],[99,104,111,113,122,129,140,143,145],[129,146],[111,139,148,213],[216,255],[216,240,255],[255],[216],[216,241,255],[216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254],[241,255],[193,257],[256],[112,129,146,148,259],[105,119,148,172,202],[262],[100,129,148],[170],[111,129,148],[100],[73,77,140],[73,129,140],[68],[70,73,137,140],[119,137],[68,148],[70,73,119,140],[65,66,69,72,99,111,129,140],[65,71],[69,73,99,132,140,148],[99,148],[89,99,148],[67,68,148],[73],[67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95],[73,80,81],[71,73,81,82],[72],[65,68,73],[73,77,81,82],[77],[71,73,76,140],[65,70,71,73,77,80],[99,129],[68,73,89,99,145,148],[129,148,171],[129,148,171,172,173,174],[114,148,172],[165,168,169,176,177,178,179],[155],[175],[100,148,155,156,163,164],[166,167,180],[165],[111,119,148,165],[186,188,190],[121,151,181,186,187],[186,189],[104,119,121,151,165,180,181,186,188],[183,184,185],[155,165,166,183],[155,182],[112,152,153,154],[120,152]],"referencedMap":[[163,1],[159,2],[158,3],[160,2],[161,2],[162,4],[194,5],[196,6],[200,7],[201,8],[151,9],[202,10],[203,11],[149,12],[204,10],[209,10],[210,13],[62,14],[63,14],[98,15],[99,16],[100,17],[101,18],[102,19],[103,20],[104,21],[105,22],[106,23],[107,24],[108,24],[110,25],[109,26],[111,27],[112,28],[113,29],[97,30],[114,31],[115,32],[116,33],[148,34],[117,35],[118,36],[119,37],[120,38],[121,39],[122,40],[123,41],[124,42],[125,43],[126,44],[127,44],[128,45],[129,46],[131,47],[130,48],[132,49],[133,50],[134,51],[135,52],[136,53],[137,54],[138,55],[139,56],[140,57],[141,58],[142,59],[143,60],[144,61],[145,62],[146,63],[214,64],[240,65],[241,66],[216,67],[219,67],[238,65],[239,65],[229,65],[228,68],[226,65],[221,65],[234,65],[232,65],[236,65],[220,65],[233,65],[237,65],[222,65],[223,65],[235,65],[217,65],[224,65],[225,65],[227,65],[231,65],[242,69],[230,65],[218,65],[255,70],[249,69],[251,71],[250,69],[243,69],[244,69],[246,69],[248,69],[252,71],[253,71],[245,71],[247,71],[258,72],[257,73],[260,74],[261,75],[263,76],[157,77],[171,78],[259,79],[156,80],[80,81],[87,82],[79,81],[94,83],[71,84],[70,85],[93,10],[88,86],[91,87],[73,88],[72,89],[68,90],[67,91],[90,92],[69,93],[74,94],[78,94],[96,95],[95,94],[82,96],[83,97],[85,98],[81,99],[84,100],[89,10],[76,101],[77,102],[86,103],[66,104],[92,105],[172,106],[175,107],[173,10],[174,108],[180,109],[177,110],[176,111],[165,112],[181,113],[166,114],[167,115],[191,116],[188,117],[190,118],[189,119],[186,120],[185,110],[184,121],[183,122],[155,123],[153,124]],"exportedModulesMap":[[163,1],[159,2],[158,3],[160,2],[161,2],[162,4],[194,5],[196,6],[200,7],[201,8],[151,9],[202,10],[203,11],[149,12],[204,10],[209,10],[210,13],[62,14],[63,14],[98,15],[99,16],[100,17],[101,18],[102,19],[103,20],[104,21],[105,22],[106,23],[107,24],[108,24],[110,25],[109,26],[111,27],[112,28],[113,29],[97,30],[114,31],[115,32],[116,33],[148,34],[117,35],[118,36],[119,37],[120,38],[121,39],[122,40],[123,41],[124,42],[125,43],[126,44],[127,44],[128,45],[129,46],[131,47],[130,48],[132,49],[133,50],[134,51],[135,52],[136,53],[137,54],[138,55],[139,56],[140,57],[141,58],[142,59],[143,60],[144,61],[145,62],[146,63],[214,64],[240,65],[241,66],[216,67],[219,67],[238,65],[239,65],[229,65],[228,68],[226,65],[221,65],[234,65],[232,65],[236,65],[220,65],[233,65],[237,65],[222,65],[223,65],[235,65],[217,65],[224,65],[225,65],[227,65],[231,65],[242,69],[230,65],[218,65],[255,70],[249,69],[251,71],[250,69],[243,69],[244,69],[246,69],[248,69],[252,71],[253,71],[245,71],[247,71],[258,72],[257,73],[260,74],[261,75],[263,76],[157,77],[171,78],[259,79],[156,80],[80,81],[87,82],[79,81],[94,83],[71,84],[70,85],[93,10],[88,86],[91,87],[73,88],[72,89],[68,90],[67,91],[90,92],[69,93],[74,94],[78,94],[96,95],[95,94],[82,96],[83,97],[85,98],[81,99],[84,100],[89,10],[76,101],[77,102],[86,103],[66,104],[92,105],[172,106],[175,107],[173,10],[174,108],[180,109],[177,110],[176,111],[165,112],[181,113],[166,114],[167,115],[191,116],[186,120],[185,110],[184,121],[183,122],[155,123],[153,124]],"semanticDiagnosticsPerFile":[163,159,158,160,161,162,192,194,193,196,197,200,198,201,151,202,203,199,149,150,204,205,206,207,208,195,209,210,62,63,98,99,100,101,102,103,104,105,106,107,108,110,109,111,112,113,97,147,114,115,116,148,117,118,119,120,121,122,123,124,125,126,127,128,129,131,130,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,211,212,214,215,213,240,241,216,219,238,239,229,228,226,221,234,232,236,220,233,237,222,223,235,217,224,225,227,231,242,230,218,255,254,249,251,250,243,244,246,248,252,253,245,247,258,257,256,260,170,261,262,263,64,187,157,171,259,156,60,61,12,11,2,13,14,15,16,17,18,19,20,3,21,4,22,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,8,49,46,47,48,50,9,51,52,53,56,54,55,57,58,10,1,59,80,87,79,94,71,70,93,88,91,73,72,68,67,90,69,74,75,78,65,96,95,82,83,85,81,84,89,76,77,86,66,92,172,175,173,174,180,179,168,177,176,164,169,178,165,181,166,167,191,188,190,189,186,182,185,184,183,154,155,153,152],"latestChangedDtsFile":"./esm/index.d.ts"},"version":"5.4.5"}
|
|
1
|
+
{"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/jsonfile/index.d.ts","../../../node_modules/@types/jsonfile/utils.d.ts","../../../node_modules/@types/fs-extra/index.d.ts","../../types-dev/utils.d.ts","../../types-dev/objects.d.ts","../../types-dev/config.d.ts","../../types-dev/index.d.ts","../../../node_modules/promisify-child-process/index.d.ts","../../../node_modules/execa/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/package-manager.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/npm/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/yarn-berry/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/package-managers/yarn-classic/index.d.ts","../../../node_modules/@alcalzone/pak/build/lib/pak.d.ts","../../../node_modules/@alcalzone/pak/build/index.d.ts","../../common-db/build/esm/lib/common/maybeCallback.d.ts","../../common-db/build/esm/lib/common/tools.d.ts","../../db-base/build/esm/lib/inMemFileDB.d.ts","../../db-base/build/esm/lib/redisHandler.d.ts","../../common-db/build/esm/lib/common/exitCodes.d.ts","../../common-db/build/esm/lib/common/password.d.ts","../../../node_modules/@types/triple-beam/index.d.ts","../../../node_modules/logform/index.d.ts","../../../node_modules/winston-transport/index.d.ts","../../../node_modules/winston/lib/winston/config/index.d.ts","../../../node_modules/winston/lib/winston/transports/index.d.ts","../../../node_modules/winston/index.d.ts","../../common-db/build/esm/lib/common/logger.d.ts","../../common-db/build/esm/lib/common/interview.d.ts","../../common-db/build/esm/lib/common/session.d.ts","../../common-db/build/esm/lib/common/constants.d.ts","../../common-db/build/esm/index.d.ts","../../db-base/build/esm/index.d.ts","../../db-objects-redis/build/esm/lib/objects/constants.d.ts","../../db-objects-redis/build/esm/lib/objects/objectsUtils.d.ts","../../db-objects-redis/build/esm/lib/objects/objectsInRedisClient.d.ts","../../db-objects-redis/build/esm/lib/objects/interview.d.ts","../../db-objects-redis/build/esm/index.d.ts","../../../node_modules/deep-clone/index.d.ts","../src/lib/objects/objectsInMemFileDB.js","../src/lib/objects/objectsInMemServerRedis.js","../src/lib/objects/objectsInMemServerClass.js","../src/index.ts","../../../node_modules/@types/argparse/index.d.ts","../../../node_modules/@types/chai/index.d.ts","../../../node_modules/@types/chai-as-promised/index.d.ts","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../../../node_modules/@types/eslint/helpers.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/eslint/index.d.ts","../../../node_modules/@types/event-stream/index.d.ts","../../../node_modules/@types/glossy/index.d.ts","../../../node_modules/@types/ioredis/index.d.ts","../../../node_modules/@types/jsonwebtoken/index.d.ts","../../../node_modules/@types/mime-types/index.d.ts","../../../node_modules/@types/minimatch/index.d.ts","../../../node_modules/@types/minimist/index.d.ts","../../../node_modules/@types/mocha/index.d.ts","../../../node_modules/@types/node-forge/index.d.ts","../../../node_modules/@types/node-schedule/index.d.ts","../../../node_modules/@types/normalize-package-data/index.d.ts","../../../node_modules/@types/pidusage/index.d.ts","../../../node_modules/@types/revalidator/index.d.ts","../../../node_modules/@types/prompt/index.d.ts","../../../node_modules/@types/readline-sync/index.d.ts","../../../node_modules/@types/semver/classes/semver.d.ts","../../../node_modules/@types/semver/functions/parse.d.ts","../../../node_modules/@types/semver/functions/valid.d.ts","../../../node_modules/@types/semver/functions/clean.d.ts","../../../node_modules/@types/semver/functions/inc.d.ts","../../../node_modules/@types/semver/functions/diff.d.ts","../../../node_modules/@types/semver/functions/major.d.ts","../../../node_modules/@types/semver/functions/minor.d.ts","../../../node_modules/@types/semver/functions/patch.d.ts","../../../node_modules/@types/semver/functions/prerelease.d.ts","../../../node_modules/@types/semver/functions/compare.d.ts","../../../node_modules/@types/semver/functions/rcompare.d.ts","../../../node_modules/@types/semver/functions/compare-loose.d.ts","../../../node_modules/@types/semver/functions/compare-build.d.ts","../../../node_modules/@types/semver/functions/sort.d.ts","../../../node_modules/@types/semver/functions/rsort.d.ts","../../../node_modules/@types/semver/functions/gt.d.ts","../../../node_modules/@types/semver/functions/lt.d.ts","../../../node_modules/@types/semver/functions/eq.d.ts","../../../node_modules/@types/semver/functions/neq.d.ts","../../../node_modules/@types/semver/functions/gte.d.ts","../../../node_modules/@types/semver/functions/lte.d.ts","../../../node_modules/@types/semver/functions/cmp.d.ts","../../../node_modules/@types/semver/functions/coerce.d.ts","../../../node_modules/@types/semver/classes/comparator.d.ts","../../../node_modules/@types/semver/classes/range.d.ts","../../../node_modules/@types/semver/functions/satisfies.d.ts","../../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../../node_modules/@types/semver/ranges/min-version.d.ts","../../../node_modules/@types/semver/ranges/valid.d.ts","../../../node_modules/@types/semver/ranges/outside.d.ts","../../../node_modules/@types/semver/ranges/gtr.d.ts","../../../node_modules/@types/semver/ranges/ltr.d.ts","../../../node_modules/@types/semver/ranges/intersects.d.ts","../../../node_modules/@types/semver/ranges/simplify.d.ts","../../../node_modules/@types/semver/ranges/subset.d.ts","../../../node_modules/@types/semver/internals/identifiers.d.ts","../../../node_modules/@types/semver/index.d.ts","../../../node_modules/@types/sinonjs__fake-timers/index.d.ts","../../../node_modules/@types/sinon/index.d.ts","../../../node_modules/@types/sinon-chai/index.d.ts","../../../node_modules/minipass/index.d.ts","../../../node_modules/@types/tar/index.d.ts","../../../node_modules/@types/winston-syslog/index.d.ts","../../../node_modules/@types/yargs-parser/index.d.ts","../../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"824cb491a40f7e8fdeb56f1df5edf91b23f3e3ee6b4cde84d4a99be32338faee","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"1c0cdb8dc619bc549c3e5020643e7cf7ae7940058e8c7e5aefa5871b6d86f44b","impliedFormat":1},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"b20fe0eca9a4e405f1a5ae24a2b3290b37cf7f21eba6cbe4fc3fab979237d4f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true,"impliedFormat":1},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"8073890e29d2f46fdbc19b8d6d2eb9ea58db9a2052f8640af20baff9afbc8640","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"51e547984877a62227042850456de71a5c45e7fe86b7c975c6e68896c86fa23b","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true,"impliedFormat":1},{"version":"08a58483392df5fcc1db57d782e87734f77ae9eab42516028acbfe46f29a3ef7","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3846d0dcf468a1d1a07e6d00eaa37ec542956fb5fe0357590a6407af20d2ff90","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"49026435d21e3d7559d723af3ae48f73ec28f9cba651b41bd2ac991012836122","affectsGlobalScope":true,"impliedFormat":1},{"version":"39b1a50d543770780b0409a4caacb87f3ff1d510aedfeb7dc06ed44188256f89","impliedFormat":1},{"version":"dafc58ee47fa25dbc68b27c638bd6153dd7659021c164f64b7760757e9f5a6ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"16b872cf5432818bdbf405428b4a1d77bb2a7ab908e8bd6609f9a541cea92f81","impliedFormat":1},{"version":"304504c854c47a55ab4a89111a27a2daf8a3614740bd787cc1f2c51e5574239c","impliedFormat":1},{"version":"95f9129a37dcace36e17b061a8484952586ecfe928c9c8ce526de1a2f4aaefa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"ed3db4eb7ad0466e19df82d9ee5c057d78df954283004783932d75e8fa4058c5","impliedFormat":1},{"version":"278fe296432b9840660d6e0d1778b4b4897a591d4b910a5f7ac8db0b476a8af7","impliedFormat":1},{"version":"1c611ff373ce1958aafc40b328048ac2540ba5c7f373cf2897e0d9aeaabe90a0","impliedFormat":1},{"version":"fd7a7fc2bb1f38ba0cded7bd8088c99033365859e03ba974f7de072e9d989fde","impliedFormat":1},{"version":"6cf42fc3765241c59339047a45855c506a2f94ee5e734bbded94ddcafc66e4c5","impliedFormat":1},{"version":"c6cf9428f45f3d78b07df7d7aab1569994c177d36549e3a962f952d89f026bc4","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"cce14dcba2c2cb1059977ad65cf9caef890118cb20e35c4cf420bf1c83f27c1a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d604e6f853b64692415a61662d8490cc6057596ce7fb52a3a2ce878e376586c","impliedFormat":1},{"version":"021ca24be8eb8c46f99b4e03ebf872931f590c9b07b88d715c68bd30495b6c44","impliedFormat":1},{"version":"fb862b9a2e78754cf44b770ba6f194987d63c8d4cd103c6c05534faa4120ae98","impliedFormat":1},{"version":"91479d2a9bc09df0091b5e24af57cb462cd223e56498d16e9efdaebd587fa81d","impliedFormat":1},{"version":"e3baa0c5780c2c805ec33a999722a2f740b572eb3746fd0a5f93a0a5c3dbf7f6","impliedFormat":1},{"version":"c6f77efcc19f51c8759779b6b6ee0d88046c15c15dadac8ffed729a6620daf39","impliedFormat":1},{"version":"089867511b37a534ae71f3d9bc97acc0b925b7f5dbec113f98c4b49224c694eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0cc19f50900706e7aae038565e825f2014ac5325b99b3daabf8ecd5d3d09f1a","impliedFormat":1},{"version":"f5ce35485541e817c2d4105d3eb78e3e538bbb009515ed014694363fa3e94ceb","impliedFormat":1},{"version":"323506ce173f7f865f42f493885ee3dacd18db6359ea1141d57676d3781ce10c","impliedFormat":1},{"version":"bd88055918cf8bf30ad7c9269177f7ebeafd4c5f0d28919edccd1c1d24f7e73c","affectsGlobalScope":true,"impliedFormat":1},{"version":"645baafeaed6855c8796fcbae4e813021c65f36eaa3f6178535457a2366f6849","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea3ab3727cd6c222d94003ecafa30e8550c61eadcdabbf59514aee76e86211a5","impliedFormat":1},{"version":"d3cdd41693c5ed6bec4f1a1c399d9501372b14bd341bc46eedacf2854c5df5a7","impliedFormat":1},{"version":"2de7a21c92226fb8abbeed7a0a9bd8aa6d37e4c68a8c7ff7938c644267e9fcc1","impliedFormat":1},{"version":"6d6070c5c81ba0bfe58988c69e3ba3149fc86421fd383f253aeb071cbf29cd41","impliedFormat":1},{"version":"48dab0d6e633b8052e7eaa0efb0bb3d58a733777b248765eafcb0b0349439834","impliedFormat":1},{"version":"d3e22aaa84d935196f465fff6645f88bb41352736c3130285eea0f2489c5f183","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"5195aeb0de306d1c5ca8033457fbcab5987657112fa6d4971cfeb7644493a369","impliedFormat":1},{"version":"c5dbf0003bc9f0f643e54cd00a3868d1afe85497fecb56be6f2373dc85102924","impliedFormat":1},{"version":"5a6fc2089f515b39aaa208339421669f61935cd661e356ebee49240be85091fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"300f8e9de0b0c3482be3e749462b6ebc3dab8a316801f1da0def94aed0cd2018","affectsGlobalScope":true,"impliedFormat":1},{"version":"4e228e78c1e9b0a75c70588d59288f63a6258e8b1fe4a67b0c53fe03461421d9","impliedFormat":1},{"version":"3df5b34f3449733bc4831b8d670f958a045e7a3f5d7b0e21991ef95408dbec13","impliedFormat":1},{"version":"76a89af04f2ba1807309320dab5169c0d1243b80738b4a2005989e40a136733e","impliedFormat":1},{"version":"c045b664abf3fc2a4750fa96117ab2735e4ed45ddd571b2a6a91b9917e231a02","impliedFormat":1},{"version":"068b8ee5c2cd90d7a50f2efadbbe353cb10196a41189a48bf4b2a867363012b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"0c312a7c5dec6c616f754d3a4b16318ce8d1cb912dfb3dfa0e808f45e66cbb21","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f44a190351ab5e1811abebe007cf60518044772ccc08244f9f241706afa767f","impliedFormat":1},{"version":"fecdf44bec4ee9c5188e5f2f58c292c9689c02520900dceaaa6e76594de6da90","impliedFormat":1},{"version":"cf45d0510b661f1da461479851ff902f188edb111777c37055eff12fa986a23a","impliedFormat":1},{"version":"6a4a80787c57c10b3ea8314c80d9cc6e1deb99d20adca16106a337825f582420","affectsGlobalScope":true,"impliedFormat":1},{"version":"f2b9440f98d6f94c8105883a2b65aee2fce0248f71f41beafd0a80636f3a565d","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","impliedFormat":1},{"version":"211440ce81e87b3491cdf07155881344b0a61566df6e749acff0be7e8b9d1a07","impliedFormat":1},{"version":"5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","impliedFormat":1},{"version":"880da0e0f3ebca42f9bd1bc2d3e5e7df33f2619d85f18ee0ed4bd16d1800bc32","impliedFormat":1},{"version":"e12a40ba307d38757b6f0637958d945de7442dbd0986fd3e4f7a61cc65b3bc61","impliedFormat":1},{"version":"f7c6cedb3d30550bcaff98e3f7ac6e6fe45909794ae6228d36dd77a0b101f176","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f6f50154127d4da065cdc1ec3b1419b571b4864ca27921af5bb7d4e58244756","impliedFormat":1},{"version":"30e6a6a947b98cdd94ad282c3e36590b6613411f44a009a0eca9105b996e0be3","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e2f08258e671e67a177bd9057e785956c23b2542308f9559db037fe1114105","impliedFormat":1},{"version":"088703b7810394a5af823ac753cca116931df81a97183725ae1e2c4e6038268d","impliedFormat":1},{"version":"6cf45d4fd013b7c4ba1cd422555a3170946dc1d3804e135b5c4a971dbe4c1aa7","impliedFormat":1},{"version":"2fd34e1921bb7e6706b8d9fcb5d4d9f2f3e23e742e38bdb3094c83668ca09070","impliedFormat":1},{"version":"be2ab41bbfa1db74d67df1a5cb0c00b5f6d4badc0bc35cff2984880e2698bc1b","impliedFormat":1},{"version":"746b7007f5959dc155f54964ce3d1f8289e914ad480f1f7ff64f54515415a637","impliedFormat":1},{"version":"41e1718c5738cd9261acc61439f2156ed3b8a3267de9805e55b3cf7d839f5063","impliedFormat":1},{"version":"4e20f9be439bf149c8f336a7d9efb1dcc785a29d8cbb73efa279f8bf883a7058","impliedFormat":1},{"version":"07e25f754a8435121d3ba0012458e3e10ae6f3fddeffebb2b1054a0579fad3ea","impliedFormat":99},{"version":"d720ff8b68e35ff0321e4a764c1fd92c1f568f4f14b1558debc05871abff388a","impliedFormat":99},{"version":"099b997612cf9d0bdb69222aeda9018094a3b18df31d294581b66eafb170087e","impliedFormat":99},{"version":"617b2e0fa917ace5e1b19dcef2eae8a5888732a390c94e0b97f1afa3b6c5b52c","impliedFormat":99},{"version":"da77aa3d854b204e47ef742c4ecd71cd0b020f802e13b6a7e719367e8b9ccd18","impliedFormat":99},{"version":"7bd07cbfecde1888cb8b573bccb64e16256c0b15c97ccdf78ad7a0e78006f925","impliedFormat":99},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"201ced2ca97d71fe47afdaebc656c2fa63ef2784256e4dfc9eb83930f7aac2c2","impliedFormat":1},{"version":"d8b8a5a6bf623239d5374ad4a7ff6f3b195ab5ee61293f59f1957e90d2a22809","impliedFormat":1},{"version":"35d283eca7dc0a0c7b099f5fbbf0678b87f3d837572cd5e539ba297ad9837e68","impliedFormat":1},{"version":"03852330113bfc10a497a653f39ad9f4ee8e4ed31a44cb9981de6d9d662c5354","impliedFormat":1},{"version":"26ec2c615ee349154b9cdb180a9bbd2d3e28a2646242e936cf79c1a44847ade7","impliedFormat":1},{"version":"56471ec726edfb50d4bc87b83e52f97de74f5d385db3db214f6e3ec2d02a3fb6","impliedFormat":99},{"version":"86a6eee8858453e02abc1196b611b348f9b157d19dcd47660246ede5b6a82676","impliedFormat":99},{"version":"129c10790c7de83509b3d852a79189b475a40b128e0726bd469f96b3d5749811","impliedFormat":99},{"version":"98763329166c62fa0ca9cfc0042bf924605c78bab880dc8b06ec83a445d3d67a","impliedFormat":99},{"version":"54cb16297ded2864aa5a752ac9ff205a85931492c3bdbe8a2ec9e584acb10048","impliedFormat":99},{"version":"ad739669b8527bacfaf8493ea4552216843afd0f9a2e583dec20ee7f4e2ead6e","impliedFormat":99},{"version":"ba56e7c11bd24eca78daa7147a870697ab31f3f14a9c56158ab9c26080019ab7","impliedFormat":99},{"version":"e659b13059a9648ee111b73bb107d78761cf4aa446b29f9a898f6aea7cce8a30","impliedFormat":99},{"version":"e6b139475ce20dbc97ce616446d383d91641d51cf49e87fa4eceace7291f0bb0","impliedFormat":99},{"version":"36e85619f30581305cb707f60af9882474e802abed2d03125e04c07e763f7c4a","impliedFormat":99},{"version":"f0009b8cd0609df584a4c73a302e8839f6c6dc79807feac2b5f2831d12721964","impliedFormat":99},{"version":"188cae2ce1d4ac59f8527e18892de13a5aca22728f2a275a2dea370e31ded612","impliedFormat":1},{"version":"9cc4b32e64c74f87cfcb26cdedb3a3455925ca430ad1f99d6a20e5a0dea1929e","signature":"ca7bd98691a8791dd32ffce6c205923d422b0ed0c2b199a2120b17dfb15fd2f2","impliedFormat":99},{"version":"74c8f050ca65a2742f4fb7838f8c201cdf4cc3163c81259b20d0aa5d91914c6a","signature":"3b5afd9a508beb9fffd7c601c04d40f933337c728f9a37386d0f6e4cc63b2ffc","impliedFormat":99},{"version":"f9bb69bf4a29e96b8ee756d57e02b995c2e222c2d5dd58136e8df9a93a16ecfd","signature":"ec30c62718c4e8d8fe11ffb0cbea6f00c9ce1811c233b96d1640856da8f5138a","impliedFormat":99},{"version":"13613f30ce4b9784a318a398db971cacde011954b93606ac53ed1802df1f38d6","signature":"7e4ca66b0da05237cb6cb8017c64f9e21474033dc1c91dc55ea7ec158a379e90","impliedFormat":99},{"version":"dc3b172ee27054dbcedcf5007b78c256021db936f6313a9ce9a3ecbb503fd646","impliedFormat":1},{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"86e56d97b13ef0a58bc9c59aee782ae7d47d63802b5b32129ec5e5d62c20dbfa","affectsGlobalScope":true,"impliedFormat":1},{"version":"68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true,"impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"7852500a7dc3f9cb6b73d619f6e0249119211ea662fd5e16c59ee5aba3deeb80","impliedFormat":1},{"version":"c3ae6bb11d6666d56efb16b56903895ba5320c2c2b0fecaf27784ef4599ac632","impliedFormat":1},{"version":"3b43f7224c99344262753af8fc1bb66cf0dc36fb15de92a190af88502c6256f6","impliedFormat":1},{"version":"be00321090ed100e3bd1e566c0408004137e73feb19d6380eba57d68519ff6c5","impliedFormat":1},{"version":"bb4ed283cfb3db7ec1d4bb79c37f5e96d39b340f1f4de995c4b0b836c8d5fa05","impliedFormat":1},{"version":"169cc96316cacf8b489aaab4ac6bcef7b33e8779a8902bce57c737b4aa372d16","impliedFormat":1},{"version":"8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","impliedFormat":1},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"0ea93d01083b3d5863cc98cb589b5d0eac55d14417487f9e5e455dfa0b17c660","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b5402ae709d042c3530ed3506c135a967159f42aed3221267e70c5b7240b577","impliedFormat":1},{"version":"4f5269c28ed792a21efe3e2733a3398cb83f84384ccd9c5cd5a0950fdb211342","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"327fddc7dd391f1e62262dafe41fc9cabedb4a5758a5cfce979cebab1456abb8","impliedFormat":1},{"version":"ec596fa2357df1b2702e42bcba645422eb727ab5c81136f78590f21a100286e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ff2ceda3a4b66023a83964a4e2674b9778ce5255f87c5eefefd6d0f7f1967d56","impliedFormat":1},{"version":"a016d2f6c0a2c15069ec69661ad37c86a450deb629ce96a592f15f01d3a5746e","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"7d2a0ba1297be385a89b5515b88cd31b4a1eeef5236f710166dc1b36b1741e1b","impliedFormat":1},{"version":"5adc55aaebfb20914e274a1202b5c78638260364997d724dec52d7b2704b461c","impliedFormat":1},{"version":"525b52b38b44420fb1758c0917e7b67cf379f7f9477d2ba7343f3d5f50a44258","affectsGlobalScope":true,"impliedFormat":1},{"version":"58b63c0f3bfac04d639c31a9fe094089c0bdcc8cda7bc35f1f23828677aa7926","impliedFormat":1},{"version":"d51d662a37aa1f1b97ed4caf4f1c25832047b9bfffcc707b53aedd07cd245303","impliedFormat":1},{"version":"b9d02ff98f8c5da182f415c7152b0da746346b0a15e6a93d772eff0c72165b9d","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e","impliedFormat":1}],"root":[[188,191]],"options":{"allowJs":true,"checkJs":false,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"inlineSourceMap":false,"module":199,"outDir":"./esm","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"useUnknownInCatchVariables":false},"fileIdsList":[[158,162],[158],[129,148,157],[158,159,160,161],[193],[195],[197,198,199],[129,148],[112,148,149,150],[148],[111,129,137,148],[112,140,148],[111,148],[62],[98],[99,104,132],[100,111,112,119,129,140],[100,101,111,119],[102,141],[103,104,112,120],[104,129,137],[105,107,111,119],[98,106],[107,108],[111],[109,111],[98,111],[111,112,113,129,140],[111,112,113,126,129,132],[96,145],[107,111,114,119,129,140],[111,112,114,115,119,129,137,140],[114,116,129,137,140],[62,63,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147],[111,117],[118,140,145],[107,111,119,129],[120],[121],[98,122],[123,139,145],[124],[125],[111,126,127],[126,128,141,143],[99,111,129,130,131,132],[99,129,131],[129,130],[132],[133],[98,129],[111,135,136],[135,136],[104,119,129,137],[138],[119,139],[99,114,125,140],[104,141],[129,142],[118,143],[144],[99,104,111,113,122,129,140,143,145],[129,146],[111,139,148,213],[216,255],[216,240,255],[255],[216],[216,241,255],[216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254],[241,255],[193,257],[256],[112,129,146,148,259],[105,119,148,172,202],[262],[100,129,148],[170],[111,129,148],[100],[73,77,140],[73,129,140],[68],[70,73,137,140],[119,137],[68,148],[70,73,119,140],[65,66,69,72,99,111,129,140],[65,71],[69,73,99,132,140,148],[99,148],[89,99,148],[67,68,148],[73],[67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95],[73,80,81],[71,73,81,82],[72],[65,68,73],[73,77,81,82],[77],[71,73,76,140],[65,70,71,73,77,80],[99,129],[68,73,89,99,145,148],[129,148,171],[129,148,171,172,173,174],[114,148,172],[165,168,169,176,177,178,179],[155],[175],[100,148,155,156,163,164],[166,167,180],[165],[111,119,148,165],[186,188,190],[121,151,181,186,187],[186,189],[104,119,121,151,165,180,181,186,188],[183,184,185],[155,165,166,183],[155,182],[112,152,153,154],[120,152]],"referencedMap":[[163,1],[159,2],[158,3],[160,2],[161,2],[162,4],[194,5],[196,6],[200,7],[201,8],[151,9],[202,10],[203,11],[149,12],[204,10],[209,10],[210,13],[62,14],[63,14],[98,15],[99,16],[100,17],[101,18],[102,19],[103,20],[104,21],[105,22],[106,23],[107,24],[108,24],[110,25],[109,26],[111,27],[112,28],[113,29],[97,30],[114,31],[115,32],[116,33],[148,34],[117,35],[118,36],[119,37],[120,38],[121,39],[122,40],[123,41],[124,42],[125,43],[126,44],[127,44],[128,45],[129,46],[131,47],[130,48],[132,49],[133,50],[134,51],[135,52],[136,53],[137,54],[138,55],[139,56],[140,57],[141,58],[142,59],[143,60],[144,61],[145,62],[146,63],[214,64],[240,65],[241,66],[216,67],[219,67],[238,65],[239,65],[229,65],[228,68],[226,65],[221,65],[234,65],[232,65],[236,65],[220,65],[233,65],[237,65],[222,65],[223,65],[235,65],[217,65],[224,65],[225,65],[227,65],[231,65],[242,69],[230,65],[218,65],[255,70],[249,69],[251,71],[250,69],[243,69],[244,69],[246,69],[248,69],[252,71],[253,71],[245,71],[247,71],[258,72],[257,73],[260,74],[261,75],[263,76],[157,77],[171,78],[259,79],[156,80],[80,81],[87,82],[79,81],[94,83],[71,84],[70,85],[93,10],[88,86],[91,87],[73,88],[72,89],[68,90],[67,91],[90,92],[69,93],[74,94],[78,94],[96,95],[95,94],[82,96],[83,97],[85,98],[81,99],[84,100],[89,10],[76,101],[77,102],[86,103],[66,104],[92,105],[172,106],[175,107],[173,10],[174,108],[180,109],[177,110],[176,111],[165,112],[181,113],[166,114],[167,115],[191,116],[188,117],[190,118],[189,119],[186,120],[185,110],[184,121],[183,122],[155,123],[153,124]],"exportedModulesMap":[[163,1],[159,2],[158,3],[160,2],[161,2],[162,4],[194,5],[196,6],[200,7],[201,8],[151,9],[202,10],[203,11],[149,12],[204,10],[209,10],[210,13],[62,14],[63,14],[98,15],[99,16],[100,17],[101,18],[102,19],[103,20],[104,21],[105,22],[106,23],[107,24],[108,24],[110,25],[109,26],[111,27],[112,28],[113,29],[97,30],[114,31],[115,32],[116,33],[148,34],[117,35],[118,36],[119,37],[120,38],[121,39],[122,40],[123,41],[124,42],[125,43],[126,44],[127,44],[128,45],[129,46],[131,47],[130,48],[132,49],[133,50],[134,51],[135,52],[136,53],[137,54],[138,55],[139,56],[140,57],[141,58],[142,59],[143,60],[144,61],[145,62],[146,63],[214,64],[240,65],[241,66],[216,67],[219,67],[238,65],[239,65],[229,65],[228,68],[226,65],[221,65],[234,65],[232,65],[236,65],[220,65],[233,65],[237,65],[222,65],[223,65],[235,65],[217,65],[224,65],[225,65],[227,65],[231,65],[242,69],[230,65],[218,65],[255,70],[249,69],[251,71],[250,69],[243,69],[244,69],[246,69],[248,69],[252,71],[253,71],[245,71],[247,71],[258,72],[257,73],[260,74],[261,75],[263,76],[157,77],[171,78],[259,79],[156,80],[80,81],[87,82],[79,81],[94,83],[71,84],[70,85],[93,10],[88,86],[91,87],[73,88],[72,89],[68,90],[67,91],[90,92],[69,93],[74,94],[78,94],[96,95],[95,94],[82,96],[83,97],[85,98],[81,99],[84,100],[89,10],[76,101],[77,102],[86,103],[66,104],[92,105],[172,106],[175,107],[173,10],[174,108],[180,109],[177,110],[176,111],[165,112],[181,113],[166,114],[167,115],[191,116],[186,120],[185,110],[184,121],[183,122],[155,123],[153,124]],"semanticDiagnosticsPerFile":[163,159,158,160,161,162,192,194,193,196,197,200,198,201,151,202,203,199,149,150,204,205,206,207,208,195,209,210,62,63,98,99,100,101,102,103,104,105,106,107,108,110,109,111,112,113,97,147,114,115,116,148,117,118,119,120,121,122,123,124,125,126,127,128,129,131,130,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,211,212,214,215,213,240,241,216,219,238,239,229,228,226,221,234,232,236,220,233,237,222,223,235,217,224,225,227,231,242,230,218,255,254,249,251,250,243,244,246,248,252,253,245,247,258,257,256,260,170,261,262,263,64,187,157,171,259,156,60,61,12,11,2,13,14,15,16,17,18,19,20,3,21,4,22,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,8,49,46,47,48,50,9,51,52,53,56,54,55,57,58,10,1,59,80,87,79,94,71,70,93,88,91,73,72,68,67,90,69,74,75,78,65,96,95,82,83,85,81,84,89,76,77,86,66,92,172,175,173,174,180,179,168,177,176,164,169,178,165,181,166,167,191,188,190,189,186,182,185,184,183,154,155,153,152],"latestChangedDtsFile":"./esm/index.d.ts"},"version":"5.4.5"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iobroker/db-objects-file",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.0.10
|
|
4
|
+
"version": "6.0.10",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=12.0.0"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@iobroker/db-base": "6.0.10
|
|
10
|
-
"@iobroker/db-objects-redis": "6.0.10
|
|
9
|
+
"@iobroker/db-base": "6.0.10",
|
|
10
|
+
"@iobroker/db-objects-redis": "6.0.10",
|
|
11
11
|
"deep-clone": "^3.0.3",
|
|
12
12
|
"fs-extra": "^11.1.0"
|
|
13
13
|
},
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"files": [
|
|
48
48
|
"build/"
|
|
49
49
|
],
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "d40de94868ecdd0b3a44d7d46bbfc8239fb268cc"
|
|
51
51
|
}
|