Commit 27c13421 by zuizuihao

refactor

parent 93fd2e6d
Showing with 5 additions and 22364 deletions
{ {
"appName": "demo_meteor", "appName": "demo_meteor",
"appLocation": { "appLocation": {
"local": "./" "local": "../"
}, },
"meteorSettingsLocation": "C:\\Users\\王扬\\Desktop\\demo_meteor\\settings.json", "meteorSettingsLocation": "./settings.json",
"meteorSettingsInRepo": false, "meteorSettingsInRepo": false,
"prebuildScript": "", "prebuildScript": "",
"meteorBuildFlags": "--architecture os.linux.x86_64", "meteorBuildFlags": "--architecture os.linux.x86_64",
"env": { "env": {
"ROOT_URL": "", "ROOT_URL": "http://39.100.116.31",
"PORT": 3000, "PORT": 3000,
"MONGO_URL": "" "MONGO_URL": ""
}, },
......
node_modules/ node_modules/
bundle
No preview for this file type
This is a Meteor application bundle. It has only one external dependency:
Node.js v8.15.1. To run the application:
$ (cd programs/server && npm install)
$ export MONGO_URL='mongodb://user:password@host:port/databasename'
$ export ROOT_URL='http://example.com'
$ export MAIL_URL='smtp://user:password@mailhost:port/'
$ node main.js
Use the PORT environment variable to set the port where the
application will listen. The default is 80, but that will require
root on most systems.
Find out more about Meteor at meteor.com.
process.argv.splice(2, 0, 'program.json');
process.chdir(require('path').join(__dirname, 'programs', 'server'));
require('./programs/server/boot.js');
\ No newline at end of file
var require = meteorInstall({"server":{"main.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////
// //
// server/main.js //
// //
///////////////////////////////////////////////////////////////////////
//
let Meteor;
module.link("meteor/meteor", {
Meteor(v) {
Meteor = v;
}
}, 0);
Meteor.startup(() => {// code to run on server at startup
});
///////////////////////////////////////////////////////////////////////
}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/server/main.js");
//# sourceURL=meteor://💻app/app/app.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21haW4uanMiXSwibmFtZXMiOlsiTWV0ZW9yIiwibW9kdWxlIiwibGluayIsInYiLCJzdGFydHVwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUlBLE1BQUo7QUFBV0MsTUFBTSxDQUFDQyxJQUFQLENBQVksZUFBWixFQUE0QjtBQUFDRixRQUFNLENBQUNHLENBQUQsRUFBRztBQUFDSCxVQUFNLEdBQUNHLENBQVA7QUFBUzs7QUFBcEIsQ0FBNUIsRUFBa0QsQ0FBbEQ7QUFFWEgsTUFBTSxDQUFDSSxPQUFQLENBQWUsTUFBTSxDQUNuQjtBQUNELENBRkQsRSIsImZpbGUiOiIvYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWV0ZW9yIH0gZnJvbSAnbWV0ZW9yL21ldGVvcic7XG5cbk1ldGVvci5zdGFydHVwKCgpID0+IHtcbiAgLy8gY29kZSB0byBydW4gb24gc2VydmVyIGF0IHN0YXJ0dXBcbn0pO1xuIl19
{"version":3,"sources":["meteor://💻app/server/main.js"],"names":["Meteor","module","link","v","startup"],"mappings":";;;;;;;;AAAA,IAAIA,MAAJ;AAAWC,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACF,QAAM,CAACG,CAAD,EAAG;AAACH,UAAM,GAACG,CAAP;AAAS;;AAApB,CAA5B,EAAkD,CAAlD;AAEXH,MAAM,CAACI,OAAP,CAAe,MAAM,CACnB;AACD,CAFD,E","file":"/app.js","sourcesContent":["import { Meteor } from 'meteor/meteor';\n\nMeteor.startup(() => {\n // code to run on server at startup\n});\n"]}
\ No newline at end of file
/* Imports for global scope */
MongoInternals = Package.mongo.MongoInternals;
Mongo = Package.mongo.Mongo;
ReactiveVar = Package['reactive-var'].ReactiveVar;
Tracker = Package.tracker.Tracker;
Deps = Package.tracker.Deps;
ECMAScript = Package.ecmascript.ECMAScript;
Meteor = Package.meteor.Meteor;
global = Package.meteor.global;
meteorEnv = Package.meteor.meteorEnv;
WebApp = Package.webapp.WebApp;
WebAppInternals = Package.webapp.WebAppInternals;
main = Package.webapp.main;
DDP = Package['ddp-client'].DDP;
DDPServer = Package['ddp-server'].DDPServer;
LaunchScreen = Package['launch-screen'].LaunchScreen;
Blaze = Package.ui.Blaze;
UI = Package.ui.UI;
Handlebars = Package.ui.Handlebars;
Spacebars = Package.spacebars.Spacebars;
meteorInstall = Package.modules.meteorInstall;
meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
Promise = Package.promise.Promise;
Autoupdate = Package.autoupdate.Autoupdate;
HTML = Package.htmljs.HTML;
// Separated from boot.js for testing.
// Check that we have a pid that looks like an integer (non-decimal
// integer is okay).
exports.validPid = function (pid) {
return ! isNaN(+pid);
};
var Fiber = require("fibers");
var fs = require("fs");
var path = require("path");
var Future = require("fibers/future");
var sourcemap_support = require('source-map-support');
var bootUtils = require('./boot-utils.js');
var files = require('./mini-files.js');
var npmRequire = require('./npm-require.js').require;
var Profile = require('./profile.js').Profile;
// This code is duplicated in tools/main.js.
var MIN_NODE_VERSION = 'v8.0.0';
var hasOwn = Object.prototype.hasOwnProperty;
if (require('semver').lt(process.version, MIN_NODE_VERSION)) {
process.stderr.write(
'Meteor requires Node ' + MIN_NODE_VERSION + ' or later.\n');
process.exit(1);
}
// read our control files
var serverJsonPath = path.resolve(process.argv[2]);
var serverDir = path.dirname(serverJsonPath);
var serverJson = require("./server-json.js");
var configJson =
JSON.parse(fs.readFileSync(path.resolve(serverDir, 'config.json'), 'utf8'));
var programsDir = path.dirname(serverDir);
var buildDir = path.dirname(programsDir);
var starJson = JSON.parse(fs.readFileSync(path.join(buildDir, "star.json")));
// Set up environment
__meteor_bootstrap__ = {
startupHooks: [],
serverDir: serverDir,
configJson: configJson
};
__meteor_runtime_config__ = {
meteorRelease: configJson.meteorRelease,
gitCommitHash: starJson.gitCommitHash
};
if (!process.env.APP_ID) {
process.env.APP_ID = configJson.appId;
}
// Map from load path to its source map.
var parsedSourceMaps = {};
const meteorDebugFuture =
process.env.METEOR_INSPECT_BRK ? new Future : null;
function maybeWaitForDebuggerToAttach() {
if (meteorDebugFuture) {
const { pause } = require("./debug.js");
const pauseThresholdMs = 50;
const pollIntervalMs = 500;
const waitStartTimeMs = +new Date;
const waitLimitMinutes = 5;
const waitLimitMs = waitLimitMinutes * 60 * 1000;
// This setTimeout not only waits for the debugger to attach, but also
// keeps the process alive by preventing the event loop from running
// empty while the main Fiber yields.
setTimeout(function poll() {
const pauseStartTimeMs = +new Date;
if (pauseStartTimeMs - waitStartTimeMs > waitLimitMs) {
console.error(
`Debugger did not attach after ${waitLimitMinutes} minutes; continuing.`
);
meteorDebugFuture.return();
} else {
// This pause function contains a debugger keyword that will only
// act as a breakpoint once a debugging client has attached to the
// process, so we keep calling pause() until the first time it
// takes at least pauseThresholdMs, which indicates that a client
// must be attached. The only other signal of a client attaching
// is an unreliable "Debugger attached" message printed to stderr
// by native C++ code, which requires the parent process to listen
// for that message and then process.send a message back to this
// process. By comparison, this polling strategy tells us exactly
// what we want to know: "Is the debugger keyword enabled yet?"
pause();
if (new Date - pauseStartTimeMs > pauseThresholdMs) {
// If the pause() function call took a meaningful amount of
// time, we can conclude the debugger keyword must be active,
// which means a debugging client must be connected, which means
// we should stop polling and let the main Fiber continue.
meteorDebugFuture.return();
} else {
// If the pause() function call didn't take a meaningful amount
// of time to execute, then the debugger keyword must not have
// caused a pause, which means a debugging client must not be
// connected, which means we should keep polling.
setTimeout(poll, pollIntervalMs);
}
}
}, pollIntervalMs);
// The polling will continue while we wait here.
meteorDebugFuture.wait();
}
}
// Read all the source maps into memory once.
serverJson.load.forEach(function (fileInfo) {
if (fileInfo.sourceMap) {
var rawSourceMap = fs.readFileSync(
path.resolve(serverDir, fileInfo.sourceMap), 'utf8');
// Parse the source map only once, not each time it's needed. Also remove
// the anti-XSSI header if it's there.
var parsedSourceMap = JSON.parse(rawSourceMap.replace(/^\)\]\}'/, ''));
// source-map-support doesn't ever look at the sourcesContent field, so
// there's no point in keeping it in memory.
delete parsedSourceMap.sourcesContent;
var url;
if (fileInfo.sourceMapRoot) {
// Add the specified root to any root that may be in the file.
parsedSourceMap.sourceRoot = path.join(
fileInfo.sourceMapRoot, parsedSourceMap.sourceRoot || '');
}
parsedSourceMaps[path.resolve(__dirname, fileInfo.path)] = parsedSourceMap;
}
});
function retrieveSourceMap(pathForSourceMap) {
if (hasOwn.call(parsedSourceMaps, pathForSourceMap)) {
return { map: parsedSourceMaps[pathForSourceMap] };
}
return null;
}
var origWrapper = sourcemap_support.wrapCallSite;
var wrapCallSite = function (frame) {
var frame = origWrapper(frame);
var wrapGetter = function (name) {
var origGetter = frame[name];
frame[name] = function (arg) {
// replace a custom location domain that we set for better UX in Chrome
// DevTools (separate domain group) in source maps.
var source = origGetter(arg);
if (! source)
return source;
return source.replace(/(^|\()meteor:\/\/..app\//, '$1');
};
};
wrapGetter('getScriptNameOrSourceURL');
wrapGetter('getEvalOrigin');
return frame;
};
sourcemap_support.install({
// Use the source maps specified in program.json instead of parsing source
// code for them.
retrieveSourceMap: retrieveSourceMap,
// For now, don't fix the source line in uncaught exceptions, because we
// haven't fixed handleUncaughtExceptions in source-map-support to properly
// locate the source files.
handleUncaughtExceptions: false,
wrapCallSite: wrapCallSite
});
// As a replacement to the old keepalives mechanism, check for a running
// parent every few seconds. Exit if the parent is not running.
//
// Two caveats to this strategy:
// * Doesn't catch the case where the parent is CPU-hogging (but maybe we
// don't want to catch that case anyway, since the bundler not yielding
// is what caused #2536).
// * Could be fooled by pid re-use, i.e. if another process comes up and
// takes the parent process's place before the child process dies.
var startCheckForLiveParent = function (parentPid) {
if (parentPid) {
if (! bootUtils.validPid(parentPid)) {
console.error("METEOR_PARENT_PID must be a valid process ID.");
process.exit(1);
}
setInterval(function () {
try {
process.kill(parentPid, 0);
} catch (err) {
console.error("Parent process is dead! Exiting.");
process.exit(1);
}
}, 3000);
}
};
var specialArgPaths = {
"packages/modules-runtime.js": function () {
return {
npmRequire: npmRequire,
Profile: Profile
};
},
"packages/dynamic-import.js": function (file) {
var dynamicImportInfo = {};
var clientArchs = configJson.clientArchs ||
Object.keys(configJson.clientPaths);
clientArchs.forEach(function (arch) {
dynamicImportInfo[arch] = {
dynamicRoot: path.join(programsDir, arch, "dynamic")
};
});
dynamicImportInfo.server = {
dynamicRoot: path.join(serverDir, "dynamic")
};
return { dynamicImportInfo: dynamicImportInfo };
}
};
var loadServerBundles = Profile("Load server bundles", function () {
var infos = [];
serverJson.load.forEach(function (fileInfo) {
var code = fs.readFileSync(path.resolve(serverDir, fileInfo.path));
var nonLocalNodeModulesPaths = [];
function addNodeModulesPath(path) {
nonLocalNodeModulesPaths.push(
files.pathResolve(serverDir, path)
);
}
if (typeof fileInfo.node_modules === "string") {
addNodeModulesPath(fileInfo.node_modules);
} else if (fileInfo.node_modules) {
Object.keys(fileInfo.node_modules).forEach(function (path) {
const info = fileInfo.node_modules[path];
if (! info.local) {
addNodeModulesPath(path);
}
});
}
// Add dev_bundle/server-lib/node_modules.
addNodeModulesPath("node_modules");
function statOrNull(path) {
try {
return fs.statSync(path);
} catch (e) {
return null;
}
}
var Npm = {
/**
* @summary Require a package that was specified using
* `Npm.depends()`.
* @param {String} name The name of the package to require.
* @locus Server
* @memberOf Npm
*/
require: Profile(function getBucketName(name) {
return "Npm.require(" + JSON.stringify(name) + ")";
}, function (name, error) {
if (nonLocalNodeModulesPaths.length > 0) {
var fullPath;
// Replace all backslashes with forward slashes, just in case
// someone passes a Windows-y module identifier.
name = name.split("\\").join("/");
nonLocalNodeModulesPaths.some(function (nodeModuleBase) {
var packageBase = files.convertToOSPath(files.pathResolve(
nodeModuleBase,
name.split("/", 1)[0]
));
if (statOrNull(packageBase)) {
return fullPath = files.convertToOSPath(
files.pathResolve(nodeModuleBase, name)
);
}
});
if (fullPath) {
return require(fullPath);
}
}
var resolved = require.resolve(name);
if (resolved === name && ! path.isAbsolute(resolved)) {
// If require.resolve(id) === id and id is not an absolute
// identifier, it must be a built-in module like fs or http.
return require(resolved);
}
throw error || new Error(
"Cannot find module " + JSON.stringify(name)
);
})
};
var getAsset = function (assetPath, encoding, callback) {
var fut;
if (! callback) {
fut = new Future();
callback = fut.resolver();
}
// This assumes that we've already loaded the meteor package, so meteor
// itself can't call Assets.get*. (We could change this function so that
// it doesn't call bindEnvironment if you don't pass a callback if we need
// to.)
var _callback = Package.meteor.Meteor.bindEnvironment(function (err, result) {
if (result && ! encoding)
// Sadly, this copies in Node 0.10.
result = new Uint8Array(result);
callback(err, result);
}, function (e) {
console.log("Exception in callback of getAsset", e.stack);
});
// Convert a DOS-style path to Unix-style in case the application code was
// written on Windows.
assetPath = files.convertToStandardPath(assetPath);
// Unicode normalize the asset path to prevent string mismatches when
// using this string elsewhere.
assetPath = files.unicodeNormalizePath(assetPath);
if (! fileInfo.assets || ! hasOwn.call(fileInfo.assets, assetPath)) {
_callback(new Error("Unknown asset: " + assetPath));
} else {
var filePath = path.join(serverDir, fileInfo.assets[assetPath]);
fs.readFile(files.convertToOSPath(filePath), encoding, _callback);
}
if (fut)
return fut.wait();
};
var Assets = {
getText: function (assetPath, callback) {
return getAsset(assetPath, "utf8", callback);
},
getBinary: function (assetPath, callback) {
return getAsset(assetPath, undefined, callback);
},
/**
* @summary Get the absolute path to the static server asset. Note that assets are read-only.
* @locus Server [Not in build plugins]
* @memberOf Assets
* @param {String} assetPath The path of the asset, relative to the application's `private` subdirectory.
*/
absoluteFilePath: function (assetPath) {
// Unicode normalize the asset path to prevent string mismatches when
// using this string elsewhere.
assetPath = files.unicodeNormalizePath(assetPath);
if (! fileInfo.assets || ! hasOwn.call(fileInfo.assets, assetPath)) {
throw new Error("Unknown asset: " + assetPath);
}
assetPath = files.convertToStandardPath(assetPath);
var filePath = path.join(serverDir, fileInfo.assets[assetPath]);
return files.convertToOSPath(filePath);
},
};
var wrapParts = ["(function(Npm,Assets"];
var specialArgs =
hasOwn.call(specialArgPaths, fileInfo.path) &&
specialArgPaths[fileInfo.path](fileInfo);
var specialKeys = Object.keys(specialArgs || {});
specialKeys.forEach(function (key) {
wrapParts.push("," + key);
});
// \n is necessary in case final line is a //-comment
wrapParts.push("){", code, "\n})");
var wrapped = wrapParts.join("");
// It is safer to use the absolute path when source map is present as
// different tooling, such as node-inspector, can get confused on relative
// urls.
// fileInfo.path is a standard path, convert it to OS path to join with
// __dirname
var fileInfoOSPath = files.convertToOSPath(fileInfo.path);
var absoluteFilePath = path.resolve(__dirname, fileInfoOSPath);
var scriptPath =
parsedSourceMaps[absoluteFilePath] ? absoluteFilePath : fileInfoOSPath;
var func = require('vm').runInThisContext(wrapped, {
filename: scriptPath,
displayErrors: true
});
var args = [Npm, Assets];
specialKeys.forEach(function (key) {
args.push(specialArgs[key]);
});
if (meteorDebugFuture) {
infos.push({
fn: Profile(fileInfo.path, func),
args
});
} else {
// Allows us to use code-coverage if the debugger is not enabled
Profile(fileInfo.path, func).apply(global, args);
}
});
maybeWaitForDebuggerToAttach();
infos.forEach(info => {
info.fn.apply(global, info.args);
});
});
var callStartupHooks = Profile("Call Meteor.startup hooks", function () {
// run the user startup hooks. other calls to startup() during this can still
// add hooks to the end.
while (__meteor_bootstrap__.startupHooks.length) {
var hook = __meteor_bootstrap__.startupHooks.shift();
Profile.time(hook.stack || "(unknown)", hook);
}
// Setting this to null tells Meteor.startup to call hooks immediately.
__meteor_bootstrap__.startupHooks = null;
});
var runMain = Profile("Run main()", function () {
// find and run main()
// XXX hack. we should know the package that contains main.
var mains = [];
var globalMain;
if ('main' in global) {
mains.push(main);
globalMain = main;
}
if (typeof Package !== "undefined") {
Object.keys(Package).forEach(function (name) {
const { main } = Package[name];
if (typeof main === "function" &&
main !== globalMain) {
mains.push(main);
}
});
}
if (! mains.length) {
process.stderr.write("Program has no main() function.\n");
process.exit(1);
}
if (mains.length > 1) {
process.stderr.write("Program has more than one main() function?\n");
process.exit(1);
}
var exitCode = mains[0].call({}, process.argv.slice(3));
// XXX hack, needs a better way to keep alive
if (exitCode !== 'DAEMON')
process.exit(exitCode);
if (process.env.METEOR_PARENT_PID) {
startCheckForLiveParent(process.env.METEOR_PARENT_PID);
}
});
Fiber(function () {
Profile.run("Server startup", function () {
loadServerBundles();
callStartupHooks();
runMain();
});
}).run();
{
"meteorRelease": "METEOR@1.8.1",
"appId": "lztljtyc7lt.qz3r4xhdnbm",
"clientArchs": [
"web.browser",
"web.browser.legacy"
]
}
\ No newline at end of file
exports.pause = function () {
// The debugger pauses here when you run `meteor debug`, so that you can
// set breakpoints or add `debugger` statements to your server code
// before the code begins executing. Once you have set any breakpoints
// you wish to set, click the |▶ button to continue.
debugger;
};
\ No newline at end of file
var _ = require("underscore");
var os = require("os");
var path = require("path");
var assert = require("assert");
// All of these functions are attached to files.js for the tool;
// they live here because we need them in boot.js as well to avoid duplicating
// a lot of the code.
//
// Note that this file does NOT contain any of the "perform I/O maybe
// synchronously" functions from files.js; this is intentional, because we want
// to make it very hard to accidentally use fs.*Sync functions in the app server
// after bootup (since they block all concurrency!)
var files = module.exports;
// Detect that we are on a Windows-like Filesystem, such as that in a WSL
// (Windows Subsystem for Linux) even if it otherwise looks like we're on Unix.
// https://github.com/Microsoft/BashOnWindows/issues/423#issuecomment-221627364
var isWindowsLikeFilesystem = function () {
return process.platform === "win32" ||
(os.release().indexOf("Microsoft") > -1);
};
var toPosixPath = function (p, partialPath) {
// Sometimes, you can have a path like \Users\IEUser on windows, and this
// actually means you want C:\Users\IEUser
if (p[0] === "\\" && (! partialPath)) {
p = process.env.SystemDrive + p;
}
p = p.replace(/\\/g, '/');
if (p[1] === ':' && ! partialPath) {
// transform "C:/bla/bla" to "/c/bla/bla"
p = '/' + p[0] + p.slice(2);
}
return p;
};
var toDosPath = function (p, partialPath) {
if (p[0] === '/' && ! partialPath) {
if (! /^\/[A-Za-z](\/|$)/.test(p))
throw new Error("Surprising path: " + p);
// transform a previously windows path back
// "/C/something" to "c:/something"
p = p[1] + ":" + p.slice(2);
}
p = p.replace(/\//g, '\\');
return p;
};
var convertToOSPath = function (standardPath, partialPath) {
if (process.platform === "win32") {
return toDosPath(standardPath, partialPath);
}
return standardPath;
};
var convertToStandardPath = function (osPath, partialPath) {
if (process.platform === "win32") {
return toPosixPath(osPath, partialPath);
}
return osPath;
}
var convertToOSLineEndings = function (fileContents) {
return fileContents.replace(/\n/g, os.EOL);
};
var convertToStandardLineEndings = function (fileContents) {
// Convert all kinds of end-of-line chars to linuxy "\n".
return fileContents.replace(new RegExp("\r\n", "g"), "\n")
.replace(new RegExp("\r", "g"), "\n");
};
// Return the Unicode Normalization Form of the passed in path string, using
// "Normalization Form Canonical Composition"
const unicodeNormalizePath = (path) => {
return (path) ? path.normalize('NFC') : path;
};
// wrappings for path functions that always run as they were on unix (using
// forward slashes)
var wrapPathFunction = function (name, partialPaths) {
var f = path[name];
assert.strictEqual(typeof f, "function");
return function (/* args */) {
if (process.platform === 'win32') {
var args = _.toArray(arguments);
args = _.map(args, function (p, i) {
// if partialPaths is turned on (for path.join mostly)
// forget about conversion of absolute paths for Windows
return toDosPath(p, partialPaths);
});
var result = f.apply(path, args);
if (typeof result === "string") {
result = toPosixPath(result, partialPaths);
}
return result;
}
return f.apply(path, arguments);
};
};
files.pathJoin = wrapPathFunction("join", true);
files.pathNormalize = wrapPathFunction("normalize");
files.pathRelative = wrapPathFunction("relative");
files.pathResolve = wrapPathFunction("resolve");
files.pathDirname = wrapPathFunction("dirname");
files.pathBasename = wrapPathFunction("basename");
files.pathExtname = wrapPathFunction("extname");
// The path.isAbsolute function is implemented in Node v4.
files.pathIsAbsolute = wrapPathFunction("isAbsolute");
files.pathSep = '/';
files.pathDelimiter = ':';
files.pathOsDelimiter = path.delimiter;
files.isWindowsLikeFilesystem = isWindowsLikeFilesystem;
files.convertToStandardPath = convertToStandardPath;
files.convertToOSPath = convertToOSPath;
files.convertToWindowsPath = toDosPath;
files.convertToPosixPath = toPosixPath;
files.convertToStandardLineEndings = convertToStandardLineEndings;
files.convertToOSLineEndings = convertToOSLineEndings;
files.unicodeNormalizePath = unicodeNormalizePath;
// Command-line arguments passed to npm when rebuilding binary packages.
var args = [
"rebuild",
// The --update-binary flag tells node-pre-gyp to replace previously
// installed local binaries with remote binaries:
// https://github.com/mapbox/node-pre-gyp#options
"--update-binary"
];
// Allow additional flags to be passed via the $METEOR_NPM_REBUILD_FLAGS
// environment variable.
var flags = process.env.METEOR_NPM_REBUILD_FLAGS;
if (flags) {
args = ["rebuild"];
flags.split(/\s+/g).forEach(function (flag) {
if (flag) {
args.push(flag);
}
});
}
exports.get = function () {
// Make a defensive copy.
return args.slice(0);
};
// If a developer wants to go to the trouble of building on exactly the
// same architecture as the production machine, then it should be possible
// to skip running `npm rebuild`.
if (process.env.METEOR_SKIP_NPM_REBUILD) {
process.exit(0);
}
var fs = require("fs");
var path = require("path");
var spawn = require("child_process").spawn;
var rebuildArgs = require("./npm-rebuild-args.js").get();
try {
// This JSON file gets written in meteor/tools/isobuild/bundler.js.
var rebuilds = require("./npm-rebuilds.json");
} catch (e) {
if (e.code !== "MODULE_NOT_FOUND") {
throw e;
}
// If npm-rebuilds.json was not written, assume there is nothing that
// needs to be rebuilt.
process.exit(0);
}
// Make sure the npm finds this exact version of node in its $PATH.
var binDir = path.dirname(process.execPath);
process.env.PATH = binDir + path.delimiter + process.env.PATH;
var npmCmd = "npm";
if (process.platform === "win32") {
var npmCmdPath = path.join(binDir, "npm.cmd");
if (fs.existsSync(npmCmdPath)) {
npmCmd = npmCmdPath;
}
}
function rebuild(i) {
var dir = rebuilds && rebuilds[i];
if (! dir) {
// Print Node/V8/etc. versions for diagnostic purposes.
spawn(npmCmd, ["version", "--json"], {
stdio: "inherit"
});
return;
}
spawn(npmCmd, rebuildArgs, {
cwd: path.join(__dirname, dir),
stdio: "inherit"
}).on("exit", function (code) {
if (code !== 0) {
process.exit(code);
} else {
rebuild(i + 1);
}
});
}
rebuild(0);
[
"npm/node_modules/meteor/babel-compiler"
]
var assert = require("assert");
var fs = require("fs");
var path = require("path");
var _ = require('underscore');
var files = require('./mini-files.js');
var serverJson = require("./server-json.js");
var topLevelIdPattern = /^[^./]/;
function statOrNull(path) {
try {
return fs.statSync(path);
} catch (e) {
return null;
}
}
function findAppDirHelper(absOSPath) {
if (fs.statSync(absOSPath).isDirectory() &&
statOrNull(path.join(absOSPath, ".meteor"))) {
return absOSPath;
}
var parentDir = path.dirname(absOSPath);
if (parentDir !== absOSPath) {
return findAppDirHelper(parentDir);
}
throw new Error("Cannot find application root directory");
}
function findAppDir(absPath) {
return files.convertToPosixPath(
findAppDirHelper(files.convertToOSPath(absPath)));
}
// Map from virtual module identifiers for node_modules directories (like
// "/node_modules/meteor/blaze/node_modules") to the absolute paths of the
// read node_modules directories on disk. The npmRequire function below
// needs to look up absolute paths using virtual identifiers as input.
var nodeModulesRegistry = Object.create(null);
_.each(serverJson.load, function (fileInfo) {
if (fileInfo.node_modules) {
var match = /^(packages|app)\/(\S+)?\.js/.exec(fileInfo.path);
if (match) {
if (match[1] === "packages") {
registerNodeModules(match[2], fileInfo.node_modules);
} else if (match[1] === "app") {
registerNodeModules(null, fileInfo.node_modules);
}
}
}
});
function registerNodeModules(name, node_modules) {
if (typeof node_modules === "string") {
addByPath(node_modules);
} else {
Object.keys(node_modules).forEach(addByPath);
}
function addByPath(node_modules) {
assert.strictEqual(typeof node_modules, "string");
var parts = node_modules.split(files.pathSep);
if (parts[0] === "") parts.shift();
if (files.pathIsAbsolute(node_modules)) {
if (! name) {
var appDir = findAppDir(node_modules);
var relPathWithinApp = files.pathRelative(appDir, node_modules);
addByParts(relPathWithinApp.split(files.pathSep), node_modules);
return;
}
parts.forEach(function (part, i) {
if (part === "npm") {
addByParts(parts.slice(i + 1), node_modules);
} else if (part === ".npm") {
if (name) {
parts.unshift("node_modules", "meteor", name);
}
if (parts[i + 1] === "package") {
addByParts(parts.slice(i + 2), node_modules);
} else if (parts[i + 1] === "plugin") {
assert.strictEqual(parts[i + 2], name);
addByParts(parts.slice(i + 3), node_modules);
}
}
});
} else if (parts[0] === "npm") {
var absPath = files.pathResolve(__dirname, parts.join(files.pathSep));
addByParts(parts.slice(1), absPath);
} else {
throw new Error("unknown node_modules path: " + node_modules);
}
}
function addByParts(parts, absPath) {
assert.ok(parts.length > 0);
assert.notEqual(parts[0], "");
assert.notEqual(parts[0], "..");
// Ensure a leading / character.
if (parts[0].length > 0) {
parts.unshift("");
}
nodeModulesRegistry[parts.join("/")] = absPath;
}
}
function getRelID(id) {
assert.strictEqual(id.charAt(0), "/");
return "./npm" + id.replace(/:/g, "_");
}
// Sort the keys in reverse alphabetical order so that longer paths will
// come before their prefixes.
var sortedNodeModulesPaths =
Object.keys(nodeModulesRegistry).sort(function (a, b) {
if (a < b) return 1;
if (b < a) return -1;
return 0;
});
function npmRequire(id) {
return require(resolve(id));
}
var resolveCache = Object.create(null);
function resolve(id) {
var res = resolveCache[id];
if (typeof res === "string") {
return res;
}
if (res === null) {
var idParts = id.split("/");
var meteorAddTip = "";
// If it looks like `meteor/xxx`, the user may forgot to add the
// package before importing it.
if (idParts.length === 2 &&
idParts[0] === "meteor") {
meteorAddTip = ". Try `meteor add " + idParts[1] + "` " +
"as it looks like you tried to import it without adding " +
"to the project.";
}
res = new Error("Cannot find module '" + id + "'" + meteorAddTip);
res.code = "MODULE_NOT_FOUND";
throw res;
}
resolveCache[id] =
resolveInLocalBuild(id) ||
resolveInNodeModules(id) ||
resolveInDevBundle(id) ||
null;
return resolve(id);
}
function resolveInLocalBuild(id) {
return tryResolve(getRelID(id));
}
function resolveInNodeModules(id) {
var absId;
sortedNodeModulesPaths.some(function (prefix) {
var relId = files.pathRelative(
files.pathJoin(".", prefix),
files.pathJoin(".", id)
);
if (relId.slice(0, 2) !== "..") {
return absId =
files.pathJoin(nodeModulesRegistry[prefix], relId);
}
});
return absId && tryResolve(files.convertToOSPath(absId));
}
function resolveInDevBundle(id) {
// Fall back to dev_bundle/lib/node_modules and built-in modules.
return topLevelIdPattern.test(id) && tryResolve(id);
}
function tryResolve(id) {
try {
return require.resolve(id);
} catch (e) {
return null;
}
}
exports.require = npmRequire;
exports.resolve = npmRequire.resolve = resolve;
{
"name": "meteor-dev-bundle",
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
},
"ansi-regex": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
"integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
"dev": true
},
"ansi-styles": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
"integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
"dev": true
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
"chalk": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
"integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
"dev": true,
"requires": {
"ansi-styles": "^1.1.0",
"escape-string-regexp": "^1.0.0",
"has-ansi": "^0.1.0",
"strip-ansi": "^0.3.0",
"supports-color": "^0.2.0"
}
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
"detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
},
"duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
"dev": true,
"requires": {
"readable-stream": "^2.0.2"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"fibers": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fibers/-/fibers-3.1.1.tgz",
"integrity": "sha512-dl3Ukt08rHVQfY8xGD0ODwyjwrRALtaghuqGH2jByYX1wpY+nAnRQjJ6Dbqq0DnVgNVQ9yibObzbF4IlPyiwPw==",
"requires": {
"detect-libc": "^1.0.3"
}
},
"has-ansi": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
"integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
"dev": true,
"requires": {
"ansi-regex": "^0.2.0"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"meteor-promise": {
"version": "0.8.7",
"resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.8.7.tgz",
"integrity": "sha512-wAu9XI3+35H1YyhTnnk5QXCfdrho5n/0Ltj65DhsUwtFCuktV7hre92FjtJgBbs+RHj5/iZ8Zcbml40EGLcFTQ=="
},
"multipipe": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
"integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
"dev": true,
"requires": {
"duplexer2": "^0.1.2",
"object-assign": "^4.1.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
"promise": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz",
"integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==",
"requires": {
"asap": "~2.0.6"
}
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"semver": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
"integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
},
"source-map": {
"version": "0.1.32",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
"integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=",
"requires": {
"amdefine": ">=0.0.4"
}
},
"source-map-support": {
"version": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e",
"integrity": "sha512-2A3Rox3Zq2hUrDE/Vi3LEa/zLCOMj8F1HlMttze0jZmmQLzJjosp1mVtUCMbOTKIurqVm5xOatncI+6KJrngCg==",
"requires": {
"source-map": "0.1.32"
}
},
"split2": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/split2/-/split2-2.1.1.tgz",
"integrity": "sha1-eh9VHhdqkOzTNF9yRqDP4XXvT9A=",
"dev": true,
"requires": {
"through2": "^2.0.2"
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
}
},
"strip-ansi": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
"integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
"dev": true,
"requires": {
"ansi-regex": "^0.2.1"
}
},
"supports-color": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
"integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
"dev": true
},
"through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
"requires": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
}
},
"underscore": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz",
"integrity": "sha1-EzXF5PXm0zu7SwBrqMhqAPVW3gg="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
}
}
}
{
"name": "meteor-dev-bundle",
"private": true,
"dependencies": {
"fibers": "3.1.1",
"meteor-promise": "0.8.7",
"promise": "8.0.2",
"underscore": "1.5.2",
"source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e",
"semver": "5.4.1",
"node-gyp": "3.7.0",
"node-pre-gyp": "0.10.3"
},
"devDependencies": {
"split2": "2.1.1",
"multipipe": "1.0.2",
"chalk": "0.5.1"
},
"scripts": {
"install": "node npm-rebuild.js"
}
}
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var LocalCollection = Package.minimongo.LocalCollection;
var Minimongo = Package.minimongo.Minimongo;
var check = Package.check.check;
var Match = Package.check.Match;
var EJSON = Package.ejson.EJSON;
var DDP = Package['ddp-client'].DDP;
var DDPServer = Package['ddp-server'].DDPServer;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var AllowDeny;
var require = meteorInstall({"node_modules":{"meteor":{"allow-deny":{"allow-deny.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/allow-deny/allow-deny.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
///
/// Remote methods and access control.
///
const hasOwn = Object.prototype.hasOwnProperty; // Restrict default mutators on collection. allow() and deny() take the
// same options:
//
// options.insert {Function(userId, doc)}
// return true to allow/deny adding this document
//
// options.update {Function(userId, docs, fields, modifier)}
// return true to allow/deny updating these documents.
// `fields` is passed as an array of fields that are to be modified
//
// options.remove {Function(userId, docs)}
// return true to allow/deny removing these documents
//
// options.fetch {Array}
// Fields to fetch for these validators. If any call to allow or deny
// does not have this option then all fields are loaded.
//
// allow and deny can be called multiple times. The validators are
// evaluated as follows:
// - If neither deny() nor allow() has been called on the collection,
// then the request is allowed if and only if the "insecure" smart
// package is in use.
// - Otherwise, if any deny() function returns true, the request is denied.
// - Otherwise, if any allow() function returns true, the request is allowed.
// - Otherwise, the request is denied.
//
// Meteor may call your deny() and allow() functions in any order, and may not
// call all of them if it is able to make a decision without calling them all
// (so don't include side effects).
AllowDeny = {
CollectionPrototype: {}
}; // In the `mongo` package, we will extend Mongo.Collection.prototype with these
// methods
const CollectionPrototype = AllowDeny.CollectionPrototype;
/**
* @summary Allow users to write directly to this collection from client code, subject to limitations you define.
* @locus Server
* @method allow
* @memberOf Mongo.Collection
* @instance
* @param {Object} options
* @param {Function} options.insert,update,remove Functions that look at a proposed modification to the database and return true if it should be allowed.
* @param {String[]} options.fetch Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your `update` and `remove` functions.
* @param {Function} options.transform Overrides `transform` on the [`Collection`](#collections). Pass `null` to disable transformation.
*/
CollectionPrototype.allow = function (options) {
addValidator(this, 'allow', options);
};
/**
* @summary Override `allow` rules.
* @locus Server
* @method deny
* @memberOf Mongo.Collection
* @instance
* @param {Object} options
* @param {Function} options.insert,update,remove Functions that look at a proposed modification to the database and return true if it should be denied, even if an [allow](#allow) rule says otherwise.
* @param {String[]} options.fetch Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your `update` and `remove` functions.
* @param {Function} options.transform Overrides `transform` on the [`Collection`](#collections). Pass `null` to disable transformation.
*/
CollectionPrototype.deny = function (options) {
addValidator(this, 'deny', options);
};
CollectionPrototype._defineMutationMethods = function (options) {
const self = this;
options = options || {}; // set to true once we call any allow or deny methods. If true, use
// allow/deny semantics. If false, use insecure mode semantics.
self._restricted = false; // Insecure mode (default to allowing writes). Defaults to 'undefined' which
// means insecure iff the insecure package is loaded. This property can be
// overriden by tests or packages wishing to change insecure mode behavior of
// their collections.
self._insecure = undefined;
self._validators = {
insert: {
allow: [],
deny: []
},
update: {
allow: [],
deny: []
},
remove: {
allow: [],
deny: []
},
upsert: {
allow: [],
deny: []
},
// dummy arrays; can't set these!
fetch: [],
fetchAllFields: false
};
if (!self._name) return; // anonymous collection
// XXX Think about method namespacing. Maybe methods should be
// "Meteor:Mongo:insert/NAME"?
self._prefix = '/' + self._name + '/'; // Mutation Methods
// Minimongo on the server gets no stubs; instead, by default
// it wait()s until its result is ready, yielding.
// This matches the behavior of macromongo on the server better.
// XXX see #MeteorServerNull
if (self._connection && (self._connection === Meteor.server || Meteor.isClient)) {
const m = {};
['insert', 'update', 'remove'].forEach(method => {
const methodName = self._prefix + method;
if (options.useExisting) {
const handlerPropName = Meteor.isClient ? '_methodHandlers' : 'method_handlers'; // Do not try to create additional methods if this has already been called.
// (Otherwise the .methods() call below will throw an error.)
if (self._connection[handlerPropName] && typeof self._connection[handlerPropName][methodName] === 'function') return;
}
m[methodName] = function ()
/* ... */
{
// All the methods do their own validation, instead of using check().
check(arguments, [Match.Any]);
const args = Array.from(arguments);
try {
// For an insert, if the client didn't specify an _id, generate one
// now; because this uses DDP.randomStream, it will be consistent with
// what the client generated. We generate it now rather than later so
// that if (eg) an allow/deny rule does an insert to the same
// collection (not that it really should), the generated _id will
// still be the first use of the stream and will be consistent.
//
// However, we don't actually stick the _id onto the document yet,
// because we want allow/deny rules to be able to differentiate
// between arbitrary client-specified _id fields and merely
// client-controlled-via-randomSeed fields.
let generatedId = null;
if (method === "insert" && !hasOwn.call(args[0], '_id')) {
generatedId = self._makeNewID();
}
if (this.isSimulation) {
// In a client simulation, you can do any mutation (even with a
// complex selector).
if (generatedId !== null) args[0]._id = generatedId;
return self._collection[method].apply(self._collection, args);
} // This is the server receiving a method call from the client.
// We don't allow arbitrary selectors in mutations from the client: only
// single-ID selectors.
if (method !== 'insert') throwIfSelectorIsNotId(args[0], method);
if (self._restricted) {
// short circuit if there is no way it will pass.
if (self._validators[method].allow.length === 0) {
throw new Meteor.Error(403, "Access denied. No allow validators set on restricted " + "collection for method '" + method + "'.");
}
const validatedMethodName = '_validated' + method.charAt(0).toUpperCase() + method.slice(1);
args.unshift(this.userId);
method === 'insert' && args.push(generatedId);
return self[validatedMethodName].apply(self, args);
} else if (self._isInsecure()) {
if (generatedId !== null) args[0]._id = generatedId; // In insecure mode, allow any mutation (with a simple selector).
// XXX This is kind of bogus. Instead of blindly passing whatever
// we get from the network to this function, we should actually
// know the correct arguments for the function and pass just
// them. For example, if you have an extraneous extra null
// argument and this is Mongo on the server, the .wrapAsync'd
// functions like update will get confused and pass the
// "fut.resolver()" in the wrong slot, where _update will never
// invoke it. Bam, broken DDP connection. Probably should just
// take this whole method and write it three times, invoking
// helpers for the common code.
return self._collection[method].apply(self._collection, args);
} else {
// In secure mode, if we haven't called allow or deny, then nothing
// is permitted.
throw new Meteor.Error(403, "Access denied");
}
} catch (e) {
if (e.name === 'MongoError' || e.name === 'MinimongoError') {
throw new Meteor.Error(409, e.toString());
} else {
throw e;
}
}
};
});
self._connection.methods(m);
}
};
CollectionPrototype._updateFetch = function (fields) {
const self = this;
if (!self._validators.fetchAllFields) {
if (fields) {
const union = Object.create(null);
const add = names => names && names.forEach(name => union[name] = 1);
add(self._validators.fetch);
add(fields);
self._validators.fetch = Object.keys(union);
} else {
self._validators.fetchAllFields = true; // clear fetch just to make sure we don't accidentally read it
self._validators.fetch = null;
}
}
};
CollectionPrototype._isInsecure = function () {
const self = this;
if (self._insecure === undefined) return !!Package.insecure;
return self._insecure;
};
CollectionPrototype._validatedInsert = function (userId, doc, generatedId) {
const self = this; // call user validators.
// Any deny returns true means denied.
if (self._validators.insert.deny.some(validator => {
return validator(userId, docToValidate(validator, doc, generatedId));
})) {
throw new Meteor.Error(403, "Access denied");
} // Any allow returns true means proceed. Throw error if they all fail.
if (self._validators.insert.allow.every(validator => {
return !validator(userId, docToValidate(validator, doc, generatedId));
})) {
throw new Meteor.Error(403, "Access denied");
} // If we generated an ID above, insert it now: after the validation, but
// before actually inserting.
if (generatedId !== null) doc._id = generatedId;
self._collection.insert.call(self._collection, doc);
}; // Simulate a mongo `update` operation while validating that the access
// control rules set by calls to `allow/deny` are satisfied. If all
// pass, rewrite the mongo operation to use $in to set the list of
// document ids to change ##ValidatedChange
CollectionPrototype._validatedUpdate = function (userId, selector, mutator, options) {
const self = this;
check(mutator, Object);
options = Object.assign(Object.create(null), options);
if (!LocalCollection._selectorIsIdPerhapsAsObject(selector)) throw new Error("validated update should be of a single ID"); // We don't support upserts because they don't fit nicely into allow/deny
// rules.
if (options.upsert) throw new Meteor.Error(403, "Access denied. Upserts not " + "allowed in a restricted collection.");
const noReplaceError = "Access denied. In a restricted collection you can only" + " update documents, not replace them. Use a Mongo update operator, such " + "as '$set'.";
const mutatorKeys = Object.keys(mutator); // compute modified fields
const modifiedFields = {};
if (mutatorKeys.length === 0) {
throw new Meteor.Error(403, noReplaceError);
}
mutatorKeys.forEach(op => {
const params = mutator[op];
if (op.charAt(0) !== '$') {
throw new Meteor.Error(403, noReplaceError);
} else if (!hasOwn.call(ALLOWED_UPDATE_OPERATIONS, op)) {
throw new Meteor.Error(403, "Access denied. Operator " + op + " not allowed in a restricted collection.");
} else {
Object.keys(params).forEach(field => {
// treat dotted fields as if they are replacing their
// top-level part
if (field.indexOf('.') !== -1) field = field.substring(0, field.indexOf('.')); // record the field we are trying to change
modifiedFields[field] = true;
});
}
});
const fields = Object.keys(modifiedFields);
const findOptions = {
transform: null
};
if (!self._validators.fetchAllFields) {
findOptions.fields = {};
self._validators.fetch.forEach(fieldName => {
findOptions.fields[fieldName] = 1;
});
}
const doc = self._collection.findOne(selector, findOptions);
if (!doc) // none satisfied!
return 0; // call user validators.
// Any deny returns true means denied.
if (self._validators.update.deny.some(validator => {
const factoriedDoc = transformDoc(validator, doc);
return validator(userId, factoriedDoc, fields, mutator);
})) {
throw new Meteor.Error(403, "Access denied");
} // Any allow returns true means proceed. Throw error if they all fail.
if (self._validators.update.allow.every(validator => {
const factoriedDoc = transformDoc(validator, doc);
return !validator(userId, factoriedDoc, fields, mutator);
})) {
throw new Meteor.Error(403, "Access denied");
}
options._forbidReplace = true; // Back when we supported arbitrary client-provided selectors, we actually
// rewrote the selector to include an _id clause before passing to Mongo to
// avoid races, but since selector is guaranteed to already just be an ID, we
// don't have to any more.
return self._collection.update.call(self._collection, selector, mutator, options);
}; // Only allow these operations in validated updates. Specifically
// whitelist operations, rather than blacklist, so new complex
// operations that are added aren't automatically allowed. A complex
// operation is one that does more than just modify its target
// field. For now this contains all update operations except '$rename'.
// http://docs.mongodb.org/manual/reference/operators/#update
const ALLOWED_UPDATE_OPERATIONS = {
$inc: 1,
$set: 1,
$unset: 1,
$addToSet: 1,
$pop: 1,
$pullAll: 1,
$pull: 1,
$pushAll: 1,
$push: 1,
$bit: 1
}; // Simulate a mongo `remove` operation while validating access control
// rules. See #ValidatedChange
CollectionPrototype._validatedRemove = function (userId, selector) {
const self = this;
const findOptions = {
transform: null
};
if (!self._validators.fetchAllFields) {
findOptions.fields = {};
self._validators.fetch.forEach(fieldName => {
findOptions.fields[fieldName] = 1;
});
}
const doc = self._collection.findOne(selector, findOptions);
if (!doc) return 0; // call user validators.
// Any deny returns true means denied.
if (self._validators.remove.deny.some(validator => {
return validator(userId, transformDoc(validator, doc));
})) {
throw new Meteor.Error(403, "Access denied");
} // Any allow returns true means proceed. Throw error if they all fail.
if (self._validators.remove.allow.every(validator => {
return !validator(userId, transformDoc(validator, doc));
})) {
throw new Meteor.Error(403, "Access denied");
} // Back when we supported arbitrary client-provided selectors, we actually
// rewrote the selector to {_id: {$in: [ids that we found]}} before passing to
// Mongo to avoid races, but since selector is guaranteed to already just be
// an ID, we don't have to any more.
return self._collection.remove.call(self._collection, selector);
};
CollectionPrototype._callMutatorMethod = function _callMutatorMethod(name, args, callback) {
if (Meteor.isClient && !callback && !alreadyInSimulation()) {
// Client can't block, so it can't report errors by exception,
// only by callback. If they forget the callback, give them a
// default one that logs the error, so they aren't totally
// baffled if their writes don't work because their database is
// down.
// Don't give a default callback in simulation, because inside stubs we
// want to return the results from the local collection immediately and
// not force a callback.
callback = function (err) {
if (err) Meteor._debug(name + " failed: " + (err.reason || err.stack));
};
} // For two out of three mutator methods, the first argument is a selector
const firstArgIsSelector = name === "update" || name === "remove";
if (firstArgIsSelector && !alreadyInSimulation()) {
// If we're about to actually send an RPC, we should throw an error if
// this is a non-ID selector, because the mutation methods only allow
// single-ID selectors. (If we don't throw here, we'll see flicker.)
throwIfSelectorIsNotId(args[0], name);
}
const mutatorMethodName = this._prefix + name;
return this._connection.apply(mutatorMethodName, args, {
returnStubValue: true
}, callback);
};
function transformDoc(validator, doc) {
if (validator.transform) return validator.transform(doc);
return doc;
}
function docToValidate(validator, doc, generatedId) {
let ret = doc;
if (validator.transform) {
ret = EJSON.clone(doc); // If you set a server-side transform on your collection, then you don't get
// to tell the difference between "client specified the ID" and "server
// generated the ID", because transforms expect to get _id. If you want to
// do that check, you can do it with a specific
// `C.allow({insert: f, transform: null})` validator.
if (generatedId !== null) {
ret._id = generatedId;
}
ret = validator.transform(ret);
}
return ret;
}
function addValidator(collection, allowOrDeny, options) {
// validate keys
const validKeysRegEx = /^(?:insert|update|remove|fetch|transform)$/;
Object.keys(options).forEach(key => {
if (!validKeysRegEx.test(key)) throw new Error(allowOrDeny + ": Invalid key: " + key);
});
collection._restricted = true;
['insert', 'update', 'remove'].forEach(name => {
if (hasOwn.call(options, name)) {
if (!(options[name] instanceof Function)) {
throw new Error(allowOrDeny + ": Value for `" + name + "` must be a function");
} // If the transform is specified at all (including as 'null') in this
// call, then take that; otherwise, take the transform from the
// collection.
if (options.transform === undefined) {
options[name].transform = collection._transform; // already wrapped
} else {
options[name].transform = LocalCollection.wrapTransform(options.transform);
}
collection._validators[name][allowOrDeny].push(options[name]);
}
}); // Only update the fetch fields if we're passed things that affect
// fetching. This way allow({}) and allow({insert: f}) don't result in
// setting fetchAllFields
if (options.update || options.remove || options.fetch) {
if (options.fetch && !(options.fetch instanceof Array)) {
throw new Error(allowOrDeny + ": Value for `fetch` must be an array");
}
collection._updateFetch(options.fetch);
}
}
function throwIfSelectorIsNotId(selector, methodName) {
if (!LocalCollection._selectorIsIdPerhapsAsObject(selector)) {
throw new Meteor.Error(403, "Not permitted. Untrusted code may only " + methodName + " documents by ID.");
}
}
; // Determine if we are in a DDP method simulation
function alreadyInSimulation() {
var CurrentInvocation = DDP._CurrentMethodInvocation || // For backwards compatibility, as explained in this issue:
// https://github.com/meteor/meteor/issues/8947
DDP._CurrentInvocation;
const enclosing = CurrentInvocation.get();
return enclosing && enclosing.isSimulation;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/allow-deny/allow-deny.js");
/* Exports */
Package._define("allow-deny", {
AllowDeny: AllowDeny
});
})();
//# sourceURL=meteor://💻app/packages/allow-deny.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYWxsb3ctZGVueS9hbGxvdy1kZW55LmpzIl0sIm5hbWVzIjpbImhhc093biIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiQWxsb3dEZW55IiwiQ29sbGVjdGlvblByb3RvdHlwZSIsImFsbG93Iiwib3B0aW9ucyIsImFkZFZhbGlkYXRvciIsImRlbnkiLCJfZGVmaW5lTXV0YXRpb25NZXRob2RzIiwic2VsZiIsIl9yZXN0cmljdGVkIiwiX2luc2VjdXJlIiwidW5kZWZpbmVkIiwiX3ZhbGlkYXRvcnMiLCJpbnNlcnQiLCJ1cGRhdGUiLCJyZW1vdmUiLCJ1cHNlcnQiLCJmZXRjaCIsImZldGNoQWxsRmllbGRzIiwiX25hbWUiLCJfcHJlZml4IiwiX2Nvbm5lY3Rpb24iLCJNZXRlb3IiLCJzZXJ2ZXIiLCJpc0NsaWVudCIsIm0iLCJmb3JFYWNoIiwibWV0aG9kIiwibWV0aG9kTmFtZSIsInVzZUV4aXN0aW5nIiwiaGFuZGxlclByb3BOYW1lIiwiY2hlY2siLCJhcmd1bWVudHMiLCJNYXRjaCIsIkFueSIsImFyZ3MiLCJBcnJheSIsImZyb20iLCJnZW5lcmF0ZWRJZCIsImNhbGwiLCJfbWFrZU5ld0lEIiwiaXNTaW11bGF0aW9uIiwiX2lkIiwiX2NvbGxlY3Rpb24iLCJhcHBseSIsInRocm93SWZTZWxlY3RvcklzTm90SWQiLCJsZW5ndGgiLCJFcnJvciIsInZhbGlkYXRlZE1ldGhvZE5hbWUiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidW5zaGlmdCIsInVzZXJJZCIsInB1c2giLCJfaXNJbnNlY3VyZSIsImUiLCJuYW1lIiwidG9TdHJpbmciLCJtZXRob2RzIiwiX3VwZGF0ZUZldGNoIiwiZmllbGRzIiwidW5pb24iLCJjcmVhdGUiLCJhZGQiLCJuYW1lcyIsImtleXMiLCJQYWNrYWdlIiwiaW5zZWN1cmUiLCJfdmFsaWRhdGVkSW5zZXJ0IiwiZG9jIiwic29tZSIsInZhbGlkYXRvciIsImRvY1RvVmFsaWRhdGUiLCJldmVyeSIsIl92YWxpZGF0ZWRVcGRhdGUiLCJzZWxlY3RvciIsIm11dGF0b3IiLCJhc3NpZ24iLCJMb2NhbENvbGxlY3Rpb24iLCJfc2VsZWN0b3JJc0lkUGVyaGFwc0FzT2JqZWN0Iiwibm9SZXBsYWNlRXJyb3IiLCJtdXRhdG9yS2V5cyIsIm1vZGlmaWVkRmllbGRzIiwib3AiLCJwYXJhbXMiLCJBTExPV0VEX1VQREFURV9PUEVSQVRJT05TIiwiZmllbGQiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiZmluZE9wdGlvbnMiLCJ0cmFuc2Zvcm0iLCJmaWVsZE5hbWUiLCJmaW5kT25lIiwiZmFjdG9yaWVkRG9jIiwidHJhbnNmb3JtRG9jIiwiX2ZvcmJpZFJlcGxhY2UiLCIkaW5jIiwiJHNldCIsIiR1bnNldCIsIiRhZGRUb1NldCIsIiRwb3AiLCIkcHVsbEFsbCIsIiRwdWxsIiwiJHB1c2hBbGwiLCIkcHVzaCIsIiRiaXQiLCJfdmFsaWRhdGVkUmVtb3ZlIiwiX2NhbGxNdXRhdG9yTWV0aG9kIiwiY2FsbGJhY2siLCJhbHJlYWR5SW5TaW11bGF0aW9uIiwiZXJyIiwiX2RlYnVnIiwicmVhc29uIiwic3RhY2siLCJmaXJzdEFyZ0lzU2VsZWN0b3IiLCJtdXRhdG9yTWV0aG9kTmFtZSIsInJldHVyblN0dWJWYWx1ZSIsInJldCIsIkVKU09OIiwiY2xvbmUiLCJjb2xsZWN0aW9uIiwiYWxsb3dPckRlbnkiLCJ2YWxpZEtleXNSZWdFeCIsImtleSIsInRlc3QiLCJGdW5jdGlvbiIsIl90cmFuc2Zvcm0iLCJ3cmFwVHJhbnNmb3JtIiwiQ3VycmVudEludm9jYXRpb24iLCJERFAiLCJfQ3VycmVudE1ldGhvZEludm9jYXRpb24iLCJfQ3VycmVudEludm9jYXRpb24iLCJlbmNsb3NpbmciLCJnZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHQyxNQUFNLENBQUNDLFNB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bGUiOiIvcGFja2FnZXMvYWxsb3ctZGVueS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vL1xuLy8vIFJlbW90ZSBtZXRob2RzIGFuZCBhY2Nlc3MgY29udHJvbC5cbi8vL1xuXG5jb25zdCBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vLyBSZXN0cmljdCBkZWZhdWx0IG11dGF0b3JzIG9uIGNvbGxlY3Rpb24uIGFsbG93KCkgYW5kIGRlbnkoKSB0YWtlIHRoZVxuLy8gc2FtZSBvcHRpb25zOlxuLy9cbi8vIG9wdGlvbnMuaW5zZXJ0IHtGdW5jdGlvbih1c2VySWQsIGRvYyl9XG4vLyAgIHJldHVybiB0cnVlIHRvIGFsbG93L2RlbnkgYWRkaW5nIHRoaXMgZG9jdW1lbnRcbi8vXG4vLyBvcHRpb25zLnVwZGF0ZSB7RnVuY3Rpb24odXNlcklkLCBkb2NzLCBmaWVsZHMsIG1vZGlmaWVyKX1cbi8vICAgcmV0dXJuIHRydWUgdG8gYWxsb3cvZGVueSB1cGRhdGluZyB0aGVzZSBkb2N1bWVudHMuXG4vLyAgIGBmaWVsZHNgIGlzIHBhc3NlZCBhcyBhbiBhcnJheSBvZiBmaWVsZHMgdGhhdCBhcmUgdG8gYmUgbW9kaWZpZWRcbi8vXG4vLyBvcHRpb25zLnJlbW92ZSB7RnVuY3Rpb24odXNlcklkLCBkb2NzKX1cbi8vICAgcmV0dXJuIHRydWUgdG8gYWxsb3cvZGVueSByZW1vdmluZyB0aGVzZSBkb2N1bWVudHNcbi8vXG4vLyBvcHRpb25zLmZldGNoIHtBcnJheX1cbi8vICAgRmllbGRzIHRvIGZldGNoIGZvciB0aGVzZSB2YWxpZGF0b3JzLiBJZiBhbnkgY2FsbCB0byBhbGxvdyBvciBkZW55XG4vLyAgIGRvZXMgbm90IGhhdmUgdGhpcyBvcHRpb24gdGhlbiBhbGwgZmllbGRzIGFyZSBsb2FkZWQuXG4vL1xuLy8gYWxsb3cgYW5kIGRlbnkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHZhbGlkYXRvcnMgYXJlXG4vLyBldmFsdWF0ZWQgYXMgZm9sbG93czpcbi8vIC0gSWYgbmVpdGhlciBkZW55KCkgbm9yIGFsbG93KCkgaGFzIGJlZW4gY2FsbGVkIG9uIHRoZSBjb2xsZWN0aW9uLFxuLy8gICB0aGVuIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgaWYgYW5kIG9ubHkgaWYgdGhlIFwiaW5zZWN1cmVcIiBzbWFydFxuLy8gICBwYWNrYWdlIGlzIGluIHVzZS5cbi8vIC0gT3RoZXJ3aXNlLCBpZiBhbnkgZGVueSgpIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIHJlcXVlc3QgaXMgZGVuaWVkLlxuLy8gLSBPdGhlcndpc2UsIGlmIGFueSBhbGxvdygpIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIHJlcXVlc3QgaXMgYWxsb3dlZC5cbi8vIC0gT3RoZXJ3aXNlLCB0aGUgcmVxdWVzdCBpcyBkZW5pZWQuXG4vL1xuLy8gTWV0ZW9yIG1heSBjYWxsIHlvdXIgZGVueSgpIGFuZCBhbGxvdygpIGZ1bmN0aW9ucyBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgbm90XG4vLyBjYWxsIGFsbCBvZiB0aGVtIGlmIGl0IGlzIGFibGUgdG8gbWFrZSBhIGRlY2lzaW9uIHdpdGhvdXQgY2FsbGluZyB0aGVtIGFsbFxuLy8gKHNvIGRvbid0IGluY2x1ZGUgc2lkZSBlZmZlY3RzKS5cblxuQWxsb3dEZW55ID0ge1xuICBDb2xsZWN0aW9uUHJvdG90eXBlOiB7fVxufTtcblxuLy8gSW4gdGhlIGBtb25nb2AgcGFja2FnZSwgd2Ugd2lsbCBleHRlbmQgTW9uZ28uQ29sbGVjdGlvbi5wcm90b3R5cGUgd2l0aCB0aGVzZVxuLy8gbWV0aG9kc1xuY29uc3QgQ29sbGVjdGlvblByb3RvdHlwZSA9IEFsbG93RGVueS5Db2xsZWN0aW9uUHJvdG90eXBlO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFsbG93IHVzZXJzIHRvIHdyaXRlIGRpcmVjdGx5IHRvIHRoaXMgY29sbGVjdGlvbiBmcm9tIGNsaWVudCBjb2RlLCBzdWJqZWN0IHRvIGxpbWl0YXRpb25zIHlvdSBkZWZpbmUuXG4gKiBAbG9jdXMgU2VydmVyXG4gKiBAbWV0aG9kIGFsbG93XG4gKiBAbWVtYmVyT2YgTW9uZ28uQ29sbGVjdGlvblxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5pbnNlcnQsdXBkYXRlLHJlbW92ZSBGdW5jdGlvbnMgdGhhdCBsb29rIGF0IGEgcHJvcG9zZWQgbW9kaWZpY2F0aW9uIHRvIHRoZSBkYXRhYmFzZSBhbmQgcmV0dXJuIHRydWUgaWYgaXQgc2hvdWxkIGJlIGFsbG93ZWQuXG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBvcHRpb25zLmZldGNoIE9wdGlvbmFsIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50LiBMaW1pdHMgdGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUgZmV0Y2hlZCBmcm9tIHRoZSBkYXRhYmFzZSBmb3IgaW5zcGVjdGlvbiBieSB5b3VyIGB1cGRhdGVgIGFuZCBgcmVtb3ZlYCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLnRyYW5zZm9ybSBPdmVycmlkZXMgYHRyYW5zZm9ybWAgb24gdGhlICBbYENvbGxlY3Rpb25gXSgjY29sbGVjdGlvbnMpLiAgUGFzcyBgbnVsbGAgdG8gZGlzYWJsZSB0cmFuc2Zvcm1hdGlvbi5cbiAqL1xuQ29sbGVjdGlvblByb3RvdHlwZS5hbGxvdyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgYWRkVmFsaWRhdG9yKHRoaXMsICdhbGxvdycsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSBPdmVycmlkZSBgYWxsb3dgIHJ1bGVzLlxuICogQGxvY3VzIFNlcnZlclxuICogQG1ldGhvZCBkZW55XG4gKiBAbWVtYmVyT2YgTW9uZ28uQ29sbGVjdGlvblxuICogQGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5pbnNlcnQsdXBkYXRlLHJlbW92ZSBGdW5jdGlvbnMgdGhhdCBsb29rIGF0IGEgcHJvcG9zZWQgbW9kaWZpY2F0aW9uIHRvIHRoZSBkYXRhYmFzZSBhbmQgcmV0dXJuIHRydWUgaWYgaXQgc2hvdWxkIGJlIGRlbmllZCwgZXZlbiBpZiBhbiBbYWxsb3ddKCNhbGxvdykgcnVsZSBzYXlzIG90aGVyd2lzZS5cbiAqIEBwYXJhbSB7U3RyaW5nW119IG9wdGlvbnMuZmV0Y2ggT3B0aW9uYWwgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQuIExpbWl0cyB0aGUgZmllbGRzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIGRhdGFiYXNlIGZvciBpbnNwZWN0aW9uIGJ5IHlvdXIgYHVwZGF0ZWAgYW5kIGByZW1vdmVgIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbnMudHJhbnNmb3JtIE92ZXJyaWRlcyBgdHJhbnNmb3JtYCBvbiB0aGUgIFtgQ29sbGVjdGlvbmBdKCNjb2xsZWN0aW9ucykuICBQYXNzIGBudWxsYCB0byBkaXNhYmxlIHRyYW5zZm9ybWF0aW9uLlxuICovXG5Db2xsZWN0aW9uUHJvdG90eXBlLmRlbnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGFkZFZhbGlkYXRvcih0aGlzLCAnZGVueScsIG9wdGlvbnMpO1xufTtcblxuQ29sbGVjdGlvblByb3RvdHlwZS5fZGVmaW5lTXV0YXRpb25NZXRob2RzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IHRvIHRydWUgb25jZSB3ZSBjYWxsIGFueSBhbGxvdyBvciBkZW55IG1ldGhvZHMuIElmIHRydWUsIHVzZVxuICAvLyBhbGxvdy9kZW55IHNlbWFudGljcy4gSWYgZmFsc2UsIHVzZSBpbnNlY3VyZSBtb2RlIHNlbWFudGljcy5cbiAgc2VsZi5fcmVzdHJpY3RlZCA9IGZhbHNlO1xuXG4gIC8vIEluc2VjdXJlIG1vZGUgKGRlZmF1bHQgdG8gYWxsb3dpbmcgd3JpdGVzKS4gRGVmYXVsdHMgdG8gJ3VuZGVmaW5lZCcgd2hpY2hcbiAgLy8gbWVhbnMgaW5zZWN1cmUgaWZmIHRoZSBpbnNlY3VyZSBwYWNrYWdlIGlzIGxvYWRlZC4gVGhpcyBwcm9wZXJ0eSBjYW4gYmVcbiAgLy8gb3ZlcnJpZGVuIGJ5IHRlc3RzIG9yIHBhY2thZ2VzIHdpc2hpbmcgdG8gY2hhbmdlIGluc2VjdXJlIG1vZGUgYmVoYXZpb3Igb2ZcbiAgLy8gdGhlaXIgY29sbGVjdGlvbnMuXG4gIHNlbGYuX2luc2VjdXJlID0gdW5kZWZpbmVkO1xuXG4gIHNlbGYuX3ZhbGlkYXRvcnMgPSB7XG4gICAgaW5zZXJ0OiB7YWxsb3c6IFtdLCBkZW55OiBbXX0sXG4gICAgdXBkYXRlOiB7YWxsb3c6IFtdLCBkZW55OiBbXX0sXG4gICAgcmVtb3ZlOiB7YWxsb3c6IFtdLCBkZW55OiBbXX0sXG4gICAgdXBzZXJ0OiB7YWxsb3c6IFtdLCBkZW55OiBbXX0sIC8vIGR1bW15IGFycmF5czsgY2FuJ3Qgc2V0IHRoZXNlIVxuICAgIGZldGNoOiBbXSxcbiAgICBmZXRjaEFsbEZpZWxkczogZmFsc2VcbiAgfTtcblxuICBpZiAoIXNlbGYuX25hbWUpXG4gICAgcmV0dXJuOyAvLyBhbm9ueW1vdXMgY29sbGVjdGlvblxuXG4gIC8vIFhYWCBUaGluayBhYm91dCBtZXRob2QgbmFtZXNwYWNpbmcuIE1heWJlIG1ldGhvZHMgc2hvdWxkIGJlXG4gIC8vIFwiTWV0ZW9yOk1vbmdvOmluc2VydC9OQU1FXCI/XG4gIHNlbGYuX3ByZWZpeCA9ICcvJyArIHNlbGYuX25hbWUgKyAnLyc7XG5cbiAgLy8gTXV0YXRpb24gTWV0aG9kc1xuICAvLyBNaW5pbW9uZ28gb24gdGhlIHNlcnZlciBnZXRzIG5vIHN0dWJzOyBpbnN0ZWFkLCBieSBkZWZhdWx0XG4gIC8vIGl0IHdhaXQoKXMgdW50aWwgaXRzIHJlc3VsdCBpcyByZWFkeSwgeWllbGRpbmcuXG4gIC8vIFRoaXMgbWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YgbWFjcm9tb25nbyBvbiB0aGUgc2VydmVyIGJldHRlci5cbiAgLy8gWFhYIHNlZSAjTWV0ZW9yU2VydmVyTnVsbFxuICBpZiAoc2VsZi5fY29ubmVjdGlvbiAmJiAoc2VsZi5fY29ubmVjdGlvbiA9PT0gTWV0ZW9yLnNlcnZlciB8fCBNZXRlb3IuaXNDbGllbnQpKSB7XG4gICAgY29uc3QgbSA9IHt9O1xuXG4gICAgWydpbnNlcnQnLCAndXBkYXRlJywgJ3JlbW92ZSddLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IHNlbGYuX3ByZWZpeCArIG1ldGhvZDtcblxuICAgICAgaWYgKG9wdGlvbnMudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlclByb3BOYW1lID0gTWV0ZW9yLmlzQ2xpZW50ID8gJ19tZXRob2RIYW5kbGVycycgOiAnbWV0aG9kX2hhbmRsZXJzJztcbiAgICAgICAgLy8gRG8gbm90IHRyeSB0byBjcmVhdGUgYWRkaXRpb25hbCBtZXRob2RzIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuXG4gICAgICAgIC8vIChPdGhlcndpc2UgdGhlIC5tZXRob2RzKCkgY2FsbCBiZWxvdyB3aWxsIHRocm93IGFuIGVycm9yLilcbiAgICAgICAgaWYgKHNlbGYuX2Nvbm5lY3Rpb25baGFuZGxlclByb3BOYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBzZWxmLl9jb25uZWN0aW9uW2hhbmRsZXJQcm9wTmFtZV1bbWV0aG9kTmFtZV0gPT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgvKiAuLi4gKi8pIHtcbiAgICAgICAgLy8gQWxsIHRoZSBtZXRob2RzIGRvIHRoZWlyIG93biB2YWxpZGF0aW9uLCBpbnN0ZWFkIG9mIHVzaW5nIGNoZWNrKCkuXG4gICAgICAgIGNoZWNrKGFyZ3VtZW50cywgW01hdGNoLkFueV0pO1xuICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEZvciBhbiBpbnNlcnQsIGlmIHRoZSBjbGllbnQgZGlkbid0IHNwZWNpZnkgYW4gX2lkLCBnZW5lcmF0ZSBvbmVcbiAgICAgICAgICAvLyBub3c7IGJlY2F1c2UgdGhpcyB1c2VzIEREUC5yYW5kb21TdHJlYW0sIGl0IHdpbGwgYmUgY29uc2lzdGVudCB3aXRoXG4gICAgICAgICAgLy8gd2hhdCB0aGUgY2xpZW50IGdlbmVyYXRlZC4gV2UgZ2VuZXJhdGUgaXQgbm93IHJhdGhlciB0aGFuIGxhdGVyIHNvXG4gICAgICAgICAgLy8gdGhhdCBpZiAoZWcpIGFuIGFsbG93L2RlbnkgcnVsZSBkb2VzIGFuIGluc2VydCB0byB0aGUgc2FtZVxuICAgICAgICAgIC8vIGNvbGxlY3Rpb24gKG5vdCB0aGF0IGl0IHJlYWxseSBzaG91bGQpLCB0aGUgZ2VuZXJhdGVkIF9pZCB3aWxsXG4gICAgICAgICAgLy8gc3RpbGwgYmUgdGhlIGZpcnN0IHVzZSBvZiB0aGUgc3RyZWFtIGFuZCB3aWxsIGJlIGNvbnNpc3RlbnQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBkb24ndCBhY3R1YWxseSBzdGljayB0aGUgX2lkIG9udG8gdGhlIGRvY3VtZW50IHlldCxcbiAgICAgICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgYWxsb3cvZGVueSBydWxlcyB0byBiZSBhYmxlIHRvIGRpZmZlcmVudGlhdGVcbiAgICAgICAgICAvLyBiZXR3ZWVuIGFyYml0cmFyeSBjbGllbnQtc3BlY2lmaWVkIF9pZCBmaWVsZHMgYW5kIG1lcmVseVxuICAgICAgICAgIC8vIGNsaWVudC1jb250cm9sbGVkLXZpYS1yYW5kb21TZWVkIGZpZWxkcy5cbiAgICAgICAgICBsZXQgZ2VuZXJhdGVkSWQgPSBudWxsO1xuICAgICAgICAgIGlmIChtZXRob2QgPT09IFwiaW5zZXJ0XCIgJiYgIWhhc093bi5jYWxsKGFyZ3NbMF0sICdfaWQnKSkge1xuICAgICAgICAgICAgZ2VuZXJhdGVkSWQgPSBzZWxmLl9tYWtlTmV3SUQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5pc1NpbXVsYXRpb24pIHtcbiAgICAgICAgICAgIC8vIEluIGEgY2xpZW50IHNpbXVsYXRpb24sIHlvdSBjYW4gZG8gYW55IG11dGF0aW9uIChldmVuIHdpdGggYVxuICAgICAgICAgICAgLy8gY29tcGxleCBzZWxlY3RvcikuXG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkSWQgIT09IG51bGwpXG4gICAgICAgICAgICAgIGFyZ3NbMF0uX2lkID0gZ2VuZXJhdGVkSWQ7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sbGVjdGlvblttZXRob2RdLmFwcGx5KFxuICAgICAgICAgICAgICBzZWxmLl9jb2xsZWN0aW9uLCBhcmdzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZXJ2ZXIgcmVjZWl2aW5nIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgY2xpZW50LlxuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgYXJiaXRyYXJ5IHNlbGVjdG9ycyBpbiBtdXRhdGlvbnMgZnJvbSB0aGUgY2xpZW50OiBvbmx5XG4gICAgICAgICAgLy8gc2luZ2xlLUlEIHNlbGVjdG9ycy5cbiAgICAgICAgICBpZiAobWV0aG9kICE9PSAnaW5zZXJ0JylcbiAgICAgICAgICAgIHRocm93SWZTZWxlY3RvcklzTm90SWQoYXJnc1swXSwgbWV0aG9kKTtcblxuICAgICAgICAgIGlmIChzZWxmLl9yZXN0cmljdGVkKSB7XG4gICAgICAgICAgICAvLyBzaG9ydCBjaXJjdWl0IGlmIHRoZXJlIGlzIG5vIHdheSBpdCB3aWxsIHBhc3MuXG4gICAgICAgICAgICBpZiAoc2VsZi5fdmFsaWRhdG9yc1ttZXRob2RdLmFsbG93Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKFxuICAgICAgICAgICAgICAgIDQwMywgXCJBY2Nlc3MgZGVuaWVkLiBObyBhbGxvdyB2YWxpZGF0b3JzIHNldCBvbiByZXN0cmljdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgIFwiY29sbGVjdGlvbiBmb3IgbWV0aG9kICdcIiArIG1ldGhvZCArIFwiJy5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZE1ldGhvZE5hbWUgPVxuICAgICAgICAgICAgICAgICAgJ192YWxpZGF0ZWQnICsgbWV0aG9kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbWV0aG9kLnNsaWNlKDEpO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KHRoaXMudXNlcklkKTtcbiAgICAgICAgICAgIG1ldGhvZCA9PT0gJ2luc2VydCcgJiYgYXJncy5wdXNoKGdlbmVyYXRlZElkKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmW3ZhbGlkYXRlZE1ldGhvZE5hbWVdLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi5faXNJbnNlY3VyZSgpKSB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkSWQgIT09IG51bGwpXG4gICAgICAgICAgICAgIGFyZ3NbMF0uX2lkID0gZ2VuZXJhdGVkSWQ7XG4gICAgICAgICAgICAvLyBJbiBpbnNlY3VyZSBtb2RlLCBhbGxvdyBhbnkgbXV0YXRpb24gKHdpdGggYSBzaW1wbGUgc2VsZWN0b3IpLlxuICAgICAgICAgICAgLy8gWFhYIFRoaXMgaXMga2luZCBvZiBib2d1cy4gIEluc3RlYWQgb2YgYmxpbmRseSBwYXNzaW5nIHdoYXRldmVyXG4gICAgICAgICAgICAvLyAgICAgd2UgZ2V0IGZyb20gdGhlIG5ldHdvcmsgdG8gdGhpcyBmdW5jdGlvbiwgd2Ugc2hvdWxkIGFjdHVhbGx5XG4gICAgICAgICAgICAvLyAgICAga25vdyB0aGUgY29ycmVjdCBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbiBhbmQgcGFzcyBqdXN0XG4gICAgICAgICAgICAvLyAgICAgdGhlbS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhbiBleHRyYW5lb3VzIGV4dHJhIG51bGxcbiAgICAgICAgICAgIC8vICAgICBhcmd1bWVudCBhbmQgdGhpcyBpcyBNb25nbyBvbiB0aGUgc2VydmVyLCB0aGUgLndyYXBBc3luYydkXG4gICAgICAgICAgICAvLyAgICAgZnVuY3Rpb25zIGxpa2UgdXBkYXRlIHdpbGwgZ2V0IGNvbmZ1c2VkIGFuZCBwYXNzIHRoZVxuICAgICAgICAgICAgLy8gICAgIFwiZnV0LnJlc29sdmVyKClcIiBpbiB0aGUgd3Jvbmcgc2xvdCwgd2hlcmUgX3VwZGF0ZSB3aWxsIG5ldmVyXG4gICAgICAgICAgICAvLyAgICAgaW52b2tlIGl0LiBCYW0sIGJyb2tlbiBERFAgY29ubmVjdGlvbi4gIFByb2JhYmx5IHNob3VsZCBqdXN0XG4gICAgICAgICAgICAvLyAgICAgdGFrZSB0aGlzIHdob2xlIG1ldGhvZCBhbmQgd3JpdGUgaXQgdGhyZWUgdGltZXMsIGludm9raW5nXG4gICAgICAgICAgICAvLyAgICAgaGVscGVycyBmb3IgdGhlIGNvbW1vbiBjb2RlLlxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbGxlY3Rpb25bbWV0aG9kXS5hcHBseShzZWxmLl9jb2xsZWN0aW9uLCBhcmdzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gc2VjdXJlIG1vZGUsIGlmIHdlIGhhdmVuJ3QgY2FsbGVkIGFsbG93IG9yIGRlbnksIHRoZW4gbm90aGluZ1xuICAgICAgICAgICAgLy8gaXMgcGVybWl0dGVkLlxuICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDMsIFwiQWNjZXNzIGRlbmllZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnTW9uZ29FcnJvcicgfHwgZS5uYW1lID09PSAnTWluaW1vbmdvRXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwOSwgZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBzZWxmLl9jb25uZWN0aW9uLm1ldGhvZHMobSk7XG4gIH1cbn07XG5cbkNvbGxlY3Rpb25Qcm90b3R5cGUuX3VwZGF0ZUZldGNoID0gZnVuY3Rpb24gKGZpZWxkcykge1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIXNlbGYuX3ZhbGlkYXRvcnMuZmV0Y2hBbGxGaWVsZHMpIHtcbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBjb25zdCB1bmlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb25zdCBhZGQgPSBuYW1lcyA9PiBuYW1lcyAmJiBuYW1lcy5mb3JFYWNoKG5hbWUgPT4gdW5pb25bbmFtZV0gPSAxKTtcbiAgICAgIGFkZChzZWxmLl92YWxpZGF0b3JzLmZldGNoKTtcbiAgICAgIGFkZChmaWVsZHMpO1xuICAgICAgc2VsZi5fdmFsaWRhdG9ycy5mZXRjaCA9IE9iamVjdC5rZXlzKHVuaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5fdmFsaWRhdG9ycy5mZXRjaEFsbEZpZWxkcyA9IHRydWU7XG4gICAgICAvLyBjbGVhciBmZXRjaCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBhY2NpZGVudGFsbHkgcmVhZCBpdFxuICAgICAgc2VsZi5fdmFsaWRhdG9ycy5mZXRjaCA9IG51bGw7XG4gICAgfVxuICB9XG59O1xuXG5Db2xsZWN0aW9uUHJvdG90eXBlLl9pc0luc2VjdXJlID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgaWYgKHNlbGYuX2luc2VjdXJlID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuICEhUGFja2FnZS5pbnNlY3VyZTtcbiAgcmV0dXJuIHNlbGYuX2luc2VjdXJlO1xufTtcblxuQ29sbGVjdGlvblByb3RvdHlwZS5fdmFsaWRhdGVkSW5zZXJ0ID0gZnVuY3Rpb24gKHVzZXJJZCwgZG9jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkSWQpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gY2FsbCB1c2VyIHZhbGlkYXRvcnMuXG4gIC8vIEFueSBkZW55IHJldHVybnMgdHJ1ZSBtZWFucyBkZW5pZWQuXG4gIGlmIChzZWxmLl92YWxpZGF0b3JzLmluc2VydC5kZW55LnNvbWUoKHZhbGlkYXRvcikgPT4ge1xuICAgIHJldHVybiB2YWxpZGF0b3IodXNlcklkLCBkb2NUb1ZhbGlkYXRlKHZhbGlkYXRvciwgZG9jLCBnZW5lcmF0ZWRJZCkpO1xuICB9KSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAzLCBcIkFjY2VzcyBkZW5pZWRcIik7XG4gIH1cbiAgLy8gQW55IGFsbG93IHJldHVybnMgdHJ1ZSBtZWFucyBwcm9jZWVkLiBUaHJvdyBlcnJvciBpZiB0aGV5IGFsbCBmYWlsLlxuICBpZiAoc2VsZi5fdmFsaWRhdG9ycy5pbnNlcnQuYWxsb3cuZXZlcnkoKHZhbGlkYXRvcikgPT4ge1xuICAgIHJldHVybiAhdmFsaWRhdG9yKHVzZXJJZCwgZG9jVG9WYWxpZGF0ZSh2YWxpZGF0b3IsIGRvYywgZ2VuZXJhdGVkSWQpKTtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMywgXCJBY2Nlc3MgZGVuaWVkXCIpO1xuICB9XG5cbiAgLy8gSWYgd2UgZ2VuZXJhdGVkIGFuIElEIGFib3ZlLCBpbnNlcnQgaXQgbm93OiBhZnRlciB0aGUgdmFsaWRhdGlvbiwgYnV0XG4gIC8vIGJlZm9yZSBhY3R1YWxseSBpbnNlcnRpbmcuXG4gIGlmIChnZW5lcmF0ZWRJZCAhPT0gbnVsbClcbiAgICBkb2MuX2lkID0gZ2VuZXJhdGVkSWQ7XG5cbiAgc2VsZi5fY29sbGVjdGlvbi5pbnNlcnQuY2FsbChzZWxmLl9jb2xsZWN0aW9uLCBkb2MpO1xufTtcblxuLy8gU2ltdWxhdGUgYSBtb25nbyBgdXBkYXRlYCBvcGVyYXRpb24gd2hpbGUgdmFsaWRhdGluZyB0aGF0IHRoZSBhY2Nlc3Ncbi8vIGNvbnRyb2wgcnVsZXMgc2V0IGJ5IGNhbGxzIHRvIGBhbGxvdy9kZW55YCBhcmUgc2F0aXNmaWVkLiBJZiBhbGxcbi8vIHBhc3MsIHJld3JpdGUgdGhlIG1vbmdvIG9wZXJhdGlvbiB0byB1c2UgJGluIHRvIHNldCB0aGUgbGlzdCBvZlxuLy8gZG9jdW1lbnQgaWRzIHRvIGNoYW5nZSAjI1ZhbGlkYXRlZENoYW5nZVxuQ29sbGVjdGlvblByb3RvdHlwZS5fdmFsaWRhdGVkVXBkYXRlID0gZnVuY3Rpb24oXG4gICAgdXNlcklkLCBzZWxlY3RvciwgbXV0YXRvciwgb3B0aW9ucykge1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjaGVjayhtdXRhdG9yLCBPYmplY3QpO1xuXG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIG9wdGlvbnMpO1xuXG4gIGlmICghTG9jYWxDb2xsZWN0aW9uLl9zZWxlY3RvcklzSWRQZXJoYXBzQXNPYmplY3Qoc2VsZWN0b3IpKVxuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRlZCB1cGRhdGUgc2hvdWxkIGJlIG9mIGEgc2luZ2xlIElEXCIpO1xuXG4gIC8vIFdlIGRvbid0IHN1cHBvcnQgdXBzZXJ0cyBiZWNhdXNlIHRoZXkgZG9uJ3QgZml0IG5pY2VseSBpbnRvIGFsbG93L2RlbnlcbiAgLy8gcnVsZXMuXG4gIGlmIChvcHRpb25zLnVwc2VydClcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMywgXCJBY2Nlc3MgZGVuaWVkLiBVcHNlcnRzIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcImFsbG93ZWQgaW4gYSByZXN0cmljdGVkIGNvbGxlY3Rpb24uXCIpO1xuXG4gIGNvbnN0IG5vUmVwbGFjZUVycm9yID0gXCJBY2Nlc3MgZGVuaWVkLiBJbiBhIHJlc3RyaWN0ZWQgY29sbGVjdGlvbiB5b3UgY2FuIG9ubHlcIiArXG4gICAgICAgIFwiIHVwZGF0ZSBkb2N1bWVudHMsIG5vdCByZXBsYWNlIHRoZW0uIFVzZSBhIE1vbmdvIHVwZGF0ZSBvcGVyYXRvciwgc3VjaCBcIiArXG4gICAgICAgIFwiYXMgJyRzZXQnLlwiO1xuXG4gIGNvbnN0IG11dGF0b3JLZXlzID0gT2JqZWN0LmtleXMobXV0YXRvcik7XG5cbiAgLy8gY29tcHV0ZSBtb2RpZmllZCBmaWVsZHNcbiAgY29uc3QgbW9kaWZpZWRGaWVsZHMgPSB7fTtcblxuICBpZiAobXV0YXRvcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDMsIG5vUmVwbGFjZUVycm9yKTtcbiAgfVxuICBtdXRhdG9yS2V5cy5mb3JFYWNoKChvcCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG11dGF0b3Jbb3BdO1xuICAgIGlmIChvcC5jaGFyQXQoMCkgIT09ICckJykge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDMsIG5vUmVwbGFjZUVycm9yKTtcbiAgICB9IGVsc2UgaWYgKCFoYXNPd24uY2FsbChBTExPV0VEX1VQREFURV9PUEVSQVRJT05TLCBvcCkpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICAgIDQwMywgXCJBY2Nlc3MgZGVuaWVkLiBPcGVyYXRvciBcIiArIG9wICsgXCIgbm90IGFsbG93ZWQgaW4gYSByZXN0cmljdGVkIGNvbGxlY3Rpb24uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIC8vIHRyZWF0IGRvdHRlZCBmaWVsZHMgYXMgaWYgdGhleSBhcmUgcmVwbGFjaW5nIHRoZWlyXG4gICAgICAgIC8vIHRvcC1sZXZlbCBwYXJ0XG4gICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgIT09IC0xKVxuICAgICAgICAgIGZpZWxkID0gZmllbGQuc3Vic3RyaW5nKDAsIGZpZWxkLmluZGV4T2YoJy4nKSk7XG5cbiAgICAgICAgLy8gcmVjb3JkIHRoZSBmaWVsZCB3ZSBhcmUgdHJ5aW5nIHRvIGNoYW5nZVxuICAgICAgICBtb2RpZmllZEZpZWxkc1tmaWVsZF0gPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhtb2RpZmllZEZpZWxkcyk7XG5cbiAgY29uc3QgZmluZE9wdGlvbnMgPSB7dHJhbnNmb3JtOiBudWxsfTtcbiAgaWYgKCFzZWxmLl92YWxpZGF0b3JzLmZldGNoQWxsRmllbGRzKSB7XG4gICAgZmluZE9wdGlvbnMuZmllbGRzID0ge307XG4gICAgc2VsZi5fdmFsaWRhdG9ycy5mZXRjaC5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICAgIGZpbmRPcHRpb25zLmZpZWxkc1tmaWVsZE5hbWVdID0gMTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGRvYyA9IHNlbGYuX2NvbGxlY3Rpb24uZmluZE9uZShzZWxlY3RvciwgZmluZE9wdGlvbnMpO1xuICBpZiAoIWRvYykgIC8vIG5vbmUgc2F0aXNmaWVkIVxuICAgIHJldHVybiAwO1xuXG4gIC8vIGNhbGwgdXNlciB2YWxpZGF0b3JzLlxuICAvLyBBbnkgZGVueSByZXR1cm5zIHRydWUgbWVhbnMgZGVuaWVkLlxuICBpZiAoc2VsZi5fdmFsaWRhdG9ycy51cGRhdGUuZGVueS5zb21lKCh2YWxpZGF0b3IpID0+IHtcbiAgICBjb25zdCBmYWN0b3JpZWREb2MgPSB0cmFuc2Zvcm1Eb2ModmFsaWRhdG9yLCBkb2MpO1xuICAgIHJldHVybiB2YWxpZGF0b3IodXNlcklkLFxuICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVkRG9jLFxuICAgICAgICAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgICAgICAgICAgbXV0YXRvcik7XG4gIH0pKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDMsIFwiQWNjZXNzIGRlbmllZFwiKTtcbiAgfVxuICAvLyBBbnkgYWxsb3cgcmV0dXJucyB0cnVlIG1lYW5zIHByb2NlZWQuIFRocm93IGVycm9yIGlmIHRoZXkgYWxsIGZhaWwuXG4gIGlmIChzZWxmLl92YWxpZGF0b3JzLnVwZGF0ZS5hbGxvdy5ldmVyeSgodmFsaWRhdG9yKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yaWVkRG9jID0gdHJhbnNmb3JtRG9jKHZhbGlkYXRvciwgZG9jKTtcbiAgICByZXR1cm4gIXZhbGlkYXRvcih1c2VySWQsXG4gICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVkRG9jLFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICBtdXRhdG9yKTtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMywgXCJBY2Nlc3MgZGVuaWVkXCIpO1xuICB9XG5cbiAgb3B0aW9ucy5fZm9yYmlkUmVwbGFjZSA9IHRydWU7XG5cbiAgLy8gQmFjayB3aGVuIHdlIHN1cHBvcnRlZCBhcmJpdHJhcnkgY2xpZW50LXByb3ZpZGVkIHNlbGVjdG9ycywgd2UgYWN0dWFsbHlcbiAgLy8gcmV3cm90ZSB0aGUgc2VsZWN0b3IgdG8gaW5jbHVkZSBhbiBfaWQgY2xhdXNlIGJlZm9yZSBwYXNzaW5nIHRvIE1vbmdvIHRvXG4gIC8vIGF2b2lkIHJhY2VzLCBidXQgc2luY2Ugc2VsZWN0b3IgaXMgZ3VhcmFudGVlZCB0byBhbHJlYWR5IGp1c3QgYmUgYW4gSUQsIHdlXG4gIC8vIGRvbid0IGhhdmUgdG8gYW55IG1vcmUuXG5cbiAgcmV0dXJuIHNlbGYuX2NvbGxlY3Rpb24udXBkYXRlLmNhbGwoXG4gICAgc2VsZi5fY29sbGVjdGlvbiwgc2VsZWN0b3IsIG11dGF0b3IsIG9wdGlvbnMpO1xufTtcblxuLy8gT25seSBhbGxvdyB0aGVzZSBvcGVyYXRpb25zIGluIHZhbGlkYXRlZCB1cGRhdGVzLiBTcGVjaWZpY2FsbHlcbi8vIHdoaXRlbGlzdCBvcGVyYXRpb25zLCByYXRoZXIgdGhhbiBibGFja2xpc3QsIHNvIG5ldyBjb21wbGV4XG4vLyBvcGVyYXRpb25zIHRoYXQgYXJlIGFkZGVkIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGFsbG93ZWQuIEEgY29tcGxleFxuLy8gb3BlcmF0aW9uIGlzIG9uZSB0aGF0IGRvZXMgbW9yZSB0aGFuIGp1c3QgbW9kaWZ5IGl0cyB0YXJnZXRcbi8vIGZpZWxkLiBGb3Igbm93IHRoaXMgY29udGFpbnMgYWxsIHVwZGF0ZSBvcGVyYXRpb25zIGV4Y2VwdCAnJHJlbmFtZScuXG4vLyBodHRwOi8vZG9jcy5tb25nb2RiLm9yZy9tYW51YWwvcmVmZXJlbmNlL29wZXJhdG9ycy8jdXBkYXRlXG5jb25zdCBBTExPV0VEX1VQREFURV9PUEVSQVRJT05TID0ge1xuICAkaW5jOjEsICRzZXQ6MSwgJHVuc2V0OjEsICRhZGRUb1NldDoxLCAkcG9wOjEsICRwdWxsQWxsOjEsICRwdWxsOjEsXG4gICRwdXNoQWxsOjEsICRwdXNoOjEsICRiaXQ6MVxufTtcblxuLy8gU2ltdWxhdGUgYSBtb25nbyBgcmVtb3ZlYCBvcGVyYXRpb24gd2hpbGUgdmFsaWRhdGluZyBhY2Nlc3MgY29udHJvbFxuLy8gcnVsZXMuIFNlZSAjVmFsaWRhdGVkQ2hhbmdlXG5Db2xsZWN0aW9uUHJvdG90eXBlLl92YWxpZGF0ZWRSZW1vdmUgPSBmdW5jdGlvbih1c2VySWQsIHNlbGVjdG9yKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGNvbnN0IGZpbmRPcHRpb25zID0ge3RyYW5zZm9ybTogbnVsbH07XG4gIGlmICghc2VsZi5fdmFsaWRhdG9ycy5mZXRjaEFsbEZpZWxkcykge1xuICAgIGZpbmRPcHRpb25zLmZpZWxkcyA9IHt9O1xuICAgIHNlbGYuX3ZhbGlkYXRvcnMuZmV0Y2guZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG4gICAgICBmaW5kT3B0aW9ucy5maWVsZHNbZmllbGROYW1lXSA9IDE7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBkb2MgPSBzZWxmLl9jb2xsZWN0aW9uLmZpbmRPbmUoc2VsZWN0b3IsIGZpbmRPcHRpb25zKTtcbiAgaWYgKCFkb2MpXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gY2FsbCB1c2VyIHZhbGlkYXRvcnMuXG4gIC8vIEFueSBkZW55IHJldHVybnMgdHJ1ZSBtZWFucyBkZW5pZWQuXG4gIGlmIChzZWxmLl92YWxpZGF0b3JzLnJlbW92ZS5kZW55LnNvbWUoKHZhbGlkYXRvcikgPT4ge1xuICAgIHJldHVybiB2YWxpZGF0b3IodXNlcklkLCB0cmFuc2Zvcm1Eb2ModmFsaWRhdG9yLCBkb2MpKTtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMywgXCJBY2Nlc3MgZGVuaWVkXCIpO1xuICB9XG4gIC8vIEFueSBhbGxvdyByZXR1cm5zIHRydWUgbWVhbnMgcHJvY2VlZC4gVGhyb3cgZXJyb3IgaWYgdGhleSBhbGwgZmFpbC5cbiAgaWYgKHNlbGYuX3ZhbGlkYXRvcnMucmVtb3ZlLmFsbG93LmV2ZXJ5KCh2YWxpZGF0b3IpID0+IHtcbiAgICByZXR1cm4gIXZhbGlkYXRvcih1c2VySWQsIHRyYW5zZm9ybURvYyh2YWxpZGF0b3IsIGRvYykpO1xuICB9KSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAzLCBcIkFjY2VzcyBkZW5pZWRcIik7XG4gIH1cblxuICAvLyBCYWNrIHdoZW4gd2Ugc3VwcG9ydGVkIGFyYml0cmFyeSBjbGllbnQtcHJvdmlkZWQgc2VsZWN0b3JzLCB3ZSBhY3R1YWxseVxuICAvLyByZXdyb3RlIHRoZSBzZWxlY3RvciB0byB7X2lkOiB7JGluOiBbaWRzIHRoYXQgd2UgZm91bmRdfX0gYmVmb3JlIHBhc3NpbmcgdG9cbiAgLy8gTW9uZ28gdG8gYXZvaWQgcmFjZXMsIGJ1dCBzaW5jZSBzZWxlY3RvciBpcyBndWFyYW50ZWVkIHRvIGFscmVhZHkganVzdCBiZVxuICAvLyBhbiBJRCwgd2UgZG9uJ3QgaGF2ZSB0byBhbnkgbW9yZS5cblxuICByZXR1cm4gc2VsZi5fY29sbGVjdGlvbi5yZW1vdmUuY2FsbChzZWxmLl9jb2xsZWN0aW9uLCBzZWxlY3Rvcik7XG59O1xuXG5Db2xsZWN0aW9uUHJvdG90eXBlLl9jYWxsTXV0YXRvck1ldGhvZCA9IGZ1bmN0aW9uIF9jYWxsTXV0YXRvck1ldGhvZChuYW1lLCBhcmdzLCBjYWxsYmFjaykge1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmICFjYWxsYmFjayAmJiAhYWxyZWFkeUluU2ltdWxhdGlvbigpKSB7XG4gICAgLy8gQ2xpZW50IGNhbid0IGJsb2NrLCBzbyBpdCBjYW4ndCByZXBvcnQgZXJyb3JzIGJ5IGV4Y2VwdGlvbixcbiAgICAvLyBvbmx5IGJ5IGNhbGxiYWNrLiBJZiB0aGV5IGZvcmdldCB0aGUgY2FsbGJhY2ssIGdpdmUgdGhlbSBhXG4gICAgLy8gZGVmYXVsdCBvbmUgdGhhdCBsb2dzIHRoZSBlcnJvciwgc28gdGhleSBhcmVuJ3QgdG90YWxseVxuICAgIC8vIGJhZmZsZWQgaWYgdGhlaXIgd3JpdGVzIGRvbid0IHdvcmsgYmVjYXVzZSB0aGVpciBkYXRhYmFzZSBpc1xuICAgIC8vIGRvd24uXG4gICAgLy8gRG9uJ3QgZ2l2ZSBhIGRlZmF1bHQgY2FsbGJhY2sgaW4gc2ltdWxhdGlvbiwgYmVjYXVzZSBpbnNpZGUgc3R1YnMgd2VcbiAgICAvLyB3YW50IHRvIHJldHVybiB0aGUgcmVzdWx0cyBmcm9tIHRoZSBsb2NhbCBjb2xsZWN0aW9uIGltbWVkaWF0ZWx5IGFuZFxuICAgIC8vIG5vdCBmb3JjZSBhIGNhbGxiYWNrLlxuICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycilcbiAgICAgICAgTWV0ZW9yLl9kZWJ1ZyhuYW1lICsgXCIgZmFpbGVkOiBcIiArIChlcnIucmVhc29uIHx8IGVyci5zdGFjaykpO1xuICAgIH07XG4gIH1cblxuICAvLyBGb3IgdHdvIG91dCBvZiB0aHJlZSBtdXRhdG9yIG1ldGhvZHMsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHNlbGVjdG9yXG4gIGNvbnN0IGZpcnN0QXJnSXNTZWxlY3RvciA9IG5hbWUgPT09IFwidXBkYXRlXCIgfHwgbmFtZSA9PT0gXCJyZW1vdmVcIjtcbiAgaWYgKGZpcnN0QXJnSXNTZWxlY3RvciAmJiAhYWxyZWFkeUluU2ltdWxhdGlvbigpKSB7XG4gICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gYWN0dWFsbHkgc2VuZCBhbiBSUEMsIHdlIHNob3VsZCB0aHJvdyBhbiBlcnJvciBpZlxuICAgIC8vIHRoaXMgaXMgYSBub24tSUQgc2VsZWN0b3IsIGJlY2F1c2UgdGhlIG11dGF0aW9uIG1ldGhvZHMgb25seSBhbGxvd1xuICAgIC8vIHNpbmdsZS1JRCBzZWxlY3RvcnMuIChJZiB3ZSBkb24ndCB0aHJvdyBoZXJlLCB3ZSdsbCBzZWUgZmxpY2tlci4pXG4gICAgdGhyb3dJZlNlbGVjdG9ySXNOb3RJZChhcmdzWzBdLCBuYW1lKTtcbiAgfVxuXG4gIGNvbnN0IG11dGF0b3JNZXRob2ROYW1lID0gdGhpcy5fcHJlZml4ICsgbmFtZTtcbiAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uYXBwbHkoXG4gICAgbXV0YXRvck1ldGhvZE5hbWUsIGFyZ3MsIHsgcmV0dXJuU3R1YlZhbHVlOiB0cnVlIH0sIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtRG9jKHZhbGlkYXRvciwgZG9jKSB7XG4gIGlmICh2YWxpZGF0b3IudHJhbnNmb3JtKVxuICAgIHJldHVybiB2YWxpZGF0b3IudHJhbnNmb3JtKGRvYyk7XG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIGRvY1RvVmFsaWRhdGUodmFsaWRhdG9yLCBkb2MsIGdlbmVyYXRlZElkKSB7XG4gIGxldCByZXQgPSBkb2M7XG4gIGlmICh2YWxpZGF0b3IudHJhbnNmb3JtKSB7XG4gICAgcmV0ID0gRUpTT04uY2xvbmUoZG9jKTtcbiAgICAvLyBJZiB5b3Ugc2V0IGEgc2VydmVyLXNpZGUgdHJhbnNmb3JtIG9uIHlvdXIgY29sbGVjdGlvbiwgdGhlbiB5b3UgZG9uJ3QgZ2V0XG4gICAgLy8gdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFwiY2xpZW50IHNwZWNpZmllZCB0aGUgSURcIiBhbmQgXCJzZXJ2ZXJcbiAgICAvLyBnZW5lcmF0ZWQgdGhlIElEXCIsIGJlY2F1c2UgdHJhbnNmb3JtcyBleHBlY3QgdG8gZ2V0IF9pZC4gIElmIHlvdSB3YW50IHRvXG4gICAgLy8gZG8gdGhhdCBjaGVjaywgeW91IGNhbiBkbyBpdCB3aXRoIGEgc3BlY2lmaWNcbiAgICAvLyBgQy5hbGxvdyh7aW5zZXJ0OiBmLCB0cmFuc2Zvcm06IG51bGx9KWAgdmFsaWRhdG9yLlxuICAgIGlmIChnZW5lcmF0ZWRJZCAhPT0gbnVsbCkge1xuICAgICAgcmV0Ll9pZCA9IGdlbmVyYXRlZElkO1xuICAgIH1cbiAgICByZXQgPSB2YWxpZGF0b3IudHJhbnNmb3JtKHJldCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gYWRkVmFsaWRhdG9yKGNvbGxlY3Rpb24sIGFsbG93T3JEZW55LCBvcHRpb25zKSB7XG4gIC8vIHZhbGlkYXRlIGtleXNcbiAgY29uc3QgdmFsaWRLZXlzUmVnRXggPSAvXig/Omluc2VydHx1cGRhdGV8cmVtb3ZlfGZldGNofHRyYW5zZm9ybSkkLztcbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCF2YWxpZEtleXNSZWdFeC50ZXN0KGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYWxsb3dPckRlbnkgKyBcIjogSW52YWxpZCBrZXk6IFwiICsga2V5KTtcbiAgfSk7XG5cbiAgY29sbGVjdGlvbi5fcmVzdHJpY3RlZCA9IHRydWU7XG5cbiAgWydpbnNlcnQnLCAndXBkYXRlJywgJ3JlbW92ZSddLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBpZiAoaGFzT3duLmNhbGwob3B0aW9ucywgbmFtZSkpIHtcbiAgICAgIGlmICghKG9wdGlvbnNbbmFtZV0gaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFsbG93T3JEZW55ICsgXCI6IFZhbHVlIGZvciBgXCIgKyBuYW1lICsgXCJgIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHRyYW5zZm9ybSBpcyBzcGVjaWZpZWQgYXQgYWxsIChpbmNsdWRpbmcgYXMgJ251bGwnKSBpbiB0aGlzXG4gICAgICAvLyBjYWxsLCB0aGVuIHRha2UgdGhhdDsgb3RoZXJ3aXNlLCB0YWtlIHRoZSB0cmFuc2Zvcm0gZnJvbSB0aGVcbiAgICAgIC8vIGNvbGxlY3Rpb24uXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zW25hbWVdLnRyYW5zZm9ybSA9IGNvbGxlY3Rpb24uX3RyYW5zZm9ybTsgIC8vIGFscmVhZHkgd3JhcHBlZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXS50cmFuc2Zvcm0gPSBMb2NhbENvbGxlY3Rpb24ud3JhcFRyYW5zZm9ybShcbiAgICAgICAgICBvcHRpb25zLnRyYW5zZm9ybSk7XG4gICAgICB9XG5cbiAgICAgIGNvbGxlY3Rpb24uX3ZhbGlkYXRvcnNbbmFtZV1bYWxsb3dPckRlbnldLnB1c2gob3B0aW9uc1tuYW1lXSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPbmx5IHVwZGF0ZSB0aGUgZmV0Y2ggZmllbGRzIGlmIHdlJ3JlIHBhc3NlZCB0aGluZ3MgdGhhdCBhZmZlY3RcbiAgLy8gZmV0Y2hpbmcuIFRoaXMgd2F5IGFsbG93KHt9KSBhbmQgYWxsb3coe2luc2VydDogZn0pIGRvbid0IHJlc3VsdCBpblxuICAvLyBzZXR0aW5nIGZldGNoQWxsRmllbGRzXG4gIGlmIChvcHRpb25zLnVwZGF0ZSB8fCBvcHRpb25zLnJlbW92ZSB8fCBvcHRpb25zLmZldGNoKSB7XG4gICAgaWYgKG9wdGlvbnMuZmV0Y2ggJiYgIShvcHRpb25zLmZldGNoIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYWxsb3dPckRlbnkgKyBcIjogVmFsdWUgZm9yIGBmZXRjaGAgbXVzdCBiZSBhbiBhcnJheVwiKTtcbiAgICB9XG4gICAgY29sbGVjdGlvbi5fdXBkYXRlRmV0Y2gob3B0aW9ucy5mZXRjaCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJZlNlbGVjdG9ySXNOb3RJZChzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIUxvY2FsQ29sbGVjdGlvbi5fc2VsZWN0b3JJc0lkUGVyaGFwc0FzT2JqZWN0KHNlbGVjdG9yKSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoXG4gICAgICA0MDMsIFwiTm90IHBlcm1pdHRlZC4gVW50cnVzdGVkIGNvZGUgbWF5IG9ubHkgXCIgKyBtZXRob2ROYW1lICtcbiAgICAgICAgXCIgZG9jdW1lbnRzIGJ5IElELlwiKTtcbiAgfVxufTtcblxuLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBpbiBhIEREUCBtZXRob2Qgc2ltdWxhdGlvblxuZnVuY3Rpb24gYWxyZWFkeUluU2ltdWxhdGlvbigpIHtcbiAgdmFyIEN1cnJlbnRJbnZvY2F0aW9uID1cbiAgICBERFAuX0N1cnJlbnRNZXRob2RJbnZvY2F0aW9uIHx8XG4gICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhcyBleHBsYWluZWQgaW4gdGhpcyBpc3N1ZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9pc3N1ZXMvODk0N1xuICAgIEREUC5fQ3VycmVudEludm9jYXRpb247XG5cbiAgY29uc3QgZW5jbG9zaW5nID0gQ3VycmVudEludm9jYXRpb24uZ2V0KCk7XG4gIHJldHVybiBlbmNsb3NpbmcgJiYgZW5jbG9zaW5nLmlzU2ltdWxhdGlvbjtcbn1cbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/allow-deny/allow-deny.js"],"names":["hasOwn","Object","prototype","hasOwnProperty","AllowDeny","CollectionPrototype","allow","options","addValidator","deny","_defineMutationMethods","self","_restricted","_insecure","undefined","_validators","insert","update","remove","upsert","fetch","fetchAllFields","_name","_prefix","_connection","Meteor","server","isClient","m","forEach","method","methodName","useExisting","handlerPropName","check","arguments","Match","Any","args","Array","from","generatedId","call","_makeNewID","isSimulation","_id","_collection","apply","throwIfSelectorIsNotId","length","Error","validatedMethodName","charAt","toUpperCase","slice","unshift","userId","push","_isInsecure","e","name","toString","methods","_updateFetch","fields","union","create","add","names","keys","Package","insecure","_validatedInsert","doc","some","validator","docToValidate","every","_validatedUpdate","selector","mutator","assign","LocalCollection","_selectorIsIdPerhapsAsObject","noReplaceError","mutatorKeys","modifiedFields","op","params","ALLOWED_UPDATE_OPERATIONS","field","indexOf","substring","findOptions","transform","fieldName","findOne","factoriedDoc","transformDoc","_forbidReplace","$inc","$set","$unset","$addToSet","$pop","$pullAll","$pull","$pushAll","$push","$bit","_validatedRemove","_callMutatorMethod","callback","alreadyInSimulation","err","_debug","reason","stack","firstArgIsSelector","mutatorMethodName","returnStubValue","ret","EJSON","clone","collection","allowOrDeny","validKeysRegEx","key","test","Function","_transform","wrapTransform","CurrentInvocation","DDP","_CurrentMethodInvocation","_CurrentInvocation","enclosing","get"],"mappings":"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","file":"/packages/allow-deny.js","sourcesContent":["///\n/// Remote methods and access control.\n///\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// Restrict default mutators on collection. allow() and deny() take the\n// same options:\n//\n// options.insert {Function(userId, doc)}\n// return true to allow/deny adding this document\n//\n// options.update {Function(userId, docs, fields, modifier)}\n// return true to allow/deny updating these documents.\n// `fields` is passed as an array of fields that are to be modified\n//\n// options.remove {Function(userId, docs)}\n// return true to allow/deny removing these documents\n//\n// options.fetch {Array}\n// Fields to fetch for these validators. If any call to allow or deny\n// does not have this option then all fields are loaded.\n//\n// allow and deny can be called multiple times. The validators are\n// evaluated as follows:\n// - If neither deny() nor allow() has been called on the collection,\n// then the request is allowed if and only if the \"insecure\" smart\n// package is in use.\n// - Otherwise, if any deny() function returns true, the request is denied.\n// - Otherwise, if any allow() function returns true, the request is allowed.\n// - Otherwise, the request is denied.\n//\n// Meteor may call your deny() and allow() functions in any order, and may not\n// call all of them if it is able to make a decision without calling them all\n// (so don't include side effects).\n\nAllowDeny = {\n CollectionPrototype: {}\n};\n\n// In the `mongo` package, we will extend Mongo.Collection.prototype with these\n// methods\nconst CollectionPrototype = AllowDeny.CollectionPrototype;\n\n/**\n * @summary Allow users to write directly to this collection from client code, subject to limitations you define.\n * @locus Server\n * @method allow\n * @memberOf Mongo.Collection\n * @instance\n * @param {Object} options\n * @param {Function} options.insert,update,remove Functions that look at a proposed modification to the database and return true if it should be allowed.\n * @param {String[]} options.fetch Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your `update` and `remove` functions.\n * @param {Function} options.transform Overrides `transform` on the [`Collection`](#collections). Pass `null` to disable transformation.\n */\nCollectionPrototype.allow = function(options) {\n addValidator(this, 'allow', options);\n};\n\n/**\n * @summary Override `allow` rules.\n * @locus Server\n * @method deny\n * @memberOf Mongo.Collection\n * @instance\n * @param {Object} options\n * @param {Function} options.insert,update,remove Functions that look at a proposed modification to the database and return true if it should be denied, even if an [allow](#allow) rule says otherwise.\n * @param {String[]} options.fetch Optional performance enhancement. Limits the fields that will be fetched from the database for inspection by your `update` and `remove` functions.\n * @param {Function} options.transform Overrides `transform` on the [`Collection`](#collections). Pass `null` to disable transformation.\n */\nCollectionPrototype.deny = function(options) {\n addValidator(this, 'deny', options);\n};\n\nCollectionPrototype._defineMutationMethods = function(options) {\n const self = this;\n options = options || {};\n\n // set to true once we call any allow or deny methods. If true, use\n // allow/deny semantics. If false, use insecure mode semantics.\n self._restricted = false;\n\n // Insecure mode (default to allowing writes). Defaults to 'undefined' which\n // means insecure iff the insecure package is loaded. This property can be\n // overriden by tests or packages wishing to change insecure mode behavior of\n // their collections.\n self._insecure = undefined;\n\n self._validators = {\n insert: {allow: [], deny: []},\n update: {allow: [], deny: []},\n remove: {allow: [], deny: []},\n upsert: {allow: [], deny: []}, // dummy arrays; can't set these!\n fetch: [],\n fetchAllFields: false\n };\n\n if (!self._name)\n return; // anonymous collection\n\n // XXX Think about method namespacing. Maybe methods should be\n // \"Meteor:Mongo:insert/NAME\"?\n self._prefix = '/' + self._name + '/';\n\n // Mutation Methods\n // Minimongo on the server gets no stubs; instead, by default\n // it wait()s until its result is ready, yielding.\n // This matches the behavior of macromongo on the server better.\n // XXX see #MeteorServerNull\n if (self._connection && (self._connection === Meteor.server || Meteor.isClient)) {\n const m = {};\n\n ['insert', 'update', 'remove'].forEach((method) => {\n const methodName = self._prefix + method;\n\n if (options.useExisting) {\n const handlerPropName = Meteor.isClient ? '_methodHandlers' : 'method_handlers';\n // Do not try to create additional methods if this has already been called.\n // (Otherwise the .methods() call below will throw an error.)\n if (self._connection[handlerPropName] &&\n typeof self._connection[handlerPropName][methodName] === 'function') return;\n }\n\n m[methodName] = function (/* ... */) {\n // All the methods do their own validation, instead of using check().\n check(arguments, [Match.Any]);\n const args = Array.from(arguments);\n try {\n // For an insert, if the client didn't specify an _id, generate one\n // now; because this uses DDP.randomStream, it will be consistent with\n // what the client generated. We generate it now rather than later so\n // that if (eg) an allow/deny rule does an insert to the same\n // collection (not that it really should), the generated _id will\n // still be the first use of the stream and will be consistent.\n //\n // However, we don't actually stick the _id onto the document yet,\n // because we want allow/deny rules to be able to differentiate\n // between arbitrary client-specified _id fields and merely\n // client-controlled-via-randomSeed fields.\n let generatedId = null;\n if (method === \"insert\" && !hasOwn.call(args[0], '_id')) {\n generatedId = self._makeNewID();\n }\n\n if (this.isSimulation) {\n // In a client simulation, you can do any mutation (even with a\n // complex selector).\n if (generatedId !== null)\n args[0]._id = generatedId;\n return self._collection[method].apply(\n self._collection, args);\n }\n\n // This is the server receiving a method call from the client.\n\n // We don't allow arbitrary selectors in mutations from the client: only\n // single-ID selectors.\n if (method !== 'insert')\n throwIfSelectorIsNotId(args[0], method);\n\n if (self._restricted) {\n // short circuit if there is no way it will pass.\n if (self._validators[method].allow.length === 0) {\n throw new Meteor.Error(\n 403, \"Access denied. No allow validators set on restricted \" +\n \"collection for method '\" + method + \"'.\");\n }\n\n const validatedMethodName =\n '_validated' + method.charAt(0).toUpperCase() + method.slice(1);\n args.unshift(this.userId);\n method === 'insert' && args.push(generatedId);\n return self[validatedMethodName].apply(self, args);\n } else if (self._isInsecure()) {\n if (generatedId !== null)\n args[0]._id = generatedId;\n // In insecure mode, allow any mutation (with a simple selector).\n // XXX This is kind of bogus. Instead of blindly passing whatever\n // we get from the network to this function, we should actually\n // know the correct arguments for the function and pass just\n // them. For example, if you have an extraneous extra null\n // argument and this is Mongo on the server, the .wrapAsync'd\n // functions like update will get confused and pass the\n // \"fut.resolver()\" in the wrong slot, where _update will never\n // invoke it. Bam, broken DDP connection. Probably should just\n // take this whole method and write it three times, invoking\n // helpers for the common code.\n return self._collection[method].apply(self._collection, args);\n } else {\n // In secure mode, if we haven't called allow or deny, then nothing\n // is permitted.\n throw new Meteor.Error(403, \"Access denied\");\n }\n } catch (e) {\n if (e.name === 'MongoError' || e.name === 'MinimongoError') {\n throw new Meteor.Error(409, e.toString());\n } else {\n throw e;\n }\n }\n };\n });\n\n self._connection.methods(m);\n }\n};\n\nCollectionPrototype._updateFetch = function (fields) {\n const self = this;\n\n if (!self._validators.fetchAllFields) {\n if (fields) {\n const union = Object.create(null);\n const add = names => names && names.forEach(name => union[name] = 1);\n add(self._validators.fetch);\n add(fields);\n self._validators.fetch = Object.keys(union);\n } else {\n self._validators.fetchAllFields = true;\n // clear fetch just to make sure we don't accidentally read it\n self._validators.fetch = null;\n }\n }\n};\n\nCollectionPrototype._isInsecure = function () {\n const self = this;\n if (self._insecure === undefined)\n return !!Package.insecure;\n return self._insecure;\n};\n\nCollectionPrototype._validatedInsert = function (userId, doc,\n generatedId) {\n const self = this;\n\n // call user validators.\n // Any deny returns true means denied.\n if (self._validators.insert.deny.some((validator) => {\n return validator(userId, docToValidate(validator, doc, generatedId));\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n // Any allow returns true means proceed. Throw error if they all fail.\n if (self._validators.insert.allow.every((validator) => {\n return !validator(userId, docToValidate(validator, doc, generatedId));\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n\n // If we generated an ID above, insert it now: after the validation, but\n // before actually inserting.\n if (generatedId !== null)\n doc._id = generatedId;\n\n self._collection.insert.call(self._collection, doc);\n};\n\n// Simulate a mongo `update` operation while validating that the access\n// control rules set by calls to `allow/deny` are satisfied. If all\n// pass, rewrite the mongo operation to use $in to set the list of\n// document ids to change ##ValidatedChange\nCollectionPrototype._validatedUpdate = function(\n userId, selector, mutator, options) {\n const self = this;\n\n check(mutator, Object);\n\n options = Object.assign(Object.create(null), options);\n\n if (!LocalCollection._selectorIsIdPerhapsAsObject(selector))\n throw new Error(\"validated update should be of a single ID\");\n\n // We don't support upserts because they don't fit nicely into allow/deny\n // rules.\n if (options.upsert)\n throw new Meteor.Error(403, \"Access denied. Upserts not \" +\n \"allowed in a restricted collection.\");\n\n const noReplaceError = \"Access denied. In a restricted collection you can only\" +\n \" update documents, not replace them. Use a Mongo update operator, such \" +\n \"as '$set'.\";\n\n const mutatorKeys = Object.keys(mutator);\n\n // compute modified fields\n const modifiedFields = {};\n\n if (mutatorKeys.length === 0) {\n throw new Meteor.Error(403, noReplaceError);\n }\n mutatorKeys.forEach((op) => {\n const params = mutator[op];\n if (op.charAt(0) !== '$') {\n throw new Meteor.Error(403, noReplaceError);\n } else if (!hasOwn.call(ALLOWED_UPDATE_OPERATIONS, op)) {\n throw new Meteor.Error(\n 403, \"Access denied. Operator \" + op + \" not allowed in a restricted collection.\");\n } else {\n Object.keys(params).forEach((field) => {\n // treat dotted fields as if they are replacing their\n // top-level part\n if (field.indexOf('.') !== -1)\n field = field.substring(0, field.indexOf('.'));\n\n // record the field we are trying to change\n modifiedFields[field] = true;\n });\n }\n });\n\n const fields = Object.keys(modifiedFields);\n\n const findOptions = {transform: null};\n if (!self._validators.fetchAllFields) {\n findOptions.fields = {};\n self._validators.fetch.forEach((fieldName) => {\n findOptions.fields[fieldName] = 1;\n });\n }\n\n const doc = self._collection.findOne(selector, findOptions);\n if (!doc) // none satisfied!\n return 0;\n\n // call user validators.\n // Any deny returns true means denied.\n if (self._validators.update.deny.some((validator) => {\n const factoriedDoc = transformDoc(validator, doc);\n return validator(userId,\n factoriedDoc,\n fields,\n mutator);\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n // Any allow returns true means proceed. Throw error if they all fail.\n if (self._validators.update.allow.every((validator) => {\n const factoriedDoc = transformDoc(validator, doc);\n return !validator(userId,\n factoriedDoc,\n fields,\n mutator);\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n\n options._forbidReplace = true;\n\n // Back when we supported arbitrary client-provided selectors, we actually\n // rewrote the selector to include an _id clause before passing to Mongo to\n // avoid races, but since selector is guaranteed to already just be an ID, we\n // don't have to any more.\n\n return self._collection.update.call(\n self._collection, selector, mutator, options);\n};\n\n// Only allow these operations in validated updates. Specifically\n// whitelist operations, rather than blacklist, so new complex\n// operations that are added aren't automatically allowed. A complex\n// operation is one that does more than just modify its target\n// field. For now this contains all update operations except '$rename'.\n// http://docs.mongodb.org/manual/reference/operators/#update\nconst ALLOWED_UPDATE_OPERATIONS = {\n $inc:1, $set:1, $unset:1, $addToSet:1, $pop:1, $pullAll:1, $pull:1,\n $pushAll:1, $push:1, $bit:1\n};\n\n// Simulate a mongo `remove` operation while validating access control\n// rules. See #ValidatedChange\nCollectionPrototype._validatedRemove = function(userId, selector) {\n const self = this;\n\n const findOptions = {transform: null};\n if (!self._validators.fetchAllFields) {\n findOptions.fields = {};\n self._validators.fetch.forEach((fieldName) => {\n findOptions.fields[fieldName] = 1;\n });\n }\n\n const doc = self._collection.findOne(selector, findOptions);\n if (!doc)\n return 0;\n\n // call user validators.\n // Any deny returns true means denied.\n if (self._validators.remove.deny.some((validator) => {\n return validator(userId, transformDoc(validator, doc));\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n // Any allow returns true means proceed. Throw error if they all fail.\n if (self._validators.remove.allow.every((validator) => {\n return !validator(userId, transformDoc(validator, doc));\n })) {\n throw new Meteor.Error(403, \"Access denied\");\n }\n\n // Back when we supported arbitrary client-provided selectors, we actually\n // rewrote the selector to {_id: {$in: [ids that we found]}} before passing to\n // Mongo to avoid races, but since selector is guaranteed to already just be\n // an ID, we don't have to any more.\n\n return self._collection.remove.call(self._collection, selector);\n};\n\nCollectionPrototype._callMutatorMethod = function _callMutatorMethod(name, args, callback) {\n if (Meteor.isClient && !callback && !alreadyInSimulation()) {\n // Client can't block, so it can't report errors by exception,\n // only by callback. If they forget the callback, give them a\n // default one that logs the error, so they aren't totally\n // baffled if their writes don't work because their database is\n // down.\n // Don't give a default callback in simulation, because inside stubs we\n // want to return the results from the local collection immediately and\n // not force a callback.\n callback = function (err) {\n if (err)\n Meteor._debug(name + \" failed: \" + (err.reason || err.stack));\n };\n }\n\n // For two out of three mutator methods, the first argument is a selector\n const firstArgIsSelector = name === \"update\" || name === \"remove\";\n if (firstArgIsSelector && !alreadyInSimulation()) {\n // If we're about to actually send an RPC, we should throw an error if\n // this is a non-ID selector, because the mutation methods only allow\n // single-ID selectors. (If we don't throw here, we'll see flicker.)\n throwIfSelectorIsNotId(args[0], name);\n }\n\n const mutatorMethodName = this._prefix + name;\n return this._connection.apply(\n mutatorMethodName, args, { returnStubValue: true }, callback);\n}\n\nfunction transformDoc(validator, doc) {\n if (validator.transform)\n return validator.transform(doc);\n return doc;\n}\n\nfunction docToValidate(validator, doc, generatedId) {\n let ret = doc;\n if (validator.transform) {\n ret = EJSON.clone(doc);\n // If you set a server-side transform on your collection, then you don't get\n // to tell the difference between \"client specified the ID\" and \"server\n // generated the ID\", because transforms expect to get _id. If you want to\n // do that check, you can do it with a specific\n // `C.allow({insert: f, transform: null})` validator.\n if (generatedId !== null) {\n ret._id = generatedId;\n }\n ret = validator.transform(ret);\n }\n return ret;\n}\n\nfunction addValidator(collection, allowOrDeny, options) {\n // validate keys\n const validKeysRegEx = /^(?:insert|update|remove|fetch|transform)$/;\n Object.keys(options).forEach((key) => {\n if (!validKeysRegEx.test(key))\n throw new Error(allowOrDeny + \": Invalid key: \" + key);\n });\n\n collection._restricted = true;\n\n ['insert', 'update', 'remove'].forEach((name) => {\n if (hasOwn.call(options, name)) {\n if (!(options[name] instanceof Function)) {\n throw new Error(allowOrDeny + \": Value for `\" + name + \"` must be a function\");\n }\n\n // If the transform is specified at all (including as 'null') in this\n // call, then take that; otherwise, take the transform from the\n // collection.\n if (options.transform === undefined) {\n options[name].transform = collection._transform; // already wrapped\n } else {\n options[name].transform = LocalCollection.wrapTransform(\n options.transform);\n }\n\n collection._validators[name][allowOrDeny].push(options[name]);\n }\n });\n\n // Only update the fetch fields if we're passed things that affect\n // fetching. This way allow({}) and allow({insert: f}) don't result in\n // setting fetchAllFields\n if (options.update || options.remove || options.fetch) {\n if (options.fetch && !(options.fetch instanceof Array)) {\n throw new Error(allowOrDeny + \": Value for `fetch` must be an array\");\n }\n collection._updateFetch(options.fetch);\n }\n}\n\nfunction throwIfSelectorIsNotId(selector, methodName) {\n if (!LocalCollection._selectorIsIdPerhapsAsObject(selector)) {\n throw new Meteor.Error(\n 403, \"Not permitted. Untrusted code may only \" + methodName +\n \" documents by ID.\");\n }\n};\n\n// Determine if we are in a DDP method simulation\nfunction alreadyInSimulation() {\n var CurrentInvocation =\n DDP._CurrentMethodInvocation ||\n // For backwards compatibility, as explained in this issue:\n // https://github.com/meteor/meteor/issues/8947\n DDP._CurrentInvocation;\n\n const enclosing = CurrentInvocation.get();\n return enclosing && enclosing.isSimulation;\n}\n"]}
\ No newline at end of file
(function () {
/* Exports */
Package._define("autopublish");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var WebApp = Package.webapp.WebApp;
var WebAppInternals = Package.webapp.WebAppInternals;
var main = Package.webapp.main;
var check = Package.check.check;
var Match = Package.check.Match;
var ECMAScript = Package.ecmascript.ECMAScript;
var DDP = Package['ddp-client'].DDP;
var DDPServer = Package['ddp-server'].DDPServer;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Autoupdate;
var require = meteorInstall({"node_modules":{"meteor":{"autoupdate":{"autoupdate_server.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/autoupdate/autoupdate_server.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
module.export({
Autoupdate: () => Autoupdate
});
let ClientVersions;
module.link("./client_versions.js", {
ClientVersions(v) {
ClientVersions = v;
}
}, 0);
let onMessage;
module.link("meteor/inter-process-messaging", {
onMessage(v) {
onMessage = v;
}
}, 1);
var Future = Npm.require("fibers/future");
const Autoupdate = __meteor_runtime_config__.autoupdate = {
// Map from client architectures (web.browser, web.browser.legacy,
// web.cordova) to version fields { version, versionRefreshable,
// versionNonRefreshable, refreshable } that will be stored in
// ClientVersions documents (whose IDs are client architectures). This
// data gets serialized into the boilerplate because it's stored in
// __meteor_runtime_config__.autoupdate.versions.
versions: {}
};
// Stores acceptable client versions.
const clientVersions = new ClientVersions(); // The client hash includes __meteor_runtime_config__, so wait until
// all packages have loaded and have had a chance to populate the
// runtime config before using the client hash as our default auto
// update version id.
// Note: Tests allow people to override Autoupdate.autoupdateVersion before
// startup.
Autoupdate.autoupdateVersion = null;
Autoupdate.autoupdateVersionRefreshable = null;
Autoupdate.autoupdateVersionCordova = null;
Autoupdate.appId = __meteor_runtime_config__.appId = process.env.APP_ID;
var syncQueue = new Meteor._SynchronousQueue();
function updateVersions(shouldReloadClientProgram) {
// Step 1: load the current client program on the server
if (shouldReloadClientProgram) {
WebAppInternals.reloadClientPrograms();
}
const {
// If the AUTOUPDATE_VERSION environment variable is defined, it takes
// precedence, but Autoupdate.autoupdateVersion is still supported as
// a fallback. In most cases neither of these values will be defined.
AUTOUPDATE_VERSION = Autoupdate.autoupdateVersion
} = process.env; // Step 2: update __meteor_runtime_config__.autoupdate.versions.
const clientArchs = Object.keys(WebApp.clientPrograms);
clientArchs.forEach(arch => {
Autoupdate.versions[arch] = {
version: AUTOUPDATE_VERSION || WebApp.calculateClientHash(arch),
versionRefreshable: AUTOUPDATE_VERSION || WebApp.calculateClientHashRefreshable(arch),
versionNonRefreshable: AUTOUPDATE_VERSION || WebApp.calculateClientHashNonRefreshable(arch)
};
}); // Step 3: form the new client boilerplate which contains the updated
// assets and __meteor_runtime_config__.
if (shouldReloadClientProgram) {
WebAppInternals.generateBoilerplate();
} // Step 4: update the ClientVersions collection.
// We use `onListening` here because we need to use
// `WebApp.getRefreshableAssets`, which is only set after
// `WebApp.generateBoilerplate` is called by `main` in webapp.
WebApp.onListening(() => {
clientArchs.forEach(arch => {
const payload = (0, _objectSpread2.default)({}, Autoupdate.versions[arch], {
assets: WebApp.getRefreshableAssets(arch)
});
clientVersions.set(arch, payload);
});
});
}
Meteor.publish("meteor_autoupdate_clientVersions", function (appId) {
// `null` happens when a client doesn't have an appId and passes
// `undefined` to `Meteor.subscribe`. `undefined` is translated to
// `null` as JSON doesn't have `undefined.
check(appId, Match.OneOf(String, undefined, null)); // Don't notify clients using wrong appId such as mobile apps built with a
// different server but pointing at the same local url
if (Autoupdate.appId && appId && Autoupdate.appId !== appId) return [];
const stop = clientVersions.watch((version, isNew) => {
(isNew ? this.added : this.changed).call(this, "meteor_autoupdate_clientVersions", version._id, version);
});
this.onStop(() => stop());
this.ready();
}, {
is_auto: true
});
Meteor.startup(function () {
updateVersions(false); // Force any connected clients that are still looking for these older
// document IDs to reload.
["version", "version-refreshable", "version-cordova"].forEach(_id => {
clientVersions.set(_id, {
version: "outdated"
});
});
});
var fut = new Future(); // We only want 'refresh' to trigger 'updateVersions' AFTER onListen,
// so we add a queued task that waits for onListen before 'refresh' can queue
// tasks. Note that the `onListening` callbacks do not fire until after
// Meteor.startup, so there is no concern that the 'updateVersions' calls from
// 'refresh' will overlap with the `updateVersions` call from Meteor.startup.
syncQueue.queueTask(function () {
fut.wait();
});
WebApp.onListening(function () {
fut.return();
});
function enqueueVersionsRefresh() {
syncQueue.queueTask(function () {
updateVersions(true);
});
} // Listen for messages pertaining to the client-refresh topic.
onMessage("client-refresh", enqueueVersionsRefresh); // Another way to tell the process to refresh: send SIGHUP signal
process.on('SIGHUP', Meteor.bindEnvironment(function () {
enqueueVersionsRefresh();
}, "handling SIGHUP signal for refresh"));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"client_versions.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/autoupdate/client_versions.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
module.export({
ClientVersions: () => ClientVersions
});
let Tracker;
module.link("meteor/tracker", {
Tracker(v) {
Tracker = v;
}
}, 0);
class ClientVersions {
constructor() {
this._versions = new Map();
this._watchCallbacks = new Set();
} // Creates a Livedata store for use with `Meteor.connection.registerStore`.
// After the store is registered, document updates reported by Livedata are
// merged with the documents in this `ClientVersions` instance.
createStore() {
return {
update: ({
id,
msg,
fields
}) => {
if (msg === "added" || msg === "changed") {
this.set(id, fields);
}
}
};
}
hasVersions() {
return this._versions.size > 0;
}
get(id) {
return this._versions.get(id);
} // Adds or updates a version document and invokes registered callbacks for the
// added/updated document. If a document with the given ID already exists, its
// fields are merged with `fields`.
set(id, fields) {
let version = this._versions.get(id);
let isNew = false;
if (version) {
Object.assign(version, fields);
} else {
version = (0, _objectSpread2.default)({
_id: id
}, fields);
isNew = true;
this._versions.set(id, version);
}
this._watchCallbacks.forEach(({
fn,
filter
}) => {
if (!filter || filter === version._id) {
fn(version, isNew);
}
});
} // Registers a callback that will be invoked when a version document is added
// or changed. Calling the function returned by `watch` removes the callback.
// If `skipInitial` is true, the callback isn't be invoked for existing
// documents. If `filter` is set, the callback is only invoked for documents
// with ID `filter`.
watch(fn, {
skipInitial,
filter
} = {}) {
if (!skipInitial) {
const resolved = Promise.resolve();
this._versions.forEach(version => {
if (!filter || filter === version._id) {
resolved.then(() => fn(version, true));
}
});
}
const callback = {
fn,
filter
};
this._watchCallbacks.add(callback);
return () => this._watchCallbacks.delete(callback);
} // A reactive data source for `Autoupdate.newClientAvailable`.
newClientAvailable(id, fields, currentVersion) {
function isNewVersion(version) {
return version._id === id && fields.some(field => version[field] !== currentVersion[field]);
}
const dependency = new Tracker.Dependency();
const version = this.get(id);
dependency.depend();
const stop = this.watch(version => {
if (isNewVersion(version)) {
dependency.changed();
stop();
}
}, {
skipInitial: true
});
return !!version && isNewVersion(version);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/autoupdate/autoupdate_server.js");
/* Exports */
Package._define("autoupdate", exports, {
Autoupdate: Autoupdate
});
})();
//# sourceURL=meteor://💻app/packages/autoupdate.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYXV0b3VwZGF0ZS9hdXRvdXBkYXRlX3NlcnZlci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYXV0b3VwZGF0ZS9jbGllbnRfdmVyc2lvbnMuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0IiwiQXV0b3VwZGF0ZSIsIkNsaWVudFZlcnNpb25zIiwibGluayIsInYiLCJvbk1lc3NhZ2UiLCJGdXR1cmUiLCJOcG0iLCJyZXF1aXJlIiwiX19tZXRlb3JfcnVudGltZV9jb25maWdfXyIsImF1dG91cGRhdGUiLCJ2ZXJzaW9ucyIsImNsaWVudFZlcnNpb25zIiwiYXV0b3VwZGF0ZVZlcnNpb24iLCJhdXRvdXBkYXRlVmVyc2lvblJlZnJlc2hhYmxlIiwiYXV0b3VwZGF0ZVZlcnNpb25Db3Jkb3ZhIiwiYXBwSWQiLCJwcm9jZXNzIiwiZW52IiwiQVBQX0lEIiwic3luY1F1ZXVlIiwiTWV0ZW9yIiwiX1N5bmNocm9ub3VzUXVldWUiLCJ1cGRhdGVWZXJzaW9ucyIsInNob3VsZFJlbG9hZENsaWVudFByb2dyYW0iLCJXZWJBcHBJbnRlcm5hbHMiLCJyZWxvYWRDbGllbnRQcm9ncmFtcyIsIkFVVE9VUERBVEVfVkVSU0lPTiIsImNsaWVudEFyY2hzIiwiT2JqZWN0Iiwia2V5cyIsIldlYkFwcCIsImNsaWVudFByb2dyYW1zIiwiZm9yRWFjaCIsImFyY2giLCJ2ZXJzaW9uIiwiY2FsY3VsYXRlQ2xpZW50SGFzaCIsInZlcnNpb25SZWZyZXNoYWJsZSIsImNhbGN1bGF0ZUNsaWVudEhhc2hSZWZyZXNoYWJsZSIsInZlcnNpb25Ob25SZWZyZXNoYWJsZSIsImNhbGN1bGF0ZUNsaWVudEhhc2hOb25SZWZyZXNoYWJsZSIsImdlbmVyYXRlQm9pbGVycGxhdGUiLCJvbkxpc3RlbmluZyIsInBheWxvYWQiLCJhc3NldHMiLCJnZXRSZWZyZXNoYWJsZUFzc2V0cyIsInNldCIsInB1Ymxpc2giLCJjaGVjayIsIk1hdGNoIiwiT25lT2YiLCJTdHJpbmciLCJ1bmRlZmluZWQiLCJzdG9wIiwid2F0Y2giLCJpc05ldyIsImFkZGVkIiwiY2hhbmdlZCIsImNhbGwiLCJfaWQiLCJvblN0b3AiLCJyZWFkeSIsImlzX2F1dG8iLCJzdGFydHVwIiwiZnV0IiwicXVldWVUYXNrIiwid2FpdCIsInJldHVybiIsImVucXVldWVWZXJzaW9uc1JlZnJlc2giLCJvbiIsImJpbmRFbnZpcm9ubWVudCIsIlRyYWNrZXIiLCJjb25zdHJ1Y3RvciIsIl92ZXJzaW9ucyIsIk1hcCIsIl93YXRjaENhbGxiYWNrcyIsIlNldCIsImNyZWF0ZVN0b3JlIiwidXBkYXRlIiwiaWQiLCJtc2ciLCJmaWVsZHMiLCJoYXNWZXJzaW9ucyIsInNpemUiLCJnZXQiLCJhc3NpZ24iLCJmbiIsImZpbHRlciIsInNraXBJbml0aWFsIiwicmVzb2x2ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJjYWxsYmFjayIsImFkZCIsImRlbGV0ZSIsIm5ld0NsaWVudEF2YWlsYWJsZSIsImN1cnJlbnRWZXJzaW9uIiwiaXNOZXdWZXJzaW9uIiwic29tZSIsImZpZWxkIiwiZGVwZW5kZW5jeSIsIkRlcGVuZGVuY3kiLCJkZXBlbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDQyxZQUFVLEVBQUMsTUFBSUE7QUFBaEIsQ0FBZDtBQUEyQyxJQUFJQyxjQUFKO0FBQW1CSCxNQUFNLENBQUNJLElBQVAsQ0FBWSxzQkFBWixFQUFtQztBQUFDRCxnQkFBYyxDQUFDRSxDQUFELEVBQUc7QUFBQ0Ysa0JBQWMsR0FBQ0UsQ0FBZjtBQUFpQjs7QUFBcEMsQ0FBbkMsRUFBeUUsQ0FBekU7QUFBNEUsSUFBSUMsU0FBSjtBQUFjTixNQUFNLENBQUNJLElBQVAsQ0FBWSxnQ0FBWixFQUE2QztBQUFDRSxXQUFTLENBQUNELENBQUQsRUFBRztBQUFDQyxhQUFTLEdBQUNELENBQVY7QUFB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QUNBLFNBQUtaLGVBQUwsQ0FBcUJtQixHQUFyQixDQUF5QkQsUUFBekI7O0FBRUEsV0FBTyxNQUFNLEtBQUtsQixlQUFMLENBQXFCb0IsTUFBckIsQ0FBNEJGLFFBQTVCLENBQWI7QUFDRCxHQXpFeUIsQ0EyRTFCOzs7QUFDQUcsb0JBQWtCLENBQUNqQixFQUFELEVBQUtFLE1BQUwsRUFBYWdCLGNBQWIsRUFBNkI7QUFDN0MsYUFBU0MsWUFBVCxDQUFzQi9ELE9BQXRCLEVBQStCO0FBQzdCLGFBQ0VBLE9BQU8sQ0FBQ3dCLEdBQVIsS0FBZ0JvQixFQUFoQixJQUNBRSxNQUFNLENBQUNrQixJQUFQLENBQWFDLEtBQUQsSUFBV2pFLE9BQU8sQ0FBQ2lFLEtBQUQsQ0FBUCxLQUFtQkgsY0FBYyxDQUFDRyxLQUFELENBQXhELENBRkY7QUFJRDs7QUFFRCxVQUFNQyxVQUFVLEdBQUcsSUFBSTlCLE9BQU8sQ0FBQytCLFVBQVosRUFBbkI7QUFDQSxVQUFNbkUsT0FBTyxHQUFHLEtBQUtpRCxHQUFMLENBQVNMLEVBQVQsQ0FBaEI7QUFFQXNCLGNBQVUsQ0FBQ0UsTUFBWDtBQUVBLFVBQU1sRCxJQUFJLEdBQUcsS0FBS0MsS0FBTCxDQUNWbkIsT0FBRCxJQUFhO0FBQ1gsVUFBSStELFlBQVksQ0FBQy9ELE9BQUQsQ0FBaEIsRUFBMkI7QUFDekJrRSxrQkFBVSxDQUFDNUMsT0FBWDtBQUNBSixZQUFJO0FBQ0w7QUFDRixLQU5VLEVBT1g7QUFBRW1DLGlCQUFXLEVBQUU7QUFBZixLQVBXLENBQWI7QUFVQSxXQUFPLENBQUMsQ0FBRXJELE9BQUgsSUFBYytELFlBQVksQ0FBQy9ELE9BQUQsQ0FBakM7QUFDRDs7QUFwR3lCLEMiLCJmaWxlIjoiL3BhY2thZ2VzL2F1dG91cGRhdGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBQdWJsaXNoIHRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9ucyBmb3IgZWFjaCBjbGllbnQgYXJjaGl0ZWN0dXJlXG4vLyAod2ViLmJyb3dzZXIsIHdlYi5icm93c2VyLmxlZ2FjeSwgd2ViLmNvcmRvdmEpLiBXaGVuIGEgY2xpZW50IG9ic2VydmVzXG4vLyBhIGNoYW5nZSBpbiB0aGUgdmVyc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGl0cyBjbGllbnQgYXJjaGl0ZWN0dXJlLFxuLy8gaXQgd2lsbCByZWZyZXNoIGl0c2VsZiwgZWl0aGVyIGJ5IHN3YXBwaW5nIG91dCBDU1MgYXNzZXRzIG9yIGJ5XG4vLyByZWxvYWRpbmcgdGhlIHBhZ2UuXG4vL1xuLy8gVGhlcmUgYXJlIHRocmVlIHZlcnNpb25zIGZvciBhbnkgZ2l2ZW4gY2xpZW50IGFyY2hpdGVjdHVyZTogYHZlcnNpb25gLFxuLy8gYHZlcnNpb25SZWZyZXNoYWJsZWAsIGFuZCBgdmVyc2lvbk5vblJlZnJlc2hhYmxlYC4gVGhlIHJlZnJlc2hhYmxlXG4vLyB2ZXJzaW9uIGlzIGEgaGFzaCBvZiBqdXN0IHRoZSBjbGllbnQgcmVzb3VyY2VzIHRoYXQgYXJlIHJlZnJlc2hhYmxlLFxuLy8gc3VjaCBhcyBDU1MsIHdoaWxlIHRoZSBub24tcmVmcmVzaGFibGUgdmVyc2lvbiBpcyBhIGhhc2ggb2YgdGhlIHJlc3Qgb2Zcbi8vIHRoZSBjbGllbnQgYXNzZXRzLCBleGNsdWRpbmcgdGhlIHJlZnJlc2hhYmxlIG9uZXM6IEhUTUwsIEpTLCBhbmQgc3RhdGljXG4vLyBmaWxlcyBpbiB0aGUgYHB1YmxpY2AgZGlyZWN0b3J5LiBUaGUgYHZlcnNpb25gIHZlcnNpb24gaXMgYSBjb21iaW5lZFxuLy8gaGFzaCBvZiBldmVyeXRoaW5nLlxuLy9cbi8vIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgQVVUT1VQREFURV9WRVJTSU9OYCBpcyBzZXQsIGl0IHdpbGwgYmVcbi8vIHVzZWQgaW4gcGxhY2Ugb2YgYWxsIGNsaWVudCB2ZXJzaW9ucy4gWW91IGNhbiB1c2UgdGhpcyB2YXJpYWJsZSB0b1xuLy8gY29udHJvbCB3aGVuIHRoZSBjbGllbnQgcmVsb2Fkcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGZvcmNlIGFcbi8vIHJlbG9hZCBvbmx5IGFmdGVyIG1ham9yIGNoYW5nZXMsIHVzZSBhIGN1c3RvbSBBVVRPVVBEQVRFX1ZFUlNJT04gYW5kXG4vLyBjaGFuZ2UgaXQgb25seSB3aGVuIHNvbWV0aGluZyB3b3J0aCBwdXNoaW5nIHRvIGNsaWVudHMgaGFwcGVucy5cbi8vXG4vLyBUaGUgc2VydmVyIHB1Ymxpc2hlcyBhIGBtZXRlb3JfYXV0b3VwZGF0ZV9jbGllbnRWZXJzaW9uc2AgY29sbGVjdGlvbi5cbi8vIFRoZSBJRCBvZiBlYWNoIGRvY3VtZW50IGlzIHRoZSBjbGllbnQgYXJjaGl0ZWN0dXJlLCBhbmQgdGhlIGZpZWxkcyBvZlxuLy8gdGhlIGRvY3VtZW50IGFyZSB0aGUgdmVyc2lvbnMgZGVzY3JpYmVkIGFib3ZlLlxuXG5pbXBvcnQgeyBDbGllbnRWZXJzaW9ucyB9IGZyb20gXCIuL2NsaWVudF92ZXJzaW9ucy5qc1wiO1xudmFyIEZ1dHVyZSA9IE5wbS5yZXF1aXJlKFwiZmliZXJzL2Z1dHVyZVwiKTtcblxuZXhwb3J0IGNvbnN0IEF1dG91cGRhdGUgPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLmF1dG91cGRhdGUgPSB7XG4gIC8vIE1hcCBmcm9tIGNsaWVudCBhcmNoaXRlY3R1cmVzICh3ZWIuYnJvd3Nlciwgd2ViLmJyb3dzZXIubGVnYWN5LFxuICAvLyB3ZWIuY29yZG92YSkgdG8gdmVyc2lvbiBmaWVsZHMgeyB2ZXJzaW9uLCB2ZXJzaW9uUmVmcmVzaGFibGUsXG4gIC8vIHZlcnNpb25Ob25SZWZyZXNoYWJsZSwgcmVmcmVzaGFibGUgfSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluXG4gIC8vIENsaWVudFZlcnNpb25zIGRvY3VtZW50cyAod2hvc2UgSURzIGFyZSBjbGllbnQgYXJjaGl0ZWN0dXJlcykuIFRoaXNcbiAgLy8gZGF0YSBnZXRzIHNlcmlhbGl6ZWQgaW50byB0aGUgYm9pbGVycGxhdGUgYmVjYXVzZSBpdCdzIHN0b3JlZCBpblxuICAvLyBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLmF1dG91cGRhdGUudmVyc2lvbnMuXG4gIHZlcnNpb25zOiB7fVxufTtcblxuLy8gU3RvcmVzIGFjY2VwdGFibGUgY2xpZW50IHZlcnNpb25zLlxuY29uc3QgY2xpZW50VmVyc2lvbnMgPSBuZXcgQ2xpZW50VmVyc2lvbnMoKTtcblxuLy8gVGhlIGNsaWVudCBoYXNoIGluY2x1ZGVzIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18sIHNvIHdhaXQgdW50aWxcbi8vIGFsbCBwYWNrYWdlcyBoYXZlIGxvYWRlZCBhbmQgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gcG9wdWxhdGUgdGhlXG4vLyBydW50aW1lIGNvbmZpZyBiZWZvcmUgdXNpbmcgdGhlIGNsaWVudCBoYXNoIGFzIG91ciBkZWZhdWx0IGF1dG9cbi8vIHVwZGF0ZSB2ZXJzaW9uIGlkLlxuXG4vLyBOb3RlOiBUZXN0cyBhbGxvdyBwZW9wbGUgdG8gb3ZlcnJpZGUgQXV0b3VwZGF0ZS5hdXRvdXBkYXRlVmVyc2lvbiBiZWZvcmVcbi8vIHN0YXJ0dXAuXG5BdXRvdXBkYXRlLmF1dG91cGRhdGVWZXJzaW9uID0gbnVsbDtcbkF1dG91cGRhdGUuYXV0b3VwZGF0ZVZlcnNpb25SZWZyZXNoYWJsZSA9IG51bGw7XG5BdXRvdXBkYXRlLmF1dG91cGRhdGVWZXJzaW9uQ29yZG92YSA9IG51bGw7XG5BdXRvdXBkYXRlLmFwcElkID0gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5hcHBJZCA9IHByb2Nlc3MuZW52LkFQUF9JRDtcblxudmFyIHN5bmNRdWV1ZSA9IG5ldyBNZXRlb3IuX1N5bmNocm9ub3VzUXVldWUoKTtcblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbnMoc2hvdWxkUmVsb2FkQ2xpZW50UHJvZ3JhbSkge1xuICAvLyBTdGVwIDE6IGxvYWQgdGhlIGN1cnJlbnQgY2xpZW50IHByb2dyYW0gb24gdGhlIHNlcnZlclxuICBpZiAoc2hvdWxkUmVsb2FkQ2xpZW50UHJvZ3JhbSkge1xuICAgIFdlYkFwcEludGVybmFscy5yZWxvYWRDbGllbnRQcm9ncmFtcygpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIC8vIElmIHRoZSBBVVRPVVBEQVRFX1ZFUlNJT04gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZGVmaW5lZCwgaXQgdGFrZXNcbiAgICAvLyBwcmVjZWRlbmNlLCBidXQgQXV0b3VwZGF0ZS5hdXRvdXBkYXRlVmVyc2lvbiBpcyBzdGlsbCBzdXBwb3J0ZWQgYXNcbiAgICAvLyBhIGZhbGxiYWNrLiBJbiBtb3N0IGNhc2VzIG5laXRoZXIgb2YgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZGVmaW5lZC5cbiAgICBBVVRPVVBEQVRFX1ZFUlNJT04gPSBBdXRvdXBkYXRlLmF1dG91cGRhdGVWZXJzaW9uXG4gIH0gPSBwcm9jZXNzLmVudjtcblxuICAvLyBTdGVwIDI6IHVwZGF0ZSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLmF1dG91cGRhdGUudmVyc2lvbnMuXG4gIGNvbnN0IGNsaWVudEFyY2hzID0gT2JqZWN0LmtleXMoV2ViQXBwLmNsaWVudFByb2dyYW1zKTtcbiAgY2xpZW50QXJjaHMuZm9yRWFjaChhcmNoID0+IHtcbiAgICBBdXRvdXBkYXRlLnZlcnNpb25zW2FyY2hdID0ge1xuICAgICAgdmVyc2lvbjogQVVUT1VQREFURV9WRVJTSU9OIHx8XG4gICAgICAgIFdlYkFwcC5jYWxjdWxhdGVDbGllbnRIYXNoKGFyY2gpLFxuICAgICAgdmVyc2lvblJlZnJlc2hhYmxlOiBBVVRPVVBEQVRFX1ZFUlNJT04gfHxcbiAgICAgICAgV2ViQXBwLmNhbGN1bGF0ZUNsaWVudEhhc2hSZWZyZXNoYWJsZShhcmNoKSxcbiAgICAgIHZlcnNpb25Ob25SZWZyZXNoYWJsZTogQVVUT1VQREFURV9WRVJTSU9OIHx8XG4gICAgICAgIFdlYkFwcC5jYWxjdWxhdGVDbGllbnRIYXNoTm9uUmVmcmVzaGFibGUoYXJjaCksXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gU3RlcCAzOiBmb3JtIHRoZSBuZXcgY2xpZW50IGJvaWxlcnBsYXRlIHdoaWNoIGNvbnRhaW5zIHRoZSB1cGRhdGVkXG4gIC8vIGFzc2V0cyBhbmQgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5cbiAgaWYgKHNob3VsZFJlbG9hZENsaWVudFByb2dyYW0pIHtcbiAgICBXZWJBcHBJbnRlcm5hbHMuZ2VuZXJhdGVCb2lsZXJwbGF0ZSgpO1xuICB9XG5cbiAgLy8gU3RlcCA0OiB1cGRhdGUgdGhlIENsaWVudFZlcnNpb25zIGNvbGxlY3Rpb24uXG4gIC8vIFdlIHVzZSBgb25MaXN0ZW5pbmdgIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZVxuICAvLyBgV2ViQXBwLmdldFJlZnJlc2hhYmxlQXNzZXRzYCwgd2hpY2ggaXMgb25seSBzZXQgYWZ0ZXJcbiAgLy8gYFdlYkFwcC5nZW5lcmF0ZUJvaWxlcnBsYXRlYCBpcyBjYWxsZWQgYnkgYG1haW5gIGluIHdlYmFwcC5cbiAgV2ViQXBwLm9uTGlzdGVuaW5nKCgpID0+IHtcbiAgICBjbGllbnRBcmNocy5mb3JFYWNoKGFyY2ggPT4ge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgLi4uQXV0b3VwZGF0ZS52ZXJzaW9uc1thcmNoXSxcbiAgICAgICAgYXNzZXRzOiBXZWJBcHAuZ2V0UmVmcmVzaGFibGVBc3NldHMoYXJjaCksXG4gICAgICB9O1xuXG4gICAgICBjbGllbnRWZXJzaW9ucy5zZXQoYXJjaCwgcGF5bG9hZCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5NZXRlb3IucHVibGlzaChcbiAgXCJtZXRlb3JfYXV0b3VwZGF0ZV9jbGllbnRWZXJzaW9uc1wiLFxuICBmdW5jdGlvbiAoYXBwSWQpIHtcbiAgICAvLyBgbnVsbGAgaGFwcGVucyB3aGVuIGEgY2xpZW50IGRvZXNuJ3QgaGF2ZSBhbiBhcHBJZCBhbmQgcGFzc2VzXG4gICAgLy8gYHVuZGVmaW5lZGAgdG8gYE1ldGVvci5zdWJzY3JpYmVgLiBgdW5kZWZpbmVkYCBpcyB0cmFuc2xhdGVkIHRvXG4gICAgLy8gYG51bGxgIGFzIEpTT04gZG9lc24ndCBoYXZlIGB1bmRlZmluZWQuXG4gICAgY2hlY2soYXBwSWQsIE1hdGNoLk9uZU9mKFN0cmluZywgdW5kZWZpbmVkLCBudWxsKSk7XG5cbiAgICAvLyBEb24ndCBub3RpZnkgY2xpZW50cyB1c2luZyB3cm9uZyBhcHBJZCBzdWNoIGFzIG1vYmlsZSBhcHBzIGJ1aWx0IHdpdGggYVxuICAgIC8vIGRpZmZlcmVudCBzZXJ2ZXIgYnV0IHBvaW50aW5nIGF0IHRoZSBzYW1lIGxvY2FsIHVybFxuICAgIGlmIChBdXRvdXBkYXRlLmFwcElkICYmIGFwcElkICYmIEF1dG91cGRhdGUuYXBwSWQgIT09IGFwcElkKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc3RvcCA9IGNsaWVudFZlcnNpb25zLndhdGNoKCh2ZXJzaW9uLCBpc05ldykgPT4ge1xuICAgICAgKGlzTmV3ID8gdGhpcy5hZGRlZCA6IHRoaXMuY2hhbmdlZClcbiAgICAgICAgLmNhbGwodGhpcywgXCJtZXRlb3JfYXV0b3VwZGF0ZV9jbGllbnRWZXJzaW9uc1wiLCB2ZXJzaW9uLl9pZCwgdmVyc2lvbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uU3RvcCgoKSA9PiBzdG9wKCkpO1xuICAgIHRoaXMucmVhZHkoKTtcbiAgfSxcbiAge2lzX2F1dG86IHRydWV9XG4pO1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbiAoKSB7XG4gIHVwZGF0ZVZlcnNpb25zKGZhbHNlKTtcblxuICAvLyBGb3JjZSBhbnkgY29ubmVjdGVkIGNsaWVudHMgdGhhdCBhcmUgc3RpbGwgbG9va2luZyBmb3IgdGhlc2Ugb2xkZXJcbiAgLy8gZG9jdW1lbnQgSURzIHRvIHJlbG9hZC5cbiAgW1widmVyc2lvblwiLFxuICAgXCJ2ZXJzaW9uLXJlZnJlc2hhYmxlXCIsXG4gICBcInZlcnNpb24tY29yZG92YVwiLFxuICBdLmZvckVhY2goX2lkID0+IHtcbiAgICBjbGllbnRWZXJzaW9ucy5zZXQoX2lkLCB7XG4gICAgICB2ZXJzaW9uOiBcIm91dGRhdGVkXCJcbiAgICB9KTtcbiAgfSk7XG59KTtcblxudmFyIGZ1dCA9IG5ldyBGdXR1cmUoKTtcblxuLy8gV2Ugb25seSB3YW50ICdyZWZyZXNoJyB0byB0cmlnZ2VyICd1cGRhdGVWZXJzaW9ucycgQUZURVIgb25MaXN0ZW4sXG4vLyBzbyB3ZSBhZGQgYSBxdWV1ZWQgdGFzayB0aGF0IHdhaXRzIGZvciBvbkxpc3RlbiBiZWZvcmUgJ3JlZnJlc2gnIGNhbiBxdWV1ZVxuLy8gdGFza3MuIE5vdGUgdGhhdCB0aGUgYG9uTGlzdGVuaW5nYCBjYWxsYmFja3MgZG8gbm90IGZpcmUgdW50aWwgYWZ0ZXJcbi8vIE1ldGVvci5zdGFydHVwLCBzbyB0aGVyZSBpcyBubyBjb25jZXJuIHRoYXQgdGhlICd1cGRhdGVWZXJzaW9ucycgY2FsbHMgZnJvbVxuLy8gJ3JlZnJlc2gnIHdpbGwgb3ZlcmxhcCB3aXRoIHRoZSBgdXBkYXRlVmVyc2lvbnNgIGNhbGwgZnJvbSBNZXRlb3Iuc3RhcnR1cC5cblxuc3luY1F1ZXVlLnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gIGZ1dC53YWl0KCk7XG59KTtcblxuV2ViQXBwLm9uTGlzdGVuaW5nKGZ1bmN0aW9uICgpIHtcbiAgZnV0LnJldHVybigpO1xufSk7XG5cbmZ1bmN0aW9uIGVucXVldWVWZXJzaW9uc1JlZnJlc2goKSB7XG4gIHN5bmNRdWV1ZS5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZVZlcnNpb25zKHRydWUpO1xuICB9KTtcbn1cblxuLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBwZXJ0YWluaW5nIHRvIHRoZSBjbGllbnQtcmVmcmVzaCB0b3BpYy5cbmltcG9ydCB7IG9uTWVzc2FnZSB9IGZyb20gXCJtZXRlb3IvaW50ZXItcHJvY2Vzcy1tZXNzYWdpbmdcIjtcbm9uTWVzc2FnZShcImNsaWVudC1yZWZyZXNoXCIsIGVucXVldWVWZXJzaW9uc1JlZnJlc2gpO1xuXG4vLyBBbm90aGVyIHdheSB0byB0ZWxsIHRoZSBwcm9jZXNzIHRvIHJlZnJlc2g6IHNlbmQgU0lHSFVQIHNpZ25hbFxucHJvY2Vzcy5vbignU0lHSFVQJywgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmdW5jdGlvbiAoKSB7XG4gIGVucXVldWVWZXJzaW9uc1JlZnJlc2goKTtcbn0sIFwiaGFuZGxpbmcgU0lHSFVQIHNpZ25hbCBmb3IgcmVmcmVzaFwiKSk7XG4iLCJpbXBvcnQgeyBUcmFja2VyIH0gZnJvbSBcIm1ldGVvci90cmFja2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRWZXJzaW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3ZlcnNpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3dhdGNoQ2FsbGJhY2tzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIExpdmVkYXRhIHN0b3JlIGZvciB1c2Ugd2l0aCBgTWV0ZW9yLmNvbm5lY3Rpb24ucmVnaXN0ZXJTdG9yZWAuXG4gIC8vIEFmdGVyIHRoZSBzdG9yZSBpcyByZWdpc3RlcmVkLCBkb2N1bWVudCB1cGRhdGVzIHJlcG9ydGVkIGJ5IExpdmVkYXRhIGFyZVxuICAvLyBtZXJnZWQgd2l0aCB0aGUgZG9jdW1lbnRzIGluIHRoaXMgYENsaWVudFZlcnNpb25zYCBpbnN0YW5jZS5cbiAgY3JlYXRlU3RvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogKHsgaWQsIG1zZywgZmllbGRzIH0pID0+IHtcbiAgICAgICAgaWYgKG1zZyA9PT0gXCJhZGRlZFwiIHx8IG1zZyA9PT0gXCJjaGFuZ2VkXCIpIHtcbiAgICAgICAgICB0aGlzLnNldChpZCwgZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBoYXNWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbnMuc2l6ZSA+IDA7XG4gIH1cblxuICBnZXQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbnMuZ2V0KGlkKTtcbiAgfVxuXG4gIC8vIEFkZHMgb3IgdXBkYXRlcyBhIHZlcnNpb24gZG9jdW1lbnQgYW5kIGludm9rZXMgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIHRoZVxuICAvLyBhZGRlZC91cGRhdGVkIGRvY3VtZW50LiBJZiBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIElEIGFscmVhZHkgZXhpc3RzLCBpdHNcbiAgLy8gZmllbGRzIGFyZSBtZXJnZWQgd2l0aCBgZmllbGRzYC5cbiAgc2V0KGlkLCBmaWVsZHMpIHtcbiAgICBsZXQgdmVyc2lvbiA9IHRoaXMuX3ZlcnNpb25zLmdldChpZCk7XG4gICAgbGV0IGlzTmV3ID0gZmFsc2U7XG5cbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgT2JqZWN0LmFzc2lnbih2ZXJzaW9uLCBmaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2ZXJzaW9uID0ge1xuICAgICAgICBfaWQ6IGlkLFxuICAgICAgICAuLi5maWVsZHNcbiAgICAgIH07XG5cbiAgICAgIGlzTmV3ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3ZlcnNpb25zLnNldChpZCwgdmVyc2lvbik7XG4gICAgfVxuXG4gICAgdGhpcy5fd2F0Y2hDYWxsYmFja3MuZm9yRWFjaCgoeyBmbiwgZmlsdGVyIH0pID0+IHtcbiAgICAgIGlmICghIGZpbHRlciB8fCBmaWx0ZXIgPT09IHZlcnNpb24uX2lkKSB7XG4gICAgICAgIGZuKHZlcnNpb24sIGlzTmV3KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYSB2ZXJzaW9uIGRvY3VtZW50IGlzIGFkZGVkXG4gIC8vIG9yIGNoYW5nZWQuIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGB3YXRjaGAgcmVtb3ZlcyB0aGUgY2FsbGJhY2suXG4gIC8vIElmIGBza2lwSW5pdGlhbGAgaXMgdHJ1ZSwgdGhlIGNhbGxiYWNrIGlzbid0IGJlIGludm9rZWQgZm9yIGV4aXN0aW5nXG4gIC8vIGRvY3VtZW50cy4gSWYgYGZpbHRlcmAgaXMgc2V0LCB0aGUgY2FsbGJhY2sgaXMgb25seSBpbnZva2VkIGZvciBkb2N1bWVudHNcbiAgLy8gd2l0aCBJRCBgZmlsdGVyYC5cbiAgd2F0Y2goZm4sIHsgc2tpcEluaXRpYWwsIGZpbHRlciB9ID0ge30pIHtcbiAgICBpZiAoISBza2lwSW5pdGlhbCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgdGhpcy5fdmVyc2lvbnMuZm9yRWFjaCgodmVyc2lvbikgPT4ge1xuICAgICAgICBpZiAoISBmaWx0ZXIgfHwgZmlsdGVyID09PSB2ZXJzaW9uLl9pZCkge1xuICAgICAgICAgIHJlc29sdmVkLnRoZW4oKCkgPT4gZm4odmVyc2lvbiwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsYmFjayA9IHsgZm4sIGZpbHRlciB9O1xuICAgIHRoaXMuX3dhdGNoQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy5fd2F0Y2hDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIEEgcmVhY3RpdmUgZGF0YSBzb3VyY2UgZm9yIGBBdXRvdXBkYXRlLm5ld0NsaWVudEF2YWlsYWJsZWAuXG4gIG5ld0NsaWVudEF2YWlsYWJsZShpZCwgZmllbGRzLCBjdXJyZW50VmVyc2lvbikge1xuICAgIGZ1bmN0aW9uIGlzTmV3VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2ZXJzaW9uLl9pZCA9PT0gaWQgJiZcbiAgICAgICAgZmllbGRzLnNvbWUoKGZpZWxkKSA9PiB2ZXJzaW9uW2ZpZWxkXSAhPT0gY3VycmVudFZlcnNpb25bZmllbGRdKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBlbmRlbmN5ID0gbmV3IFRyYWNrZXIuRGVwZW5kZW5jeSgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldChpZCk7XG5cbiAgICBkZXBlbmRlbmN5LmRlcGVuZCgpO1xuXG4gICAgY29uc3Qgc3RvcCA9IHRoaXMud2F0Y2goXG4gICAgICAodmVyc2lvbikgPT4ge1xuICAgICAgICBpZiAoaXNOZXdWZXJzaW9uKHZlcnNpb24pKSB7XG4gICAgICAgICAgZGVwZW5kZW5jeS5jaGFuZ2VkKCk7XG4gICAgICAgICAgc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBza2lwSW5pdGlhbDogdHJ1ZSB9XG4gICAgKTtcblxuICAgIHJldHVybiAhISB2ZXJzaW9uICYmIGlzTmV3VmVyc2lvbih2ZXJzaW9uKTtcbiAgfVxufVxuIl19
{"version":3,"sources":["meteor://💻app/packages/autoupdate/autoupdate_server.js","meteor://💻app/packages/autoupdate/client_versions.js"],"names":["module","export","Autoupdate","ClientVersions","link","v","onMessage","Future","Npm","require","__meteor_runtime_config__","autoupdate","versions","clientVersions","autoupdateVersion","autoupdateVersionRefreshable","autoupdateVersionCordova","appId","process","env","APP_ID","syncQueue","Meteor","_SynchronousQueue","updateVersions","shouldReloadClientProgram","WebAppInternals","reloadClientPrograms","AUTOUPDATE_VERSION","clientArchs","Object","keys","WebApp","clientPrograms","forEach","arch","version","calculateClientHash","versionRefreshable","calculateClientHashRefreshable","versionNonRefreshable","calculateClientHashNonRefreshable","generateBoilerplate","onListening","payload","assets","getRefreshableAssets","set","publish","check","Match","OneOf","String","undefined","stop","watch","isNew","added","changed","call","_id","onStop","ready","is_auto","startup","fut","queueTask","wait","return","enqueueVersionsRefresh","on","bindEnvironment","Tracker","constructor","_versions","Map","_watchCallbacks","Set","createStore","update","id","msg","fields","hasVersions","size","get","assign","fn","filter","skipInitial","resolved","Promise","resolve","then","callback","add","delete","newClientAvailable","currentVersion","isNewVersion","some","field","dependency","Dependency","depend"],"mappings":"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","file":"/packages/autoupdate.js","sourcesContent":["// Publish the current client versions for each client architecture\n// (web.browser, web.browser.legacy, web.cordova). When a client observes\n// a change in the versions associated with its client architecture,\n// it will refresh itself, either by swapping out CSS assets or by\n// reloading the page.\n//\n// There are three versions for any given client architecture: `version`,\n// `versionRefreshable`, and `versionNonRefreshable`. The refreshable\n// version is a hash of just the client resources that are refreshable,\n// such as CSS, while the non-refreshable version is a hash of the rest of\n// the client assets, excluding the refreshable ones: HTML, JS, and static\n// files in the `public` directory. The `version` version is a combined\n// hash of everything.\n//\n// If the environment variable `AUTOUPDATE_VERSION` is set, it will be\n// used in place of all client versions. You can use this variable to\n// control when the client reloads. For example, if you want to force a\n// reload only after major changes, use a custom AUTOUPDATE_VERSION and\n// change it only when something worth pushing to clients happens.\n//\n// The server publishes a `meteor_autoupdate_clientVersions` collection.\n// The ID of each document is the client architecture, and the fields of\n// the document are the versions described above.\n\nimport { ClientVersions } from \"./client_versions.js\";\nvar Future = Npm.require(\"fibers/future\");\n\nexport const Autoupdate = __meteor_runtime_config__.autoupdate = {\n // Map from client architectures (web.browser, web.browser.legacy,\n // web.cordova) to version fields { version, versionRefreshable,\n // versionNonRefreshable, refreshable } that will be stored in\n // ClientVersions documents (whose IDs are client architectures). This\n // data gets serialized into the boilerplate because it's stored in\n // __meteor_runtime_config__.autoupdate.versions.\n versions: {}\n};\n\n// Stores acceptable client versions.\nconst clientVersions = new ClientVersions();\n\n// The client hash includes __meteor_runtime_config__, so wait until\n// all packages have loaded and have had a chance to populate the\n// runtime config before using the client hash as our default auto\n// update version id.\n\n// Note: Tests allow people to override Autoupdate.autoupdateVersion before\n// startup.\nAutoupdate.autoupdateVersion = null;\nAutoupdate.autoupdateVersionRefreshable = null;\nAutoupdate.autoupdateVersionCordova = null;\nAutoupdate.appId = __meteor_runtime_config__.appId = process.env.APP_ID;\n\nvar syncQueue = new Meteor._SynchronousQueue();\n\nfunction updateVersions(shouldReloadClientProgram) {\n // Step 1: load the current client program on the server\n if (shouldReloadClientProgram) {\n WebAppInternals.reloadClientPrograms();\n }\n\n const {\n // If the AUTOUPDATE_VERSION environment variable is defined, it takes\n // precedence, but Autoupdate.autoupdateVersion is still supported as\n // a fallback. In most cases neither of these values will be defined.\n AUTOUPDATE_VERSION = Autoupdate.autoupdateVersion\n } = process.env;\n\n // Step 2: update __meteor_runtime_config__.autoupdate.versions.\n const clientArchs = Object.keys(WebApp.clientPrograms);\n clientArchs.forEach(arch => {\n Autoupdate.versions[arch] = {\n version: AUTOUPDATE_VERSION ||\n WebApp.calculateClientHash(arch),\n versionRefreshable: AUTOUPDATE_VERSION ||\n WebApp.calculateClientHashRefreshable(arch),\n versionNonRefreshable: AUTOUPDATE_VERSION ||\n WebApp.calculateClientHashNonRefreshable(arch),\n };\n });\n\n // Step 3: form the new client boilerplate which contains the updated\n // assets and __meteor_runtime_config__.\n if (shouldReloadClientProgram) {\n WebAppInternals.generateBoilerplate();\n }\n\n // Step 4: update the ClientVersions collection.\n // We use `onListening` here because we need to use\n // `WebApp.getRefreshableAssets`, which is only set after\n // `WebApp.generateBoilerplate` is called by `main` in webapp.\n WebApp.onListening(() => {\n clientArchs.forEach(arch => {\n const payload = {\n ...Autoupdate.versions[arch],\n assets: WebApp.getRefreshableAssets(arch),\n };\n\n clientVersions.set(arch, payload);\n });\n });\n}\n\nMeteor.publish(\n \"meteor_autoupdate_clientVersions\",\n function (appId) {\n // `null` happens when a client doesn't have an appId and passes\n // `undefined` to `Meteor.subscribe`. `undefined` is translated to\n // `null` as JSON doesn't have `undefined.\n check(appId, Match.OneOf(String, undefined, null));\n\n // Don't notify clients using wrong appId such as mobile apps built with a\n // different server but pointing at the same local url\n if (Autoupdate.appId && appId && Autoupdate.appId !== appId)\n return [];\n\n const stop = clientVersions.watch((version, isNew) => {\n (isNew ? this.added : this.changed)\n .call(this, \"meteor_autoupdate_clientVersions\", version._id, version);\n });\n\n this.onStop(() => stop());\n this.ready();\n },\n {is_auto: true}\n);\n\nMeteor.startup(function () {\n updateVersions(false);\n\n // Force any connected clients that are still looking for these older\n // document IDs to reload.\n [\"version\",\n \"version-refreshable\",\n \"version-cordova\",\n ].forEach(_id => {\n clientVersions.set(_id, {\n version: \"outdated\"\n });\n });\n});\n\nvar fut = new Future();\n\n// We only want 'refresh' to trigger 'updateVersions' AFTER onListen,\n// so we add a queued task that waits for onListen before 'refresh' can queue\n// tasks. Note that the `onListening` callbacks do not fire until after\n// Meteor.startup, so there is no concern that the 'updateVersions' calls from\n// 'refresh' will overlap with the `updateVersions` call from Meteor.startup.\n\nsyncQueue.queueTask(function () {\n fut.wait();\n});\n\nWebApp.onListening(function () {\n fut.return();\n});\n\nfunction enqueueVersionsRefresh() {\n syncQueue.queueTask(function () {\n updateVersions(true);\n });\n}\n\n// Listen for messages pertaining to the client-refresh topic.\nimport { onMessage } from \"meteor/inter-process-messaging\";\nonMessage(\"client-refresh\", enqueueVersionsRefresh);\n\n// Another way to tell the process to refresh: send SIGHUP signal\nprocess.on('SIGHUP', Meteor.bindEnvironment(function () {\n enqueueVersionsRefresh();\n}, \"handling SIGHUP signal for refresh\"));\n","import { Tracker } from \"meteor/tracker\";\n\nexport class ClientVersions {\n constructor() {\n this._versions = new Map();\n this._watchCallbacks = new Set();\n }\n\n // Creates a Livedata store for use with `Meteor.connection.registerStore`.\n // After the store is registered, document updates reported by Livedata are\n // merged with the documents in this `ClientVersions` instance.\n createStore() {\n return {\n update: ({ id, msg, fields }) => {\n if (msg === \"added\" || msg === \"changed\") {\n this.set(id, fields);\n }\n }\n };\n }\n\n hasVersions() {\n return this._versions.size > 0;\n }\n\n get(id) {\n return this._versions.get(id);\n }\n\n // Adds or updates a version document and invokes registered callbacks for the\n // added/updated document. If a document with the given ID already exists, its\n // fields are merged with `fields`.\n set(id, fields) {\n let version = this._versions.get(id);\n let isNew = false;\n\n if (version) {\n Object.assign(version, fields);\n } else {\n version = {\n _id: id,\n ...fields\n };\n\n isNew = true;\n this._versions.set(id, version);\n }\n\n this._watchCallbacks.forEach(({ fn, filter }) => {\n if (! filter || filter === version._id) {\n fn(version, isNew);\n }\n });\n }\n\n // Registers a callback that will be invoked when a version document is added\n // or changed. Calling the function returned by `watch` removes the callback.\n // If `skipInitial` is true, the callback isn't be invoked for existing\n // documents. If `filter` is set, the callback is only invoked for documents\n // with ID `filter`.\n watch(fn, { skipInitial, filter } = {}) {\n if (! skipInitial) {\n const resolved = Promise.resolve();\n\n this._versions.forEach((version) => {\n if (! filter || filter === version._id) {\n resolved.then(() => fn(version, true));\n }\n });\n }\n\n const callback = { fn, filter };\n this._watchCallbacks.add(callback);\n\n return () => this._watchCallbacks.delete(callback);\n }\n\n // A reactive data source for `Autoupdate.newClientAvailable`.\n newClientAvailable(id, fields, currentVersion) {\n function isNewVersion(version) {\n return (\n version._id === id &&\n fields.some((field) => version[field] !== currentVersion[field])\n );\n }\n\n const dependency = new Tracker.Dependency();\n const version = this.get(id);\n\n dependency.depend();\n\n const stop = this.watch(\n (version) => {\n if (isNewVersion(version)) {\n dependency.changed();\n stop();\n }\n },\n { skipInitial: true }\n );\n\n return !! version && isNewVersion(version);\n }\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
/* Package-scope variables */
var Babel, BabelCompiler;
(function(){
////////////////////////////////////////////////////////////////////////////////
// //
// packages/babel-compiler/babel.js //
// //
////////////////////////////////////////////////////////////////////////////////
//
var meteorBabel = null;
function getMeteorBabel() {
return meteorBabel || (meteorBabel = Npm.require("meteor-babel"));
}
/**
* Returns a new object containing default options appropriate for
*/
function getDefaultOptions(extraFeatures) {
// See https://github.com/meteor/babel/blob/master/options.js for more
// information about what the default options are.
return getMeteorBabel().getDefaultOptions(extraFeatures);
}
Babel = {
getDefaultOptions: getDefaultOptions,
// Deprecated, now a no-op.
validateExtraFeatures: Function.prototype,
parse: function (source) {
return getMeteorBabel().parse(source);
},
compile: function (source, babelOptions, cacheOptions) {
return getMeteorBabel().compile(
source,
babelOptions || getDefaultOptions(),
cacheOptions,
);
},
// This method is deprecated in favor of passing
// cacheDeps.cacheDirectory to Babel.compile (see above).
setCacheDir: function (cacheDir) {
getMeteorBabel().setCacheDir(cacheDir);
},
minify: function (source, options) {
var options = options || getMeteorBabel().getMinifierOptions();
return getMeteorBabel().minify(source, options);
},
getMinifierOptions: function (extraFeatures) {
return getMeteorBabel().getMinifierOptions(extraFeatures);
},
getMinimumModernBrowserVersions: function () {
return Npm.require("meteor-babel/modern-versions.js").get();
}
};
////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
////////////////////////////////////////////////////////////////////////////////
// //
// packages/babel-compiler/babel-compiler.js //
// //
////////////////////////////////////////////////////////////////////////////////
//
var semver = Npm.require("semver");
var JSON5 = Npm.require("json5");
/**
* A compiler that can be instantiated with features and used inside
* Plugin.registerCompiler
* @param {Object} extraFeatures The same object that getDefaultOptions takes
*/
BabelCompiler = function BabelCompiler(extraFeatures) {
this.extraFeatures = extraFeatures;
this._babelrcCache = null;
this._babelrcWarnings = Object.create(null);
this.cacheDirectory = null;
};
var BCp = BabelCompiler.prototype;
var excludedFileExtensionPattern = /\.(es5|min)\.js$/i;
var hasOwn = Object.prototype.hasOwnProperty;
// There's no way to tell the current Meteor version, but we can infer
// whether it's Meteor 1.4.4 or earlier by checking the Node version.
var isMeteorPre144 = semver.lt(process.version, "4.8.1");
BCp.processFilesForTarget = function (inputFiles) {
var compiler = this;
// Reset this cache for each batch processed.
this._babelrcCache = null;
inputFiles.forEach(function (inputFile) {
if (inputFile.supportsLazyCompilation) {
inputFile.addJavaScript({
path: inputFile.getPathInPackage(),
bare: !! inputFile.getFileOptions().bare
}, function () {
return compiler.processOneFileForTarget(inputFile);
});
} else {
var toBeAdded = compiler.processOneFileForTarget(inputFile);
if (toBeAdded) {
inputFile.addJavaScript(toBeAdded);
}
}
});
};
// Returns an object suitable for passing to inputFile.addJavaScript, or
// null to indicate there was an error, and nothing should be added.
BCp.processOneFileForTarget = function (inputFile, source) {
this._babelrcCache = this._babelrcCache || Object.create(null);
if (typeof source !== "string") {
// Other compiler plugins can call processOneFileForTarget with a
// source string that's different from inputFile.getContentsAsString()
// if they've already done some processing.
source = inputFile.getContentsAsString();
}
var packageName = inputFile.getPackageName();
var inputFilePath = inputFile.getPathInPackage();
var outputFilePath = inputFilePath;
var fileOptions = inputFile.getFileOptions();
var toBeAdded = {
sourcePath: inputFilePath,
path: outputFilePath,
data: source,
hash: inputFile.getSourceHash(),
sourceMap: null,
bare: !! fileOptions.bare
};
var cacheOptions = {
cacheDirectory: this.cacheDirectory,
cacheDeps: {
sourceHash: toBeAdded.hash,
},
};
// If you need to exclude a specific file within a package from Babel
// compilation, pass the { transpile: false } options to api.addFiles
// when you add that file.
if (fileOptions.transpile !== false &&
// Bare files should not be transpiled by Babel, because they do not
// have access to CommonJS APIs like `require`, `module`, `exports`.
! toBeAdded.bare &&
// If you need to exclude a specific file within an app from Babel
// compilation, give it the following file extension: .es5.js
! excludedFileExtensionPattern.test(inputFilePath)) {
var extraFeatures = Object.assign({}, this.extraFeatures);
var arch = inputFile.getArch();
if (arch.startsWith("os.")) {
// Start with a much simpler set of Babel presets and plugins if
// we're compiling for Node 8.
extraFeatures.nodeMajorVersion = parseInt(process.versions.node, 10);
} else if (arch === "web.browser") {
extraFeatures.modernBrowsers = true;
}
if (! extraFeatures.hasOwnProperty("jscript")) {
// Perform some additional transformations to improve compatibility
// in older browsers (e.g. wrapping named function expressions, per
// http://kiro.me/blog/nfe_dilemma.html).
extraFeatures.jscript = true;
}
var babelOptions = Babel.getDefaultOptions(extraFeatures);
babelOptions.caller = { name: "meteor", arch };
this.inferExtraBabelOptions(
inputFile,
babelOptions,
cacheOptions.cacheDeps,
);
babelOptions.sourceMaps = true;
babelOptions.filename =
babelOptions.sourceFileName = packageName
? "packages/" + packageName + "/" + inputFilePath
: inputFilePath;
try {
var result = profile('Babel.compile', function () {
return Babel.compile(source, babelOptions, cacheOptions);
});
} catch (e) {
if (e.loc) {
// Error is from @babel/parser.
inputFile.error({
message: e.message,
line: e.loc.line,
column: e.loc.column,
});
} else {
// Error is from a Babel transform, with line/column information
// embedded in e.message.
inputFile.error(e);
}
return null;
}
if (isMeteorPre144) {
// Versions of meteor-tool earlier than 1.4.4 do not understand that
// module.importSync is synonymous with the deprecated module.import
// and thus fail to register dependencies for importSync calls.
// This string replacement may seem a bit hacky, but it will tide us
// over until everyone has updated to Meteor 1.4.4.
// https://github.com/meteor/meteor/issues/8572
result.code = result.code.replace(
/\bmodule\.importSync\b/g,
"module.import"
);
}
toBeAdded.data = result.code;
toBeAdded.hash = result.hash;
// The babelOptions.sourceMapTarget option was deprecated in Babel
// 7.0.0-beta.41: https://github.com/babel/babel/pull/7500
result.map.file = babelOptions.filename + ".map";
toBeAdded.sourceMap = result.map;
}
return toBeAdded;
};
BCp.setDiskCacheDirectory = function (cacheDir) {
this.cacheDirectory = cacheDir;
};
function profile(name, func) {
if (typeof Profile !== 'undefined') {
return Profile.time(name, func);
} else {
return func();
}
};
BCp.inferExtraBabelOptions = function (inputFile, babelOptions, cacheDeps) {
if (! inputFile.require ||
! inputFile.findControlFile ||
! inputFile.readAndWatchFile) {
return false;
}
return (
// If a .babelrc exists, it takes precedence over package.json.
this._inferFromBabelRc(inputFile, babelOptions, cacheDeps) ||
this._inferFromPackageJson(inputFile, babelOptions, cacheDeps)
);
};
BCp._inferFromBabelRc = function (inputFile, babelOptions, cacheDeps) {
var babelrcPath = inputFile.findControlFile(".babelrc");
if (babelrcPath) {
if (! hasOwn.call(this._babelrcCache, babelrcPath)) {
try {
this._babelrcCache[babelrcPath] = {
controlFilePath: babelrcPath,
controlFileData: JSON5.parse(
inputFile.readAndWatchFile(babelrcPath)),
deps: Object.create(null),
};
} catch (e) {
if (e instanceof SyntaxError) {
e.message = ".babelrc is not a valid JSON5 file: " + e.message;
}
throw e;
}
}
const cacheEntry = this._babelrcCache[babelrcPath];
if (this._inferHelper(inputFile, cacheEntry)) {
merge(babelOptions, cacheEntry, "presets");
merge(babelOptions, cacheEntry, "plugins");
Object.assign(cacheDeps, cacheEntry.deps);
return true;
}
}
};
BCp._inferFromPackageJson = function (inputFile, babelOptions, cacheDeps) {
var pkgJsonPath = inputFile.findControlFile("package.json");
if (pkgJsonPath) {
const cacheEntry = hasOwn.call(this._babelrcCache, pkgJsonPath)
? this._babelrcCache[pkgJsonPath]
: this._babelrcCache[pkgJsonPath] = {
controlFilePath: pkgJsonPath,
controlFileData: JSON.parse(
inputFile.readAndWatchFile(pkgJsonPath)
).babel || null,
deps: Object.create(null),
};
if (this._inferHelper(inputFile, cacheEntry)) {
merge(babelOptions, cacheEntry, "presets");
merge(babelOptions, cacheEntry, "plugins");
Object.assign(cacheDeps, cacheEntry.deps);
return true;
}
}
};
BCp._inferHelper = function (inputFile, cacheEntry) {
if (! cacheEntry.controlFileData) {
return false;
}
if (hasOwn.call(cacheEntry, "finalInferHelperResult")) {
// We've already run _inferHelper and populated
// cacheEntry.{presets,plugins}, so we can return early here.
return cacheEntry.finalInferHelperResult;
}
var compiler = this;
function walkBabelRC(obj, path) {
if (obj && typeof obj === "object") {
const copy = Object.create(null);
path = path || [];
const index = path.length;
if (obj.presets) {
path[index] = "presets";
copy.presets = walkHelper(obj.presets, path);
}
if (obj.plugins) {
path[index] = "plugins";
copy.plugins = walkHelper(obj.plugins, path);
}
path.pop();
return copy;
}
return obj;
}
function walkHelper(list, path) {
const copy = [];
list.forEach(function (pluginOrPreset) {
const res = resolveHelper(pluginOrPreset, path);
if (res) {
copy.push(res);
}
});
return copy;
}
function resolveHelper(value, path) {
if (value) {
if (typeof value === "function") {
// The value has already been resolved to a plugin function.
return value;
}
if (Array.isArray(value)) {
// The value is a [plugin, options] pair.
const res = resolveHelper(value[0], path);
if (res) {
const copy = value.slice(0);
copy[0] = res;
return copy;
}
} else if (typeof value === "string") {
// The value is a string that we need to require.
const result = requireWithPath(value, path);
if (result && result.module) {
cacheEntry.deps[result.name] = result.version;
return walkBabelRC(result.module, path);
}
} else if (typeof value === "object") {
// The value is a { presets?, plugins? } preset object.
return walkBabelRC(value, path);
}
}
return null;
}
function requireWithPath(id, path) {
const prefixes = [];
const lastInPath = path[path.length - 1];
if (lastInPath === "presets") {
prefixes.push("@babel/preset-", "babel-preset-");
} else if (lastInPath === "plugins") {
prefixes.push("@babel/plugin-", "babel-plugin-");
}
// Try without a prefix if the prefixes fail.
prefixes.push("");
try {
return requireWithPrefixes(
inputFile, id, prefixes,
cacheEntry.controlFilePath
);
} catch (e) {
if (e.code !== "MODULE_NOT_FOUND") {
throw e;
}
if (! hasOwn.call(compiler._babelrcWarnings, id)) {
compiler._babelrcWarnings[id] = cacheEntry.controlFilePath;
console.error(
"Warning: unable to resolve " +
JSON.stringify(id) +
" in " + path.join(".") +
" of " + cacheEntry.controlFilePath + ", due to:"
);
console.error(e.stack || e);
}
return null;
}
}
const { controlFileData } = cacheEntry;
const clean = walkBabelRC(controlFileData);
merge(cacheEntry, clean, "presets");
merge(cacheEntry, clean, "plugins");
if (controlFileData &&
controlFileData.env) {
const envKey =
process.env.BABEL_ENV ||
process.env.NODE_ENV ||
"development";
const clean = walkBabelRC(controlFileData.env[envKey]);
if (clean) {
merge(cacheEntry, clean, "presets");
merge(cacheEntry, clean, "plugins");
}
}
return cacheEntry.finalInferHelperResult =
!! (cacheEntry.presets ||
cacheEntry.plugins);
};
function merge(babelOptions, babelrc, name) {
if (babelrc[name]) {
var list = babelOptions[name] || [];
babelOptions[name] = list;
list.push.apply(list, babelrc[name]);
}
}
const forbiddenPresetNames = new Set([
// Since Meteor always includes babel-preset-meteor automatically, it's
// likely a mistake for that preset to appear in a custom .babelrc
// file. Previously we recommended that developers simply remove the
// preset (e.g. #9631), but we can easily just ignore it by returning
// null here, which seems like a better solution since it allows the
// same .babelrc file to be used for other purposes, such as running
// tests with a testing tool that needs to compile application code the
// same way Meteor does.
"babel-preset-meteor",
// Similar reasoning applies to these commonly misused Babel presets:
"@babel/preset-env",
"@babel/preset-react",
]);
function requireWithPrefixes(inputFile, id, prefixes, controlFilePath) {
var isTopLevel = "./".indexOf(id.charAt(0)) < 0;
var presetOrPlugin;
var presetOrPluginMeta;
if (isTopLevel) {
var presetOrPluginId;
var found = prefixes.some(function (prefix) {
try {
// Call inputFile.resolve here rather than inputFile.require so
// that the import doesn't fail due to missing transitive
// dependencies imported by the preset or plugin.
if (inputFile.resolve(prefix + id, controlFilePath)) {
presetOrPluginId = prefix + id;
}
presetOrPluginMeta = inputFile.require(
packageNameFromTopLevelModuleId(prefix + id) + "/package.json",
controlFilePath
);
return true;
} catch (e) {
if (e.code !== "MODULE_NOT_FOUND") {
throw e;
}
return false;
}
});
if (found) {
if (forbiddenPresetNames.has(presetOrPluginMeta.name)) {
return null;
}
presetOrPlugin = inputFile.require(
presetOrPluginId,
controlFilePath
);
}
} else {
// If the identifier is not top-level, but relative or absolute,
// then it will be required as-is, so that you can implement your
// own Babel plugins locally, rather than always using plugins
// installed from npm.
presetOrPlugin = inputFile.require(id, controlFilePath);
// Note that inputFile.readAndWatchFileWithHash converts module
// identifers to OS-specific paths if necessary.
var absId = inputFile.resolve(id, controlFilePath);
var info = inputFile.readAndWatchFileWithHash(absId);
presetOrPluginMeta = {
name: absId,
version: info.hash
};
}
if (presetOrPlugin &&
presetOrPluginMeta) {
return {
name: presetOrPluginMeta.name,
version: presetOrPluginMeta.version,
module: presetOrPlugin.__esModule
? presetOrPlugin.default
: presetOrPlugin
};
}
return null;
}
// react-hot-loader/babel => react-hot-loader
// @babel/preset-env/lib/index.js => @babel/preset-env
function packageNameFromTopLevelModuleId(id) {
const parts = id.split("/", 2);
if (parts[0].charAt(0) === "@") {
return parts.join("/");
}
return parts[0];
}
////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
////////////////////////////////////////////////////////////////////////////////
// //
// packages/babel-compiler/versions.js //
// //
////////////////////////////////////////////////////////////////////////////////
//
// Make sure code compiled with features.modernBrowsers is delivered only
// to browsers that satisfy the assumptions of meteor-babel's modern Babel
// configuration.
Package["modern-browsers"].setMinimumBrowserVersions(
Babel.getMinimumModernBrowserVersions(),
// Although module.id is the recommended source string to pass as the
// second argument to setMinimumBrowserVersions, we can't use module.id
// here because babel-compiler cannot depend on the modules package. We
// can still make this string look like any other module.id, though.
"/node_modules/meteor/babel-compiler/versions.js"
);
////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("babel-compiler", {
Babel: Babel,
BabelCompiler: BabelCompiler
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
/* Package-scope variables */
var meteorBabelHelpers;
var require = meteorInstall({"node_modules":{"meteor":{"babel-runtime":{"babel-runtime.js":function(require,exports){
/////////////////////////////////////////////////////////////////////////////////////
// //
// packages/babel-runtime/babel-runtime.js //
// //
/////////////////////////////////////////////////////////////////////////////////////
//
exports.meteorBabelHelpers = require("meteor-babel-helpers");
try {
var babelRuntimeVersion = require("@babel/runtime/package.json").version;
} catch (e) {
throw new Error([
"",
"The @babel/runtime npm package could not be found in your node_modules ",
"directory. Please run the following command to install it:",
"",
" meteor npm install --save @babel/runtime",
""
].join("\n"));
}
if (parseInt(babelRuntimeVersion, 10) < 7 ||
(babelRuntimeVersion.indexOf("7.0.0-beta.") === 0 &&
parseInt(babelRuntimeVersion.split(".").pop(), 10) < 56)) {
console.error([
"The version of @babel/runtime installed in your node_modules directory ",
"(" + babelRuntimeVersion + ") is out of date. Please upgrade it by running ",
"",
" meteor npm install --save @babel/runtime@latest",
"",
"in your application directory.",
""
].join("\n"));
}
/////////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"meteor-babel-helpers":{"package.json":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/babel-runtime/node_modules/meteor-babel-helpers/package.jso //
// //
/////////////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "meteor-babel-helpers",
"version": "0.0.3",
"main": "index.js"
};
/////////////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/babel-runtime/node_modules/meteor-babel-helpers/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
/////////////////////////////////////////////////////////////////////////////////////
}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/babel-runtime/babel-runtime.js");
/* Exports */
Package._define("babel-runtime", exports, {
meteorBabelHelpers: meteorBabelHelpers
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Base64;
var require = meteorInstall({"node_modules":{"meteor":{"base64":{"base64.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/base64/base64.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
Base64: () => Base64
});
// Base 64 encoding
const BASE_64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const BASE_64_VALS = Object.create(null);
const getChar = val => BASE_64_CHARS.charAt(val);
const getVal = ch => ch === '=' ? -1 : BASE_64_VALS[ch];
for (let i = 0; i < BASE_64_CHARS.length; i++) {
BASE_64_VALS[getChar(i)] = i;
}
;
const encode = array => {
if (typeof array === "string") {
const str = array;
array = newBinary(str.length);
for (let i = 0; i < str.length; i++) {
const ch = str.charCodeAt(i);
if (ch > 0xFF) {
throw new Error("Not ascii. Base64.encode can only take ascii strings.");
}
array[i] = ch;
}
}
const answer = [];
let a = null;
let b = null;
let c = null;
let d = null;
array.forEach((elm, i) => {
switch (i % 3) {
case 0:
a = elm >> 2 & 0x3F;
b = (elm & 0x03) << 4;
break;
case 1:
b = b | elm >> 4 & 0xF;
c = (elm & 0xF) << 2;
break;
case 2:
c = c | elm >> 6 & 0x03;
d = elm & 0x3F;
answer.push(getChar(a));
answer.push(getChar(b));
answer.push(getChar(c));
answer.push(getChar(d));
a = null;
b = null;
c = null;
d = null;
break;
}
});
if (a != null) {
answer.push(getChar(a));
answer.push(getChar(b));
if (c == null) {
answer.push('=');
} else {
answer.push(getChar(c));
}
if (d == null) {
answer.push('=');
}
}
return answer.join("");
}; // XXX This is a weird place for this to live, but it's used both by
// this package and 'ejson', and we can't put it in 'ejson' without
// introducing a circular dependency. It should probably be in its own
// package or as a helper in a package that both 'base64' and 'ejson'
// use.
const newBinary = len => {
if (typeof Uint8Array === 'undefined' || typeof ArrayBuffer === 'undefined') {
const ret = [];
for (let i = 0; i < len; i++) {
ret.push(0);
}
ret.$Uint8ArrayPolyfill = true;
return ret;
}
return new Uint8Array(new ArrayBuffer(len));
};
const decode = str => {
let len = Math.floor(str.length * 3 / 4);
if (str.charAt(str.length - 1) == '=') {
len--;
if (str.charAt(str.length - 2) == '=') {
len--;
}
}
const arr = newBinary(len);
let one = null;
let two = null;
let three = null;
let j = 0;
for (let i = 0; i < str.length; i++) {
const c = str.charAt(i);
const v = getVal(c);
switch (i % 4) {
case 0:
if (v < 0) {
throw new Error('invalid base64 string');
}
one = v << 2;
break;
case 1:
if (v < 0) {
throw new Error('invalid base64 string');
}
one = one | v >> 4;
arr[j++] = one;
two = (v & 0x0F) << 4;
break;
case 2:
if (v >= 0) {
two = two | v >> 2;
arr[j++] = two;
three = (v & 0x03) << 6;
}
break;
case 3:
if (v >= 0) {
arr[j++] = three | v;
}
break;
}
}
return arr;
};
const Base64 = {
encode,
decode,
newBinary
};
////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/base64/base64.js");
/* Exports */
Package._define("base64", exports, {
Base64: Base64
});
})();
//# sourceURL=meteor://💻app/packages/base64.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYmFzZTY0L2Jhc2U2NC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnQiLCJCYXNlNjQiLCJCQVNFXzY0X0NIQVJTIiwiQkFTRV82NF9WQUxTIiwiT2JqZWN0IiwiY3JlYXRlIiwiZ2V0Q2hhciIsInZhbCIsImNoYXJBdCIsImdldFZhbCIsImNoIiwiaSIsImxlbmd0aCIsImVuY29kZSIsImFycmF5Iiwic3RyIiwibmV3QmluYXJ5IiwiY2hhckNvZGVBdCIsIkVycm9yIiwiYW5zd2VyIiwiYSIsImIiLCJjIiwiZCIsImZvckVhY2giLCJlbG0iLCJwdXNoIiwiam9pbiIsImxlbiIsIlVpbnQ4QXJyYXkiLCJBcnJheUJ1ZmZlciIsInJldCIsIiRVaW50OEFycmF5UG9seWZpbGwiLCJkZWNvZGUiLCJNYXRoIiwiZmxvb3IiLCJhcnIiLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImoiLCJ2Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUNDLFFBQU0sRUFBQyxNQUFJQTtBQUFaLENBQWQ7QUFBQTtBQUVBLE1BQU1DLGFBQWEsR0FBRyxrRUFBdEI7QUFFQSxNQUFNQyxZQUFZLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLElBQWQsQ0FBckI7O0FBRUEsTUFBTUMsT0FBTyxHQUFHQyxHQUFHLElBQUlMLGFBQWEsQ0FBQ00sTUFBZCxDQUFxQkQsR0FBckIsQ0FBdkI7O0FBQ0EsTUFBTUUsTUFBTSxHQUFHQyxFQUFFLElBQUlBLEVBQUUsS0FBSyxHQUFQLEdBQWEsQ0FBQyxDQUFkLEdBQWtCUCxZQUFZLENBQUNPLEVBQUQsQ0FBbkQ7O0FBRUEsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHVCxhQUFhLENBQUNVLE1BQWxDLEVBQTBDRCxDQUFDLEVBQTNDLEVBQStDO0FBQzdDUixjQUFZLENBQUNHLE9BQU8sQ0FBQ0ss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Ii9wYWNrYWdlcy9iYXNlNjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCYXNlIDY0IGVuY29kaW5nXG5cbmNvbnN0IEJBU0VfNjRfQ0hBUlMgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcblxuY29uc3QgQkFTRV82NF9WQUxTID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgZ2V0Q2hhciA9IHZhbCA9PiBCQVNFXzY0X0NIQVJTLmNoYXJBdCh2YWwpO1xuY29uc3QgZ2V0VmFsID0gY2ggPT4gY2ggPT09ICc9JyA/IC0xIDogQkFTRV82NF9WQUxTW2NoXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCBCQVNFXzY0X0NIQVJTLmxlbmd0aDsgaSsrKSB7XG4gIEJBU0VfNjRfVkFMU1tnZXRDaGFyKGkpXSA9IGk7XG59O1xuXG5jb25zdCBlbmNvZGUgPSBhcnJheSA9PiB7XG4gIGlmICh0eXBlb2YgYXJyYXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBzdHIgPSBhcnJheTtcbiAgICBhcnJheSA9IG5ld0JpbmFyeShzdHIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjaCA+IDB4RkYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiTm90IGFzY2lpLiBCYXNlNjQuZW5jb2RlIGNhbiBvbmx5IHRha2UgYXNjaWkgc3RyaW5ncy5cIik7XG4gICAgICB9XG5cbiAgICAgIGFycmF5W2ldID0gY2g7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYW5zd2VyID0gW107XG4gIGxldCBhID0gbnVsbDtcbiAgbGV0IGIgPSBudWxsO1xuICBsZXQgYyA9IG51bGw7XG4gIGxldCBkID0gbnVsbDtcblxuICBhcnJheS5mb3JFYWNoKChlbG0sIGkpID0+IHtcbiAgICBzd2l0Y2ggKGkgJSAzKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGEgPSAoZWxtID4+IDIpICYgMHgzRjtcbiAgICAgICAgYiA9IChlbG0gJiAweDAzKSA8PCA0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgYiA9IGIgfCAoZWxtID4+IDQpICYgMHhGO1xuICAgICAgICBjID0gKGVsbSAmIDB4RikgPDwgMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGMgPSBjIHwgKGVsbSA+PiA2KSAmIDB4MDM7XG4gICAgICAgIGQgPSBlbG0gJiAweDNGO1xuICAgICAgICBhbnN3ZXIucHVzaChnZXRDaGFyKGEpKTtcbiAgICAgICAgYW5zd2VyLnB1c2goZ2V0Q2hhcihiKSk7XG4gICAgICAgIGFuc3dlci5wdXNoKGdldENoYXIoYykpO1xuICAgICAgICBhbnN3ZXIucHVzaChnZXRDaGFyKGQpKTtcbiAgICAgICAgYSA9IG51bGw7XG4gICAgICAgIGIgPSBudWxsO1xuICAgICAgICBjID0gbnVsbDtcbiAgICAgICAgZCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGEgIT0gbnVsbCkge1xuICAgIGFuc3dlci5wdXNoKGdldENoYXIoYSkpO1xuICAgIGFuc3dlci5wdXNoKGdldENoYXIoYikpO1xuICAgIGlmIChjID09IG51bGwpIHtcbiAgICAgIGFuc3dlci5wdXNoKCc9Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuc3dlci5wdXNoKGdldENoYXIoYykpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZCA9PSBudWxsKSB7XG4gICAgICBhbnN3ZXIucHVzaCgnPScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbnN3ZXIuam9pbihcIlwiKTtcbn07XG5cblxuXG4vLyBYWFggVGhpcyBpcyBhIHdlaXJkIHBsYWNlIGZvciB0aGlzIHRvIGxpdmUsIGJ1dCBpdCdzIHVzZWQgYm90aCBieVxuLy8gdGhpcyBwYWNrYWdlIGFuZCAnZWpzb24nLCBhbmQgd2UgY2FuJ3QgcHV0IGl0IGluICdlanNvbicgd2l0aG91dFxuLy8gaW50cm9kdWNpbmcgYSBjaXJjdWxhciBkZXBlbmRlbmN5LiBJdCBzaG91bGQgcHJvYmFibHkgYmUgaW4gaXRzIG93blxuLy8gcGFja2FnZSBvciBhcyBhIGhlbHBlciBpbiBhIHBhY2thZ2UgdGhhdCBib3RoICdiYXNlNjQnIGFuZCAnZWpzb24nXG4vLyB1c2UuXG5jb25zdCBuZXdCaW5hcnkgPSBsZW4gPT4ge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICByZXQucHVzaCgwKTtcbiAgICB9XG5cbiAgICByZXQuJFVpbnQ4QXJyYXlQb2x5ZmlsbCA9IHRydWU7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKGxlbikpO1xufTtcblxuY29uc3QgZGVjb2RlID0gc3RyID0+IHtcbiAgbGV0IGxlbiA9IE1hdGguZmxvb3IoKHN0ci5sZW5ndGggKiAzKSAvIDQpO1xuICBpZiAoc3RyLmNoYXJBdChzdHIubGVuZ3RoIC0gMSkgPT0gJz0nKSB7XG4gICAgbGVuLS07XG4gICAgaWYgKHN0ci5jaGFyQXQoc3RyLmxlbmd0aCAtIDIpID09ICc9Jykge1xuICAgICAgbGVuLS07XG4gICAgfVxuICB9XG4gIFxuICBjb25zdCBhcnIgPSBuZXdCaW5hcnkobGVuKTtcblxuICBsZXQgb25lID0gbnVsbDtcbiAgbGV0IHR3byA9IG51bGw7XG4gIGxldCB0aHJlZSA9IG51bGw7XG5cbiAgbGV0IGogPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgY29uc3QgdiA9IGdldFZhbChjKTtcbiAgICBzd2l0Y2ggKGkgJSA0KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGlmICh2IDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiYXNlNjQgc3RyaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICBvbmUgPSB2IDw8IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAodiA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25lID0gb25lIHwgKHYgPj4gNCk7XG4gICAgICAgIGFycltqKytdID0gb25lO1xuICAgICAgICB0d28gPSAodiAmIDB4MEYpIDw8IDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAodiA+PSAwKSB7XG4gICAgICAgICAgdHdvID0gdHdvIHwgKHYgPj4gMik7XG4gICAgICAgICAgYXJyW2orK10gPSB0d287XG4gICAgICAgICAgdGhyZWUgPSAodiAmIDB4MDMpIDw8IDY7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKHYgPj0gMCkge1xuICAgICAgICAgIGFycltqKytdID0gdGhyZWUgfCB2O1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gYXJyO1xufTtcblxuZXhwb3J0IGNvbnN0IEJhc2U2NCA9IHsgZW5jb2RlLCBkZWNvZGUsIG5ld0JpbmFyeSB9O1xuIl19
{"version":3,"sources":["meteor://💻app/packages/base64/base64.js"],"names":["module","export","Base64","BASE_64_CHARS","BASE_64_VALS","Object","create","getChar","val","charAt","getVal","ch","i","length","encode","array","str","newBinary","charCodeAt","Error","answer","a","b","c","d","forEach","elm","push","join","len","Uint8Array","ArrayBuffer","ret","$Uint8ArrayPolyfill","decode","Math","floor","arr","one","two","three","j","v"],"mappings":"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","file":"/packages/base64.js","sourcesContent":["// Base 64 encoding\n\nconst BASE_64_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nconst BASE_64_VALS = Object.create(null);\n\nconst getChar = val => BASE_64_CHARS.charAt(val);\nconst getVal = ch => ch === '=' ? -1 : BASE_64_VALS[ch];\n\nfor (let i = 0; i < BASE_64_CHARS.length; i++) {\n BASE_64_VALS[getChar(i)] = i;\n};\n\nconst encode = array => {\n if (typeof array === \"string\") {\n const str = array;\n array = newBinary(str.length);\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n if (ch > 0xFF) {\n throw new Error(\n \"Not ascii. Base64.encode can only take ascii strings.\");\n }\n\n array[i] = ch;\n }\n }\n\n const answer = [];\n let a = null;\n let b = null;\n let c = null;\n let d = null;\n\n array.forEach((elm, i) => {\n switch (i % 3) {\n case 0:\n a = (elm >> 2) & 0x3F;\n b = (elm & 0x03) << 4;\n break;\n case 1:\n b = b | (elm >> 4) & 0xF;\n c = (elm & 0xF) << 2;\n break;\n case 2:\n c = c | (elm >> 6) & 0x03;\n d = elm & 0x3F;\n answer.push(getChar(a));\n answer.push(getChar(b));\n answer.push(getChar(c));\n answer.push(getChar(d));\n a = null;\n b = null;\n c = null;\n d = null;\n break;\n }\n });\n\n if (a != null) {\n answer.push(getChar(a));\n answer.push(getChar(b));\n if (c == null) {\n answer.push('=');\n } else {\n answer.push(getChar(c));\n }\n \n if (d == null) {\n answer.push('=');\n }\n }\n\n return answer.join(\"\");\n};\n\n\n\n// XXX This is a weird place for this to live, but it's used both by\n// this package and 'ejson', and we can't put it in 'ejson' without\n// introducing a circular dependency. It should probably be in its own\n// package or as a helper in a package that both 'base64' and 'ejson'\n// use.\nconst newBinary = len => {\n if (typeof Uint8Array === 'undefined' || typeof ArrayBuffer === 'undefined') {\n const ret = [];\n for (let i = 0; i < len; i++) {\n ret.push(0);\n }\n\n ret.$Uint8ArrayPolyfill = true;\n return ret;\n }\n return new Uint8Array(new ArrayBuffer(len));\n};\n\nconst decode = str => {\n let len = Math.floor((str.length * 3) / 4);\n if (str.charAt(str.length - 1) == '=') {\n len--;\n if (str.charAt(str.length - 2) == '=') {\n len--;\n }\n }\n \n const arr = newBinary(len);\n\n let one = null;\n let two = null;\n let three = null;\n\n let j = 0;\n\n for (let i = 0; i < str.length; i++) {\n const c = str.charAt(i);\n const v = getVal(c);\n switch (i % 4) {\n case 0:\n if (v < 0) {\n throw new Error('invalid base64 string');\n }\n\n one = v << 2;\n break;\n case 1:\n if (v < 0) {\n throw new Error('invalid base64 string');\n }\n\n one = one | (v >> 4);\n arr[j++] = one;\n two = (v & 0x0F) << 4;\n break;\n case 2:\n if (v >= 0) {\n two = two | (v >> 2);\n arr[j++] = two;\n three = (v & 0x03) << 6;\n }\n\n break;\n case 3:\n if (v >= 0) {\n arr[j++] = three | v;\n }\n\n break;\n }\n }\n \n return arr;\n};\n\nexport const Base64 = { encode, decode, newBinary };\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var IdMap = Package['id-map'].IdMap;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var idx, MaxHeap, MinHeap, MinMaxHeap;
var require = meteorInstall({"node_modules":{"meteor":{"binary-heap":{"binary-heap.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/binary-heap/binary-heap.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.link("./max-heap.js", {
MaxHeap: "MaxHeap"
}, 0);
module.link("./min-heap.js", {
MinHeap: "MinHeap"
}, 1);
module.link("./min-max-heap.js", {
MinMaxHeap: "MinMaxHeap"
}, 2);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"max-heap.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/binary-heap/max-heap.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
MaxHeap: () => MaxHeap
});
class MaxHeap {
constructor(comparator, options = {}) {
if (typeof comparator !== 'function') {
throw new Error('Passed comparator is invalid, should be a comparison function');
} // a C-style comparator that is given two values and returns a number,
// negative if the first value is less than the second, positive if the second
// value is greater than the first and zero if they are equal.
this._comparator = comparator;
if (!options.IdMap) {
options.IdMap = IdMap;
} // _heapIdx maps an id to an index in the Heap array the corresponding value
// is located on.
this._heapIdx = new options.IdMap(); // The Heap data-structure implemented as a 0-based contiguous array where
// every item on index idx is a node in a complete binary tree. Every node can
// have children on indexes idx*2+1 and idx*2+2, except for the leaves. Every
// node has a parent on index (idx-1)/2;
this._heap = []; // If the initial array is passed, we can build the heap in linear time
// complexity (O(N)) compared to linearithmic time complexity (O(nlogn)) if
// we push elements one by one.
if (Array.isArray(options.initData)) {
this._initFromData(options.initData);
}
} // Builds a new heap in-place in linear time based on passed data
_initFromData(data) {
this._heap = data.map(({
id,
value
}) => ({
id,
value
}));
data.forEach(({
id
}, i) => this._heapIdx.set(id, i));
if (!data.length) {
return;
} // start from the first non-leaf - the parent of the last leaf
for (let i = parentIdx(data.length - 1); i >= 0; i--) {
this._downHeap(i);
}
}
_downHeap(idx) {
while (leftChildIdx(idx) < this.size()) {
const left = leftChildIdx(idx);
const right = rightChildIdx(idx);
let largest = idx;
if (left < this.size()) {
largest = this._maxIndex(largest, left);
}
if (right < this.size()) {
largest = this._maxIndex(largest, right);
}
if (largest === idx) {
break;
}
this._swap(largest, idx);
idx = largest;
}
}
_upHeap(idx) {
while (idx > 0) {
const parent = parentIdx(idx);
if (this._maxIndex(parent, idx) === idx) {
this._swap(parent, idx);
idx = parent;
} else {
break;
}
}
}
_maxIndex(idxA, idxB) {
const valueA = this._get(idxA);
const valueB = this._get(idxB);
return this._comparator(valueA, valueB) >= 0 ? idxA : idxB;
} // Internal: gets raw data object placed on idxth place in heap
_get(idx) {
return this._heap[idx].value;
}
_swap(idxA, idxB) {
const recA = this._heap[idxA];
const recB = this._heap[idxB];
this._heapIdx.set(recA.id, idxB);
this._heapIdx.set(recB.id, idxA);
this._heap[idxA] = recB;
this._heap[idxB] = recA;
}
get(id) {
return this.has(id) ? this._get(this._heapIdx.get(id)) : null;
}
set(id, value) {
if (this.has(id)) {
if (this.get(id) === value) {
return;
}
const idx = this._heapIdx.get(id);
this._heap[idx].value = value; // Fix the new value's position
// Either bubble new value up if it is greater than its parent
this._upHeap(idx); // or bubble it down if it is smaller than one of its children
this._downHeap(idx);
} else {
this._heapIdx.set(id, this._heap.length);
this._heap.push({
id,
value
});
this._upHeap(this._heap.length - 1);
}
}
remove(id) {
if (this.has(id)) {
const last = this._heap.length - 1;
const idx = this._heapIdx.get(id);
if (idx !== last) {
this._swap(idx, last);
this._heap.pop();
this._heapIdx.remove(id); // Fix the swapped value's position
this._upHeap(idx);
this._downHeap(idx);
} else {
this._heap.pop();
this._heapIdx.remove(id);
}
}
}
has(id) {
return this._heapIdx.has(id);
}
empty() {
return !this.size();
}
clear() {
this._heap = [];
this._heapIdx.clear();
} // iterate over values in no particular order
forEach(iterator) {
this._heap.forEach(obj => iterator(obj.value, obj.id));
}
size() {
return this._heap.length;
}
setDefault(id, def) {
if (this.has(id)) {
return this.get(id);
}
this.set(id, def);
return def;
}
clone() {
const clone = new MaxHeap(this._comparator, this._heap);
return clone;
}
maxElementId() {
return this.size() ? this._heap[0].id : null;
}
_selfCheck() {
for (let i = 1; i < this._heap.length; i++) {
if (this._maxIndex(parentIdx(i), i) !== parentIdx(i)) {
throw new Error(`An item with id ${this._heap[i].id}` + " has a parent younger than it: " + this._heap[parentIdx(i)].id);
}
}
}
}
const leftChildIdx = i => i * 2 + 1;
const rightChildIdx = i => i * 2 + 2;
const parentIdx = i => i - 1 >> 1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"min-heap.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/binary-heap/min-heap.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
MinHeap: () => MinHeap
});
let MaxHeap;
module.link("./max-heap.js", {
MaxHeap(v) {
MaxHeap = v;
}
}, 0);
class MinHeap extends MaxHeap {
constructor(comparator, options) {
super((a, b) => -comparator(a, b), options);
}
maxElementId() {
throw new Error("Cannot call maxElementId on MinHeap");
}
minElementId() {
return super.maxElementId();
}
}
;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"min-max-heap.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/binary-heap/min-max-heap.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
MinMaxHeap: () => MinMaxHeap
});
let MaxHeap;
module.link("./max-heap.js", {
MaxHeap(v) {
MaxHeap = v;
}
}, 0);
let MinHeap;
module.link("./min-heap.js", {
MinHeap(v) {
MinHeap = v;
}
}, 1);
class MinMaxHeap extends MaxHeap {
constructor(comparator, options) {
super(comparator, options);
this._minHeap = new MinHeap(comparator, options);
}
set(...args) {
super.set(...args);
this._minHeap.set(...args);
}
remove(...args) {
super.remove(...args);
this._minHeap.remove(...args);
}
clear(...args) {
super.clear(...args);
this._minHeap.clear(...args);
}
setDefault(...args) {
super.setDefault(...args);
return this._minHeap.setDefault(...args);
}
clone() {
const clone = new MinMaxHeap(this._comparator, this._heap);
return clone;
}
minElementId() {
return this._minHeap.minElementId();
}
}
;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/binary-heap/binary-heap.js");
/* Exports */
Package._define("binary-heap", exports, {
MaxHeap: MaxHeap,
MinHeap: MinHeap,
MinMaxHeap: MinMaxHeap
});
})();
//# sourceURL=meteor://💻app/packages/binary-heap.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYmluYXJ5LWhlYXAvYmluYXJ5LWhlYXAuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL2JpbmFyeS1oZWFwL21heC1oZWFwLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9iaW5hcnktaGVhcC9taW4taGVhcC5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYmluYXJ5LWhlYXAvbWluLW1heC1oZWFwLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImxpbmsiLCJNYXhIZWFwIiwiTWluSGVhcCIsIk1pbk1heEhlYXAiLCJleHBvcnQiLCJjb25zdHJ1Y3RvciIsImNvbXBhcmF0b3IiLCJvcHRpb25zIiwiRXJyb3IiLCJfY29tcGFyYXRvciIsIklkTWFwIiwiX2hlYXBJZHgiLCJfaGVhcCIsIkFycmF5IiwiaXNBcnJheSIsImluaXREYXRhIiwiX2luaXRGcm9tRGF0YSIsImRhdGEiLCJtYXAiLCJpZCIsInZhbHVlIiwiZm9yRWFjaCIsImkiLCJzZXQiLCJsZW5ndGgiLCJwYXJlbnRJZHgiLCJfZG93bkhlYXAiLCJpZHgiLCJsZWZ0Q2hpbGRJZHgiLCJzaXplIiwibGVmdCIsInJpZ2h0IiwicmlnaHRDaGlsZElkeCIsImxhcmdlc3QiLCJfbWF4SW5kZXgiLCJfc3dhcCIsIl91cEhlYXAiLCJwYXJlbnQiLCJpZHhBIiwiaWR4QiIsInZhbHVlQSIsIl9nZXQiLCJ2YWx1ZUIiLCJyZWNBIiwicmVjQiIsImdldCIsImhhcyIsInB1c2giLCJyZW1vdmUiLCJsYXN0IiwicG9wIiwiZW1wdHkiLCJjbGVhciIsIml0ZXJhdG9yIiwib2JqIiwic2V0RGVmYXVsdCIsImRlZiIsImNsb25lIiwibWF4RWxlbWVudElkIiwiX3NlbGZDaGVjayIsInYiLCJhIiwiYiIsIm1pbkVsZW1lbnRJZCIsIl9taW5IZWFwIiwiYXJncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxD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IjoiL3BhY2thZ2VzL2JpbmFyeS1oZWFwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgTWF4SGVhcCB9IGZyb20gJy4vbWF4LWhlYXAuanMnO1xuZXhwb3J0IHsgTWluSGVhcCB9IGZyb20gJy4vbWluLWhlYXAuanMnO1xuZXhwb3J0IHsgTWluTWF4SGVhcCB9IGZyb20gJy4vbWluLW1heC1oZWFwLmpzJztcbiIsIi8vIENvbnN0cnVjdG9yIG9mIEhlYXBcbi8vIC0gY29tcGFyYXRvciAtIEZ1bmN0aW9uIC0gZ2l2ZW4gdHdvIGl0ZW1zIHJldHVybnMgYSBudW1iZXJcbi8vIC0gb3B0aW9uczpcbi8vICAgLSBpbml0RGF0YSAtIEFycmF5IC0gT3B0aW9uYWwgLSB0aGUgaW5pdGlhbCBkYXRhIGluIGEgZm9ybWF0OlxuLy8gICAgICAgIE9iamVjdDpcbi8vICAgICAgICAgIC0gaWQgLSBTdHJpbmcgLSB1bmlxdWUgaWQgb2YgdGhlIGl0ZW1cbi8vICAgICAgICAgIC0gdmFsdWUgLSBBbnkgLSB0aGUgZGF0YSB2YWx1ZVxuLy8gICAgICBlYWNoIHZhbHVlIGlzIHJldGFpbmVkXG4vLyAgIC0gSWRNYXAgLSBDb25zdHJ1Y3RvciAtIE9wdGlvbmFsIC0gY3VzdG9tIElkTWFwIGNsYXNzIHRvIHN0b3JlIGlkLT5pbmRleFxuLy8gICAgICAgbWFwcGluZ3MgaW50ZXJuYWxseS4gU3RhbmRhcmQgSWRNYXAgaXMgdXNlZCBieSBkZWZhdWx0LlxuZXhwb3J0IGNsYXNzIE1heEhlYXAgeyBcbiAgY29uc3RydWN0b3IoY29tcGFyYXRvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBjb21wYXJhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3NlZCBjb21wYXJhdG9yIGlzIGludmFsaWQsIHNob3VsZCBiZSBhIGNvbXBhcmlzb24gZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBhIEMtc3R5bGUgY29tcGFyYXRvciB0aGF0IGlzIGdpdmVuIHR3byB2YWx1ZXMgYW5kIHJldHVybnMgYSBudW1iZXIsXG4gICAgLy8gbmVnYXRpdmUgaWYgdGhlIGZpcnN0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCBwb3NpdGl2ZSBpZiB0aGUgc2Vjb25kXG4gICAgLy8gdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBmaXJzdCBhbmQgemVybyBpZiB0aGV5IGFyZSBlcXVhbC5cbiAgICB0aGlzLl9jb21wYXJhdG9yID0gY29tcGFyYXRvcjtcblxuICAgIGlmICghIG9wdGlvbnMuSWRNYXApIHtcbiAgICAgIG9wdGlvbnMuSWRNYXAgPSBJZE1hcDtcbiAgICB9XG5cbiAgICAvLyBfaGVhcElkeCBtYXBzIGFuIGlkIHRvIGFuIGluZGV4IGluIHRoZSBIZWFwIGFycmF5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlXG4gICAgLy8gaXMgbG9jYXRlZCBvbi5cbiAgICB0aGlzLl9oZWFwSWR4ID0gbmV3IG9wdGlvbnMuSWRNYXA7XG5cbiAgICAvLyBUaGUgSGVhcCBkYXRhLXN0cnVjdHVyZSBpbXBsZW1lbnRlZCBhcyBhIDAtYmFzZWQgY29udGlndW91cyBhcnJheSB3aGVyZVxuICAgIC8vIGV2ZXJ5IGl0ZW0gb24gaW5kZXggaWR4IGlzIGEgbm9kZSBpbiBhIGNvbXBsZXRlIGJpbmFyeSB0cmVlLiBFdmVyeSBub2RlIGNhblxuICAgIC8vIGhhdmUgY2hpbGRyZW4gb24gaW5kZXhlcyBpZHgqMisxIGFuZCBpZHgqMisyLCBleGNlcHQgZm9yIHRoZSBsZWF2ZXMuIEV2ZXJ5XG4gICAgLy8gbm9kZSBoYXMgYSBwYXJlbnQgb24gaW5kZXggKGlkeC0xKS8yO1xuICAgIHRoaXMuX2hlYXAgPSBbXTtcblxuICAgIC8vIElmIHRoZSBpbml0aWFsIGFycmF5IGlzIHBhc3NlZCwgd2UgY2FuIGJ1aWxkIHRoZSBoZWFwIGluIGxpbmVhciB0aW1lXG4gICAgLy8gY29tcGxleGl0eSAoTyhOKSkgY29tcGFyZWQgdG8gbGluZWFyaXRobWljIHRpbWUgY29tcGxleGl0eSAoTyhubG9nbikpIGlmXG4gICAgLy8gd2UgcHVzaCBlbGVtZW50cyBvbmUgYnkgb25lLlxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5pdERhdGEpKSB7XG4gICAgICB0aGlzLl9pbml0RnJvbURhdGEob3B0aW9ucy5pbml0RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQnVpbGRzIGEgbmV3IGhlYXAgaW4tcGxhY2UgaW4gbGluZWFyIHRpbWUgYmFzZWQgb24gcGFzc2VkIGRhdGFcbiAgX2luaXRGcm9tRGF0YShkYXRhKSB7XG4gICAgdGhpcy5faGVhcCA9IGRhdGEubWFwKCh7IGlkLCB2YWx1ZSB9KSA9PiAoeyBpZCwgdmFsdWUgfSkpO1xuXG4gICAgZGF0YS5mb3JFYWNoKCh7IGlkIH0sIGkpID0+IHRoaXMuX2hlYXBJZHguc2V0KGlkLCBpKSk7XG5cbiAgICBpZiAoISBkYXRhLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IG5vbi1sZWFmIC0gdGhlIHBhcmVudCBvZiB0aGUgbGFzdCBsZWFmXG4gICAgZm9yIChsZXQgaSA9IHBhcmVudElkeChkYXRhLmxlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5fZG93bkhlYXAoaSk7XG4gICAgfVxuICB9XG5cbiAgX2Rvd25IZWFwKGlkeCkge1xuICAgIHdoaWxlIChsZWZ0Q2hpbGRJZHgoaWR4KSA8IHRoaXMuc2l6ZSgpKSB7XG4gICAgICBjb25zdCBsZWZ0ID0gbGVmdENoaWxkSWR4KGlkeCk7XG4gICAgICBjb25zdCByaWdodCA9IHJpZ2h0Q2hpbGRJZHgoaWR4KTtcbiAgICAgIGxldCBsYXJnZXN0ID0gaWR4O1xuXG4gICAgICBpZiAobGVmdCA8IHRoaXMuc2l6ZSgpKSB7XG4gICAgICAgIGxhcmdlc3QgPSB0aGlzLl9tYXhJbmRleChsYXJnZXN0LCBsZWZ0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0IDwgdGhpcy5zaXplKCkpIHtcbiAgICAgICAgbGFyZ2VzdCA9IHRoaXMuX21heEluZGV4KGxhcmdlc3QsIHJpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhcmdlc3QgPT09IGlkeCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3dhcChsYXJnZXN0LCBpZHgpO1xuICAgICAgaWR4ID0gbGFyZ2VzdDtcbiAgICB9XG4gIH1cblxuICBfdXBIZWFwKGlkeCkge1xuICAgIHdoaWxlIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRJZHgoaWR4KTtcbiAgICAgIGlmICh0aGlzLl9tYXhJbmRleChwYXJlbnQsIGlkeCkgPT09IGlkeCkge1xuICAgICAgICB0aGlzLl9zd2FwKHBhcmVudCwgaWR4KVxuICAgICAgICBpZHggPSBwYXJlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfbWF4SW5kZXgoaWR4QSwgaWR4Qikge1xuICAgIGNvbnN0IHZhbHVlQSA9IHRoaXMuX2dldChpZHhBKTtcbiAgICBjb25zdCB2YWx1ZUIgPSB0aGlzLl9nZXQoaWR4Qik7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcmF0b3IodmFsdWVBLCB2YWx1ZUIpID49IDAgPyBpZHhBIDogaWR4QjtcbiAgfVxuXG4gIC8vIEludGVybmFsOiBnZXRzIHJhdyBkYXRhIG9iamVjdCBwbGFjZWQgb24gaWR4dGggcGxhY2UgaW4gaGVhcFxuICBfZ2V0KGlkeCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFwW2lkeF0udmFsdWU7XG4gIH1cblxuICBfc3dhcChpZHhBLCBpZHhCKSB7XG4gICAgY29uc3QgcmVjQSA9IHRoaXMuX2hlYXBbaWR4QV07XG4gICAgY29uc3QgcmVjQiA9IHRoaXMuX2hlYXBbaWR4Ql07XG5cbiAgICB0aGlzLl9oZWFwSWR4LnNldChyZWNBLmlkLCBpZHhCKTtcbiAgICB0aGlzLl9oZWFwSWR4LnNldChyZWNCLmlkLCBpZHhBKTtcblxuICAgIHRoaXMuX2hlYXBbaWR4QV0gPSByZWNCO1xuICAgIHRoaXMuX2hlYXBbaWR4Ql0gPSByZWNBO1xuICB9XG5cbiAgZ2V0KGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGlkKSA/XG4gICAgICB0aGlzLl9nZXQodGhpcy5faGVhcElkeC5nZXQoaWQpKSA6XG4gICAgICBudWxsO1xuICB9XG5cbiAgc2V0KGlkLCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhpZCkpIHtcbiAgICAgIGlmICh0aGlzLmdldChpZCkgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5faGVhcElkeC5nZXQoaWQpO1xuICAgICAgdGhpcy5faGVhcFtpZHhdLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgIC8vIEZpeCB0aGUgbmV3IHZhbHVlJ3MgcG9zaXRpb25cbiAgICAgIC8vIEVpdGhlciBidWJibGUgbmV3IHZhbHVlIHVwIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiBpdHMgcGFyZW50XG4gICAgICB0aGlzLl91cEhlYXAoaWR4KTtcbiAgICAgIC8vIG9yIGJ1YmJsZSBpdCBkb3duIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBvbmUgb2YgaXRzIGNoaWxkcmVuXG4gICAgICB0aGlzLl9kb3duSGVhcChpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWFwSWR4LnNldChpZCwgdGhpcy5faGVhcC5sZW5ndGgpO1xuICAgICAgdGhpcy5faGVhcC5wdXNoKHsgaWQsIHZhbHVlIH0pO1xuICAgICAgdGhpcy5fdXBIZWFwKHRoaXMuX2hlYXAubGVuZ3RoIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlKGlkKSB7XG4gICAgaWYgKHRoaXMuaGFzKGlkKSkge1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMuX2hlYXAubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2hlYXBJZHguZ2V0KGlkKTtcblxuICAgICAgaWYgKGlkeCAhPT0gbGFzdCkge1xuICAgICAgICB0aGlzLl9zd2FwKGlkeCwgbGFzdCk7XG4gICAgICAgIHRoaXMuX2hlYXAucG9wKCk7XG4gICAgICAgIHRoaXMuX2hlYXBJZHgucmVtb3ZlKGlkKTtcblxuICAgICAgICAvLyBGaXggdGhlIHN3YXBwZWQgdmFsdWUncyBwb3NpdGlvblxuICAgICAgICB0aGlzLl91cEhlYXAoaWR4KTtcbiAgICAgICAgdGhpcy5fZG93bkhlYXAoaWR4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hlYXAucG9wKCk7XG4gICAgICAgIHRoaXMuX2hlYXBJZHgucmVtb3ZlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhcElkeC5oYXMoaWQpO1xuICB9XG5cbiAgZW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLnNpemUoKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2hlYXAgPSBbXTtcbiAgICB0aGlzLl9oZWFwSWR4LmNsZWFyKCk7XG4gIH1cblxuICAvLyBpdGVyYXRlIG92ZXIgdmFsdWVzIGluIG5vIHBhcnRpY3VsYXIgb3JkZXJcbiAgZm9yRWFjaChpdGVyYXRvcikge1xuICAgIHRoaXMuX2hlYXAuZm9yRWFjaChvYmogPT4gaXRlcmF0b3Iob2JqLnZhbHVlLCBvYmouaWQpKTtcbiAgfVxuXG4gIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYXAubGVuZ3RoO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZCwgZGVmKSB7XG4gICAgaWYgKHRoaXMuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldChpZCwgZGVmKTtcbiAgICByZXR1cm4gZGVmO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTWF4SGVhcCh0aGlzLl9jb21wYXJhdG9yLCB0aGlzLl9oZWFwKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBtYXhFbGVtZW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpID8gdGhpcy5faGVhcFswXS5pZCA6IG51bGw7XG4gIH1cblxuICBfc2VsZkNoZWNrKCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5faGVhcC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX21heEluZGV4KHBhcmVudElkeChpKSwgaSkgIT09IHBhcmVudElkeChpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gaXRlbSB3aXRoIGlkICR7dGhpcy5faGVhcFtpXS5pZH1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGFzIGEgcGFyZW50IHlvdW5nZXIgdGhhbiBpdDogXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFwW3BhcmVudElkeChpKV0uaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsZWZ0Q2hpbGRJZHggPSBpID0+IGkgKiAyICsgMTtcbmNvbnN0IHJpZ2h0Q2hpbGRJZHggPSBpID0+IGkgKiAyICsgMjtcbmNvbnN0IHBhcmVudElkeCA9IGkgPT4gKGkgLSAxKSA+PiAxO1xuIiwiaW1wb3J0IHsgTWF4SGVhcCB9IGZyb20gJy4vbWF4LWhlYXAuanMnO1xuXG5leHBvcnQgY2xhc3MgTWluSGVhcCBleHRlbmRzIE1heEhlYXAge1xuICBjb25zdHJ1Y3Rvcihjb21wYXJhdG9yLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKGEsIGIpID0+IC1jb21wYXJhdG9yKGEsIGIpLCBvcHRpb25zKTtcbiAgfVxuXG4gIG1heEVsZW1lbnRJZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBtYXhFbGVtZW50SWQgb24gTWluSGVhcFwiKTtcbiAgfVxuXG4gIG1pbkVsZW1lbnRJZCgpIHtcbiAgICByZXR1cm4gc3VwZXIubWF4RWxlbWVudElkKCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBNYXhIZWFwIH0gZnJvbSAnLi9tYXgtaGVhcC5qcyc7XG5pbXBvcnQgeyBNaW5IZWFwIH0gZnJvbSAnLi9taW4taGVhcC5qcyc7XG5cbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgTWluL01heC1IZWFwIGlzIGp1c3QgYSBzdWJjbGFzcyBvZiBNYXgtSGVhcFxuLy8gd2l0aCBhIE1pbi1IZWFwIGFzIGFuIGVuY2Fwc3VsYXRlZCBwcm9wZXJ0eS5cbi8vXG4vLyBNb3N0IG9mIHRoZSBvcGVyYXRpb25zIGFyZSBqdXN0IHByb3h5IG1ldGhvZHMgdG8gY2FsbCB0aGUgc2FtZSBtZXRob2Qgb24gYm90aFxuLy8gaGVhcHMuXG4vL1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyAyKk4gbWVtb3J5IGJ1dCBpcyBmYWlybHkgc2ltcGxlIHRvIHdyaXRlIGFuZFxuLy8gdW5kZXJzdGFuZC4gQW5kIHRoZSBjb25zdGFudCBmYWN0b3Igb2YgYSBzaW1wbGUgSGVhcCBpcyB1c3VhbGx5IHNtYWxsZXJcbi8vIGNvbXBhcmVkIHRvIG90aGVyIHR3by13YXkgcHJpb3JpdHkgcXVldWVzIGxpa2UgTWluL01heCBIZWFwc1xuLy8gKGh0dHA6Ly93d3cuY3Mub3RhZ28uYWMubnovc3RhZmZwcml2L21pa2UvUGFwZXJzL01pbk1heEhlYXBzL01pbk1heEhlYXBzLnBkZilcbi8vIGFuZCBJbnRlcnZhbCBIZWFwc1xuLy8gKGh0dHA6Ly93d3cuY2lzZS51ZmwuZWR1L35zYWhuaS9kc2FhYy9lbnJpY2gvYzEzL2RvdWJsZS5odG0pXG5leHBvcnQgY2xhc3MgTWluTWF4SGVhcCBleHRlbmRzIE1heEhlYXAge1xuICBjb25zdHJ1Y3Rvcihjb21wYXJhdG9yLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoY29tcGFyYXRvciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fbWluSGVhcCA9IG5ldyBNaW5IZWFwKGNvbXBhcmF0b3IsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0KC4uLmFyZ3MpIHtcbiAgICBzdXBlci5zZXQoLi4uYXJncyk7XG4gICAgdGhpcy5fbWluSGVhcC5zZXQoLi4uYXJncyk7XG4gIH1cblxuICByZW1vdmUoLi4uYXJncykge1xuICAgIHN1cGVyLnJlbW92ZSguLi5hcmdzKTtcbiAgICB0aGlzLl9taW5IZWFwLnJlbW92ZSguLi5hcmdzKTtcbiAgfVxuXG4gIGNsZWFyKC4uLmFyZ3MpIHtcbiAgICBzdXBlci5jbGVhciguLi5hcmdzKTtcbiAgICB0aGlzLl9taW5IZWFwLmNsZWFyKC4uLmFyZ3MpO1xuICB9XG5cbiAgc2V0RGVmYXVsdCguLi5hcmdzKSB7XG4gICAgc3VwZXIuc2V0RGVmYXVsdCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5fbWluSGVhcC5zZXREZWZhdWx0KC4uLmFyZ3MpO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTWluTWF4SGVhcCh0aGlzLl9jb21wYXJhdG9yLCB0aGlzLl9oZWFwKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBtaW5FbGVtZW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbkhlYXAubWluRWxlbWVudElkKCk7XG4gIH1cblxufTtcbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/binary-heap/binary-heap.js","meteor://💻app/packages/binary-heap/max-heap.js","meteor://💻app/packages/binary-heap/min-heap.js","meteor://💻app/packages/binary-heap/min-max-heap.js"],"names":["module","link","MaxHeap","MinHeap","MinMaxHeap","export","constructor","comparator","options","Error","_comparator","IdMap","_heapIdx","_heap","Array","isArray","initData","_initFromData","data","map","id","value","forEach","i","set","length","parentIdx","_downHeap","idx","leftChildIdx","size","left","right","rightChildIdx","largest","_maxIndex","_swap","_upHeap","parent","idxA","idxB","valueA","_get","valueB","recA","recB","get","has","push","remove","last","pop","empty","clear","iterator","obj","setDefault","def","clone","maxElementId","_selfCheck","v","a","b","minElementId","_minHeap","args"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAAA,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACC,SAAO,EAAC;AAAT,CAA5B,EAAgD,CAAhD;AAAmDF,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACE,SAAO,EAAC;AAAT,CAA5B,EAAgD,CAAhD;AAAmDH,MAAM,CAACC,IAAP,CAAY,mBAAZ,EAAgC;AAACG,YAAU,EAAC;AAAZ,CAAhC,EAA0D,CAA1D,E;;;;;;;;;;;ACAtGJ,MAAM,CAACK,MAAP,CAAc;AAACH,SAAO,EAAC,MAAIA;AAAb,CAAd;;AAUO,MAAMA,OAAN,CAAc;AACnBI,aAAW,CAACC,UAAD,EAAaC,OAAO,GAAG,EAAvB,EAA2B;AACpC,QAAI,OAAOD,UAAP,KAAsB,UAA1B,EAAsC;AACpC,YAAM,IAAIE,KAAJ,CAAU,+DAAV,CAAN;AACD,KAHmC,CAKpC;AACA;AACA;;;AACA,SAAKC,WAAL,GAAmBH,UAAnB;;AAEA,QAAI,CAAEC,OAAO,CAACG,KAAd,EAAqB;AACnBH,aAAO,CAACG,KAAR,GAAgBA,KAAhB;AACD,KAZmC,CAcpC;AACA;;;AACA,SAAKC,QAAL,GAAgB,IAAIJ,OAAO,CAACG,KAAZ,EAAhB,CAhBoC,CAkBpC;AACA;AACA;AACA;;AACA,SAAKE,KAAL,GAAa,EAAb,CAtBoC,CAwBpC;AACA;AACA;;AACA,QAAIC,KAAK,CAACC,OAAN,CAAcP,OAAO,CAACQ,QAAtB,CAAJ,EAAqC;AACnC,WAAKC,aAAL,CAAmBT,OAAO,CAACQ,QAA3B;AACD;AACF,GA/BkB,CAiCnB;;;AACAC,eAAa,CAACC,IAAD,EAAO;AAClB,SAAKL,KAAL,GAAaK,IAAI,CAACC,GAAL,CAAS,CAAC;AAAEC,QAAF;AAAMC;AAAN,KAAD,MAAoB;AAAED,QAAF;AAAMC;AAAN,KAApB,CAAT,CAAb;AAEAH,QAAI,CAACI,OAAL,CAAa,CAAC;AAAEF;AAAF,KAAD,EAASG,CAAT,KAAe,KAAKX,QAAL,CAAcY,GAAd,CAAkBJ,EAAlB,EAAsBG,CAAtB,CAA5B;;AAEA,QAAI,CAAEL,IAAI,CAACO,MAAX,EAAmB;AACjB;AACD,KAPiB,CASlB;;;AACA,SAAK,IAAIF,CAAC,GAAGG,SAAS,CAACR,IAAI,CAACO,MAAL,GAAc,CAAf,CAAtB,EAAyCF,CAAC,IAAI,CAA9C,EAAiDA,CAAC,EAAlD,EAAsD;AACpD,WAAKI,SAAL,CAAeJ,CAAf;AACD;AACF;;AAEDI,WAAS,CAACC,GAAD,EAAM;AACb,WAAOC,YAAY,CAACD,GAAD,CAAZ,GAAoB,KAAKE,IAAL,EAA3B,EAAwC;AACtC,YAAMC,IAAI,GAAGF,YAAY,CAACD,GAAD,CAAzB;AACA,YAAMI,KAAK,GAAGC,aAAa,CAACL,GAAD,CAA3B;AACA,UAAIM,OAAO,GAAGN,GAAd;;AAEA,UAAIG,IAAI,GAAG,KAAKD,IAAL,EAAX,EAAwB;AACtBI,eAAO,GAAG,KAAKC,SAAL,CAAeD,OAAf,EAAwBH,IAAxB,CAAV;AACD;;AAED,UAAIC,KAAK,GAAG,KAAKF,IAAL,EAAZ,EAAyB;AACvBI,eAAO,GAAG,KAAKC,SAAL,CAAeD,OAAf,EAAwBF,KAAxB,CAAV;AACD;;AAED,UAAIE,OAAO,KAAKN,GAAhB,EAAqB;AACnB;AACD;;AAED,WAAKQ,KAAL,CAAWF,OAAX,EAAoBN,GAApB;;AACAA,SAAG,GAAGM,OAAN;AACD;AACF;;AAEDG,SAAO,CAACT,GAAD,EAAM;AACX,WAAOA,GAAG,GAAG,CAAb,EAAgB;AACd,YAAMU,MAAM,GAAGZ,SAAS,CAACE,GAAD,CAAxB;;AACA,UAAI,KAAKO,SAAL,CAAeG,MAAf,EAAuBV,GAAvB,MAAgCA,GAApC,EAAyC;AACvC,aAAKQ,KAAL,CAAWE,MAAX,EAAmBV,GAAnB;;AACAA,WAAG,GAAGU,MAAN;AACD,OAHD,MAGO;AACL;AACD;AACF;AACF;;AAEDH,WAAS,CAACI,IAAD,EAAOC,IAAP,EAAa;AACpB,UAAMC,MAAM,GAAG,KAAKC,IAAL,CAAUH,IAAV,CAAf;;AACA,UAAMI,MAAM,GAAG,KAAKD,IAAL,CAAUF,IAAV,CAAf;;AACA,WAAO,KAAK9B,WAAL,CAAiB+B,MAAjB,EAAyBE,MAAzB,KAAoC,CAApC,GAAwCJ,IAAxC,GAA+CC,IAAtD;AACD,GAxFkB,CA0FnB;;;AACAE,MAAI,CAACd,GAAD,EAAM;AACR,WAAO,KAAKf,KAAL,CAAWe,GAAX,EAAgBP,KAAvB;AACD;;AAEDe,OAAK,CAACG,IAAD,EAAOC,IAAP,EAAa;AAChB,UAAMI,IAAI,GAAG,KAAK/B,KAAL,CAAW0B,IAAX,CAAb;AACA,UAAMM,IAAI,GAAG,KAAKhC,KAAL,CAAW2B,IAAX,CAAb;;AAEA,SAAK5B,QAAL,CAAcY,GAAd,CAAkBoB,IAAI,CAACxB,EAAvB,EAA2BoB,IAA3B;;AACA,SAAK5B,QAAL,CAAcY,GAAd,CAAkBqB,IAAI,CAACzB,EAAvB,EAA2BmB,IAA3B;;AAEA,SAAK1B,KAAL,CAAW0B,IAAX,IAAmBM,IAAnB;AACA,SAAKhC,KAAL,CAAW2B,IAAX,IAAmBI,IAAnB;AACD;;AAEDE,KAAG,CAAC1B,EAAD,EAAK;AACN,WAAO,KAAK2B,GAAL,CAAS3B,EAAT,IACL,KAAKsB,IAAL,CAAU,KAAK9B,QAAL,CAAckC,GAAd,CAAkB1B,EAAlB,CAAV,CADK,GAEL,IAFF;AAGD;;AAEDI,KAAG,CAACJ,EAAD,EAAKC,KAAL,EAAY;AACb,QAAI,KAAK0B,GAAL,CAAS3B,EAAT,CAAJ,EAAkB;AAChB,UAAI,KAAK0B,GAAL,CAAS1B,EAAT,MAAiBC,KAArB,EAA4B;AAC1B;AACD;;AAED,YAAMO,GAAG,GAAG,KAAKhB,QAAL,CAAckC,GAAd,CAAkB1B,EAAlB,CAAZ;;AACA,WAAKP,KAAL,CAAWe,GAAX,EAAgBP,KAAhB,GAAwBA,KAAxB,CANgB,CAQhB;AACA;;AACA,WAAKgB,OAAL,CAAaT,GAAb,EAVgB,CAWhB;;;AACA,WAAKD,SAAL,CAAeC,GAAf;AACD,KAbD,MAaO;AACL,WAAKhB,QAAL,CAAcY,GAAd,CAAkBJ,EAAlB,EAAsB,KAAKP,KAAL,CAAWY,MAAjC;;AACA,WAAKZ,KAAL,CAAWmC,IAAX,CAAgB;AAAE5B,UAAF;AAAMC;AAAN,OAAhB;;AACA,WAAKgB,OAAL,CAAa,KAAKxB,KAAL,CAAWY,MAAX,GAAoB,CAAjC;AACD;AACF;;AAEDwB,QAAM,CAAC7B,EAAD,EAAK;AACT,QAAI,KAAK2B,GAAL,CAAS3B,EAAT,CAAJ,EAAkB;AAChB,YAAM8B,IAAI,GAAG,KAAKrC,KAAL,CAAWY,MAAX,GAAoB,CAAjC;;AACA,YAAMG,GAAG,GAAG,KAAKhB,QAAL,CAAckC,GAAd,CAAkB1B,EAAlB,CAAZ;;AAEA,UAAIQ,GAAG,KAAKsB,IAAZ,EAAkB;AAChB,aAAKd,KAAL,CAAWR,GAAX,EAAgBsB,IAAhB;;AACA,aAAKrC,KAAL,CAAWsC,GAAX;;AACA,aAAKvC,QAAL,CAAcqC,MAAd,CAAqB7B,EAArB,EAHgB,CAKhB;;;AACA,aAAKiB,OAAL,CAAaT,GAAb;;AACA,aAAKD,SAAL,CAAeC,GAAf;AACD,OARD,MAQO;AACL,aAAKf,KAAL,CAAWsC,GAAX;;AACA,aAAKvC,QAAL,CAAcqC,MAAd,CAAqB7B,EAArB;AACD;AACF;AACF;;AAED2B,KAAG,CAAC3B,EAAD,EAAK;AACN,WAAO,KAAKR,QAAL,CAAcmC,GAAd,CAAkB3B,EAAlB,CAAP;AACD;;AAEDgC,OAAK,GAAG;AACN,WAAO,CAAC,KAAKtB,IAAL,EAAR;AACD;;AAEDuB,OAAK,GAAG;AACN,SAAKxC,KAAL,GAAa,EAAb;;AACA,SAAKD,QAAL,CAAcyC,KAAd;AACD,GApKkB,CAsKnB;;;AACA/B,SAAO,CAACgC,QAAD,EAAW;AAChB,SAAKzC,KAAL,CAAWS,OAAX,CAAmBiC,GAAG,IAAID,QAAQ,CAACC,GAAG,CAAClC,KAAL,EAAYkC,GAAG,CAACnC,EAAhB,CAAlC;AACD;;AAEDU,MAAI,GAAG;AACL,WAAO,KAAKjB,KAAL,CAAWY,MAAlB;AACD;;AAED+B,YAAU,CAACpC,EAAD,EAAKqC,GAAL,EAAU;AAClB,QAAI,KAAKV,GAAL,CAAS3B,EAAT,CAAJ,EAAkB;AAChB,aAAO,KAAK0B,GAAL,CAAS1B,EAAT,CAAP;AACD;;AAED,SAAKI,GAAL,CAASJ,EAAT,EAAaqC,GAAb;AACA,WAAOA,GAAP;AACD;;AAEDC,OAAK,GAAG;AACN,UAAMA,KAAK,GAAG,IAAIxD,OAAJ,CAAY,KAAKQ,WAAjB,EAA8B,KAAKG,KAAnC,CAAd;AACA,WAAO6C,KAAP;AACD;;AAEDC,cAAY,GAAG;AACb,WAAO,KAAK7B,IAAL,KAAc,KAAKjB,KAAL,CAAW,CAAX,EAAcO,EAA5B,GAAiC,IAAxC;AACD;;AAEDwC,YAAU,GAAG;AACX,SAAK,IAAIrC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKV,KAAL,CAAWY,MAA/B,EAAuCF,CAAC,EAAxC,EAA4C;AAC1C,UAAI,KAAKY,SAAL,CAAeT,SAAS,CAACH,CAAD,CAAxB,EAA6BA,CAA7B,MAAoCG,SAAS,CAACH,CAAD,CAAjD,EAAsD;AAClD,cAAM,IAAId,KAAJ,CAAW,mBAAkB,KAAKI,KAAL,CAAWU,CAAX,EAAcH,EAAG,EAApC,GACA,iCADA,GAEA,KAAKP,KAAL,CAAWa,SAAS,CAACH,CAAD,CAApB,EAAyBH,EAFnC,CAAN;AAGH;AACF;AACF;;AAzMkB;;AA4MrB,MAAMS,YAAY,GAAGN,CAAC,IAAIA,CAAC,GAAG,CAAJ,GAAQ,CAAlC;;AACA,MAAMU,aAAa,GAAGV,CAAC,IAAIA,CAAC,GAAG,CAAJ,GAAQ,CAAnC;;AACA,MAAMG,SAAS,GAAGH,CAAC,IAAKA,CAAC,GAAG,CAAL,IAAW,CAAlC,C;;;;;;;;;;;ACxNAvB,MAAM,CAACK,MAAP,CAAc;AAACF,SAAO,EAAC,MAAIA;AAAb,CAAd;AAAqC,IAAID,OAAJ;AAAYF,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACC,SAAO,CAAC2D,CAAD,EAAG;AAAC3D,WAAO,GAAC2D,CAAR;AAAU;;AAAtB,CAA5B,EAAoD,CAApD;;AAE1C,MAAM1D,OAAN,SAAsBD,OAAtB,CAA8B;AACnCI,aAAW,CAACC,UAAD,EAAaC,OAAb,EAAsB;AAC/B,UAAM,CAACsD,CAAD,EAAIC,CAAJ,KAAU,CAACxD,UAAU,CAACuD,CAAD,EAAIC,CAAJ,CAA3B,EAAmCvD,OAAnC;AACD;;AAEDmD,cAAY,GAAG;AACb,UAAM,IAAIlD,KAAJ,CAAU,qCAAV,CAAN;AACD;;AAEDuD,cAAY,GAAG;AACb,WAAO,MAAML,YAAN,EAAP;AACD;;AAXkC;;AAYpC,C;;;;;;;;;;;ACdD3D,MAAM,CAACK,MAAP,CAAc;AAACD,YAAU,EAAC,MAAIA;AAAhB,CAAd;AAA2C,IAAIF,OAAJ;AAAYF,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACC,SAAO,CAAC2D,CAAD,EAAG;AAAC3D,WAAO,GAAC2D,CAAR;AAAU;;AAAtB,CAA5B,EAAoD,CAApD;AAAuD,IAAI1D,OAAJ;AAAYH,MAAM,CAACC,IAAP,CAAY,eAAZ,EAA4B;AAACE,SAAO,CAAC0D,CAAD,EAAG;AAAC1D,WAAO,GAAC0D,CAAR;AAAU;;AAAtB,CAA5B,EAAoD,CAApD;;AAenH,MAAMzD,UAAN,SAAyBF,OAAzB,CAAiC;AACtCI,aAAW,CAACC,UAAD,EAAaC,OAAb,EAAsB;AAC/B,UAAMD,UAAN,EAAkBC,OAAlB;AACA,SAAKyD,QAAL,GAAgB,IAAI9D,OAAJ,CAAYI,UAAZ,EAAwBC,OAAxB,CAAhB;AACD;;AAEDgB,KAAG,CAAC,GAAG0C,IAAJ,EAAU;AACX,UAAM1C,GAAN,CAAU,GAAG0C,IAAb;;AACA,SAAKD,QAAL,CAAczC,GAAd,CAAkB,GAAG0C,IAArB;AACD;;AAEDjB,QAAM,CAAC,GAAGiB,IAAJ,EAAU;AACd,UAAMjB,MAAN,CAAa,GAAGiB,IAAhB;;AACA,SAAKD,QAAL,CAAchB,MAAd,CAAqB,GAAGiB,IAAxB;AACD;;AAEDb,OAAK,CAAC,GAAGa,IAAJ,EAAU;AACb,UAAMb,KAAN,CAAY,GAAGa,IAAf;;AACA,SAAKD,QAAL,CAAcZ,KAAd,CAAoB,GAAGa,IAAvB;AACD;;AAEDV,YAAU,CAAC,GAAGU,IAAJ,EAAU;AAClB,UAAMV,UAAN,CAAiB,GAAGU,IAApB;AACA,WAAO,KAAKD,QAAL,CAAcT,UAAd,CAAyB,GAAGU,IAA5B,CAAP;AACD;;AAEDR,OAAK,GAAG;AACN,UAAMA,KAAK,GAAG,IAAItD,UAAJ,CAAe,KAAKM,WAApB,EAAiC,KAAKG,KAAtC,CAAd;AACA,WAAO6C,KAAP;AACD;;AAEDM,cAAY,GAAG;AACb,WAAO,KAAKC,QAAL,CAAcD,YAAd,EAAP;AACD;;AAjCqC;;AAmCvC,C","file":"/packages/binary-heap.js","sourcesContent":["export { MaxHeap } from './max-heap.js';\nexport { MinHeap } from './min-heap.js';\nexport { MinMaxHeap } from './min-max-heap.js';\n","// Constructor of Heap\n// - comparator - Function - given two items returns a number\n// - options:\n// - initData - Array - Optional - the initial data in a format:\n// Object:\n// - id - String - unique id of the item\n// - value - Any - the data value\n// each value is retained\n// - IdMap - Constructor - Optional - custom IdMap class to store id->index\n// mappings internally. Standard IdMap is used by default.\nexport class MaxHeap { \n constructor(comparator, options = {}) {\n if (typeof comparator !== 'function') {\n throw new Error('Passed comparator is invalid, should be a comparison function');\n }\n\n // a C-style comparator that is given two values and returns a number,\n // negative if the first value is less than the second, positive if the second\n // value is greater than the first and zero if they are equal.\n this._comparator = comparator;\n\n if (! options.IdMap) {\n options.IdMap = IdMap;\n }\n\n // _heapIdx maps an id to an index in the Heap array the corresponding value\n // is located on.\n this._heapIdx = new options.IdMap;\n\n // The Heap data-structure implemented as a 0-based contiguous array where\n // every item on index idx is a node in a complete binary tree. Every node can\n // have children on indexes idx*2+1 and idx*2+2, except for the leaves. Every\n // node has a parent on index (idx-1)/2;\n this._heap = [];\n\n // If the initial array is passed, we can build the heap in linear time\n // complexity (O(N)) compared to linearithmic time complexity (O(nlogn)) if\n // we push elements one by one.\n if (Array.isArray(options.initData)) {\n this._initFromData(options.initData);\n }\n }\n\n // Builds a new heap in-place in linear time based on passed data\n _initFromData(data) {\n this._heap = data.map(({ id, value }) => ({ id, value }));\n\n data.forEach(({ id }, i) => this._heapIdx.set(id, i));\n\n if (! data.length) {\n return;\n }\n\n // start from the first non-leaf - the parent of the last leaf\n for (let i = parentIdx(data.length - 1); i >= 0; i--) {\n this._downHeap(i);\n }\n }\n\n _downHeap(idx) {\n while (leftChildIdx(idx) < this.size()) {\n const left = leftChildIdx(idx);\n const right = rightChildIdx(idx);\n let largest = idx;\n\n if (left < this.size()) {\n largest = this._maxIndex(largest, left);\n }\n\n if (right < this.size()) {\n largest = this._maxIndex(largest, right);\n }\n\n if (largest === idx) {\n break;\n }\n\n this._swap(largest, idx);\n idx = largest;\n }\n }\n\n _upHeap(idx) {\n while (idx > 0) {\n const parent = parentIdx(idx);\n if (this._maxIndex(parent, idx) === idx) {\n this._swap(parent, idx)\n idx = parent;\n } else {\n break;\n }\n }\n }\n\n _maxIndex(idxA, idxB) {\n const valueA = this._get(idxA);\n const valueB = this._get(idxB);\n return this._comparator(valueA, valueB) >= 0 ? idxA : idxB;\n }\n\n // Internal: gets raw data object placed on idxth place in heap\n _get(idx) {\n return this._heap[idx].value;\n }\n\n _swap(idxA, idxB) {\n const recA = this._heap[idxA];\n const recB = this._heap[idxB];\n\n this._heapIdx.set(recA.id, idxB);\n this._heapIdx.set(recB.id, idxA);\n\n this._heap[idxA] = recB;\n this._heap[idxB] = recA;\n }\n\n get(id) {\n return this.has(id) ?\n this._get(this._heapIdx.get(id)) :\n null;\n }\n\n set(id, value) {\n if (this.has(id)) {\n if (this.get(id) === value) {\n return;\n }\n\n const idx = this._heapIdx.get(id);\n this._heap[idx].value = value;\n\n // Fix the new value's position\n // Either bubble new value up if it is greater than its parent\n this._upHeap(idx);\n // or bubble it down if it is smaller than one of its children\n this._downHeap(idx);\n } else {\n this._heapIdx.set(id, this._heap.length);\n this._heap.push({ id, value });\n this._upHeap(this._heap.length - 1);\n }\n }\n\n remove(id) {\n if (this.has(id)) {\n const last = this._heap.length - 1;\n const idx = this._heapIdx.get(id);\n\n if (idx !== last) {\n this._swap(idx, last);\n this._heap.pop();\n this._heapIdx.remove(id);\n\n // Fix the swapped value's position\n this._upHeap(idx);\n this._downHeap(idx);\n } else {\n this._heap.pop();\n this._heapIdx.remove(id);\n }\n }\n }\n\n has(id) {\n return this._heapIdx.has(id);\n }\n\n empty() {\n return !this.size();\n }\n\n clear() {\n this._heap = [];\n this._heapIdx.clear();\n }\n\n // iterate over values in no particular order\n forEach(iterator) {\n this._heap.forEach(obj => iterator(obj.value, obj.id));\n }\n\n size() {\n return this._heap.length;\n }\n\n setDefault(id, def) {\n if (this.has(id)) {\n return this.get(id);\n }\n\n this.set(id, def);\n return def;\n }\n\n clone() {\n const clone = new MaxHeap(this._comparator, this._heap);\n return clone;\n }\n\n maxElementId() {\n return this.size() ? this._heap[0].id : null;\n }\n\n _selfCheck() {\n for (let i = 1; i < this._heap.length; i++) {\n if (this._maxIndex(parentIdx(i), i) !== parentIdx(i)) {\n throw new Error(`An item with id ${this._heap[i].id}` +\n \" has a parent younger than it: \" +\n this._heap[parentIdx(i)].id);\n }\n }\n }\n}\n\nconst leftChildIdx = i => i * 2 + 1;\nconst rightChildIdx = i => i * 2 + 2;\nconst parentIdx = i => (i - 1) >> 1;\n","import { MaxHeap } from './max-heap.js';\n\nexport class MinHeap extends MaxHeap {\n constructor(comparator, options) {\n super((a, b) => -comparator(a, b), options);\n }\n\n maxElementId() {\n throw new Error(\"Cannot call maxElementId on MinHeap\");\n }\n\n minElementId() {\n return super.maxElementId();\n }\n};\n","import { MaxHeap } from './max-heap.js';\nimport { MinHeap } from './min-heap.js';\n\n// This implementation of Min/Max-Heap is just a subclass of Max-Heap\n// with a Min-Heap as an encapsulated property.\n//\n// Most of the operations are just proxy methods to call the same method on both\n// heaps.\n//\n// This implementation takes 2*N memory but is fairly simple to write and\n// understand. And the constant factor of a simple Heap is usually smaller\n// compared to other two-way priority queues like Min/Max Heaps\n// (http://www.cs.otago.ac.nz/staffpriv/mike/Papers/MinMaxHeaps/MinMaxHeaps.pdf)\n// and Interval Heaps\n// (http://www.cise.ufl.edu/~sahni/dsaac/enrich/c13/double.htm)\nexport class MinMaxHeap extends MaxHeap {\n constructor(comparator, options) {\n super(comparator, options);\n this._minHeap = new MinHeap(comparator, options);\n }\n\n set(...args) {\n super.set(...args);\n this._minHeap.set(...args);\n }\n\n remove(...args) {\n super.remove(...args);\n this._minHeap.remove(...args);\n }\n\n clear(...args) {\n super.clear(...args);\n this._minHeap.clear(...args);\n }\n\n setDefault(...args) {\n super.setDefault(...args);\n return this._minHeap.setDefault(...args);\n }\n\n clone() {\n const clone = new MinMaxHeap(this._comparator, this._heap);\n return clone;\n }\n\n minElementId() {\n return this._minHeap.minElementId();\n }\n\n};\n"]}
\ No newline at end of file
(function () {
/* Exports */
Package._define("blaze-html-templates");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
var check = Package.check.check;
var Match = Package.check.Match;
var _ = Package.underscore._;
var ObserveSequence = Package['observe-sequence'].ObserveSequence;
var ReactiveVar = Package['reactive-var'].ReactiveVar;
var OrderedDict = Package['ordered-dict'].OrderedDict;
var HTML = Package.htmljs.HTML;
/* Package-scope variables */
var Blaze, UI, Handlebars;
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/preamble.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/**
* @namespace Blaze
* @summary The namespace for all Blaze-related methods and classes.
*/
Blaze = {};
// Utility to HTML-escape a string. Included for legacy reasons.
// TODO: Should be replaced with _.escape once underscore is upgraded to a newer
// version which escapes ` (backtick) as well. Underscore 1.5.2 does not.
Blaze._escape = (function() {
var escape_map = {
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"/": "&#x2F;",
"`": "&#x60;", /* IE allows backtick-delimited attributes?? */
"&": "&amp;"
};
var escape_one = function(c) {
return escape_map[c];
};
return function (x) {
return x.replace(/[&<>"'`]/g, escape_one);
};
})();
Blaze._warn = function (msg) {
msg = 'Warning: ' + msg;
if ((typeof console !== 'undefined') && console.warn) {
console.warn(msg);
}
};
var nativeBind = Function.prototype.bind;
// An implementation of _.bind which allows better optimization.
// See: https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments
if (nativeBind) {
Blaze._bind = function (func, obj) {
if (arguments.length === 2) {
return nativeBind.call(func, obj);
}
// Copy the arguments so this function can be optimized.
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
return nativeBind.apply(func, args.slice(1));
};
}
else {
// A slower but backwards compatible version.
Blaze._bind = _.bind;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/exceptions.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var debugFunc;
// We call into user code in many places, and it's nice to catch exceptions
// propagated from user code immediately so that the whole system doesn't just
// break. Catching exceptions is easy; reporting them is hard. This helper
// reports exceptions.
//
// Usage:
//
// ```
// try {
// // ... someStuff ...
// } catch (e) {
// reportUIException(e);
// }
// ```
//
// An optional second argument overrides the default message.
// Set this to `true` to cause `reportException` to throw
// the next exception rather than reporting it. This is
// useful in unit tests that test error messages.
Blaze._throwNextException = false;
Blaze._reportException = function (e, msg) {
if (Blaze._throwNextException) {
Blaze._throwNextException = false;
throw e;
}
if (! debugFunc)
// adapted from Tracker
debugFunc = function () {
return (typeof Meteor !== "undefined" ? Meteor._debug :
((typeof console !== "undefined") && console.log ? console.log :
function () {}));
};
// In Chrome, `e.stack` is a multiline string that starts with the message
// and contains a stack trace. Furthermore, `console.log` makes it clickable.
// `console.log` supplies the space between the two arguments.
debugFunc()(msg || 'Exception caught in template:', e.stack || e.message || e);
};
Blaze._wrapCatchingExceptions = function (f, where) {
if (typeof f !== 'function')
return f;
return function () {
try {
return f.apply(this, arguments);
} catch (e) {
Blaze._reportException(e, 'Exception in ' + where + ':');
}
};
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/view.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/// [new] Blaze.View([name], renderMethod)
///
/// Blaze.View is the building block of reactive DOM. Views have
/// the following features:
///
/// * lifecycle callbacks - Views are created, rendered, and destroyed,
/// and callbacks can be registered to fire when these things happen.
///
/// * parent pointer - A View points to its parentView, which is the
/// View that caused it to be rendered. These pointers form a
/// hierarchy or tree of Views.
///
/// * render() method - A View's render() method specifies the DOM
/// (or HTML) content of the View. If the method establishes
/// reactive dependencies, it may be re-run.
///
/// * a DOMRange - If a View is rendered to DOM, its position and
/// extent in the DOM are tracked using a DOMRange object.
///
/// When a View is constructed by calling Blaze.View, the View is
/// not yet considered "created." It doesn't have a parentView yet,
/// and no logic has been run to initialize the View. All real
/// work is deferred until at least creation time, when the onViewCreated
/// callbacks are fired, which happens when the View is "used" in
/// some way that requires it to be rendered.
///
/// ...more lifecycle stuff
///
/// `name` is an optional string tag identifying the View. The only
/// time it's used is when looking in the View tree for a View of a
/// particular name; for example, data contexts are stored on Views
/// of name "with". Names are also useful when debugging, so in
/// general it's good for functions that create Views to set the name.
/// Views associated with templates have names of the form "Template.foo".
/**
* @class
* @summary Constructor for a View, which represents a reactive region of DOM.
* @locus Client
* @param {String} [name] Optional. A name for this type of View. See [`view.name`](#view_name).
* @param {Function} renderFunction A function that returns [*renderable content*](#Renderable-Content). In this function, `this` is bound to the View.
*/
Blaze.View = function (name, render) {
if (! (this instanceof Blaze.View))
// called without `new`
return new Blaze.View(name, render);
if (typeof name === 'function') {
// omitted "name" argument
render = name;
name = '';
}
this.name = name;
this._render = render;
this._callbacks = {
created: null,
rendered: null,
destroyed: null
};
// Setting all properties here is good for readability,
// and also may help Chrome optimize the code by keeping
// the View object from changing shape too much.
this.isCreated = false;
this._isCreatedForExpansion = false;
this.isRendered = false;
this._isAttached = false;
this.isDestroyed = false;
this._isInRender = false;
this.parentView = null;
this._domrange = null;
// This flag is normally set to false except for the cases when view's parent
// was generated as part of expanding some syntactic sugar expressions or
// methods.
// Ex.: Blaze.renderWithData is an equivalent to creating a view with regular
// Blaze.render and wrapping it into {{#with data}}{{/with}} view. Since the
// users don't know anything about these generated parent views, Blaze needs
// this information to be available on views to make smarter decisions. For
// example: removing the generated parent view with the view on Blaze.remove.
this._hasGeneratedParent = false;
// Bindings accessible to children views (via view.lookup('name')) within the
// closest template view.
this._scopeBindings = {};
this.renderCount = 0;
};
Blaze.View.prototype._render = function () { return null; };
Blaze.View.prototype.onViewCreated = function (cb) {
this._callbacks.created = this._callbacks.created || [];
this._callbacks.created.push(cb);
};
Blaze.View.prototype._onViewRendered = function (cb) {
this._callbacks.rendered = this._callbacks.rendered || [];
this._callbacks.rendered.push(cb);
};
Blaze.View.prototype.onViewReady = function (cb) {
var self = this;
var fire = function () {
Tracker.afterFlush(function () {
if (! self.isDestroyed) {
Blaze._withCurrentView(self, function () {
cb.call(self);
});
}
});
};
self._onViewRendered(function onViewRendered() {
if (self.isDestroyed)
return;
if (! self._domrange.attached)
self._domrange.onAttached(fire);
else
fire();
});
};
Blaze.View.prototype.onViewDestroyed = function (cb) {
this._callbacks.destroyed = this._callbacks.destroyed || [];
this._callbacks.destroyed.push(cb);
};
Blaze.View.prototype.removeViewDestroyedListener = function (cb) {
var destroyed = this._callbacks.destroyed;
if (! destroyed)
return;
var index = _.lastIndexOf(destroyed, cb);
if (index !== -1) {
// XXX You'd think the right thing to do would be splice, but _fireCallbacks
// gets sad if you remove callbacks while iterating over the list. Should
// change this to use callback-hook or EventEmitter or something else that
// properly supports removal.
destroyed[index] = null;
}
};
/// View#autorun(func)
///
/// Sets up a Tracker autorun that is "scoped" to this View in two
/// important ways: 1) Blaze.currentView is automatically set
/// on every re-run, and 2) the autorun is stopped when the
/// View is destroyed. As with Tracker.autorun, the first run of
/// the function is immediate, and a Computation object that can
/// be used to stop the autorun is returned.
///
/// View#autorun is meant to be called from View callbacks like
/// onViewCreated, or from outside the rendering process. It may not
/// be called before the onViewCreated callbacks are fired (too early),
/// or from a render() method (too confusing).
///
/// Typically, autoruns that update the state
/// of the View (as in Blaze.With) should be started from an onViewCreated
/// callback. Autoruns that update the DOM should be started
/// from either onViewCreated (guarded against the absence of
/// view._domrange), or onViewReady.
Blaze.View.prototype.autorun = function (f, _inViewScope, displayName) {
var self = this;
// The restrictions on when View#autorun can be called are in order
// to avoid bad patterns, like creating a Blaze.View and immediately
// calling autorun on it. A freshly created View is not ready to
// have logic run on it; it doesn't have a parentView, for example.
// It's when the View is materialized or expanded that the onViewCreated
// handlers are fired and the View starts up.
//
// Letting the render() method call `this.autorun()` is problematic
// because of re-render. The best we can do is to stop the old
// autorun and start a new one for each render, but that's a pattern
// we try to avoid internally because it leads to helpers being
// called extra times, in the case where the autorun causes the
// view to re-render (and thus the autorun to be torn down and a
// new one established).
//
// We could lift these restrictions in various ways. One interesting
// idea is to allow you to call `view.autorun` after instantiating
// `view`, and automatically wrap it in `view.onViewCreated`, deferring
// the autorun so that it starts at an appropriate time. However,
// then we can't return the Computation object to the caller, because
// it doesn't exist yet.
if (! self.isCreated) {
throw new Error("View#autorun must be called from the created callback at the earliest");
}
if (this._isInRender) {
throw new Error("Can't call View#autorun from inside render(); try calling it from the created or rendered callback");
}
var templateInstanceFunc = Blaze.Template._currentTemplateInstanceFunc;
var func = function viewAutorun(c) {
return Blaze._withCurrentView(_inViewScope || self, function () {
return Blaze.Template._withTemplateInstanceFunc(
templateInstanceFunc, function () {
return f.call(self, c);
});
});
};
// Give the autorun function a better name for debugging and profiling.
// The `displayName` property is not part of the spec but browsers like Chrome
// and Firefox prefer it in debuggers over the name function was declared by.
func.displayName =
(self.name || 'anonymous') + ':' + (displayName || 'anonymous');
var comp = Tracker.autorun(func);
var stopComputation = function () { comp.stop(); };
self.onViewDestroyed(stopComputation);
comp.onStop(function () {
self.removeViewDestroyedListener(stopComputation);
});
return comp;
};
Blaze.View.prototype._errorIfShouldntCallSubscribe = function () {
var self = this;
if (! self.isCreated) {
throw new Error("View#subscribe must be called from the created callback at the earliest");
}
if (self._isInRender) {
throw new Error("Can't call View#subscribe from inside render(); try calling it from the created or rendered callback");
}
if (self.isDestroyed) {
throw new Error("Can't call View#subscribe from inside the destroyed callback, try calling it inside created or rendered.");
}
};
/**
* Just like Blaze.View#autorun, but with Meteor.subscribe instead of
* Tracker.autorun. Stop the subscription when the view is destroyed.
* @return {SubscriptionHandle} A handle to the subscription so that you can
* see if it is ready, or stop it manually
*/
Blaze.View.prototype.subscribe = function (args, options) {
var self = this;
options = options || {};
self._errorIfShouldntCallSubscribe();
var subHandle;
if (options.connection) {
subHandle = options.connection.subscribe.apply(options.connection, args);
} else {
subHandle = Meteor.subscribe.apply(Meteor, args);
}
self.onViewDestroyed(function () {
subHandle.stop();
});
return subHandle;
};
Blaze.View.prototype.firstNode = function () {
if (! this._isAttached)
throw new Error("View must be attached before accessing its DOM");
return this._domrange.firstNode();
};
Blaze.View.prototype.lastNode = function () {
if (! this._isAttached)
throw new Error("View must be attached before accessing its DOM");
return this._domrange.lastNode();
};
Blaze._fireCallbacks = function (view, which) {
Blaze._withCurrentView(view, function () {
Tracker.nonreactive(function fireCallbacks() {
var cbs = view._callbacks[which];
for (var i = 0, N = (cbs && cbs.length); i < N; i++)
cbs[i] && cbs[i].call(view);
});
});
};
Blaze._createView = function (view, parentView, forExpansion) {
if (view.isCreated)
throw new Error("Can't render the same View twice");
view.parentView = (parentView || null);
view.isCreated = true;
if (forExpansion)
view._isCreatedForExpansion = true;
Blaze._fireCallbacks(view, 'created');
};
var doFirstRender = function (view, initialContent) {
var domrange = new Blaze._DOMRange(initialContent);
view._domrange = domrange;
domrange.view = view;
view.isRendered = true;
Blaze._fireCallbacks(view, 'rendered');
var teardownHook = null;
domrange.onAttached(function attached(range, element) {
view._isAttached = true;
teardownHook = Blaze._DOMBackend.Teardown.onElementTeardown(
element, function teardown() {
Blaze._destroyView(view, true /* _skipNodes */);
});
});
// tear down the teardown hook
view.onViewDestroyed(function () {
teardownHook && teardownHook.stop();
teardownHook = null;
});
return domrange;
};
// Take an uncreated View `view` and create and render it to DOM,
// setting up the autorun that updates the View. Returns a new
// DOMRange, which has been associated with the View.
//
// The private arguments `_workStack` and `_intoArray` are passed in
// by Blaze._materializeDOM and are only present for recursive calls
// (when there is some other _materializeView on the stack). If
// provided, then we avoid the mutual recursion of calling back into
// Blaze._materializeDOM so that deep View hierarchies don't blow the
// stack. Instead, we push tasks onto workStack for the initial
// rendering and subsequent setup of the View, and they are done after
// we return. When there is a _workStack, we do not return the new
// DOMRange, but instead push it into _intoArray from a _workStack
// task.
Blaze._materializeView = function (view, parentView, _workStack, _intoArray) {
Blaze._createView(view, parentView);
var domrange;
var lastHtmljs;
// We don't expect to be called in a Computation, but just in case,
// wrap in Tracker.nonreactive.
Tracker.nonreactive(function () {
view.autorun(function doRender(c) {
// `view.autorun` sets the current view.
view.renderCount++;
view._isInRender = true;
// Any dependencies that should invalidate this Computation come
// from this line:
var htmljs = view._render();
view._isInRender = false;
if (! c.firstRun && ! Blaze._isContentEqual(lastHtmljs, htmljs)) {
Tracker.nonreactive(function doMaterialize() {
// re-render
var rangesAndNodes = Blaze._materializeDOM(htmljs, [], view);
domrange.setMembers(rangesAndNodes);
Blaze._fireCallbacks(view, 'rendered');
});
}
lastHtmljs = htmljs;
// Causes any nested views to stop immediately, not when we call
// `setMembers` the next time around the autorun. Otherwise,
// helpers in the DOM tree to be replaced might be scheduled
// to re-run before we have a chance to stop them.
Tracker.onInvalidate(function () {
if (domrange) {
domrange.destroyMembers();
}
});
}, undefined, 'materialize');
// first render. lastHtmljs is the first htmljs.
var initialContents;
if (! _workStack) {
initialContents = Blaze._materializeDOM(lastHtmljs, [], view);
domrange = doFirstRender(view, initialContents);
initialContents = null; // help GC because we close over this scope a lot
} else {
// We're being called from Blaze._materializeDOM, so to avoid
// recursion and save stack space, provide a description of the
// work to be done instead of doing it. Tasks pushed onto
// _workStack will be done in LIFO order after we return.
// The work will still be done within a Tracker.nonreactive,
// because it will be done by some call to Blaze._materializeDOM
// (which is always called in a Tracker.nonreactive).
initialContents = [];
// push this function first so that it happens last
_workStack.push(function () {
domrange = doFirstRender(view, initialContents);
initialContents = null; // help GC because of all the closures here
_intoArray.push(domrange);
});
// now push the task that calculates initialContents
_workStack.push(Blaze._bind(Blaze._materializeDOM, null,
lastHtmljs, initialContents, view, _workStack));
}
});
if (! _workStack) {
return domrange;
} else {
return null;
}
};
// Expands a View to HTMLjs, calling `render` recursively on all
// Views and evaluating any dynamic attributes. Calls the `created`
// callback, but not the `materialized` or `rendered` callbacks.
// Destroys the view immediately, unless called in a Tracker Computation,
// in which case the view will be destroyed when the Computation is
// invalidated. If called in a Tracker Computation, the result is a
// reactive string; that is, the Computation will be invalidated
// if any changes are made to the view or subviews that might affect
// the HTML.
Blaze._expandView = function (view, parentView) {
Blaze._createView(view, parentView, true /*forExpansion*/);
view._isInRender = true;
var htmljs = Blaze._withCurrentView(view, function () {
return view._render();
});
view._isInRender = false;
var result = Blaze._expand(htmljs, view);
if (Tracker.active) {
Tracker.onInvalidate(function () {
Blaze._destroyView(view);
});
} else {
Blaze._destroyView(view);
}
return result;
};
// Options: `parentView`
Blaze._HTMLJSExpander = HTML.TransformingVisitor.extend();
Blaze._HTMLJSExpander.def({
visitObject: function (x) {
if (x instanceof Blaze.Template)
x = x.constructView();
if (x instanceof Blaze.View)
return Blaze._expandView(x, this.parentView);
// this will throw an error; other objects are not allowed!
return HTML.TransformingVisitor.prototype.visitObject.call(this, x);
},
visitAttributes: function (attrs) {
// expand dynamic attributes
if (typeof attrs === 'function')
attrs = Blaze._withCurrentView(this.parentView, attrs);
// call super (e.g. for case where `attrs` is an array)
return HTML.TransformingVisitor.prototype.visitAttributes.call(this, attrs);
},
visitAttribute: function (name, value, tag) {
// expand attribute values that are functions. Any attribute value
// that contains Views must be wrapped in a function.
if (typeof value === 'function')
value = Blaze._withCurrentView(this.parentView, value);
return HTML.TransformingVisitor.prototype.visitAttribute.call(
this, name, value, tag);
}
});
// Return Blaze.currentView, but only if it is being rendered
// (i.e. we are in its render() method).
var currentViewIfRendering = function () {
var view = Blaze.currentView;
return (view && view._isInRender) ? view : null;
};
Blaze._expand = function (htmljs, parentView) {
parentView = parentView || currentViewIfRendering();
return (new Blaze._HTMLJSExpander(
{parentView: parentView})).visit(htmljs);
};
Blaze._expandAttributes = function (attrs, parentView) {
parentView = parentView || currentViewIfRendering();
return (new Blaze._HTMLJSExpander(
{parentView: parentView})).visitAttributes(attrs);
};
Blaze._destroyView = function (view, _skipNodes) {
if (view.isDestroyed)
return;
view.isDestroyed = true;
Blaze._fireCallbacks(view, 'destroyed');
// Destroy views and elements recursively. If _skipNodes,
// only recurse up to views, not elements, for the case where
// the backend (jQuery) is recursing over the elements already.
if (view._domrange)
view._domrange.destroyMembers(_skipNodes);
};
Blaze._destroyNode = function (node) {
if (node.nodeType === 1)
Blaze._DOMBackend.Teardown.tearDownElement(node);
};
// Are the HTMLjs entities `a` and `b` the same? We could be
// more elaborate here but the point is to catch the most basic
// cases.
Blaze._isContentEqual = function (a, b) {
if (a instanceof HTML.Raw) {
return (b instanceof HTML.Raw) && (a.value === b.value);
} else if (a == null) {
return (b == null);
} else {
return (a === b) &&
((typeof a === 'number') || (typeof a === 'boolean') ||
(typeof a === 'string'));
}
};
/**
* @summary The View corresponding to the current template helper, event handler, callback, or autorun. If there isn't one, `null`.
* @locus Client
* @type {Blaze.View}
*/
Blaze.currentView = null;
Blaze._withCurrentView = function (view, func) {
var oldView = Blaze.currentView;
try {
Blaze.currentView = view;
return func();
} finally {
Blaze.currentView = oldView;
}
};
// Blaze.render publicly takes a View or a Template.
// Privately, it takes any HTMLJS (extended with Views and Templates)
// except null or undefined, or a function that returns any extended
// HTMLJS.
var checkRenderContent = function (content) {
if (content === null)
throw new Error("Can't render null");
if (typeof content === 'undefined')
throw new Error("Can't render undefined");
if ((content instanceof Blaze.View) ||
(content instanceof Blaze.Template) ||
(typeof content === 'function'))
return;
try {
// Throw if content doesn't look like HTMLJS at the top level
// (i.e. verify that this is an HTML.Tag, or an array,
// or a primitive, etc.)
(new HTML.Visitor).visit(content);
} catch (e) {
// Make error message suitable for public API
throw new Error("Expected Template or View");
}
};
// For Blaze.render and Blaze.toHTML, take content and
// wrap it in a View, unless it's a single View or
// Template already.
var contentAsView = function (content) {
checkRenderContent(content);
if (content instanceof Blaze.Template) {
return content.constructView();
} else if (content instanceof Blaze.View) {
return content;
} else {
var func = content;
if (typeof func !== 'function') {
func = function () {
return content;
};
}
return Blaze.View('render', func);
}
};
// For Blaze.renderWithData and Blaze.toHTMLWithData, wrap content
// in a function, if necessary, so it can be a content arg to
// a Blaze.With.
var contentAsFunc = function (content) {
checkRenderContent(content);
if (typeof content !== 'function') {
return function () {
return content;
};
} else {
return content;
}
};
/**
* @summary Renders a template or View to DOM nodes and inserts it into the DOM, returning a rendered [View](#Blaze-View) which can be passed to [`Blaze.remove`](#Blaze-remove).
* @locus Client
* @param {Template|Blaze.View} templateOrView The template (e.g. `Template.myTemplate`) or View object to render. If a template, a View object is [constructed](#template_constructview). If a View, it must be an unrendered View, which becomes a rendered View and is returned.
* @param {DOMNode} parentNode The node that will be the parent of the rendered template. It must be an Element node.
* @param {DOMNode} [nextNode] Optional. If provided, must be a child of <em>parentNode</em>; the template will be inserted before this node. If not provided, the template will be inserted as the last child of parentNode.
* @param {Blaze.View} [parentView] Optional. If provided, it will be set as the rendered View's [`parentView`](#view_parentview).
*/
Blaze.render = function (content, parentElement, nextNode, parentView) {
if (! parentElement) {
Blaze._warn("Blaze.render without a parent element is deprecated. " +
"You must specify where to insert the rendered content.");
}
if (nextNode instanceof Blaze.View) {
// handle omitted nextNode
parentView = nextNode;
nextNode = null;
}
// parentElement must be a DOM node. in particular, can't be the
// result of a call to `$`. Can't check if `parentElement instanceof
// Node` since 'Node' is undefined in IE8.
if (parentElement && typeof parentElement.nodeType !== 'number')
throw new Error("'parentElement' must be a DOM node");
if (nextNode && typeof nextNode.nodeType !== 'number') // 'nextNode' is optional
throw new Error("'nextNode' must be a DOM node");
parentView = parentView || currentViewIfRendering();
var view = contentAsView(content);
Blaze._materializeView(view, parentView);
if (parentElement) {
view._domrange.attach(parentElement, nextNode);
}
return view;
};
Blaze.insert = function (view, parentElement, nextNode) {
Blaze._warn("Blaze.insert has been deprecated. Specify where to insert the " +
"rendered content in the call to Blaze.render.");
if (! (view && (view._domrange instanceof Blaze._DOMRange)))
throw new Error("Expected template rendered with Blaze.render");
view._domrange.attach(parentElement, nextNode);
};
/**
* @summary Renders a template or View to DOM nodes with a data context. Otherwise identical to `Blaze.render`.
* @locus Client
* @param {Template|Blaze.View} templateOrView The template (e.g. `Template.myTemplate`) or View object to render.
* @param {Object|Function} data The data context to use, or a function returning a data context. If a function is provided, it will be reactively re-run.
* @param {DOMNode} parentNode The node that will be the parent of the rendered template. It must be an Element node.
* @param {DOMNode} [nextNode] Optional. If provided, must be a child of <em>parentNode</em>; the template will be inserted before this node. If not provided, the template will be inserted as the last child of parentNode.
* @param {Blaze.View} [parentView] Optional. If provided, it will be set as the rendered View's [`parentView`](#view_parentview).
*/
Blaze.renderWithData = function (content, data, parentElement, nextNode, parentView) {
// We defer the handling of optional arguments to Blaze.render. At this point,
// `nextNode` may actually be `parentView`.
return Blaze.render(Blaze._TemplateWith(data, contentAsFunc(content)),
parentElement, nextNode, parentView);
};
/**
* @summary Removes a rendered View from the DOM, stopping all reactive updates and event listeners on it. Also destroys the Blaze.Template instance associated with the view.
* @locus Client
* @param {Blaze.View} renderedView The return value from `Blaze.render` or `Blaze.renderWithData`, or the `view` property of a Blaze.Template instance. Calling `Blaze.remove(Template.instance().view)` from within a template event handler will destroy the view as well as that template and trigger the template's `onDestroyed` handlers.
*/
Blaze.remove = function (view) {
if (! (view && (view._domrange instanceof Blaze._DOMRange)))
throw new Error("Expected template rendered with Blaze.render");
while (view) {
if (! view.isDestroyed) {
var range = view._domrange;
if (range.attached && ! range.parentRange)
range.detach();
range.destroy();
}
view = view._hasGeneratedParent && view.parentView;
}
};
/**
* @summary Renders a template or View to a string of HTML.
* @locus Client
* @param {Template|Blaze.View} templateOrView The template (e.g. `Template.myTemplate`) or View object from which to generate HTML.
*/
Blaze.toHTML = function (content, parentView) {
parentView = parentView || currentViewIfRendering();
return HTML.toHTML(Blaze._expandView(contentAsView(content), parentView));
};
/**
* @summary Renders a template or View to HTML with a data context. Otherwise identical to `Blaze.toHTML`.
* @locus Client
* @param {Template|Blaze.View} templateOrView The template (e.g. `Template.myTemplate`) or View object from which to generate HTML.
* @param {Object|Function} data The data context to use, or a function returning a data context.
*/
Blaze.toHTMLWithData = function (content, data, parentView) {
parentView = parentView || currentViewIfRendering();
return HTML.toHTML(Blaze._expandView(Blaze._TemplateWith(
data, contentAsFunc(content)), parentView));
};
Blaze._toText = function (htmljs, parentView, textMode) {
if (typeof htmljs === 'function')
throw new Error("Blaze._toText doesn't take a function, just HTMLjs");
if ((parentView != null) && ! (parentView instanceof Blaze.View)) {
// omitted parentView argument
textMode = parentView;
parentView = null;
}
parentView = parentView || currentViewIfRendering();
if (! textMode)
throw new Error("textMode required");
if (! (textMode === HTML.TEXTMODE.STRING ||
textMode === HTML.TEXTMODE.RCDATA ||
textMode === HTML.TEXTMODE.ATTRIBUTE))
throw new Error("Unknown textMode: " + textMode);
return HTML.toText(Blaze._expand(htmljs, parentView), textMode);
};
/**
* @summary Returns the current data context, or the data context that was used when rendering a particular DOM element or View from a Meteor template.
* @locus Client
* @param {DOMElement|Blaze.View} [elementOrView] Optional. An element that was rendered by a Meteor, or a View.
*/
Blaze.getData = function (elementOrView) {
var theWith;
if (! elementOrView) {
theWith = Blaze.getView('with');
} else if (elementOrView instanceof Blaze.View) {
var view = elementOrView;
theWith = (view.name === 'with' ? view :
Blaze.getView(view, 'with'));
} else if (typeof elementOrView.nodeType === 'number') {
if (elementOrView.nodeType !== 1)
throw new Error("Expected DOM element");
theWith = Blaze.getView(elementOrView, 'with');
} else {
throw new Error("Expected DOM element or View");
}
return theWith ? theWith.dataVar.get() : null;
};
// For back-compat
Blaze.getElementData = function (element) {
Blaze._warn("Blaze.getElementData has been deprecated. Use " +
"Blaze.getData(element) instead.");
if (element.nodeType !== 1)
throw new Error("Expected DOM element");
return Blaze.getData(element);
};
// Both arguments are optional.
/**
* @summary Gets either the current View, or the View enclosing the given DOM element.
* @locus Client
* @param {DOMElement} [element] Optional. If specified, the View enclosing `element` is returned.
*/
Blaze.getView = function (elementOrView, _viewName) {
var viewName = _viewName;
if ((typeof elementOrView) === 'string') {
// omitted elementOrView; viewName present
viewName = elementOrView;
elementOrView = null;
}
// We could eventually shorten the code by folding the logic
// from the other methods into this method.
if (! elementOrView) {
return Blaze._getCurrentView(viewName);
} else if (elementOrView instanceof Blaze.View) {
return Blaze._getParentView(elementOrView, viewName);
} else if (typeof elementOrView.nodeType === 'number') {
return Blaze._getElementView(elementOrView, viewName);
} else {
throw new Error("Expected DOM element or View");
}
};
// Gets the current view or its nearest ancestor of name
// `name`.
Blaze._getCurrentView = function (name) {
var view = Blaze.currentView;
// Better to fail in cases where it doesn't make sense
// to use Blaze._getCurrentView(). There will be a current
// view anywhere it does. You can check Blaze.currentView
// if you want to know whether there is one or not.
if (! view)
throw new Error("There is no current view");
if (name) {
while (view && view.name !== name)
view = view.parentView;
return view || null;
} else {
// Blaze._getCurrentView() with no arguments just returns
// Blaze.currentView.
return view;
}
};
Blaze._getParentView = function (view, name) {
var v = view.parentView;
if (name) {
while (v && v.name !== name)
v = v.parentView;
}
return v || null;
};
Blaze._getElementView = function (elem, name) {
var range = Blaze._DOMRange.forElement(elem);
var view = null;
while (range && ! view) {
view = (range.view || null);
if (! view) {
if (range.parentRange)
range = range.parentRange;
else
range = Blaze._DOMRange.forElement(range.parentElement);
}
}
if (name) {
while (view && view.name !== name)
view = view.parentView;
return view || null;
} else {
return view;
}
};
Blaze._addEventMap = function (view, eventMap, thisInHandler) {
thisInHandler = (thisInHandler || null);
var handles = [];
if (! view._domrange)
throw new Error("View must have a DOMRange");
view._domrange.onAttached(function attached_eventMaps(range, element) {
_.each(eventMap, function (handler, spec) {
var clauses = spec.split(/,\s+/);
// iterate over clauses of spec, e.g. ['click .foo', 'click .bar']
_.each(clauses, function (clause) {
var parts = clause.split(/\s+/);
if (parts.length === 0)
return;
var newEvents = parts.shift();
var selector = parts.join(' ');
handles.push(Blaze._EventSupport.listen(
element, newEvents, selector,
function (evt) {
if (! range.containsElement(evt.currentTarget))
return null;
var handlerThis = thisInHandler || this;
var handlerArgs = arguments;
return Blaze._withCurrentView(view, function () {
return handler.apply(handlerThis, handlerArgs);
});
},
range, function (r) {
return r.parentRange;
}));
});
});
});
view.onViewDestroyed(function () {
_.each(handles, function (h) {
h.stop();
});
handles.length = 0;
});
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/builtins.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Blaze._calculateCondition = function (cond) {
if (cond instanceof Array && cond.length === 0)
cond = false;
return !! cond;
};
/**
* @summary Constructs a View that renders content with a data context.
* @locus Client
* @param {Object|Function} data An object to use as the data context, or a function returning such an object. If a function is provided, it will be reactively re-run.
* @param {Function} contentFunc A Function that returns [*renderable content*](#Renderable-Content).
*/
Blaze.With = function (data, contentFunc) {
var view = Blaze.View('with', contentFunc);
view.dataVar = new ReactiveVar;
view.onViewCreated(function () {
if (typeof data === 'function') {
// `data` is a reactive function
view.autorun(function () {
view.dataVar.set(data());
}, view.parentView, 'setData');
} else {
view.dataVar.set(data);
}
});
return view;
};
/**
* Attaches bindings to the instantiated view.
* @param {Object} bindings A dictionary of bindings, each binding name
* corresponds to a value or a function that will be reactively re-run.
* @param {View} view The target.
*/
Blaze._attachBindingsToView = function (bindings, view) {
view.onViewCreated(function () {
_.each(bindings, function (binding, name) {
view._scopeBindings[name] = new ReactiveVar;
if (typeof binding === 'function') {
view.autorun(function () {
view._scopeBindings[name].set(binding());
}, view.parentView);
} else {
view._scopeBindings[name].set(binding);
}
});
});
};
/**
* @summary Constructs a View setting the local lexical scope in the block.
* @param {Function} bindings Dictionary mapping names of bindings to
* values or computations to reactively re-run.
* @param {Function} contentFunc A Function that returns [*renderable content*](#Renderable-Content).
*/
Blaze.Let = function (bindings, contentFunc) {
var view = Blaze.View('let', contentFunc);
Blaze._attachBindingsToView(bindings, view);
return view;
};
/**
* @summary Constructs a View that renders content conditionally.
* @locus Client
* @param {Function} conditionFunc A function to reactively re-run. Whether the result is truthy or falsy determines whether `contentFunc` or `elseFunc` is shown. An empty array is considered falsy.
* @param {Function} contentFunc A Function that returns [*renderable content*](#Renderable-Content).
* @param {Function} [elseFunc] Optional. A Function that returns [*renderable content*](#Renderable-Content). If no `elseFunc` is supplied, no content is shown in the "else" case.
*/
Blaze.If = function (conditionFunc, contentFunc, elseFunc, _not) {
var conditionVar = new ReactiveVar;
var view = Blaze.View(_not ? 'unless' : 'if', function () {
return conditionVar.get() ? contentFunc() :
(elseFunc ? elseFunc() : null);
});
view.__conditionVar = conditionVar;
view.onViewCreated(function () {
this.autorun(function () {
var cond = Blaze._calculateCondition(conditionFunc());
conditionVar.set(_not ? (! cond) : cond);
}, this.parentView, 'condition');
});
return view;
};
/**
* @summary An inverted [`Blaze.If`](#Blaze-If).
* @locus Client
* @param {Function} conditionFunc A function to reactively re-run. If the result is falsy, `contentFunc` is shown, otherwise `elseFunc` is shown. An empty array is considered falsy.
* @param {Function} contentFunc A Function that returns [*renderable content*](#Renderable-Content).
* @param {Function} [elseFunc] Optional. A Function that returns [*renderable content*](#Renderable-Content). If no `elseFunc` is supplied, no content is shown in the "else" case.
*/
Blaze.Unless = function (conditionFunc, contentFunc, elseFunc) {
return Blaze.If(conditionFunc, contentFunc, elseFunc, true /*_not*/);
};
/**
* @summary Constructs a View that renders `contentFunc` for each item in a sequence.
* @locus Client
* @param {Function} argFunc A function to reactively re-run. The function can
* return one of two options:
*
* 1. An object with two fields: '_variable' and '_sequence'. Each iterates over
* '_sequence', it may be a Cursor, an array, null, or undefined. Inside the
* Each body you will be able to get the current item from the sequence using
* the name specified in the '_variable' field.
*
* 2. Just a sequence (Cursor, array, null, or undefined) not wrapped into an
* object. Inside the Each body, the current item will be set as the data
* context.
* @param {Function} contentFunc A Function that returns [*renderable
* content*](#Renderable-Content).
* @param {Function} [elseFunc] A Function that returns [*renderable
* content*](#Renderable-Content) to display in the case when there are no items
* in the sequence.
*/
Blaze.Each = function (argFunc, contentFunc, elseFunc) {
var eachView = Blaze.View('each', function () {
var subviews = this.initialSubviews;
this.initialSubviews = null;
if (this._isCreatedForExpansion) {
this.expandedValueDep = new Tracker.Dependency;
this.expandedValueDep.depend();
}
return subviews;
});
eachView.initialSubviews = [];
eachView.numItems = 0;
eachView.inElseMode = false;
eachView.stopHandle = null;
eachView.contentFunc = contentFunc;
eachView.elseFunc = elseFunc;
eachView.argVar = new ReactiveVar;
eachView.variableName = null;
// update the @index value in the scope of all subviews in the range
var updateIndices = function (from, to) {
if (to === undefined) {
to = eachView.numItems - 1;
}
for (var i = from; i <= to; i++) {
var view = eachView._domrange.members[i].view;
view._scopeBindings['@index'].set(i);
}
};
eachView.onViewCreated(function () {
// We evaluate argFunc in an autorun to make sure
// Blaze.currentView is always set when it runs (rather than
// passing argFunc straight to ObserveSequence).
eachView.autorun(function () {
// argFunc can return either a sequence as is or a wrapper object with a
// _sequence and _variable fields set.
var arg = argFunc();
if (_.isObject(arg) && _.has(arg, '_sequence')) {
eachView.variableName = arg._variable || null;
arg = arg._sequence;
}
eachView.argVar.set(arg);
}, eachView.parentView, 'collection');
eachView.stopHandle = ObserveSequence.observe(function () {
return eachView.argVar.get();
}, {
addedAt: function (id, item, index) {
Tracker.nonreactive(function () {
var newItemView;
if (eachView.variableName) {
// new-style #each (as in {{#each item in items}})
// doesn't create a new data context
newItemView = Blaze.View('item', eachView.contentFunc);
} else {
newItemView = Blaze.With(item, eachView.contentFunc);
}
eachView.numItems++;
var bindings = {};
bindings['@index'] = index;
if (eachView.variableName) {
bindings[eachView.variableName] = item;
}
Blaze._attachBindingsToView(bindings, newItemView);
if (eachView.expandedValueDep) {
eachView.expandedValueDep.changed();
} else if (eachView._domrange) {
if (eachView.inElseMode) {
eachView._domrange.removeMember(0);
eachView.inElseMode = false;
}
var range = Blaze._materializeView(newItemView, eachView);
eachView._domrange.addMember(range, index);
updateIndices(index);
} else {
eachView.initialSubviews.splice(index, 0, newItemView);
}
});
},
removedAt: function (id, item, index) {
Tracker.nonreactive(function () {
eachView.numItems--;
if (eachView.expandedValueDep) {
eachView.expandedValueDep.changed();
} else if (eachView._domrange) {
eachView._domrange.removeMember(index);
updateIndices(index);
if (eachView.elseFunc && eachView.numItems === 0) {
eachView.inElseMode = true;
eachView._domrange.addMember(
Blaze._materializeView(
Blaze.View('each_else',eachView.elseFunc),
eachView), 0);
}
} else {
eachView.initialSubviews.splice(index, 1);
}
});
},
changedAt: function (id, newItem, oldItem, index) {
Tracker.nonreactive(function () {
if (eachView.expandedValueDep) {
eachView.expandedValueDep.changed();
} else {
var itemView;
if (eachView._domrange) {
itemView = eachView._domrange.getMember(index).view;
} else {
itemView = eachView.initialSubviews[index];
}
if (eachView.variableName) {
itemView._scopeBindings[eachView.variableName].set(newItem);
} else {
itemView.dataVar.set(newItem);
}
}
});
},
movedTo: function (id, item, fromIndex, toIndex) {
Tracker.nonreactive(function () {
if (eachView.expandedValueDep) {
eachView.expandedValueDep.changed();
} else if (eachView._domrange) {
eachView._domrange.moveMember(fromIndex, toIndex);
updateIndices(
Math.min(fromIndex, toIndex), Math.max(fromIndex, toIndex));
} else {
var subviews = eachView.initialSubviews;
var itemView = subviews[fromIndex];
subviews.splice(fromIndex, 1);
subviews.splice(toIndex, 0, itemView);
}
});
}
});
if (eachView.elseFunc && eachView.numItems === 0) {
eachView.inElseMode = true;
eachView.initialSubviews[0] =
Blaze.View('each_else', eachView.elseFunc);
}
});
eachView.onViewDestroyed(function () {
if (eachView.stopHandle)
eachView.stopHandle.stop();
});
return eachView;
};
Blaze._TemplateWith = function (arg, contentFunc) {
var w;
var argFunc = arg;
if (typeof arg !== 'function') {
argFunc = function () {
return arg;
};
}
// This is a little messy. When we compile `{{> Template.contentBlock}}`, we
// wrap it in Blaze._InOuterTemplateScope in order to skip the intermediate
// parent Views in the current template. However, when there's an argument
// (`{{> Template.contentBlock arg}}`), the argument needs to be evaluated
// in the original scope. There's no good order to nest
// Blaze._InOuterTemplateScope and Spacebars.TemplateWith to achieve this,
// so we wrap argFunc to run it in the "original parentView" of the
// Blaze._InOuterTemplateScope.
//
// To make this better, reconsider _InOuterTemplateScope as a primitive.
// Longer term, evaluate expressions in the proper lexical scope.
var wrappedArgFunc = function () {
var viewToEvaluateArg = null;
if (w.parentView && w.parentView.name === 'InOuterTemplateScope') {
viewToEvaluateArg = w.parentView.originalParentView;
}
if (viewToEvaluateArg) {
return Blaze._withCurrentView(viewToEvaluateArg, argFunc);
} else {
return argFunc();
}
};
var wrappedContentFunc = function () {
var content = contentFunc.call(this);
// Since we are generating the Blaze._TemplateWith view for the
// user, set the flag on the child view. If `content` is a template,
// construct the View so that we can set the flag.
if (content instanceof Blaze.Template) {
content = content.constructView();
}
if (content instanceof Blaze.View) {
content._hasGeneratedParent = true;
}
return content;
};
w = Blaze.With(wrappedArgFunc, wrappedContentFunc);
w.__isTemplateWith = true;
return w;
};
Blaze._InOuterTemplateScope = function (templateView, contentFunc) {
var view = Blaze.View('InOuterTemplateScope', contentFunc);
var parentView = templateView.parentView;
// Hack so that if you call `{{> foo bar}}` and it expands into
// `{{#with bar}}{{> foo}}{{/with}}`, and then `foo` is a template
// that inserts `{{> Template.contentBlock}}`, the data context for
// `Template.contentBlock` is not `bar` but the one enclosing that.
if (parentView.__isTemplateWith)
parentView = parentView.parentView;
view.onViewCreated(function () {
this.originalParentView = this.parentView;
this.parentView = parentView;
this.__childDoesntStartNewLexicalScope = true;
});
return view;
};
// XXX COMPAT WITH 0.9.0
Blaze.InOuterTemplateScope = Blaze._InOuterTemplateScope;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/lookup.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Blaze._globalHelpers = {};
// Documented as Template.registerHelper.
// This definition also provides back-compat for `UI.registerHelper`.
Blaze.registerHelper = function (name, func) {
Blaze._globalHelpers[name] = func;
};
// Also documented as Template.deregisterHelper
Blaze.deregisterHelper = function(name) {
delete Blaze._globalHelpers[name];
};
var bindIfIsFunction = function (x, target) {
if (typeof x !== 'function')
return x;
return Blaze._bind(x, target);
};
// If `x` is a function, binds the value of `this` for that function
// to the current data context.
var bindDataContext = function (x) {
if (typeof x === 'function') {
return function () {
var data = Blaze.getData();
if (data == null)
data = {};
return x.apply(data, arguments);
};
}
return x;
};
Blaze._OLDSTYLE_HELPER = {};
Blaze._getTemplateHelper = function (template, name, tmplInstanceFunc) {
// XXX COMPAT WITH 0.9.3
var isKnownOldStyleHelper = false;
if (template.__helpers.has(name)) {
var helper = template.__helpers.get(name);
if (helper === Blaze._OLDSTYLE_HELPER) {
isKnownOldStyleHelper = true;
} else if (helper != null) {
return wrapHelper(bindDataContext(helper), tmplInstanceFunc);
} else {
return null;
}
}
// old-style helper
if (name in template) {
// Only warn once per helper
if (! isKnownOldStyleHelper) {
template.__helpers.set(name, Blaze._OLDSTYLE_HELPER);
if (! template._NOWARN_OLDSTYLE_HELPERS) {
Blaze._warn('Assigning helper with `' + template.viewName + '.' +
name + ' = ...` is deprecated. Use `' + template.viewName +
'.helpers(...)` instead.');
}
}
if (template[name] != null) {
return wrapHelper(bindDataContext(template[name]), tmplInstanceFunc);
}
}
return null;
};
var wrapHelper = function (f, templateFunc) {
if (typeof f !== "function") {
return f;
}
return function () {
var self = this;
var args = arguments;
return Blaze.Template._withTemplateInstanceFunc(templateFunc, function () {
return Blaze._wrapCatchingExceptions(f, 'template helper').apply(self, args);
});
};
};
Blaze._lexicalBindingLookup = function (view, name) {
var currentView = view;
var blockHelpersStack = [];
// walk up the views stopping at a Spacebars.include or Template view that
// doesn't have an InOuterTemplateScope view as a parent
do {
// skip block helpers views
// if we found the binding on the scope, return it
if (_.has(currentView._scopeBindings, name)) {
var bindingReactiveVar = currentView._scopeBindings[name];
return function () {
return bindingReactiveVar.get();
};
}
} while (! (currentView.__startsNewLexicalScope &&
! (currentView.parentView &&
currentView.parentView.__childDoesntStartNewLexicalScope))
&& (currentView = currentView.parentView));
return null;
};
// templateInstance argument is provided to be available for possible
// alternative implementations of this function by 3rd party packages.
Blaze._getTemplate = function (name, templateInstance) {
if ((name in Blaze.Template) && (Blaze.Template[name] instanceof Blaze.Template)) {
return Blaze.Template[name];
}
return null;
};
Blaze._getGlobalHelper = function (name, templateInstance) {
if (Blaze._globalHelpers[name] != null) {
return wrapHelper(bindDataContext(Blaze._globalHelpers[name]), templateInstance);
}
return null;
};
// Looks up a name, like "foo" or "..", as a helper of the
// current template; the name of a template; a global helper;
// or a property of the data context. Called on the View of
// a template (i.e. a View with a `.template` property,
// where the helpers are). Used for the first name in a
// "path" in a template tag, like "foo" in `{{foo.bar}}` or
// ".." in `{{frobulate ../blah}}`.
//
// Returns a function, a non-function value, or null. If
// a function is found, it is bound appropriately.
//
// NOTE: This function must not establish any reactive
// dependencies itself. If there is any reactivity in the
// value, lookup should return a function.
Blaze.View.prototype.lookup = function (name, _options) {
var template = this.template;
var lookupTemplate = _options && _options.template;
var helper;
var binding;
var boundTmplInstance;
var foundTemplate;
if (this.templateInstance) {
boundTmplInstance = Blaze._bind(this.templateInstance, this);
}
// 0. looking up the parent data context with the special "../" syntax
if (/^\./.test(name)) {
// starts with a dot. must be a series of dots which maps to an
// ancestor of the appropriate height.
if (!/^(\.)+$/.test(name))
throw new Error("id starting with dot must be a series of dots");
return Blaze._parentData(name.length - 1, true /*_functionWrapped*/);
}
// 1. look up a helper on the current template
if (template && ((helper = Blaze._getTemplateHelper(template, name, boundTmplInstance)) != null)) {
return helper;
}
// 2. look up a binding by traversing the lexical view hierarchy inside the
// current template
if (template && (binding = Blaze._lexicalBindingLookup(Blaze.currentView, name)) != null) {
return binding;
}
// 3. look up a template by name
if (lookupTemplate && ((foundTemplate = Blaze._getTemplate(name, boundTmplInstance)) != null)) {
return foundTemplate;
}
// 4. look up a global helper
if ((helper = Blaze._getGlobalHelper(name, boundTmplInstance)) != null) {
return helper;
}
// 5. look up in a data context
return function () {
var isCalledAsFunction = (arguments.length > 0);
var data = Blaze.getData();
var x = data && data[name];
if (! x) {
if (lookupTemplate) {
throw new Error("No such template: " + name);
} else if (isCalledAsFunction) {
throw new Error("No such function: " + name);
} else if (name.charAt(0) === '@' && ((x === null) ||
(x === undefined))) {
// Throw an error if the user tries to use a `@directive`
// that doesn't exist. We don't implement all directives
// from Handlebars, so there's a potential for confusion
// if we fail silently. On the other hand, we want to
// throw late in case some app or package wants to provide
// a missing directive.
throw new Error("Unsupported directive: " + name);
}
}
if (! data) {
return null;
}
if (typeof x !== 'function') {
if (isCalledAsFunction) {
throw new Error("Can't call non-function: " + x);
}
return x;
}
return x.apply(data, arguments);
};
};
// Implement Spacebars' {{../..}}.
// @param height {Number} The number of '..'s
Blaze._parentData = function (height, _functionWrapped) {
// If height is null or undefined, we default to 1, the first parent.
if (height == null) {
height = 1;
}
var theWith = Blaze.getView('with');
for (var i = 0; (i < height) && theWith; i++) {
theWith = Blaze.getView(theWith, 'with');
}
if (! theWith)
return null;
if (_functionWrapped)
return function () { return theWith.dataVar.get(); };
return theWith.dataVar.get();
};
Blaze.View.prototype.lookupTemplate = function (name) {
return this.lookup(name, {template:true});
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/template.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// [new] Blaze.Template([viewName], renderFunction)
//
// `Blaze.Template` is the class of templates, like `Template.foo` in
// Meteor, which is `instanceof Template`.
//
// `viewKind` is a string that looks like "Template.foo" for templates
// defined by the compiler.
/**
* @class
* @summary Constructor for a Template, which is used to construct Views with particular name and content.
* @locus Client
* @param {String} [viewName] Optional. A name for Views constructed by this Template. See [`view.name`](#view_name).
* @param {Function} renderFunction A function that returns [*renderable content*](#Renderable-Content). This function is used as the `renderFunction` for Views constructed by this Template.
*/
Blaze.Template = function (viewName, renderFunction) {
if (! (this instanceof Blaze.Template))
// called without `new`
return new Blaze.Template(viewName, renderFunction);
if (typeof viewName === 'function') {
// omitted "viewName" argument
renderFunction = viewName;
viewName = '';
}
if (typeof viewName !== 'string')
throw new Error("viewName must be a String (or omitted)");
if (typeof renderFunction !== 'function')
throw new Error("renderFunction must be a function");
this.viewName = viewName;
this.renderFunction = renderFunction;
this.__helpers = new HelperMap;
this.__eventMaps = [];
this._callbacks = {
created: [],
rendered: [],
destroyed: []
};
};
var Template = Blaze.Template;
var HelperMap = function () {};
HelperMap.prototype.get = function (name) {
return this[' '+name];
};
HelperMap.prototype.set = function (name, helper) {
this[' '+name] = helper;
};
HelperMap.prototype.has = function (name) {
return (typeof this[' '+name] !== 'undefined');
};
/**
* @summary Returns true if `value` is a template object like `Template.myTemplate`.
* @locus Client
* @param {Any} value The value to test.
*/
Blaze.isTemplate = function (t) {
return (t instanceof Blaze.Template);
};
/**
* @name onCreated
* @instance
* @memberOf Template
* @summary Register a function to be called when an instance of this template is created.
* @param {Function} callback A function to be added as a callback.
* @locus Client
* @importFromPackage templating
*/
Template.prototype.onCreated = function (cb) {
this._callbacks.created.push(cb);
};
/**
* @name onRendered
* @instance
* @memberOf Template
* @summary Register a function to be called when an instance of this template is inserted into the DOM.
* @param {Function} callback A function to be added as a callback.
* @locus Client
* @importFromPackage templating
*/
Template.prototype.onRendered = function (cb) {
this._callbacks.rendered.push(cb);
};
/**
* @name onDestroyed
* @instance
* @memberOf Template
* @summary Register a function to be called when an instance of this template is removed from the DOM and destroyed.
* @param {Function} callback A function to be added as a callback.
* @locus Client
* @importFromPackage templating
*/
Template.prototype.onDestroyed = function (cb) {
this._callbacks.destroyed.push(cb);
};
Template.prototype._getCallbacks = function (which) {
var self = this;
var callbacks = self[which] ? [self[which]] : [];
// Fire all callbacks added with the new API (Template.onRendered())
// as well as the old-style callback (e.g. Template.rendered) for
// backwards-compatibility.
callbacks = callbacks.concat(self._callbacks[which]);
return callbacks;
};
var fireCallbacks = function (callbacks, template) {
Template._withTemplateInstanceFunc(
function () { return template; },
function () {
for (var i = 0, N = callbacks.length; i < N; i++) {
callbacks[i].call(template);
}
});
};
Template.prototype.constructView = function (contentFunc, elseFunc) {
var self = this;
var view = Blaze.View(self.viewName, self.renderFunction);
view.template = self;
view.templateContentBlock = (
contentFunc ? new Template('(contentBlock)', contentFunc) : null);
view.templateElseBlock = (
elseFunc ? new Template('(elseBlock)', elseFunc) : null);
if (self.__eventMaps || typeof self.events === 'object') {
view._onViewRendered(function () {
if (view.renderCount !== 1)
return;
if (! self.__eventMaps.length && typeof self.events === "object") {
// Provide limited back-compat support for `.events = {...}`
// syntax. Pass `template.events` to the original `.events(...)`
// function. This code must run only once per template, in
// order to not bind the handlers more than once, which is
// ensured by the fact that we only do this when `__eventMaps`
// is falsy, and we cause it to be set now.
Template.prototype.events.call(self, self.events);
}
_.each(self.__eventMaps, function (m) {
Blaze._addEventMap(view, m, view);
});
});
}
view._templateInstance = new Blaze.TemplateInstance(view);
view.templateInstance = function () {
// Update data, firstNode, and lastNode, and return the TemplateInstance
// object.
var inst = view._templateInstance;
/**
* @instance
* @memberOf Blaze.TemplateInstance
* @name data
* @summary The data context of this instance's latest invocation.
* @locus Client
*/
inst.data = Blaze.getData(view);
if (view._domrange && !view.isDestroyed) {
inst.firstNode = view._domrange.firstNode();
inst.lastNode = view._domrange.lastNode();
} else {
// on 'created' or 'destroyed' callbacks we don't have a DomRange
inst.firstNode = null;
inst.lastNode = null;
}
return inst;
};
/**
* @name created
* @instance
* @memberOf Template
* @summary Provide a callback when an instance of a template is created.
* @locus Client
* @deprecated in 1.1
*/
// To avoid situations when new callbacks are added in between view
// instantiation and event being fired, decide on all callbacks to fire
// immediately and then fire them on the event.
var createdCallbacks = self._getCallbacks('created');
view.onViewCreated(function () {
fireCallbacks(createdCallbacks, view.templateInstance());
});
/**
* @name rendered
* @instance
* @memberOf Template
* @summary Provide a callback when an instance of a template is rendered.
* @locus Client
* @deprecated in 1.1
*/
var renderedCallbacks = self._getCallbacks('rendered');
view.onViewReady(function () {
fireCallbacks(renderedCallbacks, view.templateInstance());
});
/**
* @name destroyed
* @instance
* @memberOf Template
* @summary Provide a callback when an instance of a template is destroyed.
* @locus Client
* @deprecated in 1.1
*/
var destroyedCallbacks = self._getCallbacks('destroyed');
view.onViewDestroyed(function () {
fireCallbacks(destroyedCallbacks, view.templateInstance());
});
return view;
};
/**
* @class
* @summary The class for template instances
* @param {Blaze.View} view
* @instanceName template
*/
Blaze.TemplateInstance = function (view) {
if (! (this instanceof Blaze.TemplateInstance))
// called without `new`
return new Blaze.TemplateInstance(view);
if (! (view instanceof Blaze.View))
throw new Error("View required");
view._templateInstance = this;
/**
* @name view
* @memberOf Blaze.TemplateInstance
* @instance
* @summary The [View](../api/blaze.html#Blaze-View) object for this invocation of the template.
* @locus Client
* @type {Blaze.View}
*/
this.view = view;
this.data = null;
/**
* @name firstNode
* @memberOf Blaze.TemplateInstance
* @instance
* @summary The first top-level DOM node in this template instance.
* @locus Client
* @type {DOMNode}
*/
this.firstNode = null;
/**
* @name lastNode
* @memberOf Blaze.TemplateInstance
* @instance
* @summary The last top-level DOM node in this template instance.
* @locus Client
* @type {DOMNode}
*/
this.lastNode = null;
// This dependency is used to identify state transitions in
// _subscriptionHandles which could cause the result of
// TemplateInstance#subscriptionsReady to change. Basically this is triggered
// whenever a new subscription handle is added or when a subscription handle
// is removed and they are not ready.
this._allSubsReadyDep = new Tracker.Dependency();
this._allSubsReady = false;
this._subscriptionHandles = {};
};
/**
* @summary Find all elements matching `selector` in this template instance, and return them as a JQuery object.
* @locus Client
* @param {String} selector The CSS selector to match, scoped to the template contents.
* @returns {DOMNode[]}
*/
Blaze.TemplateInstance.prototype.$ = function (selector) {
var view = this.view;
if (! view._domrange)
throw new Error("Can't use $ on template instance with no DOM");
return view._domrange.$(selector);
};
/**
* @summary Find all elements matching `selector` in this template instance.
* @locus Client
* @param {String} selector The CSS selector to match, scoped to the template contents.
* @returns {DOMElement[]}
*/
Blaze.TemplateInstance.prototype.findAll = function (selector) {
return Array.prototype.slice.call(this.$(selector));
};
/**
* @summary Find one element matching `selector` in this template instance.
* @locus Client
* @param {String} selector The CSS selector to match, scoped to the template contents.
* @returns {DOMElement}
*/
Blaze.TemplateInstance.prototype.find = function (selector) {
var result = this.$(selector);
return result[0] || null;
};
/**
* @summary A version of [Tracker.autorun](https://docs.meteor.com/api/tracker.html#Tracker-autorun) that is stopped when the template is destroyed.
* @locus Client
* @param {Function} runFunc The function to run. It receives one argument: a Tracker.Computation object.
*/
Blaze.TemplateInstance.prototype.autorun = function (f) {
return this.view.autorun(f);
};
/**
* @summary A version of [Meteor.subscribe](https://docs.meteor.com/api/pubsub.html#Meteor-subscribe) that is stopped
* when the template is destroyed.
* @return {SubscriptionHandle} The subscription handle to the newly made
* subscription. Call `handle.stop()` to manually stop the subscription, or
* `handle.ready()` to find out if this particular subscription has loaded all
* of its inital data.
* @locus Client
* @param {String} name Name of the subscription. Matches the name of the
* server's `publish()` call.
* @param {Any} [arg1,arg2...] Optional arguments passed to publisher function
* on server.
* @param {Function|Object} [options] If a function is passed instead of an
* object, it is interpreted as an `onReady` callback.
* @param {Function} [options.onReady] Passed to [`Meteor.subscribe`](https://docs.meteor.com/api/pubsub.html#Meteor-subscribe).
* @param {Function} [options.onStop] Passed to [`Meteor.subscribe`](https://docs.meteor.com/api/pubsub.html#Meteor-subscribe).
* @param {DDP.Connection} [options.connection] The connection on which to make the
* subscription.
*/
Blaze.TemplateInstance.prototype.subscribe = function (/* arguments */) {
var self = this;
var subHandles = self._subscriptionHandles;
var args = _.toArray(arguments);
// Duplicate logic from Meteor.subscribe
var options = {};
if (args.length) {
var lastParam = _.last(args);
// Match pattern to check if the last arg is an options argument
var lastParamOptionsPattern = {
onReady: Match.Optional(Function),
// XXX COMPAT WITH 1.0.3.1 onError used to exist, but now we use
// onStop with an error callback instead.
onError: Match.Optional(Function),
onStop: Match.Optional(Function),
connection: Match.Optional(Match.Any)
};
if (_.isFunction(lastParam)) {
options.onReady = args.pop();
} else if (lastParam && ! _.isEmpty(lastParam) && Match.test(lastParam, lastParamOptionsPattern)) {
options = args.pop();
}
}
var subHandle;
var oldStopped = options.onStop;
options.onStop = function (error) {
// When the subscription is stopped, remove it from the set of tracked
// subscriptions to avoid this list growing without bound
delete subHandles[subHandle.subscriptionId];
// Removing a subscription can only change the result of subscriptionsReady
// if we are not ready (that subscription could be the one blocking us being
// ready).
if (! self._allSubsReady) {
self._allSubsReadyDep.changed();
}
if (oldStopped) {
oldStopped(error);
}
};
var connection = options.connection;
var callbacks = _.pick(options, ["onReady", "onError", "onStop"]);
// The callbacks are passed as the last item in the arguments array passed to
// View#subscribe
args.push(callbacks);
// View#subscribe takes the connection as one of the options in the last
// argument
subHandle = self.view.subscribe.call(self.view, args, {
connection: connection
});
if (! _.has(subHandles, subHandle.subscriptionId)) {
subHandles[subHandle.subscriptionId] = subHandle;
// Adding a new subscription will always cause us to transition from ready
// to not ready, but if we are already not ready then this can't make us
// ready.
if (self._allSubsReady) {
self._allSubsReadyDep.changed();
}
}
return subHandle;
};
/**
* @summary A reactive function that returns true when all of the subscriptions
* called with [this.subscribe](#TemplateInstance-subscribe) are ready.
* @return {Boolean} True if all subscriptions on this template instance are
* ready.
*/
Blaze.TemplateInstance.prototype.subscriptionsReady = function () {
this._allSubsReadyDep.depend();
this._allSubsReady = _.all(this._subscriptionHandles, function (handle) {
return handle.ready();
});
return this._allSubsReady;
};
/**
* @summary Specify template helpers available to this template.
* @locus Client
* @param {Object} helpers Dictionary of helper functions by name.
* @importFromPackage templating
*/
Template.prototype.helpers = function (dict) {
if (! _.isObject(dict)) {
throw new Error("Helpers dictionary has to be an object");
}
for (var k in dict)
this.__helpers.set(k, dict[k]);
};
var canUseGetters = function() {
if (Object.defineProperty) {
var obj = {};
try {
Object.defineProperty(obj, "self", {
get: function () { return obj; }
});
} catch (e) {
return false;
}
return obj.self === obj;
}
return false;
}();
if (canUseGetters) {
// Like Blaze.currentView but for the template instance. A function
// rather than a value so that not all helpers are implicitly dependent
// on the current template instance's `data` property, which would make
// them dependent on the data context of the template inclusion.
var currentTemplateInstanceFunc = null;
// If getters are supported, define this property with a getter function
// to make it effectively read-only, and to work around this bizarre JSC
// bug: https://github.com/meteor/meteor/issues/9926
Object.defineProperty(Template, "_currentTemplateInstanceFunc", {
get: function () {
return currentTemplateInstanceFunc;
}
});
Template._withTemplateInstanceFunc = function (templateInstanceFunc, func) {
if (typeof func !== 'function') {
throw new Error("Expected function, got: " + func);
}
var oldTmplInstanceFunc = currentTemplateInstanceFunc;
try {
currentTemplateInstanceFunc = templateInstanceFunc;
return func();
} finally {
currentTemplateInstanceFunc = oldTmplInstanceFunc;
}
};
} else {
// If getters are not supported, just use a normal property.
Template._currentTemplateInstanceFunc = null;
Template._withTemplateInstanceFunc = function (templateInstanceFunc, func) {
if (typeof func !== 'function') {
throw new Error("Expected function, got: " + func);
}
var oldTmplInstanceFunc = Template._currentTemplateInstanceFunc;
try {
Template._currentTemplateInstanceFunc = templateInstanceFunc;
return func();
} finally {
Template._currentTemplateInstanceFunc = oldTmplInstanceFunc;
}
};
}
/**
* @summary Specify event handlers for this template.
* @locus Client
* @param {EventMap} eventMap Event handlers to associate with this template.
* @importFromPackage templating
*/
Template.prototype.events = function (eventMap) {
if (! _.isObject(eventMap)) {
throw new Error("Event map has to be an object");
}
var template = this;
var eventMap2 = {};
for (var k in eventMap) {
eventMap2[k] = (function (k, v) {
return function (event/*, ...*/) {
var view = this; // passed by EventAugmenter
var data = Blaze.getData(event.currentTarget);
if (data == null)
data = {};
var args = Array.prototype.slice.call(arguments);
var tmplInstanceFunc = Blaze._bind(view.templateInstance, view);
args.splice(1, 0, tmplInstanceFunc());
return Template._withTemplateInstanceFunc(tmplInstanceFunc, function () {
return v.apply(data, args);
});
};
})(k, eventMap[k]);
}
template.__eventMaps.push(eventMap2);
};
/**
* @function
* @name instance
* @memberOf Template
* @summary The [template instance](#Template-instances) corresponding to the current template helper, event handler, callback, or autorun. If there isn't one, `null`.
* @locus Client
* @returns {Blaze.TemplateInstance}
* @importFromPackage templating
*/
Template.instance = function () {
return Template._currentTemplateInstanceFunc
&& Template._currentTemplateInstanceFunc();
};
// Note: Template.currentData() is documented to take zero arguments,
// while Blaze.getData takes up to one.
/**
* @summary
*
* - Inside an `onCreated`, `onRendered`, or `onDestroyed` callback, returns
* the data context of the template.
* - Inside an event handler, returns the data context of the template on which
* this event handler was defined.
* - Inside a helper, returns the data context of the DOM node where the helper
* was used.
*
* Establishes a reactive dependency on the result.
* @locus Client
* @function
* @importFromPackage templating
*/
Template.currentData = Blaze.getData;
/**
* @summary Accesses other data contexts that enclose the current data context.
* @locus Client
* @function
* @param {Integer} [numLevels] The number of levels beyond the current data context to look. Defaults to 1.
* @importFromPackage templating
*/
Template.parentData = Blaze._parentData;
/**
* @summary Defines a [helper function](#Template-helpers) which can be used from all templates.
* @locus Client
* @function
* @param {String} name The name of the helper function you are defining.
* @param {Function} function The helper function itself.
* @importFromPackage templating
*/
Template.registerHelper = Blaze.registerHelper;
/**
* @summary Removes a global [helper function](#Template-helpers).
* @locus Client
* @function
* @param {String} name The name of the helper function you are defining.
* @importFromPackage templating
*/
Template.deregisterHelper = Blaze.deregisterHelper;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/blaze/backcompat.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
UI = Blaze;
Blaze.ReactiveVar = ReactiveVar;
UI._templateInstance = Blaze.Template.instance;
Handlebars = {};
Handlebars.registerHelper = Blaze.registerHelper;
Handlebars._escape = Blaze._escape;
// Return these from {{...}} helpers to achieve the same as returning
// strings from {{{...}}} helpers
Handlebars.SafeString = function(string) {
this.string = string;
};
Handlebars.SafeString.prototype.toString = function() {
return this.string.toString();
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("blaze", {
Blaze: Blaze,
UI: UI,
Handlebars: Handlebars
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var _ = Package.underscore._;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Boilerplate;
var require = meteorInstall({"node_modules":{"meteor":{"boilerplate-generator":{"generator.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/boilerplate-generator/generator.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
module.export({
Boilerplate: () => Boilerplate
});
let readFile;
module.link("fs", {
readFile(v) {
readFile = v;
}
}, 0);
let createStream;
module.link("combined-stream2", {
create(v) {
createStream = v;
}
}, 1);
let WebBrowserTemplate;
module.link("./template-web.browser", {
default(v) {
WebBrowserTemplate = v;
}
}, 2);
let WebCordovaTemplate;
module.link("./template-web.cordova", {
default(v) {
WebCordovaTemplate = v;
}
}, 3);
// Copied from webapp_server
const readUtf8FileSync = filename => Meteor.wrapAsync(readFile)(filename, 'utf8');
const identity = value => value;
function appendToStream(chunk, stream) {
if (typeof chunk === "string") {
stream.append(Buffer.from(chunk, "utf8"));
} else if (Buffer.isBuffer(chunk) || typeof chunk.read === "function") {
stream.append(chunk);
}
}
let shouldWarnAboutToHTMLDeprecation = !Meteor.isProduction;
class Boilerplate {
constructor(arch, manifest, options = {}) {
const {
headTemplate,
closeTemplate
} = getTemplate(arch);
this.headTemplate = headTemplate;
this.closeTemplate = closeTemplate;
this.baseData = null;
this._generateBoilerplateFromManifest(manifest, options);
}
toHTML(extraData) {
if (shouldWarnAboutToHTMLDeprecation) {
shouldWarnAboutToHTMLDeprecation = false;
console.error("The Boilerplate#toHTML method has been deprecated. " + "Please use Boilerplate#toHTMLStream instead.");
console.trace();
} // Calling .await() requires a Fiber.
return this.toHTMLAsync(extraData).await();
} // Returns a Promise that resolves to a string of HTML.
toHTMLAsync(extraData) {
return new Promise((resolve, reject) => {
const stream = this.toHTMLStream(extraData);
const chunks = [];
stream.on("data", chunk => chunks.push(chunk));
stream.on("end", () => {
resolve(Buffer.concat(chunks).toString("utf8"));
});
stream.on("error", reject);
});
} // The 'extraData' argument can be used to extend 'self.baseData'. Its
// purpose is to allow you to specify data that you might not know at
// the time that you construct the Boilerplate object. (e.g. it is used
// by 'webapp' to specify data that is only known at request-time).
// this returns a stream
toHTMLStream(extraData) {
if (!this.baseData || !this.headTemplate || !this.closeTemplate) {
throw new Error('Boilerplate did not instantiate correctly.');
}
const data = (0, _objectSpread2.default)({}, this.baseData, extraData);
const start = "<!DOCTYPE html>\n" + this.headTemplate(data);
const {
body,
dynamicBody
} = data;
const end = this.closeTemplate(data);
const response = createStream();
appendToStream(start, response);
if (body) {
appendToStream(body, response);
}
if (dynamicBody) {
appendToStream(dynamicBody, response);
}
appendToStream(end, response);
return response;
} // XXX Exported to allow client-side only changes to rebuild the boilerplate
// without requiring a full server restart.
// Produces an HTML string with given manifest and boilerplateSource.
// Optionally takes urlMapper in case urls from manifest need to be prefixed
// or rewritten.
// Optionally takes pathMapper for resolving relative file system paths.
// Optionally allows to override fields of the data context.
_generateBoilerplateFromManifest(manifest, {
urlMapper = identity,
pathMapper = identity,
baseDataExtension,
inline
} = {}) {
const boilerplateBaseData = (0, _objectSpread2.default)({
css: [],
js: [],
head: '',
body: '',
meteorManifest: JSON.stringify(manifest)
}, baseDataExtension);
manifest.forEach(item => {
const urlPath = urlMapper(item.url);
const itemObj = {
url: urlPath
};
if (inline) {
itemObj.scriptContent = readUtf8FileSync(pathMapper(item.path));
itemObj.inline = true;
} else if (item.sri) {
itemObj.sri = item.sri;
}
if (item.type === 'css' && item.where === 'client') {
boilerplateBaseData.css.push(itemObj);
}
if (item.type === 'js' && item.where === 'client' && // Dynamic JS modules should not be loaded eagerly in the
// initial HTML of the app.
!item.path.startsWith('dynamic/')) {
boilerplateBaseData.js.push(itemObj);
}
if (item.type === 'head') {
boilerplateBaseData.head = readUtf8FileSync(pathMapper(item.path));
}
if (item.type === 'body') {
boilerplateBaseData.body = readUtf8FileSync(pathMapper(item.path));
}
});
this.baseData = boilerplateBaseData;
}
}
; // Returns a template function that, when called, produces the boilerplate
// html as a string.
function getTemplate(arch) {
const prefix = arch.split(".", 2).join(".");
if (prefix === "web.browser") {
return WebBrowserTemplate;
}
if (prefix === "web.cordova") {
return WebCordovaTemplate;
}
throw new Error("Unsupported arch: " + arch);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template-web.browser.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/boilerplate-generator/template-web.browser.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
headTemplate: () => headTemplate,
closeTemplate: () => closeTemplate
});
let template;
module.link("./template", {
default(v) {
template = v;
}
}, 0);
const sri = (sri, mode) => sri && mode ? ` integrity="sha512-${sri}" crossorigin="${mode}"` : '';
const headTemplate = ({
css,
htmlAttributes,
bundledJsCssUrlRewriteHook,
sriMode,
head,
dynamicHead
}) => {
var headSections = head.split(/<meteor-bundled-css[^<>]*>/, 2);
var cssBundle = [...(css || []).map(file => template(' <link rel="stylesheet" type="text/css" class="__meteor-css__" href="<%- href %>"<%= sri %>>')({
href: bundledJsCssUrlRewriteHook(file.url),
sri: sri(file.sri, sriMode)
}))].join('\n');
return ['<html' + Object.keys(htmlAttributes || {}).map(key => template(' <%= attrName %>="<%- attrValue %>"')({
attrName: key,
attrValue: htmlAttributes[key]
})).join('') + '>', '<head>', headSections.length === 1 ? [cssBundle, headSections[0]].join('\n') : [headSections[0], cssBundle, headSections[1]].join('\n'), dynamicHead, '</head>', '<body>'].join('\n');
};
const closeTemplate = ({
meteorRuntimeConfig,
rootUrlPathPrefix,
inlineScriptsAllowed,
js,
additionalStaticJs,
bundledJsCssUrlRewriteHook,
sriMode
}) => ['', inlineScriptsAllowed ? template(' <script type="text/javascript">__meteor_runtime_config__ = JSON.parse(decodeURIComponent(<%= conf %>))</script>')({
conf: meteorRuntimeConfig
}) : template(' <script type="text/javascript" src="<%- src %>/meteor_runtime_config.js"></script>')({
src: rootUrlPathPrefix
}), '', ...(js || []).map(file => template(' <script type="text/javascript" src="<%- src %>"<%= sri %>></script>')({
src: bundledJsCssUrlRewriteHook(file.url),
sri: sri(file.sri, sriMode)
})), ...(additionalStaticJs || []).map(({
contents,
pathname
}) => inlineScriptsAllowed ? template(' <script><%= contents %></script>')({
contents
}) : template(' <script type="text/javascript" src="<%- src %>"></script>')({
src: rootUrlPathPrefix + pathname
})), '', '', '</body>', '</html>'].join('\n');
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template-web.cordova.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/boilerplate-generator/template-web.cordova.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
headTemplate: () => headTemplate,
closeTemplate: () => closeTemplate
});
let template;
module.link("./template", {
default(v) {
template = v;
}
}, 0);
const headTemplate = ({
meteorRuntimeConfig,
rootUrlPathPrefix,
inlineScriptsAllowed,
css,
js,
additionalStaticJs,
htmlAttributes,
bundledJsCssUrlRewriteHook,
head,
dynamicHead
}) => {
var headSections = head.split(/<meteor-bundled-css[^<>]*>/, 2);
var cssBundle = [// We are explicitly not using bundledJsCssUrlRewriteHook: in cordova we serve assets up directly from disk, so rewriting the URL does not make sense
...(css || []).map(file => template(' <link rel="stylesheet" type="text/css" class="__meteor-css__" href="<%- href %>">')({
href: file.url
}))].join('\n');
return ['<html>', '<head>', ' <meta charset="utf-8">', ' <meta name="format-detection" content="telephone=no">', ' <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, viewport-fit=cover">', ' <meta name="msapplication-tap-highlight" content="no">', ' <meta http-equiv="Content-Security-Policy" content="default-src * gap: data: blob: \'unsafe-inline\' \'unsafe-eval\' ws: wss:;">', headSections.length === 1 ? [cssBundle, headSections[0]].join('\n') : [headSections[0], cssBundle, headSections[1]].join('\n'), ' <script type="text/javascript">', template(' __meteor_runtime_config__ = JSON.parse(decodeURIComponent(<%= conf %>));')({
conf: meteorRuntimeConfig
}), ' if (/Android/i.test(navigator.userAgent)) {', // When Android app is emulated, it cannot connect to localhost,
// instead it should connect to 10.0.2.2
// (unless we\'re using an http proxy; then it works!)
' if (!__meteor_runtime_config__.httpProxyPort) {', ' __meteor_runtime_config__.ROOT_URL = (__meteor_runtime_config__.ROOT_URL || \'\').replace(/localhost/i, \'10.0.2.2\');', ' __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL = (__meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL || \'\').replace(/localhost/i, \'10.0.2.2\');', ' }', ' }', ' </script>', '', ' <script type="text/javascript" src="/cordova.js"></script>', ...(js || []).map(file => template(' <script type="text/javascript" src="<%- src %>"></script>')({
src: file.url
})), ...(additionalStaticJs || []).map(({
contents,
pathname
}) => inlineScriptsAllowed ? template(' <script><%= contents %></script>')({
contents
}) : template(' <script type="text/javascript" src="<%- src %>"></script>')({
src: rootUrlPathPrefix + pathname
})), '', '</head>', '', '<body>'].join('\n');
};
function closeTemplate() {
return "</body>\n</html>";
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"template.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/boilerplate-generator/template.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
default: () => template
});
let _;
module.link("meteor/underscore", {
_(v) {
_ = v;
}
}, 0);
function template(text) {
return _.template(text, null, {
evaluate: /<%([\s\S]+?)%>/g,
interpolate: /<%=([\s\S]+?)%>/g,
escape: /<%-([\s\S]+?)%>/g
});
}
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"combined-stream2":{"package.json":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/boilerplate-generator/node_modules/combined-stream2/package.json //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "combined-stream2",
"version": "1.1.2",
"main": "index.js"
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/boilerplate-generator/node_modules/combined-stream2/index.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/boilerplate-generator/generator.js");
/* Exports */
Package._define("boilerplate-generator", exports, {
Boilerplate: Boilerplate
});
})();
//# sourceURL=meteor://💻app/packages/boilerplate-generator.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYm9pbGVycGxhdGUtZ2VuZXJhdG9yL2dlbmVyYXRvci5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvYm9pbGVycGxhdGUtZ2VuZXJhdG9yL3RlbXBsYXRlLXdlYi5icm93c2VyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9ib2lsZXJwbGF0ZS1nZW5lcmF0b3IvdGVtcGxhdGUtd2ViLmNvcmRvdmEuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL2JvaWxlcnBsYXRlLWdlbmVyYXRvci90ZW1wbGF0ZS5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnQiLCJCb2lsZXJwbGF0ZSIsInJlYWRGaWxlIiwibGluayIsInYiLCJjcmVhdGVTdHJlYW0iLCJjcmVhdGUiLCJXZWJCcm93c2VyVGVtcGxhdGUiLCJkZWZhdWx0IiwiV2ViQ29yZG92YVRlbXBsYXRlIiwicmVhZFV0ZjhGaWxlU3luYyIsImZpbGVuYW1lIiwiTWV0ZW9yIiwid3JhcEFzeW5jIiwiaWRlbnRpdHkiLCJ2YWx1ZSIsImFwcGVuZFRvU3RyZWFtIiwiY2h1bmsiLCJzdHJlYW0iLCJhcHBlbmQiLCJCdWZmZXIiLCJmcm9tIiwiaXNCdWZmZXIiLCJyZWFkIiwic2hvdWxkV2FybkFib3V0VG9IVE1MRGVwcmVjYXRpb24iLCJpc1Byb2R1Y3Rpb24iLCJjb25zdHJ1Y3RvciIsImFyY2giLCJtYW5pZmVzdCIsIm9wdGlvbnMiLCJoZWFkVGVtcGxhdGUiLCJjbG9zZVRlbXBsYXRlIiwiZ2V0VGVtcGxhdGUiLCJiYXNlRGF0YSIsIl9nZW5lcmF0ZUJvaWxlcnBsYXRlRnJvbU1hbmlmZXN0IiwidG9IVE1MIiwiZXh0cmFEYXRhIiwiY29uc29sZSIsImVycm9yIiwidHJhY2UiLCJ0b0hUTUxBc3luYyIsImF3YWl0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ0b0hUTUxTdHJlYW0iLCJjaHVua3MiLCJvbiIsInB1c2giLCJjb25jYXQiLCJ0b1N0cmluZyIsIkVycm9yIiwiZGF0YSIsInN0YXJ0IiwiYm9keSIsImR5bmFtaWNCb2R5IiwiZW5kIiwicmVzcG9uc2UiLCJ1cmxNYXBwZXIiLCJwYXRoTWFwcGVyIiwiYmFzZURhdGFFeHRlbnNpb24iLCJpbmxpbmUiLCJib2lsZXJwbGF0ZUJhc2VEYXRhIiwiY3NzIiwianMiLCJoZWFkIiwibWV0ZW9yTWFuaWZlc3QiLCJKU09OIiwic3RyaW5naWZ5IiwiZm9yRWFjaCIsIml0ZW0iLCJ1cmxQYXRoIiwidXJsIiwiaXRlbU9iaiIsInNjcmlwdENvbnRlbnQiLCJwYXRoIiwic3JpIiwidHlwZSIsIndoZXJlIiwic3RhcnRzV2l0aCIsInByZWZpeCIsInNwbGl0Iiwiam9pbiIsInRlbXBsYXRlIiwibW9kZSIsImh0bWxBdHRyaWJ1dGVzIiwiYnVuZGxlZEpzQ3NzVXJsUmV3cml0ZUhvb2siLCJzcmlNb2RlIiwiZHluYW1pY0hlYWQiLCJoZWFkU2VjdGlvbnMiLCJjc3NCdW5kbGUiLCJtYXAiLCJmaWxlIiwiaHJlZiIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJhdHRyTmFtZSIsImF0dHJWYWx1ZSIsImxlbmd0aCIsIm1ldGVvclJ1bnRpbWVDb25maWciLCJyb290VXJsUGF0aFByZWZpeCIsImlubGluZVNjcmlwdHNBbGxvd2VkIiwiYWRkaXRpb25hbFN0YXRpY0pzIiwiY29uZiIsInNyYyIsImNvbnRlbnRzIiwicGF0aG5hbWUiLCJfIiwidGV4dCIsImV2YWx1YXRlIiwiaW50ZXJwb2xhdGUiLCJlc2NhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDQyxhQUFXLEVBQUMsTUFBSUE7QUFBakIsQ0FBZDtBQUE2QyxJQUFJQyxRQUFKO0FBQWFILE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLElBQVosRUFBaUI7QUFBQ0QsVUFBUSxDQUFDRSxDQUFELEVBQUc7QUFBQ0YsWUFBUSxHQUFDRSxDQUFUO0FBQVc7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TCxFQTdDSyxFQThDTCxTQTlDSyxFQStDTCxFQS9DSyxFQWdETCxRQWhESyxFQWlETHpCLElBakRLLENBaURBLElBakRBLENBQVA7QUFrREQsQ0F2RU07O0FBeUVBLFNBQVNuRCxhQUFULEdBQXlCO0FBQzlCLFNBQU8sa0JBQVA7QUFDRCxDOzs7Ozs7Ozs7OztBQzlFRGhDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUNRLFNBQU8sRUFBQyxNQUFJMkU7QUFBYixDQUFkOztBQUFzQyxJQUFJeUIsQ0FBSjs7QUFBTTdHLE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLG1CQUFaLEVBQWdDO0FBQUN5RyxHQUFDLENBQUN4RyxDQUFELEVBQUc7QUFBQ3dHLEtBQUMsR0FBQ3hHLENBQUY7QUFBSTs7QUFBVixDQUFoQyxFQUE0QyxDQUE1Qzs7QUFPN0IsU0FBUytFLFFBQVQsQ0FBa0IwQixJQUFsQixFQUF3QjtBQUNyQyxTQUFPRCxDQUFDLENBQUN6QixRQUFGLENBQVcwQixJQUFYLEVBQWlCLElBQWpCLEVBQXVCO0FBQzVCQyxZQUFRLEVBQU0saUJBRGM7QUFFNUJDLGVBQVcsRUFBRyxrQkFGYztBQUc1QkMsVUFBTSxFQUFRO0FBSGMsR0FBdkIsQ0FBUDtBQUtEOztBQUFBLEMiLCJmaWxlIjoiL3BhY2thZ2VzL2JvaWxlcnBsYXRlLWdlbmVyYXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgY3JlYXRlIGFzIGNyZWF0ZVN0cmVhbSB9IGZyb20gXCJjb21iaW5lZC1zdHJlYW0yXCI7XG5cbmltcG9ydCBXZWJCcm93c2VyVGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZS13ZWIuYnJvd3Nlcic7XG5pbXBvcnQgV2ViQ29yZG92YVRlbXBsYXRlIGZyb20gJy4vdGVtcGxhdGUtd2ViLmNvcmRvdmEnO1xuXG4vLyBDb3BpZWQgZnJvbSB3ZWJhcHBfc2VydmVyXG5jb25zdCByZWFkVXRmOEZpbGVTeW5jID0gZmlsZW5hbWUgPT4gTWV0ZW9yLndyYXBBc3luYyhyZWFkRmlsZSkoZmlsZW5hbWUsICd1dGY4Jyk7XG5cbmNvbnN0IGlkZW50aXR5ID0gdmFsdWUgPT4gdmFsdWU7XG5cbmZ1bmN0aW9uIGFwcGVuZFRvU3RyZWFtKGNodW5rLCBzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgIHN0cmVhbS5hcHBlbmQoQnVmZmVyLmZyb20oY2h1bmssIFwidXRmOFwiKSk7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSB8fFxuICAgICAgICAgICAgIHR5cGVvZiBjaHVuay5yZWFkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzdHJlYW0uYXBwZW5kKGNodW5rKTtcbiAgfVxufVxuXG5sZXQgc2hvdWxkV2FybkFib3V0VG9IVE1MRGVwcmVjYXRpb24gPSAhIE1ldGVvci5pc1Byb2R1Y3Rpb247XG5cbmV4cG9ydCBjbGFzcyBCb2lsZXJwbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKGFyY2gsIG1hbmlmZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGhlYWRUZW1wbGF0ZSwgY2xvc2VUZW1wbGF0ZSB9ID0gZ2V0VGVtcGxhdGUoYXJjaCk7XG4gICAgdGhpcy5oZWFkVGVtcGxhdGUgPSBoZWFkVGVtcGxhdGU7XG4gICAgdGhpcy5jbG9zZVRlbXBsYXRlID0gY2xvc2VUZW1wbGF0ZTtcbiAgICB0aGlzLmJhc2VEYXRhID0gbnVsbDtcblxuICAgIHRoaXMuX2dlbmVyYXRlQm9pbGVycGxhdGVGcm9tTWFuaWZlc3QoXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG5cbiAgdG9IVE1MKGV4dHJhRGF0YSkge1xuICAgIGlmIChzaG91bGRXYXJuQWJvdXRUb0hUTUxEZXByZWNhdGlvbikge1xuICAgICAgc2hvdWxkV2FybkFib3V0VG9IVE1MRGVwcmVjYXRpb24gPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiVGhlIEJvaWxlcnBsYXRlI3RvSFRNTCBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZC4gXCIgK1xuICAgICAgICAgIFwiUGxlYXNlIHVzZSBCb2lsZXJwbGF0ZSN0b0hUTUxTdHJlYW0gaW5zdGVhZC5cIlxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsaW5nIC5hd2FpdCgpIHJlcXVpcmVzIGEgRmliZXIuXG4gICAgcmV0dXJuIHRoaXMudG9IVE1MQXN5bmMoZXh0cmFEYXRhKS5hd2FpdCgpO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHN0cmluZyBvZiBIVE1MLlxuICB0b0hUTUxBc3luYyhleHRyYURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy50b0hUTUxTdHJlYW0oZXh0cmFEYXRhKTtcbiAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgc3RyZWFtLm9uKFwiZGF0YVwiLCBjaHVuayA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSAnZXh0cmFEYXRhJyBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBleHRlbmQgJ3NlbGYuYmFzZURhdGEnLiBJdHNcbiAgLy8gcHVycG9zZSBpcyB0byBhbGxvdyB5b3UgdG8gc3BlY2lmeSBkYXRhIHRoYXQgeW91IG1pZ2h0IG5vdCBrbm93IGF0XG4gIC8vIHRoZSB0aW1lIHRoYXQgeW91IGNvbnN0cnVjdCB0aGUgQm9pbGVycGxhdGUgb2JqZWN0LiAoZS5nLiBpdCBpcyB1c2VkXG4gIC8vIGJ5ICd3ZWJhcHAnIHRvIHNwZWNpZnkgZGF0YSB0aGF0IGlzIG9ubHkga25vd24gYXQgcmVxdWVzdC10aW1lKS5cbiAgLy8gdGhpcyByZXR1cm5zIGEgc3RyZWFtXG4gIHRvSFRNTFN0cmVhbShleHRyYURhdGEpIHtcbiAgICBpZiAoIXRoaXMuYmFzZURhdGEgfHwgIXRoaXMuaGVhZFRlbXBsYXRlIHx8ICF0aGlzLmNsb3NlVGVtcGxhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQm9pbGVycGxhdGUgZGlkIG5vdCBpbnN0YW50aWF0ZSBjb3JyZWN0bHkuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHsuLi50aGlzLmJhc2VEYXRhLCAuLi5leHRyYURhdGF9O1xuICAgIGNvbnN0IHN0YXJ0ID0gXCI8IURPQ1RZUEUgaHRtbD5cXG5cIiArIHRoaXMuaGVhZFRlbXBsYXRlKGRhdGEpO1xuXG4gICAgY29uc3QgeyBib2R5LCBkeW5hbWljQm9keSB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuY2xvc2VUZW1wbGF0ZShkYXRhKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGNyZWF0ZVN0cmVhbSgpO1xuXG4gICAgYXBwZW5kVG9TdHJlYW0oc3RhcnQsIHJlc3BvbnNlKTtcblxuICAgIGlmIChib2R5KSB7XG4gICAgICBhcHBlbmRUb1N0cmVhbShib2R5LCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgaWYgKGR5bmFtaWNCb2R5KSB7XG4gICAgICBhcHBlbmRUb1N0cmVhbShkeW5hbWljQm9keSwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIGFwcGVuZFRvU3RyZWFtKGVuZCwgcmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLy8gWFhYIEV4cG9ydGVkIHRvIGFsbG93IGNsaWVudC1zaWRlIG9ubHkgY2hhbmdlcyB0byByZWJ1aWxkIHRoZSBib2lsZXJwbGF0ZVxuICAvLyB3aXRob3V0IHJlcXVpcmluZyBhIGZ1bGwgc2VydmVyIHJlc3RhcnQuXG4gIC8vIFByb2R1Y2VzIGFuIEhUTUwgc3RyaW5nIHdpdGggZ2l2ZW4gbWFuaWZlc3QgYW5kIGJvaWxlcnBsYXRlU291cmNlLlxuICAvLyBPcHRpb25hbGx5IHRha2VzIHVybE1hcHBlciBpbiBjYXNlIHVybHMgZnJvbSBtYW5pZmVzdCBuZWVkIHRvIGJlIHByZWZpeGVkXG4gIC8vIG9yIHJld3JpdHRlbi5cbiAgLy8gT3B0aW9uYWxseSB0YWtlcyBwYXRoTWFwcGVyIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZmlsZSBzeXN0ZW0gcGF0aHMuXG4gIC8vIE9wdGlvbmFsbHkgYWxsb3dzIHRvIG92ZXJyaWRlIGZpZWxkcyBvZiB0aGUgZGF0YSBjb250ZXh0LlxuICBfZ2VuZXJhdGVCb2lsZXJwbGF0ZUZyb21NYW5pZmVzdChtYW5pZmVzdCwge1xuICAgIHVybE1hcHBlciA9IGlkZW50aXR5LFxuICAgIHBhdGhNYXBwZXIgPSBpZGVudGl0eSxcbiAgICBiYXNlRGF0YUV4dGVuc2lvbixcbiAgICBpbmxpbmUsXG4gIH0gPSB7fSkge1xuXG4gICAgY29uc3QgYm9pbGVycGxhdGVCYXNlRGF0YSA9IHtcbiAgICAgIGNzczogW10sXG4gICAgICBqczogW10sXG4gICAgICBoZWFkOiAnJyxcbiAgICAgIGJvZHk6ICcnLFxuICAgICAgbWV0ZW9yTWFuaWZlc3Q6IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KSxcbiAgICAgIC4uLmJhc2VEYXRhRXh0ZW5zaW9uLFxuICAgIH07XG5cbiAgICBtYW5pZmVzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgdXJsUGF0aCA9IHVybE1hcHBlcihpdGVtLnVybCk7XG4gICAgICBjb25zdCBpdGVtT2JqID0geyB1cmw6IHVybFBhdGggfTtcblxuICAgICAgaWYgKGlubGluZSkge1xuICAgICAgICBpdGVtT2JqLnNjcmlwdENvbnRlbnQgPSByZWFkVXRmOEZpbGVTeW5jKFxuICAgICAgICAgIHBhdGhNYXBwZXIoaXRlbS5wYXRoKSk7XG4gICAgICAgIGl0ZW1PYmouaW5saW5lID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5zcmkpIHtcbiAgICAgICAgaXRlbU9iai5zcmkgPSBpdGVtLnNyaTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2NzcycgJiYgaXRlbS53aGVyZSA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgYm9pbGVycGxhdGVCYXNlRGF0YS5jc3MucHVzaChpdGVtT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2pzJyAmJiBpdGVtLndoZXJlID09PSAnY2xpZW50JyAmJlxuICAgICAgICAvLyBEeW5hbWljIEpTIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSBsb2FkZWQgZWFnZXJseSBpbiB0aGVcbiAgICAgICAgLy8gaW5pdGlhbCBIVE1MIG9mIHRoZSBhcHAuXG4gICAgICAgICFpdGVtLnBhdGguc3RhcnRzV2l0aCgnZHluYW1pYy8nKSkge1xuICAgICAgICBib2lsZXJwbGF0ZUJhc2VEYXRhLmpzLnB1c2goaXRlbU9iaik7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdoZWFkJykge1xuICAgICAgICBib2lsZXJwbGF0ZUJhc2VEYXRhLmhlYWQgPVxuICAgICAgICAgIHJlYWRVdGY4RmlsZVN5bmMocGF0aE1hcHBlcihpdGVtLnBhdGgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgIGJvaWxlcnBsYXRlQmFzZURhdGEuYm9keSA9XG4gICAgICAgICAgcmVhZFV0ZjhGaWxlU3luYyhwYXRoTWFwcGVyKGl0ZW0ucGF0aCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5iYXNlRGF0YSA9IGJvaWxlcnBsYXRlQmFzZURhdGE7XG4gIH1cbn07XG5cbi8vIFJldHVybnMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgcHJvZHVjZXMgdGhlIGJvaWxlcnBsYXRlXG4vLyBodG1sIGFzIGEgc3RyaW5nLlxuZnVuY3Rpb24gZ2V0VGVtcGxhdGUoYXJjaCkge1xuICBjb25zdCBwcmVmaXggPSBhcmNoLnNwbGl0KFwiLlwiLCAyKS5qb2luKFwiLlwiKTtcblxuICBpZiAocHJlZml4ID09PSBcIndlYi5icm93c2VyXCIpIHtcbiAgICByZXR1cm4gV2ViQnJvd3NlclRlbXBsYXRlO1xuICB9XG5cbiAgaWYgKHByZWZpeCA9PT0gXCJ3ZWIuY29yZG92YVwiKSB7XG4gICAgcmV0dXJuIFdlYkNvcmRvdmFUZW1wbGF0ZTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFyY2g6IFwiICsgYXJjaCk7XG59XG4iLCJpbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZSc7XG5cbmNvbnN0IHNyaSA9IChzcmksIG1vZGUpID0+XG4gIChzcmkgJiYgbW9kZSkgPyBgIGludGVncml0eT1cInNoYTUxMi0ke3NyaX1cIiBjcm9zc29yaWdpbj1cIiR7bW9kZX1cImAgOiAnJztcblxuZXhwb3J0IGNvbnN0IGhlYWRUZW1wbGF0ZSA9ICh7XG4gIGNzcyxcbiAgaHRtbEF0dHJpYnV0ZXMsXG4gIGJ1bmRsZWRKc0Nzc1VybFJld3JpdGVIb29rLFxuICBzcmlNb2RlLFxuICBoZWFkLFxuICBkeW5hbWljSGVhZCxcbn0pID0+IHtcbiAgdmFyIGhlYWRTZWN0aW9ucyA9IGhlYWQuc3BsaXQoLzxtZXRlb3ItYnVuZGxlZC1jc3NbXjw+XSo+LywgMik7XG4gIHZhciBjc3NCdW5kbGUgPSBbLi4uKGNzcyB8fCBbXSkubWFwKGZpbGUgPT5cbiAgICB0ZW1wbGF0ZSgnICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgY2xhc3M9XCJfX21ldGVvci1jc3NfX1wiIGhyZWY9XCI8JS0gaHJlZiAlPlwiPCU9IHNyaSAlPj4nKSh7XG4gICAgICBocmVmOiBidW5kbGVkSnNDc3NVcmxSZXdyaXRlSG9vayhmaWxlLnVybCksXG4gICAgICBzcmk6IHNyaShmaWxlLnNyaSwgc3JpTW9kZSksXG4gICAgfSlcbiAgKV0uam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIFtcbiAgICAnPGh0bWwnICsgT2JqZWN0LmtleXMoaHRtbEF0dHJpYnV0ZXMgfHwge30pLm1hcChcbiAgICAgIGtleSA9PiB0ZW1wbGF0ZSgnIDwlPSBhdHRyTmFtZSAlPj1cIjwlLSBhdHRyVmFsdWUgJT5cIicpKHtcbiAgICAgICAgYXR0ck5hbWU6IGtleSxcbiAgICAgICAgYXR0clZhbHVlOiBodG1sQXR0cmlidXRlc1trZXldLFxuICAgICAgfSlcbiAgICApLmpvaW4oJycpICsgJz4nLFxuXG4gICAgJzxoZWFkPicsXG5cbiAgICAoaGVhZFNlY3Rpb25zLmxlbmd0aCA9PT0gMSlcbiAgICAgID8gW2Nzc0J1bmRsZSwgaGVhZFNlY3Rpb25zWzBdXS5qb2luKCdcXG4nKVxuICAgICAgOiBbaGVhZFNlY3Rpb25zWzBdLCBjc3NCdW5kbGUsIGhlYWRTZWN0aW9uc1sxXV0uam9pbignXFxuJyksXG5cbiAgICBkeW5hbWljSGVhZCxcbiAgICAnPC9oZWFkPicsXG4gICAgJzxib2R5PicsXG4gIF0uam9pbignXFxuJyk7XG59O1xuXG4vLyBUZW1wbGF0ZSBmdW5jdGlvbiBmb3IgcmVuZGVyaW5nIHRoZSBib2lsZXJwbGF0ZSBodG1sIGZvciBicm93c2Vyc1xuZXhwb3J0IGNvbnN0IGNsb3NlVGVtcGxhdGUgPSAoe1xuICBtZXRlb3JSdW50aW1lQ29uZmlnLFxuICByb290VXJsUGF0aFByZWZpeCxcbiAgaW5saW5lU2NyaXB0c0FsbG93ZWQsXG4gIGpzLFxuICBhZGRpdGlvbmFsU3RhdGljSnMsXG4gIGJ1bmRsZWRKc0Nzc1VybFJld3JpdGVIb29rLFxuICBzcmlNb2RlLFxufSkgPT4gW1xuICAnJyxcbiAgaW5saW5lU2NyaXB0c0FsbG93ZWRcbiAgICA/IHRlbXBsYXRlKCcgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCg8JT0gY29uZiAlPikpPC9zY3JpcHQ+Jykoe1xuICAgICAgY29uZjogbWV0ZW9yUnVudGltZUNvbmZpZyxcbiAgICB9KVxuICAgIDogdGVtcGxhdGUoJyAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiPCUtIHNyYyAlPi9tZXRlb3JfcnVudGltZV9jb25maWcuanNcIj48L3NjcmlwdD4nKSh7XG4gICAgICBzcmM6IHJvb3RVcmxQYXRoUHJlZml4LFxuICAgIH0pLFxuICAnJyxcblxuICAuLi4oanMgfHwgW10pLm1hcChmaWxlID0+XG4gICAgdGVtcGxhdGUoJyAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiPCUtIHNyYyAlPlwiPCU9IHNyaSAlPj48L3NjcmlwdD4nKSh7XG4gICAgICBzcmM6IGJ1bmRsZWRKc0Nzc1VybFJld3JpdGVIb29rKGZpbGUudXJsKSxcbiAgICAgIHNyaTogc3JpKGZpbGUuc3JpLCBzcmlNb2RlKSxcbiAgICB9KVxuICApLFxuXG4gIC4uLihhZGRpdGlvbmFsU3RhdGljSnMgfHwgW10pLm1hcCgoeyBjb250ZW50cywgcGF0aG5hbWUgfSkgPT4gKFxuICAgIGlubGluZVNjcmlwdHNBbGxvd2VkXG4gICAgICA/IHRlbXBsYXRlKCcgIDxzY3JpcHQ+PCU9IGNvbnRlbnRzICU+PC9zY3JpcHQ+Jykoe1xuICAgICAgICBjb250ZW50cyxcbiAgICAgIH0pXG4gICAgICA6IHRlbXBsYXRlKCcgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cIjwlLSBzcmMgJT5cIj48L3NjcmlwdD4nKSh7XG4gICAgICAgIHNyYzogcm9vdFVybFBhdGhQcmVmaXggKyBwYXRobmFtZSxcbiAgICAgIH0pXG4gICkpLFxuXG4gICcnLFxuICAnJyxcbiAgJzwvYm9keT4nLFxuICAnPC9odG1sPidcbl0uam9pbignXFxuJyk7XG4iLCJpbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZSc7XG5cbi8vIFRlbXBsYXRlIGZ1bmN0aW9uIGZvciByZW5kZXJpbmcgdGhlIGJvaWxlcnBsYXRlIGh0bWwgZm9yIGNvcmRvdmFcbmV4cG9ydCBjb25zdCBoZWFkVGVtcGxhdGUgPSAoe1xuICBtZXRlb3JSdW50aW1lQ29uZmlnLFxuICByb290VXJsUGF0aFByZWZpeCxcbiAgaW5saW5lU2NyaXB0c0FsbG93ZWQsXG4gIGNzcyxcbiAganMsXG4gIGFkZGl0aW9uYWxTdGF0aWNKcyxcbiAgaHRtbEF0dHJpYnV0ZXMsXG4gIGJ1bmRsZWRKc0Nzc1VybFJld3JpdGVIb29rLFxuICBoZWFkLFxuICBkeW5hbWljSGVhZCxcbn0pID0+IHtcbiAgdmFyIGhlYWRTZWN0aW9ucyA9IGhlYWQuc3BsaXQoLzxtZXRlb3ItYnVuZGxlZC1jc3NbXjw+XSo+LywgMik7XG4gIHZhciBjc3NCdW5kbGUgPSBbXG4gICAgLy8gV2UgYXJlIGV4cGxpY2l0bHkgbm90IHVzaW5nIGJ1bmRsZWRKc0Nzc1VybFJld3JpdGVIb29rOiBpbiBjb3Jkb3ZhIHdlIHNlcnZlIGFzc2V0cyB1cCBkaXJlY3RseSBmcm9tIGRpc2ssIHNvIHJld3JpdGluZyB0aGUgVVJMIGRvZXMgbm90IG1ha2Ugc2Vuc2VcbiAgICAuLi4oY3NzIHx8IFtdKS5tYXAoZmlsZSA9PlxuICAgICAgdGVtcGxhdGUoJyAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGNsYXNzPVwiX19tZXRlb3ItY3NzX19cIiBocmVmPVwiPCUtIGhyZWYgJT5cIj4nKSh7XG4gICAgICAgIGhyZWY6IGZpbGUudXJsLFxuICAgICAgfSlcbiAgKV0uam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIFtcbiAgICAnPGh0bWw+JyxcbiAgICAnPGhlYWQ+JyxcbiAgICAnICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj4nLFxuICAgICcgIDxtZXRhIG5hbWU9XCJmb3JtYXQtZGV0ZWN0aW9uXCIgY29udGVudD1cInRlbGVwaG9uZT1ub1wiPicsXG4gICAgJyAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cInVzZXItc2NhbGFibGU9bm8sIGluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xLCBtaW5pbXVtLXNjYWxlPTEsIHdpZHRoPWRldmljZS13aWR0aCwgaGVpZ2h0PWRldmljZS1oZWlnaHQsIHZpZXdwb3J0LWZpdD1jb3ZlclwiPicsXG4gICAgJyAgPG1ldGEgbmFtZT1cIm1zYXBwbGljYXRpb24tdGFwLWhpZ2hsaWdodFwiIGNvbnRlbnQ9XCJub1wiPicsXG4gICAgJyAgPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5XCIgY29udGVudD1cImRlZmF1bHQtc3JjICogZ2FwOiBkYXRhOiBibG9iOiBcXCd1bnNhZmUtaW5saW5lXFwnIFxcJ3Vuc2FmZS1ldmFsXFwnIHdzOiB3c3M6O1wiPicsXG5cbiAgKGhlYWRTZWN0aW9ucy5sZW5ndGggPT09IDEpXG4gICAgPyBbY3NzQnVuZGxlLCBoZWFkU2VjdGlvbnNbMF1dLmpvaW4oJ1xcbicpXG4gICAgOiBbaGVhZFNlY3Rpb25zWzBdLCBjc3NCdW5kbGUsIGhlYWRTZWN0aW9uc1sxXV0uam9pbignXFxuJyksXG5cbiAgICAnICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4nLFxuICAgIHRlbXBsYXRlKCcgICAgX19tZXRlb3JfcnVudGltZV9jb25maWdfXyA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KDwlPSBjb25mICU+KSk7Jykoe1xuICAgICAgY29uZjogbWV0ZW9yUnVudGltZUNvbmZpZyxcbiAgICB9KSxcbiAgICAnICAgIGlmICgvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsnLFxuICAgIC8vIFdoZW4gQW5kcm9pZCBhcHAgaXMgZW11bGF0ZWQsIGl0IGNhbm5vdCBjb25uZWN0IHRvIGxvY2FsaG9zdCxcbiAgICAvLyBpbnN0ZWFkIGl0IHNob3VsZCBjb25uZWN0IHRvIDEwLjAuMi4yXG4gICAgLy8gKHVubGVzcyB3ZVxcJ3JlIHVzaW5nIGFuIGh0dHAgcHJveHk7IHRoZW4gaXQgd29ya3MhKVxuICAgICcgICAgICBpZiAoIV9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uaHR0cFByb3h5UG9ydCkgeycsXG4gICAgJyAgICAgICAgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTCA9IChfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMIHx8IFxcJ1xcJykucmVwbGFjZSgvbG9jYWxob3N0L2ksIFxcJzEwLjAuMi4yXFwnKTsnLFxuICAgICcgICAgICAgIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uRERQX0RFRkFVTFRfQ09OTkVDVElPTl9VUkwgPSAoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ERFBfREVGQVVMVF9DT05ORUNUSU9OX1VSTCB8fCBcXCdcXCcpLnJlcGxhY2UoL2xvY2FsaG9zdC9pLCBcXCcxMC4wLjIuMlxcJyk7JyxcbiAgICAnICAgICAgfScsXG4gICAgJyAgICB9JyxcbiAgICAnICA8L3NjcmlwdD4nLFxuICAgICcnLFxuICAgICcgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cIi9jb3Jkb3ZhLmpzXCI+PC9zY3JpcHQ+JyxcblxuICAgIC4uLihqcyB8fCBbXSkubWFwKGZpbGUgPT5cbiAgICAgIHRlbXBsYXRlKCcgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cIjwlLSBzcmMgJT5cIj48L3NjcmlwdD4nKSh7XG4gICAgICAgIHNyYzogZmlsZS51cmwsXG4gICAgICB9KVxuICAgICksXG5cbiAgICAuLi4oYWRkaXRpb25hbFN0YXRpY0pzIHx8IFtdKS5tYXAoKHsgY29udGVudHMsIHBhdGhuYW1lIH0pID0+IChcbiAgICAgIGlubGluZVNjcmlwdHNBbGxvd2VkXG4gICAgICAgID8gdGVtcGxhdGUoJyAgPHNjcmlwdD48JT0gY29udGVudHMgJT48L3NjcmlwdD4nKSh7XG4gICAgICAgICAgY29udGVudHMsXG4gICAgICAgIH0pXG4gICAgICAgIDogdGVtcGxhdGUoJyAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiPCUtIHNyYyAlPlwiPjwvc2NyaXB0PicpKHtcbiAgICAgICAgICBzcmM6IHJvb3RVcmxQYXRoUHJlZml4ICsgcGF0aG5hbWVcbiAgICAgICAgfSlcbiAgICApKSxcbiAgICAnJyxcbiAgICAnPC9oZWFkPicsXG4gICAgJycsXG4gICAgJzxib2R5PicsXG4gIF0uam9pbignXFxuJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VUZW1wbGF0ZSgpIHtcbiAgcmV0dXJuIFwiPC9ib2R5PlxcbjwvaHRtbD5cIjtcbn1cbiIsImltcG9ydCB7IF8gfSBmcm9tICdtZXRlb3IvdW5kZXJzY29yZSc7XG5cbi8vIEFzIGlkZW50aWZpZWQgaW4gaXNzdWUgIzkxNDksIHdoZW4gYW4gYXBwbGljYXRpb24gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0XG4vLyBfLnRlbXBsYXRlIHNldHRpbmdzIHVzaW5nIF8udGVtcGxhdGVTZXR0aW5ncywgdGhvc2UgbmV3IHNldHRpbmdzIGFyZVxuLy8gdXNlZCBhbnl3aGVyZSBfLnRlbXBsYXRlIGlzIHVzZWQsIGluY2x1ZGluZyB3aXRoaW4gdGhlXG4vLyBib2lsZXJwbGF0ZS1nZW5lcmF0b3IuIFRvIGhhbmRsZSB0aGlzLCBfLnRlbXBsYXRlIHNldHRpbmdzIHRoYXQgaGF2ZVxuLy8gYmVlbiB2ZXJpZmllZCB0byB3b3JrIGFyZSBvdmVycmlkZGVuIGhlcmUgb24gZWFjaCBfLnRlbXBsYXRlIGNhbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZXh0KSB7XG4gIHJldHVybiBfLnRlbXBsYXRlKHRleHQsIG51bGwsIHtcbiAgICBldmFsdWF0ZSAgICA6IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgaW50ZXJwb2xhdGUgOiAvPCU9KFtcXHNcXFNdKz8pJT4vZyxcbiAgICBlc2NhcGUgICAgICA6IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICB9KTtcbn07XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/boilerplate-generator/generator.js","meteor://💻app/packages/boilerplate-generator/template-web.browser.js","meteor://💻app/packages/boilerplate-generator/template-web.cordova.js","meteor://💻app/packages/boilerplate-generator/template.js"],"names":["module","export","Boilerplate","readFile","link","v","createStream","create","WebBrowserTemplate","default","WebCordovaTemplate","readUtf8FileSync","filename","Meteor","wrapAsync","identity","value","appendToStream","chunk","stream","append","Buffer","from","isBuffer","read","shouldWarnAboutToHTMLDeprecation","isProduction","constructor","arch","manifest","options","headTemplate","closeTemplate","getTemplate","baseData","_generateBoilerplateFromManifest","toHTML","extraData","console","error","trace","toHTMLAsync","await","Promise","resolve","reject","toHTMLStream","chunks","on","push","concat","toString","Error","data","start","body","dynamicBody","end","response","urlMapper","pathMapper","baseDataExtension","inline","boilerplateBaseData","css","js","head","meteorManifest","JSON","stringify","forEach","item","urlPath","url","itemObj","scriptContent","path","sri","type","where","startsWith","prefix","split","join","template","mode","htmlAttributes","bundledJsCssUrlRewriteHook","sriMode","dynamicHead","headSections","cssBundle","map","file","href","Object","keys","key","attrName","attrValue","length","meteorRuntimeConfig","rootUrlPathPrefix","inlineScriptsAllowed","additionalStaticJs","conf","src","contents","pathname","_","text","evaluate","interpolate","escape"],"mappings":"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","file":"/packages/boilerplate-generator.js","sourcesContent":["import { readFile } from 'fs';\nimport { create as createStream } from \"combined-stream2\";\n\nimport WebBrowserTemplate from './template-web.browser';\nimport WebCordovaTemplate from './template-web.cordova';\n\n// Copied from webapp_server\nconst readUtf8FileSync = filename => Meteor.wrapAsync(readFile)(filename, 'utf8');\n\nconst identity = value => value;\n\nfunction appendToStream(chunk, stream) {\n if (typeof chunk === \"string\") {\n stream.append(Buffer.from(chunk, \"utf8\"));\n } else if (Buffer.isBuffer(chunk) ||\n typeof chunk.read === \"function\") {\n stream.append(chunk);\n }\n}\n\nlet shouldWarnAboutToHTMLDeprecation = ! Meteor.isProduction;\n\nexport class Boilerplate {\n constructor(arch, manifest, options = {}) {\n const { headTemplate, closeTemplate } = getTemplate(arch);\n this.headTemplate = headTemplate;\n this.closeTemplate = closeTemplate;\n this.baseData = null;\n\n this._generateBoilerplateFromManifest(\n manifest,\n options\n );\n }\n\n toHTML(extraData) {\n if (shouldWarnAboutToHTMLDeprecation) {\n shouldWarnAboutToHTMLDeprecation = false;\n console.error(\n \"The Boilerplate#toHTML method has been deprecated. \" +\n \"Please use Boilerplate#toHTMLStream instead.\"\n );\n console.trace();\n }\n\n // Calling .await() requires a Fiber.\n return this.toHTMLAsync(extraData).await();\n }\n\n // Returns a Promise that resolves to a string of HTML.\n toHTMLAsync(extraData) {\n return new Promise((resolve, reject) => {\n const stream = this.toHTMLStream(extraData);\n const chunks = [];\n stream.on(\"data\", chunk => chunks.push(chunk));\n stream.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n stream.on(\"error\", reject);\n });\n }\n\n // The 'extraData' argument can be used to extend 'self.baseData'. Its\n // purpose is to allow you to specify data that you might not know at\n // the time that you construct the Boilerplate object. (e.g. it is used\n // by 'webapp' to specify data that is only known at request-time).\n // this returns a stream\n toHTMLStream(extraData) {\n if (!this.baseData || !this.headTemplate || !this.closeTemplate) {\n throw new Error('Boilerplate did not instantiate correctly.');\n }\n\n const data = {...this.baseData, ...extraData};\n const start = \"<!DOCTYPE html>\\n\" + this.headTemplate(data);\n\n const { body, dynamicBody } = data;\n\n const end = this.closeTemplate(data);\n const response = createStream();\n\n appendToStream(start, response);\n\n if (body) {\n appendToStream(body, response);\n }\n\n if (dynamicBody) {\n appendToStream(dynamicBody, response);\n }\n\n appendToStream(end, response);\n\n return response;\n }\n\n // XXX Exported to allow client-side only changes to rebuild the boilerplate\n // without requiring a full server restart.\n // Produces an HTML string with given manifest and boilerplateSource.\n // Optionally takes urlMapper in case urls from manifest need to be prefixed\n // or rewritten.\n // Optionally takes pathMapper for resolving relative file system paths.\n // Optionally allows to override fields of the data context.\n _generateBoilerplateFromManifest(manifest, {\n urlMapper = identity,\n pathMapper = identity,\n baseDataExtension,\n inline,\n } = {}) {\n\n const boilerplateBaseData = {\n css: [],\n js: [],\n head: '',\n body: '',\n meteorManifest: JSON.stringify(manifest),\n ...baseDataExtension,\n };\n\n manifest.forEach(item => {\n const urlPath = urlMapper(item.url);\n const itemObj = { url: urlPath };\n\n if (inline) {\n itemObj.scriptContent = readUtf8FileSync(\n pathMapper(item.path));\n itemObj.inline = true;\n } else if (item.sri) {\n itemObj.sri = item.sri;\n }\n\n if (item.type === 'css' && item.where === 'client') {\n boilerplateBaseData.css.push(itemObj);\n }\n\n if (item.type === 'js' && item.where === 'client' &&\n // Dynamic JS modules should not be loaded eagerly in the\n // initial HTML of the app.\n !item.path.startsWith('dynamic/')) {\n boilerplateBaseData.js.push(itemObj);\n }\n\n if (item.type === 'head') {\n boilerplateBaseData.head =\n readUtf8FileSync(pathMapper(item.path));\n }\n\n if (item.type === 'body') {\n boilerplateBaseData.body =\n readUtf8FileSync(pathMapper(item.path));\n }\n });\n\n this.baseData = boilerplateBaseData;\n }\n};\n\n// Returns a template function that, when called, produces the boilerplate\n// html as a string.\nfunction getTemplate(arch) {\n const prefix = arch.split(\".\", 2).join(\".\");\n\n if (prefix === \"web.browser\") {\n return WebBrowserTemplate;\n }\n\n if (prefix === \"web.cordova\") {\n return WebCordovaTemplate;\n }\n\n throw new Error(\"Unsupported arch: \" + arch);\n}\n","import template from './template';\n\nconst sri = (sri, mode) =>\n (sri && mode) ? ` integrity=\"sha512-${sri}\" crossorigin=\"${mode}\"` : '';\n\nexport const headTemplate = ({\n css,\n htmlAttributes,\n bundledJsCssUrlRewriteHook,\n sriMode,\n head,\n dynamicHead,\n}) => {\n var headSections = head.split(/<meteor-bundled-css[^<>]*>/, 2);\n var cssBundle = [...(css || []).map(file =>\n template(' <link rel=\"stylesheet\" type=\"text/css\" class=\"__meteor-css__\" href=\"<%- href %>\"<%= sri %>>')({\n href: bundledJsCssUrlRewriteHook(file.url),\n sri: sri(file.sri, sriMode),\n })\n )].join('\\n');\n\n return [\n '<html' + Object.keys(htmlAttributes || {}).map(\n key => template(' <%= attrName %>=\"<%- attrValue %>\"')({\n attrName: key,\n attrValue: htmlAttributes[key],\n })\n ).join('') + '>',\n\n '<head>',\n\n (headSections.length === 1)\n ? [cssBundle, headSections[0]].join('\\n')\n : [headSections[0], cssBundle, headSections[1]].join('\\n'),\n\n dynamicHead,\n '</head>',\n '<body>',\n ].join('\\n');\n};\n\n// Template function for rendering the boilerplate html for browsers\nexport const closeTemplate = ({\n meteorRuntimeConfig,\n rootUrlPathPrefix,\n inlineScriptsAllowed,\n js,\n additionalStaticJs,\n bundledJsCssUrlRewriteHook,\n sriMode,\n}) => [\n '',\n inlineScriptsAllowed\n ? template(' <script type=\"text/javascript\">__meteor_runtime_config__ = JSON.parse(decodeURIComponent(<%= conf %>))</script>')({\n conf: meteorRuntimeConfig,\n })\n : template(' <script type=\"text/javascript\" src=\"<%- src %>/meteor_runtime_config.js\"></script>')({\n src: rootUrlPathPrefix,\n }),\n '',\n\n ...(js || []).map(file =>\n template(' <script type=\"text/javascript\" src=\"<%- src %>\"<%= sri %>></script>')({\n src: bundledJsCssUrlRewriteHook(file.url),\n sri: sri(file.sri, sriMode),\n })\n ),\n\n ...(additionalStaticJs || []).map(({ contents, pathname }) => (\n inlineScriptsAllowed\n ? template(' <script><%= contents %></script>')({\n contents,\n })\n : template(' <script type=\"text/javascript\" src=\"<%- src %>\"></script>')({\n src: rootUrlPathPrefix + pathname,\n })\n )),\n\n '',\n '',\n '</body>',\n '</html>'\n].join('\\n');\n","import template from './template';\n\n// Template function for rendering the boilerplate html for cordova\nexport const headTemplate = ({\n meteorRuntimeConfig,\n rootUrlPathPrefix,\n inlineScriptsAllowed,\n css,\n js,\n additionalStaticJs,\n htmlAttributes,\n bundledJsCssUrlRewriteHook,\n head,\n dynamicHead,\n}) => {\n var headSections = head.split(/<meteor-bundled-css[^<>]*>/, 2);\n var cssBundle = [\n // We are explicitly not using bundledJsCssUrlRewriteHook: in cordova we serve assets up directly from disk, so rewriting the URL does not make sense\n ...(css || []).map(file =>\n template(' <link rel=\"stylesheet\" type=\"text/css\" class=\"__meteor-css__\" href=\"<%- href %>\">')({\n href: file.url,\n })\n )].join('\\n');\n\n return [\n '<html>',\n '<head>',\n ' <meta charset=\"utf-8\">',\n ' <meta name=\"format-detection\" content=\"telephone=no\">',\n ' <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, viewport-fit=cover\">',\n ' <meta name=\"msapplication-tap-highlight\" content=\"no\">',\n ' <meta http-equiv=\"Content-Security-Policy\" content=\"default-src * gap: data: blob: \\'unsafe-inline\\' \\'unsafe-eval\\' ws: wss:;\">',\n\n (headSections.length === 1)\n ? [cssBundle, headSections[0]].join('\\n')\n : [headSections[0], cssBundle, headSections[1]].join('\\n'),\n\n ' <script type=\"text/javascript\">',\n template(' __meteor_runtime_config__ = JSON.parse(decodeURIComponent(<%= conf %>));')({\n conf: meteorRuntimeConfig,\n }),\n ' if (/Android/i.test(navigator.userAgent)) {',\n // When Android app is emulated, it cannot connect to localhost,\n // instead it should connect to 10.0.2.2\n // (unless we\\'re using an http proxy; then it works!)\n ' if (!__meteor_runtime_config__.httpProxyPort) {',\n ' __meteor_runtime_config__.ROOT_URL = (__meteor_runtime_config__.ROOT_URL || \\'\\').replace(/localhost/i, \\'10.0.2.2\\');',\n ' __meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL = (__meteor_runtime_config__.DDP_DEFAULT_CONNECTION_URL || \\'\\').replace(/localhost/i, \\'10.0.2.2\\');',\n ' }',\n ' }',\n ' </script>',\n '',\n ' <script type=\"text/javascript\" src=\"/cordova.js\"></script>',\n\n ...(js || []).map(file =>\n template(' <script type=\"text/javascript\" src=\"<%- src %>\"></script>')({\n src: file.url,\n })\n ),\n\n ...(additionalStaticJs || []).map(({ contents, pathname }) => (\n inlineScriptsAllowed\n ? template(' <script><%= contents %></script>')({\n contents,\n })\n : template(' <script type=\"text/javascript\" src=\"<%- src %>\"></script>')({\n src: rootUrlPathPrefix + pathname\n })\n )),\n '',\n '</head>',\n '',\n '<body>',\n ].join('\\n');\n};\n\nexport function closeTemplate() {\n return \"</body>\\n</html>\";\n}\n","import { _ } from 'meteor/underscore';\n\n// As identified in issue #9149, when an application overrides the default\n// _.template settings using _.templateSettings, those new settings are\n// used anywhere _.template is used, including within the\n// boilerplate-generator. To handle this, _.template settings that have\n// been verified to work are overridden here on each _.template call.\nexport default function template(text) {\n return _.template(text, null, {\n evaluate : /<%([\\s\\S]+?)%>/g,\n interpolate : /<%=([\\s\\S]+?)%>/g,\n escape : /<%-([\\s\\S]+?)%>/g,\n });\n};\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var options, Hook;
var require = meteorInstall({"node_modules":{"meteor":{"callback-hook":{"hook.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/callback-hook/hook.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
Hook: () => Hook
});
// XXX This pattern is under development. Do not add more callsites
// using this package for now. See:
// https://meteor.hackpad.com/Design-proposal-Hooks-YxvgEW06q6f
//
// Encapsulates the pattern of registering callbacks on a hook.
//
// The `each` method of the hook calls its iterator function argument
// with each registered callback. This allows the hook to
// conditionally decide not to call the callback (if, for example, the
// observed object has been closed or terminated).
//
// By default, callbacks are bound with `Meteor.bindEnvironment`, so they will be
// called with the Meteor environment of the calling code that
// registered the callback. Override by passing { bindEnvironment: false }
// to the constructor.
//
// Registering a callback returns an object with a single `stop`
// method which unregisters the callback.
//
// The code is careful to allow a callback to be safely unregistered
// while the callbacks are being iterated over.
//
// If the hook is configured with the `exceptionHandler` option, the
// handler will be called if a called callback throws an exception.
// By default (if the exception handler doesn't itself throw an
// exception, or if the iterator function doesn't return a falsy value
// to terminate the calling of callbacks), the remaining callbacks
// will still be called.
//
// Alternatively, the `debugPrintExceptions` option can be specified
// as string describing the callback. On an exception the string and
// the exception will be printed to the console log with
// `Meteor._debug`, and the exception otherwise ignored.
//
// If an exception handler isn't specified, exceptions thrown in the
// callback will propagate up to the iterator function, and will
// terminate calling the remaining callbacks if not caught.
const hasOwn = Object.prototype.hasOwnProperty;
class Hook {
constructor(options) {
options = options || {};
this.nextCallbackId = 0;
this.callbacks = Object.create(null); // Whether to wrap callbacks with Meteor.bindEnvironment
this.bindEnvironment = true;
if (options.bindEnvironment === false) {
this.bindEnvironment = false;
}
if (options.exceptionHandler) {
this.exceptionHandler = options.exceptionHandler;
} else if (options.debugPrintExceptions) {
if (typeof options.debugPrintExceptions !== "string") {
throw new Error("Hook option debugPrintExceptions should be a string");
}
this.exceptionHandler = options.debugPrintExceptions;
}
}
register(callback) {
var exceptionHandler = this.exceptionHandler || function (exception) {
// Note: this relies on the undocumented fact that if bindEnvironment's
// onException throws, and you are invoking the callback either in the
// browser or from within a Fiber in Node, the exception is propagated.
throw exception;
};
if (this.bindEnvironment) {
callback = Meteor.bindEnvironment(callback, exceptionHandler);
} else {
callback = dontBindEnvironment(callback, exceptionHandler);
}
var id = this.nextCallbackId++;
this.callbacks[id] = callback;
return {
stop: () => {
delete this.callbacks[id];
}
};
} // For each registered callback, call the passed iterator function
// with the callback.
//
// The iterator function can choose whether or not to call the
// callback. (For example, it might not call the callback if the
// observed object has been closed or terminated).
//
// The iteration is stopped if the iterator function returns a falsy
// value or throws an exception.
//
each(iterator) {
// Invoking bindEnvironment'd callbacks outside of a Fiber in Node doesn't
// run them to completion (and exceptions thrown from onException are not
// propagated), so we need to be in a Fiber.
Meteor._nodeCodeMustBeInFiber();
var ids = Object.keys(this.callbacks);
for (var i = 0; i < ids.length; ++i) {
var id = ids[i]; // check to see if the callback was removed during iteration
if (hasOwn.call(this.callbacks, id)) {
var callback = this.callbacks[id];
if (!iterator(callback)) {
break;
}
}
}
}
}
// Copied from Meteor.bindEnvironment and removed all the env stuff.
function dontBindEnvironment(func, onException, _this) {
if (!onException || typeof onException === 'string') {
var description = onException || "callback of async function";
onException = function (error) {
Meteor._debug("Exception in " + description + ":", error && error.stack || error);
};
}
return function (...args) {
try {
var ret = func.apply(_this, args);
} catch (e) {
onException(e);
}
return ret;
};
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/callback-hook/hook.js");
/* Exports */
Package._define("callback-hook", exports, {
Hook: Hook
});
})();
//# sourceURL=meteor://💻app/packages/callback-hook.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvY2FsbGJhY2staG9vay9ob29rLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydCIsIkhvb2siLCJoYXNPd24iLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm5leHRDYWxsYmFja0lkIiwiY2FsbGJhY2tzIiwiY3JlYXRlIiwiYmluZEVudmlyb25tZW50IiwiZXhjZXB0aW9uSGFuZGxlciIsImRlYnVnUHJpbnRFeGNlcHRpb25zIiwiRXJyb3IiLCJyZWdpc3RlciIsImNhbGxiYWNrIiwiZXhjZXB0aW9uIiwiTWV0ZW9yIiwiZG9udEJpbmRFbnZpcm9ubWVudCIsImlkIiwic3RvcCIsImVhY2giLCJpdGVyYXRvciIsIl9ub2RlQ29kZU11c3RCZUluRmliZXIiLCJpZHMiLCJrZXlzIiwiaSIsImxlbmd0aCIsImNhbGwiLCJmdW5jIiwib25FeGNlcHRpb24iLCJfdGhpcyIsImRlc2NyaXB0aW9uIiwiZXJyb3IiLCJfZGVidWciLCJzdGFjayIsImFyZ3MiLCJyZXQiLCJhcHBseSIsImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ0MsTUFBSSxFQUFDLE1BQUlBO0FBQVYsQ0FBZDtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLGNBQWhDOztBQUVPLE1BQU1KLElBQU4sQ0FBVztBQUNoQkssYUFBVyxDQUFD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RSxLQUFmLElBQXdCRixLQUYxQjtBQUlELEtBTEQ7QUFNRDs7QUFFRCxTQUFPLFVBQVUsR0FBR0csSUFBYixFQUFtQjtBQUN4QixRQUFJO0FBQ0YsVUFBSUMsR0FBRyxHQUFHUixJQUFJLENBQUNTLEtBQUwsQ0FBV1AsS0FBWCxFQUFrQkssSUFBbEIsQ0FBVjtBQUNELEtBRkQsQ0FFRSxPQUFPRyxDQUFQLEVBQVU7QUFDVlQsaUJBQVcsQ0FBQ1MsQ0FBRCxDQUFYO0FBQ0Q7O0FBQ0QsV0FBT0YsR0FBUDtBQUNELEdBUEQ7QUFRRCxDIiwiZmlsZSI6Ii9wYWNrYWdlcy9jYWxsYmFjay1ob29rLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gWFhYIFRoaXMgcGF0dGVybiBpcyB1bmRlciBkZXZlbG9wbWVudC4gRG8gbm90IGFkZCBtb3JlIGNhbGxzaXRlc1xuLy8gdXNpbmcgdGhpcyBwYWNrYWdlIGZvciBub3cuIFNlZTpcbi8vIGh0dHBzOi8vbWV0ZW9yLmhhY2twYWQuY29tL0Rlc2lnbi1wcm9wb3NhbC1Ib29rcy1ZeHZnRVcwNnE2ZlxuLy9cbi8vIEVuY2Fwc3VsYXRlcyB0aGUgcGF0dGVybiBvZiByZWdpc3RlcmluZyBjYWxsYmFja3Mgb24gYSBob29rLlxuLy9cbi8vIFRoZSBgZWFjaGAgbWV0aG9kIG9mIHRoZSBob29rIGNhbGxzIGl0cyBpdGVyYXRvciBmdW5jdGlvbiBhcmd1bWVudFxuLy8gd2l0aCBlYWNoIHJlZ2lzdGVyZWQgY2FsbGJhY2suICBUaGlzIGFsbG93cyB0aGUgaG9vayB0b1xuLy8gY29uZGl0aW9uYWxseSBkZWNpZGUgbm90IHRvIGNhbGwgdGhlIGNhbGxiYWNrIChpZiwgZm9yIGV4YW1wbGUsIHRoZVxuLy8gb2JzZXJ2ZWQgb2JqZWN0IGhhcyBiZWVuIGNsb3NlZCBvciB0ZXJtaW5hdGVkKS5cbi8vXG4vLyBCeSBkZWZhdWx0LCBjYWxsYmFja3MgYXJlIGJvdW5kIHdpdGggYE1ldGVvci5iaW5kRW52aXJvbm1lbnRgLCBzbyB0aGV5IHdpbGwgYmVcbi8vIGNhbGxlZCB3aXRoIHRoZSBNZXRlb3IgZW52aXJvbm1lbnQgb2YgdGhlIGNhbGxpbmcgY29kZSB0aGF0XG4vLyByZWdpc3RlcmVkIHRoZSBjYWxsYmFjay4gT3ZlcnJpZGUgYnkgcGFzc2luZyB7IGJpbmRFbnZpcm9ubWVudDogZmFsc2UgfVxuLy8gdG8gdGhlIGNvbnN0cnVjdG9yLlxuLy9cbi8vIFJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBgc3RvcGBcbi8vIG1ldGhvZCB3aGljaCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4vL1xuLy8gVGhlIGNvZGUgaXMgY2FyZWZ1bCB0byBhbGxvdyBhIGNhbGxiYWNrIHRvIGJlIHNhZmVseSB1bnJlZ2lzdGVyZWRcbi8vIHdoaWxlIHRoZSBjYWxsYmFja3MgYXJlIGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4vL1xuLy8gSWYgdGhlIGhvb2sgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBgZXhjZXB0aW9uSGFuZGxlcmAgb3B0aW9uLCB0aGVcbi8vIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaWYgYSBjYWxsZWQgY2FsbGJhY2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbi8vIEJ5IGRlZmF1bHQgKGlmIHRoZSBleGNlcHRpb24gaGFuZGxlciBkb2Vzbid0IGl0c2VsZiB0aHJvdyBhblxuLy8gZXhjZXB0aW9uLCBvciBpZiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gYSBmYWxzeSB2YWx1ZVxuLy8gdG8gdGVybWluYXRlIHRoZSBjYWxsaW5nIG9mIGNhbGxiYWNrcyksIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzXG4vLyB3aWxsIHN0aWxsIGJlIGNhbGxlZC5cbi8vXG4vLyBBbHRlcm5hdGl2ZWx5LCB0aGUgYGRlYnVnUHJpbnRFeGNlcHRpb25zYCBvcHRpb24gY2FuIGJlIHNwZWNpZmllZFxuLy8gYXMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNhbGxiYWNrLiAgT24gYW4gZXhjZXB0aW9uIHRoZSBzdHJpbmcgYW5kXG4vLyB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBsb2cgd2l0aFxuLy8gYE1ldGVvci5fZGVidWdgLCBhbmQgdGhlIGV4Y2VwdGlvbiBvdGhlcndpc2UgaWdub3JlZC5cbi8vXG4vLyBJZiBhbiBleGNlcHRpb24gaGFuZGxlciBpc24ndCBzcGVjaWZpZWQsIGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZVxuLy8gY2FsbGJhY2sgd2lsbCBwcm9wYWdhdGUgdXAgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLCBhbmQgd2lsbFxuLy8gdGVybWluYXRlIGNhbGxpbmcgdGhlIHJlbWFpbmluZyBjYWxsYmFja3MgaWYgbm90IGNhdWdodC5cblxuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZXhwb3J0IGNsYXNzIEhvb2sge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5uZXh0Q2FsbGJhY2tJZCA9IDA7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIFdoZXRoZXIgdG8gd3JhcCBjYWxsYmFja3Mgd2l0aCBNZXRlb3IuYmluZEVudmlyb25tZW50XG4gICAgdGhpcy5iaW5kRW52aXJvbm1lbnQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zLmJpbmRFbnZpcm9ubWVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYmluZEVudmlyb25tZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhjZXB0aW9uSGFuZGxlcikge1xuICAgICAgdGhpcy5leGNlcHRpb25IYW5kbGVyID0gb3B0aW9ucy5leGNlcHRpb25IYW5kbGVyO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kZWJ1Z1ByaW50RXhjZXB0aW9ucykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlYnVnUHJpbnRFeGNlcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhvb2sgb3B0aW9uIGRlYnVnUHJpbnRFeGNlcHRpb25zIHNob3VsZCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IG9wdGlvbnMuZGVidWdQcmludEV4Y2VwdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgZXhjZXB0aW9uSGFuZGxlciA9IHRoaXMuZXhjZXB0aW9uSGFuZGxlciB8fCBmdW5jdGlvbiAoZXhjZXB0aW9uKSB7XG4gICAgICAvLyBOb3RlOiB0aGlzIHJlbGllcyBvbiB0aGUgdW5kb2N1bWVudGVkIGZhY3QgdGhhdCBpZiBiaW5kRW52aXJvbm1lbnQnc1xuICAgICAgLy8gb25FeGNlcHRpb24gdGhyb3dzLCBhbmQgeW91IGFyZSBpbnZva2luZyB0aGUgY2FsbGJhY2sgZWl0aGVyIGluIHRoZVxuICAgICAgLy8gYnJvd3NlciBvciBmcm9tIHdpdGhpbiBhIEZpYmVyIGluIE5vZGUsIHRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZC5cbiAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYmluZEVudmlyb25tZW50KSB7XG4gICAgICBjYWxsYmFjayA9IE1ldGVvci5iaW5kRW52aXJvbm1lbnQoY2FsbGJhY2ssIGV4Y2VwdGlvbkhhbmRsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IGRvbnRCaW5kRW52aXJvbm1lbnQoY2FsbGJhY2ssIGV4Y2VwdGlvbkhhbmRsZXIpO1xuICAgIH1cblxuICAgIHZhciBpZCA9IHRoaXMubmV4dENhbGxiYWNrSWQrKztcbiAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjaztcblxuICAgIHJldHVybiB7XG4gICAgICBzdG9wOiAoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZvciBlYWNoIHJlZ2lzdGVyZWQgY2FsbGJhY2ssIGNhbGwgdGhlIHBhc3NlZCBpdGVyYXRvciBmdW5jdGlvblxuICAvLyB3aXRoIHRoZSBjYWxsYmFjay5cbiAgLy9cbiAgLy8gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGNhbiBjaG9vc2Ugd2hldGhlciBvciBub3QgdG8gY2FsbCB0aGVcbiAgLy8gY2FsbGJhY2suICAoRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IG5vdCBjYWxsIHRoZSBjYWxsYmFjayBpZiB0aGVcbiAgLy8gb2JzZXJ2ZWQgb2JqZWN0IGhhcyBiZWVuIGNsb3NlZCBvciB0ZXJtaW5hdGVkKS5cbiAgLy9cbiAgLy8gVGhlIGl0ZXJhdGlvbiBpcyBzdG9wcGVkIGlmIHRoZSBpdGVyYXRvciBmdW5jdGlvbiByZXR1cm5zIGEgZmFsc3lcbiAgLy8gdmFsdWUgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgLy9cbiAgZWFjaChpdGVyYXRvcikge1xuICAgIC8vIEludm9raW5nIGJpbmRFbnZpcm9ubWVudCdkIGNhbGxiYWNrcyBvdXRzaWRlIG9mIGEgRmliZXIgaW4gTm9kZSBkb2Vzbid0XG4gICAgLy8gcnVuIHRoZW0gdG8gY29tcGxldGlvbiAoYW5kIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gb25FeGNlcHRpb24gYXJlIG5vdFxuICAgIC8vIHByb3BhZ2F0ZWQpLCBzbyB3ZSBuZWVkIHRvIGJlIGluIGEgRmliZXIuXG4gICAgTWV0ZW9yLl9ub2RlQ29kZU11c3RCZUluRmliZXIoKTtcblxuICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNhbGxiYWNrcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7ICBpIDwgaWRzLmxlbmd0aDsgICsraSkge1xuICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBjYWxsYmFjayB3YXMgcmVtb3ZlZCBkdXJpbmcgaXRlcmF0aW9uXG4gICAgICBpZiAoaGFzT3duLmNhbGwodGhpcy5jYWxsYmFja3MsIGlkKSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgIGlmICghIGl0ZXJhdG9yKGNhbGxiYWNrKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIENvcGllZCBmcm9tIE1ldGVvci5iaW5kRW52aXJvbm1lbnQgYW5kIHJlbW92ZWQgYWxsIHRoZSBlbnYgc3R1ZmYuXG5mdW5jdGlvbiBkb250QmluZEVudmlyb25tZW50KGZ1bmMsIG9uRXhjZXB0aW9uLCBfdGhpcykge1xuICBpZiAoIW9uRXhjZXB0aW9uIHx8IHR5cGVvZihvbkV4Y2VwdGlvbikgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gb25FeGNlcHRpb24gfHwgXCJjYWxsYmFjayBvZiBhc3luYyBmdW5jdGlvblwiO1xuICAgIG9uRXhjZXB0aW9uID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBNZXRlb3IuX2RlYnVnKFxuICAgICAgICBcIkV4Y2VwdGlvbiBpbiBcIiArIGRlc2NyaXB0aW9uICsgXCI6XCIsXG4gICAgICAgIGVycm9yICYmIGVycm9yLnN0YWNrIHx8IGVycm9yXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJldCA9IGZ1bmMuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9uRXhjZXB0aW9uKGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xufVxuIl19
{"version":3,"sources":["meteor://💻app/packages/callback-hook/hook.js"],"names":["module","export","Hook","hasOwn","Object","prototype","hasOwnProperty","constructor","options","nextCallbackId","callbacks","create","bindEnvironment","exceptionHandler","debugPrintExceptions","Error","register","callback","exception","Meteor","dontBindEnvironment","id","stop","each","iterator","_nodeCodeMustBeInFiber","ids","keys","i","length","call","func","onException","_this","description","error","_debug","stack","args","ret","apply","e"],"mappings":"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","file":"/packages/callback-hook.js","sourcesContent":["// XXX This pattern is under development. Do not add more callsites\n// using this package for now. See:\n// https://meteor.hackpad.com/Design-proposal-Hooks-YxvgEW06q6f\n//\n// Encapsulates the pattern of registering callbacks on a hook.\n//\n// The `each` method of the hook calls its iterator function argument\n// with each registered callback. This allows the hook to\n// conditionally decide not to call the callback (if, for example, the\n// observed object has been closed or terminated).\n//\n// By default, callbacks are bound with `Meteor.bindEnvironment`, so they will be\n// called with the Meteor environment of the calling code that\n// registered the callback. Override by passing { bindEnvironment: false }\n// to the constructor.\n//\n// Registering a callback returns an object with a single `stop`\n// method which unregisters the callback.\n//\n// The code is careful to allow a callback to be safely unregistered\n// while the callbacks are being iterated over.\n//\n// If the hook is configured with the `exceptionHandler` option, the\n// handler will be called if a called callback throws an exception.\n// By default (if the exception handler doesn't itself throw an\n// exception, or if the iterator function doesn't return a falsy value\n// to terminate the calling of callbacks), the remaining callbacks\n// will still be called.\n//\n// Alternatively, the `debugPrintExceptions` option can be specified\n// as string describing the callback. On an exception the string and\n// the exception will be printed to the console log with\n// `Meteor._debug`, and the exception otherwise ignored.\n//\n// If an exception handler isn't specified, exceptions thrown in the\n// callback will propagate up to the iterator function, and will\n// terminate calling the remaining callbacks if not caught.\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nexport class Hook {\n constructor(options) {\n options = options || {};\n this.nextCallbackId = 0;\n this.callbacks = Object.create(null);\n // Whether to wrap callbacks with Meteor.bindEnvironment\n this.bindEnvironment = true;\n if (options.bindEnvironment === false) {\n this.bindEnvironment = false;\n }\n\n if (options.exceptionHandler) {\n this.exceptionHandler = options.exceptionHandler;\n } else if (options.debugPrintExceptions) {\n if (typeof options.debugPrintExceptions !== \"string\") {\n throw new Error(\"Hook option debugPrintExceptions should be a string\");\n }\n this.exceptionHandler = options.debugPrintExceptions;\n }\n }\n\n register(callback) {\n var exceptionHandler = this.exceptionHandler || function (exception) {\n // Note: this relies on the undocumented fact that if bindEnvironment's\n // onException throws, and you are invoking the callback either in the\n // browser or from within a Fiber in Node, the exception is propagated.\n throw exception;\n };\n\n if (this.bindEnvironment) {\n callback = Meteor.bindEnvironment(callback, exceptionHandler);\n } else {\n callback = dontBindEnvironment(callback, exceptionHandler);\n }\n\n var id = this.nextCallbackId++;\n this.callbacks[id] = callback;\n\n return {\n stop: () => {\n delete this.callbacks[id];\n }\n };\n }\n\n // For each registered callback, call the passed iterator function\n // with the callback.\n //\n // The iterator function can choose whether or not to call the\n // callback. (For example, it might not call the callback if the\n // observed object has been closed or terminated).\n //\n // The iteration is stopped if the iterator function returns a falsy\n // value or throws an exception.\n //\n each(iterator) {\n // Invoking bindEnvironment'd callbacks outside of a Fiber in Node doesn't\n // run them to completion (and exceptions thrown from onException are not\n // propagated), so we need to be in a Fiber.\n Meteor._nodeCodeMustBeInFiber();\n\n var ids = Object.keys(this.callbacks);\n for (var i = 0; i < ids.length; ++i) {\n var id = ids[i];\n // check to see if the callback was removed during iteration\n if (hasOwn.call(this.callbacks, id)) {\n var callback = this.callbacks[id];\n if (! iterator(callback)) {\n break;\n }\n }\n }\n }\n}\n\n// Copied from Meteor.bindEnvironment and removed all the env stuff.\nfunction dontBindEnvironment(func, onException, _this) {\n if (!onException || typeof(onException) === 'string') {\n var description = onException || \"callback of async function\";\n onException = function (error) {\n Meteor._debug(\n \"Exception in \" + description + \":\",\n error && error.stack || error\n );\n };\n }\n\n return function (...args) {\n try {\n var ret = func.apply(_this, args);\n } catch (e) {\n onException(e);\n }\n return ret;\n };\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var EJSON = Package.ejson.EJSON;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var check, Match;
var require = meteorInstall({"node_modules":{"meteor":{"check":{"match.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/check/match.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
check: () => check,
Match: () => Match
});
let isPlainObject;
module.link("./isPlainObject", {
isPlainObject(v) {
isPlainObject = v;
}
}, 0);
// Things we explicitly do NOT support:
// - heterogenous arrays
const currentArgumentChecker = new Meteor.EnvironmentVariable();
const hasOwn = Object.prototype.hasOwnProperty;
/**
* @summary Check that a value matches a [pattern](#matchpatterns).
* If the value does not match the pattern, throw a `Match.Error`.
*
* Particularly useful to assert that arguments to a function have the right
* types and structure.
* @locus Anywhere
* @param {Any} value The value to check
* @param {MatchPattern} pattern The pattern to match `value` against
*/
function check(value, pattern) {
// Record that check got called, if somebody cared.
//
// We use getOrNullIfOutsideFiber so that it's OK to call check()
// from non-Fiber server contexts; the downside is that if you forget to
// bindEnvironment on some random callback in your method/publisher,
// it might not find the argumentChecker and you'll get an error about
// not checking an argument that it looks like you're checking (instead
// of just getting a "Node code must run in a Fiber" error).
const argChecker = currentArgumentChecker.getOrNullIfOutsideFiber();
if (argChecker) {
argChecker.checking(value);
}
const result = testSubtree(value, pattern);
if (result) {
const err = new Match.Error(result.message);
if (result.path) {
err.message += ` in field ${result.path}`;
err.path = result.path;
}
throw err;
}
}
;
/**
* @namespace Match
* @summary The namespace for all Match types and methods.
*/
const Match = {
Optional: function (pattern) {
return new Optional(pattern);
},
Maybe: function (pattern) {
return new Maybe(pattern);
},
OneOf: function (...args) {
return new OneOf(args);
},
Any: ['__any__'],
Where: function (condition) {
return new Where(condition);
},
ObjectIncluding: function (pattern) {
return new ObjectIncluding(pattern);
},
ObjectWithValues: function (pattern) {
return new ObjectWithValues(pattern);
},
// Matches only signed 32-bit integers
Integer: ['__integer__'],
// XXX matchers should know how to describe themselves for errors
Error: Meteor.makeErrorType('Match.Error', function (msg) {
this.message = `Match error: ${msg}`; // The path of the value that failed to match. Initially empty, this gets
// populated by catching and rethrowing the exception as it goes back up the
// stack.
// E.g.: "vals[3].entity.created"
this.path = ''; // If this gets sent over DDP, don't give full internal details but at least
// provide something better than 500 Internal server error.
this.sanitizedError = new Meteor.Error(400, 'Match failed');
}),
// Tests to see if value matches pattern. Unlike check, it merely returns true
// or false (unless an error other than Match.Error was thrown). It does not
// interact with _failIfArgumentsAreNotAllChecked.
// XXX maybe also implement a Match.match which returns more information about
// failures but without using exception handling or doing what check()
// does with _failIfArgumentsAreNotAllChecked and Meteor.Error conversion
/**
* @summary Returns true if the value matches the pattern.
* @locus Anywhere
* @param {Any} value The value to check
* @param {MatchPattern} pattern The pattern to match `value` against
*/
test(value, pattern) {
return !testSubtree(value, pattern);
},
// Runs `f.apply(context, args)`. If check() is not called on every element of
// `args` (either directly or in the first level of an array), throws an error
// (using `description` in the message).
_failIfArgumentsAreNotAllChecked(f, context, args, description) {
const argChecker = new ArgumentChecker(args, description);
const result = currentArgumentChecker.withValue(argChecker, () => f.apply(context, args)); // If f didn't itself throw, make sure it checked all of its arguments.
argChecker.throwUnlessAllArgumentsHaveBeenChecked();
return result;
}
};
class Optional {
constructor(pattern) {
this.pattern = pattern;
}
}
class Maybe {
constructor(pattern) {
this.pattern = pattern;
}
}
class OneOf {
constructor(choices) {
if (!choices || choices.length === 0) {
throw new Error('Must provide at least one choice to Match.OneOf');
}
this.choices = choices;
}
}
class Where {
constructor(condition) {
this.condition = condition;
}
}
class ObjectIncluding {
constructor(pattern) {
this.pattern = pattern;
}
}
class ObjectWithValues {
constructor(pattern) {
this.pattern = pattern;
}
}
const stringForErrorMessage = (value, options = {}) => {
if (value === null) {
return 'null';
}
if (options.onlyShowType) {
return typeof value;
} // Your average non-object things. Saves from doing the try/catch below for.
if (typeof value !== 'object') {
return EJSON.stringify(value);
}
try {
// Find objects with circular references since EJSON doesn't support them yet (Issue #4778 + Unaccepted PR)
// If the native stringify is going to choke, EJSON.stringify is going to choke too.
JSON.stringify(value);
} catch (stringifyError) {
if (stringifyError.name === 'TypeError') {
return typeof value;
}
}
return EJSON.stringify(value);
};
const typeofChecks = [[String, 'string'], [Number, 'number'], [Boolean, 'boolean'], // While we don't allow undefined/function in EJSON, this is good for optional
// arguments with OneOf.
[Function, 'function'], [undefined, 'undefined']]; // Return `false` if it matches. Otherwise, return an object with a `message` and a `path` field.
const testSubtree = (value, pattern) => {
// Match anything!
if (pattern === Match.Any) {
return false;
} // Basic atomic types.
// Do not match boxed objects (e.g. String, Boolean)
for (let i = 0; i < typeofChecks.length; ++i) {
if (pattern === typeofChecks[i][0]) {
if (typeof value === typeofChecks[i][1]) {
return false;
}
return {
message: `Expected ${typeofChecks[i][1]}, got ${stringForErrorMessage(value, {
onlyShowType: true
})}`,
path: ''
};
}
}
if (pattern === null) {
if (value === null) {
return false;
}
return {
message: `Expected null, got ${stringForErrorMessage(value)}`,
path: ''
};
} // Strings, numbers, and booleans match literally. Goes well with Match.OneOf.
if (typeof pattern === 'string' || typeof pattern === 'number' || typeof pattern === 'boolean') {
if (value === pattern) {
return false;
}
return {
message: `Expected ${pattern}, got ${stringForErrorMessage(value)}`,
path: ''
};
} // Match.Integer is special type encoded with array
if (pattern === Match.Integer) {
// There is no consistent and reliable way to check if variable is a 64-bit
// integer. One of the popular solutions is to get reminder of division by 1
// but this method fails on really large floats with big precision.
// E.g.: 1.348192308491824e+23 % 1 === 0 in V8
// Bitwise operators work consistantly but always cast variable to 32-bit
// signed integer according to JavaScript specs.
if (typeof value === 'number' && (value | 0) === value) {
return false;
}
return {
message: `Expected Integer, got ${stringForErrorMessage(value)}`,
path: ''
};
} // 'Object' is shorthand for Match.ObjectIncluding({});
if (pattern === Object) {
pattern = Match.ObjectIncluding({});
} // Array (checked AFTER Any, which is implemented as an Array).
if (pattern instanceof Array) {
if (pattern.length !== 1) {
return {
message: `Bad pattern: arrays must have one type element ${stringForErrorMessage(pattern)}`,
path: ''
};
}
if (!Array.isArray(value) && !isArguments(value)) {
return {
message: `Expected array, got ${stringForErrorMessage(value)}`,
path: ''
};
}
for (let i = 0, length = value.length; i < length; i++) {
const result = testSubtree(value[i], pattern[0]);
if (result) {
result.path = _prependPath(i, result.path);
return result;
}
}
return false;
} // Arbitrary validation checks. The condition can return false or throw a
// Match.Error (ie, it can internally use check()) to fail.
if (pattern instanceof Where) {
let result;
try {
result = pattern.condition(value);
} catch (err) {
if (!(err instanceof Match.Error)) {
throw err;
}
return {
message: err.message,
path: err.path
};
}
if (result) {
return false;
} // XXX this error is terrible
return {
message: 'Failed Match.Where validation',
path: ''
};
}
if (pattern instanceof Maybe) {
pattern = Match.OneOf(undefined, null, pattern.pattern);
} else if (pattern instanceof Optional) {
pattern = Match.OneOf(undefined, pattern.pattern);
}
if (pattern instanceof OneOf) {
for (let i = 0; i < pattern.choices.length; ++i) {
const result = testSubtree(value, pattern.choices[i]);
if (!result) {
// No error? Yay, return.
return false;
} // Match errors just mean try another choice.
} // XXX this error is terrible
return {
message: 'Failed Match.OneOf, Match.Maybe or Match.Optional validation',
path: ''
};
} // A function that isn't something we special-case is assumed to be a
// constructor.
if (pattern instanceof Function) {
if (value instanceof pattern) {
return false;
}
return {
message: `Expected ${pattern.name || 'particular constructor'}`,
path: ''
};
}
let unknownKeysAllowed = false;
let unknownKeyPattern;
if (pattern instanceof ObjectIncluding) {
unknownKeysAllowed = true;
pattern = pattern.pattern;
}
if (pattern instanceof ObjectWithValues) {
unknownKeysAllowed = true;
unknownKeyPattern = [pattern.pattern];
pattern = {}; // no required keys
}
if (typeof pattern !== 'object') {
return {
message: 'Bad pattern: unknown pattern type',
path: ''
};
} // An object, with required and optional keys. Note that this does NOT do
// structural matches against objects of special types that happen to match
// the pattern: this really needs to be a plain old {Object}!
if (typeof value !== 'object') {
return {
message: `Expected object, got ${typeof value}`,
path: ''
};
}
if (value === null) {
return {
message: `Expected object, got null`,
path: ''
};
}
if (!isPlainObject(value)) {
return {
message: `Expected plain object`,
path: ''
};
}
const requiredPatterns = Object.create(null);
const optionalPatterns = Object.create(null);
Object.keys(pattern).forEach(key => {
const subPattern = pattern[key];
if (subPattern instanceof Optional || subPattern instanceof Maybe) {
optionalPatterns[key] = subPattern.pattern;
} else {
requiredPatterns[key] = subPattern;
}
});
for (let key in Object(value)) {
const subValue = value[key];
if (hasOwn.call(requiredPatterns, key)) {
const result = testSubtree(subValue, requiredPatterns[key]);
if (result) {
result.path = _prependPath(key, result.path);
return result;
}
delete requiredPatterns[key];
} else if (hasOwn.call(optionalPatterns, key)) {
const result = testSubtree(subValue, optionalPatterns[key]);
if (result) {
result.path = _prependPath(key, result.path);
return result;
}
} else {
if (!unknownKeysAllowed) {
return {
message: 'Unknown key',
path: key
};
}
if (unknownKeyPattern) {
const result = testSubtree(subValue, unknownKeyPattern[0]);
if (result) {
result.path = _prependPath(key, result.path);
return result;
}
}
}
}
const keys = Object.keys(requiredPatterns);
if (keys.length) {
return {
message: `Missing key '${keys[0]}'`,
path: ''
};
}
};
class ArgumentChecker {
constructor(args, description) {
// Make a SHALLOW copy of the arguments. (We'll be doing identity checks
// against its contents.)
this.args = [...args]; // Since the common case will be to check arguments in order, and we splice
// out arguments when we check them, make it so we splice out from the end
// rather than the beginning.
this.args.reverse();
this.description = description;
}
checking(value) {
if (this._checkingOneValue(value)) {
return;
} // Allow check(arguments, [String]) or check(arguments.slice(1), [String])
// or check([foo, bar], [String]) to count... but only if value wasn't
// itself an argument.
if (Array.isArray(value) || isArguments(value)) {
Array.prototype.forEach.call(value, this._checkingOneValue.bind(this));
}
}
_checkingOneValue(value) {
for (let i = 0; i < this.args.length; ++i) {
// Is this value one of the arguments? (This can have a false positive if
// the argument is an interned primitive, but it's still a good enough
// check.)
// (NaN is not === to itself, so we have to check specially.)
if (value === this.args[i] || Number.isNaN(value) && Number.isNaN(this.args[i])) {
this.args.splice(i, 1);
return true;
}
}
return false;
}
throwUnlessAllArgumentsHaveBeenChecked() {
if (this.args.length > 0) throw new Error(`Did not check() all arguments during ${this.description}`);
}
}
const _jsKeywords = ['do', 'if', 'in', 'for', 'let', 'new', 'try', 'var', 'case', 'else', 'enum', 'eval', 'false', 'null', 'this', 'true', 'void', 'with', 'break', 'catch', 'class', 'const', 'super', 'throw', 'while', 'yield', 'delete', 'export', 'import', 'public', 'return', 'static', 'switch', 'typeof', 'default', 'extends', 'finally', 'package', 'private', 'continue', 'debugger', 'function', 'arguments', 'interface', 'protected', 'implements', 'instanceof']; // Assumes the base of path is already escaped properly
// returns key + base
const _prependPath = (key, base) => {
if (typeof key === 'number' || key.match(/^[0-9]+$/)) {
key = `[${key}]`;
} else if (!key.match(/^[a-z_$][0-9a-z_$]*$/i) || _jsKeywords.indexOf(key) >= 0) {
key = JSON.stringify([key]);
}
if (base && base[0] !== '[') {
return `${key}.${base}`;
}
return key + base;
};
const isObject = value => typeof value === 'object' && value !== null;
const baseIsArguments = item => isObject(item) && Object.prototype.toString.call(item) === '[object Arguments]';
const isArguments = baseIsArguments(function () {
return arguments;
}()) ? baseIsArguments : value => isObject(value) && typeof value.callee === 'function';
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"isPlainObject.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/check/isPlainObject.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
isPlainObject: () => isPlainObject
});
// Copy of jQuery.isPlainObject for the server side from jQuery v3.1.1.
const class2type = {};
const toString = class2type.toString;
const hasOwn = Object.prototype.hasOwnProperty;
const fnToString = hasOwn.toString;
const ObjectFunctionString = fnToString.call(Object);
const getProto = Object.getPrototypeOf;
const isPlainObject = obj => {
let proto;
let Ctor; // Detect obvious negatives
// Use toString instead of jQuery.type to catch host objects
if (!obj || toString.call(obj) !== '[object Object]') {
return false;
}
proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain
if (!proto) {
return true;
} // Objects with prototype are plain iff they were constructed by a global Object function
Ctor = hasOwn.call(proto, 'constructor') && proto.constructor;
return typeof Ctor === 'function' && fnToString.call(Ctor) === ObjectFunctionString;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/check/match.js");
/* Exports */
Package._define("check", exports, {
check: check,
Match: Match
});
})();
//# sourceURL=meteor://💻app/packages/check.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvY2hlY2svbWF0Y2guanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL2NoZWNrL2lzUGxhaW5PYmplY3QuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0IiwiY2hlY2siLCJNYXRjaCIsImlzUGxhaW5PYmplY3QiLCJsaW5rIiwidiIsImN1cnJlbnRBcmd1bWVudENoZWNrZXIiLCJNZXRlb3IiLCJFbnZpcm9ubWVudFZhcmlhYmxlIiwiaGFzT3duIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJ2YWx1ZSIsInBhdHRlcm4iLCJhcmdDaGVja2VyIiwiZ2V0T3JOdWxsSWZPdXRzaWRlRmliZXIiLCJjaGVja2luZyIsInJlc3VsdCIsInRlc3RTdWJ0cmVlIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwicGF0aCIsIk9wdGlvbmFsIiwiTWF5YmUiLCJPbmVPZiIsImFyZ3MiLCJBbnkiLCJXaGVyZSIsImNvbmRpdGlvbiIsIk9iamVjdEluY2x1ZGluZyIsIk9iamVjdFdpdGhWYWx1ZXMiLCJJbnRlZ2VyIiwibWFrZUVycm9yVHlwZSIsIm1zZyIsInNhbml0aXplZEVycm9yIiwidGVzdCIsIl9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkIiwiZiIsImNvbnRleHQiLCJkZXNjcmlwdGlvbiIsIkFyZ3VtZW50Q2hlY2tlciIsIndpdGhWYWx1ZSIsImFwcGx5IiwidGhyb3dVbmxlc3NBbGxBcmd1bWVudHNIYXZlQmVlbkNoZWNrZWQiLCJjb25zdHJ1Y3RvciIsImNob2ljZXMiLCJsZW5ndGgiLCJzdHJpbmdGb3JFcnJvck1lc3NhZ2UiLCJvcHRpb25zIiwib25seVNob3dUeXBlIiwiRUpTT04iLCJzdHJpbmdpZnkiLCJKU09OIiwic3RyaW5naWZ5RXJyb3IiLCJuYW1lIiwidHlwZW9mQ2hlY2tzIiwiU3RyaW5nIiwiTnVtYmVyIiwiQm9vbGVhbiIsIkZ1bmN0aW9uIiwidW5kZWZpbmVkIiwiaSIsIkFycmF5IiwiaXNBcnJheSIsImlzQXJndW1lbnRzIiwiX3ByZXBlbmRQYXRoIiwidW5rbm93bktleXNBbGxvd2VkIiwidW5rbm93bktleVBhdHRlcm4iLCJyZXF1aXJlZFBhdHRlcm5zIiwiY3JlYXRlIiwib3B0aW9uYWxQYXR0ZXJucyIsImtleXMiLCJmb3JFYWNoIiwia2V5Iiwic3ViUGF0dGVybiIsInN1YlZhbHVlIiwiY2FsbCIsInJldmVyc2UiLCJfY2hlY2tpbmdPbmVWYWx1ZSIsImJpbmQiLCJpc05hTiIsInNwbGljZSIsIl9qc0tleXdvcmRzIiwiYmFzZSIsIm1hdGNoIiwiaW5kZXhPZiIsImlzT2JqZWN0IiwiYmFzZUlzQXJndW1lbnRzIiwiaXRlbSIsInRvU3RyaW5nIiwiYXJndW1lbnRzIiwiY2FsbGVlIiwiY2xhc3MydHlwZSIsImZuVG9TdHJpbmciLCJPYmplY3RGdW5jdGlvblN0cmluZyIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJvYmoiLCJwcm90byIsIkN0b3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUNDLE9BQUssRUFBQyxNQUFJQSxLQUFYO0FBQWlCQyxPQUFLLEVBQUMsTUFBSUE7QUFBM0IsQ0FBZDtBQUFpRCxJQUFJQyxhQUFKO0FBQWtCSixNQUFNLENBQUNLLElBQVAsQ0FBWSxpQkFBWixFQUE4QjtBQUFDRCxlQUFhLENBQUNFLENBQUQsRUFBRztBQUFDRixpQkFBYSxHQUFDRSxDQUFkO0FBQWdCOztBQUFsQyxDQUE5QixFQUFrRSxDQUFsRTtBQUduRTtBQUNBO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSUMsTUFBTSxDQUFDQyxtQkFBWCxFQUEvQjtBQUNBLE1BQU1DLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxjQUFoQztBQUVBOzs7Ozs7Ozs7OztBQVVPLFNBQVNYLEtBQVQsQ0FBZVksS0FBZixFQUFzQkMsT0FBdEIsRUFBK0I7QUFD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QixDQUFkO0FBQUE7QUFFQSxNQUFNMkYsVUFBVSxHQUFHLEVBQW5CO0FBRUEsTUFBTUgsUUFBUSxHQUFHRyxVQUFVLENBQUNILFFBQTVCO0FBRUEsTUFBTWxGLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxjQUFoQztBQUVBLE1BQU1tRixVQUFVLEdBQUd0RixNQUFNLENBQUNrRixRQUExQjtBQUVBLE1BQU1LLG9CQUFvQixHQUFHRCxVQUFVLENBQUNqQixJQUFYLENBQWdCcEUsTUFBaEIsQ0FBN0I7QUFFQSxNQUFNdUYsUUFBUSxHQUFHdkYsTUFBTSxDQUFDd0YsY0FBeEI7O0FBRU8sTUFBTS9GLGFBQWEsR0FBR2dHLEdBQUcsSUFBSTtBQUNsQyxNQUFJQyxLQUFKO0FBQ0EsTUFBSUMsSUFBSixDQUZrQyxDQUlsQztBQUNBOztBQUNBLE1BQUksQ0FBQ0YsR0FBRCxJQUFRUixRQUFRLENBQUNiLElBQVQsQ0FBY3FCLEdBQWQsTUFBdUIsaUJBQW5DLEVBQXNEO0FBQ3BELFdBQU8sS0FBUDtBQUNEOztBQUVEQyxPQUFLLEdBQUdILFFBQVEsQ0FBQ0UsR0FBRCxDQUFoQixDQVZrQyxDQVlsQzs7QUFDQSxNQUFJLENBQUNDLEtBQUwsRUFBWTtBQUNWLFdBQU8sSUFBUDtBQUNELEdBZmlDLENBaUJsQzs7O0FBQ0FDLE1BQUksR0FBRzVGLE1BQU0sQ0FBQ3FFLElBQVAsQ0FBWXNCLEtBQVosRUFBbUIsYUFBbkIsS0FBcUNBLEtBQUssQ0FBQ3RELFdBQWxEO0FBQ0EsU0FBTyxPQUFPdUQsSUFBUCxLQUFnQixVQUFoQixJQUNMTixVQUFVLENBQUNqQixJQUFYLENBQWdCdUIsSUFBaEIsTUFBMEJMLG9CQUQ1QjtBQUVELENBckJNLEMiLCJmaWxlIjoiL3BhY2thZ2VzL2NoZWNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gWFhYIGRvY3NcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuXG4vLyBUaGluZ3Mgd2UgZXhwbGljaXRseSBkbyBOT1Qgc3VwcG9ydDpcbi8vICAgIC0gaGV0ZXJvZ2Vub3VzIGFycmF5c1xuXG5jb25zdCBjdXJyZW50QXJndW1lbnRDaGVja2VyID0gbmV3IE1ldGVvci5FbnZpcm9ubWVudFZhcmlhYmxlO1xuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBAc3VtbWFyeSBDaGVjayB0aGF0IGEgdmFsdWUgbWF0Y2hlcyBhIFtwYXR0ZXJuXSgjbWF0Y2hwYXR0ZXJucykuXG4gKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4sIHRocm93IGEgYE1hdGNoLkVycm9yYC5cbiAqXG4gKiBQYXJ0aWN1bGFybHkgdXNlZnVsIHRvIGFzc2VydCB0aGF0IGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGhhdmUgdGhlIHJpZ2h0XG4gKiB0eXBlcyBhbmQgc3RydWN0dXJlLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAcGFyYW0ge0FueX0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge01hdGNoUGF0dGVybn0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBgdmFsdWVgIGFnYWluc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrKHZhbHVlLCBwYXR0ZXJuKSB7XG4gIC8vIFJlY29yZCB0aGF0IGNoZWNrIGdvdCBjYWxsZWQsIGlmIHNvbWVib2R5IGNhcmVkLlxuICAvL1xuICAvLyBXZSB1c2UgZ2V0T3JOdWxsSWZPdXRzaWRlRmliZXIgc28gdGhhdCBpdCdzIE9LIHRvIGNhbGwgY2hlY2soKVxuICAvLyBmcm9tIG5vbi1GaWJlciBzZXJ2ZXIgY29udGV4dHM7IHRoZSBkb3duc2lkZSBpcyB0aGF0IGlmIHlvdSBmb3JnZXQgdG9cbiAgLy8gYmluZEVudmlyb25tZW50IG9uIHNvbWUgcmFuZG9tIGNhbGxiYWNrIGluIHlvdXIgbWV0aG9kL3B1Ymxpc2hlcixcbiAgLy8gaXQgbWlnaHQgbm90IGZpbmQgdGhlIGFyZ3VtZW50Q2hlY2tlciBhbmQgeW91J2xsIGdldCBhbiBlcnJvciBhYm91dFxuICAvLyBub3QgY2hlY2tpbmcgYW4gYXJndW1lbnQgdGhhdCBpdCBsb29rcyBsaWtlIHlvdSdyZSBjaGVja2luZyAoaW5zdGVhZFxuICAvLyBvZiBqdXN0IGdldHRpbmcgYSBcIk5vZGUgY29kZSBtdXN0IHJ1biBpbiBhIEZpYmVyXCIgZXJyb3IpLlxuICBjb25zdCBhcmdDaGVja2VyID0gY3VycmVudEFyZ3VtZW50Q2hlY2tlci5nZXRPck51bGxJZk91dHNpZGVGaWJlcigpO1xuICBpZiAoYXJnQ2hlY2tlcikge1xuICAgIGFyZ0NoZWNrZXIuY2hlY2tpbmcodmFsdWUpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gdGVzdFN1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uc3QgZXJyID0gbmV3IE1hdGNoLkVycm9yKHJlc3VsdC5tZXNzYWdlKTtcbiAgICBpZiAocmVzdWx0LnBhdGgpIHtcbiAgICAgIGVyci5tZXNzYWdlICs9IGAgaW4gZmllbGQgJHtyZXN1bHQucGF0aH1gO1xuICAgICAgZXJyLnBhdGggPSByZXN1bHQucGF0aDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07XG5cbi8qKlxuICogQG5hbWVzcGFjZSBNYXRjaFxuICogQHN1bW1hcnkgVGhlIG5hbWVzcGFjZSBmb3IgYWxsIE1hdGNoIHR5cGVzIGFuZCBtZXRob2RzLlxuICovXG5leHBvcnQgY29uc3QgTWF0Y2ggPSB7XG4gIE9wdGlvbmFsOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIG5ldyBPcHRpb25hbChwYXR0ZXJuKTtcbiAgfSxcblxuICBNYXliZTogZnVuY3Rpb24ocGF0dGVybikge1xuICAgIHJldHVybiBuZXcgTWF5YmUocGF0dGVybik7XG4gIH0sXG5cbiAgT25lT2Y6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IE9uZU9mKGFyZ3MpO1xuICB9LFxuXG4gIEFueTogWydfX2FueV9fJ10sXG4gIFdoZXJlOiBmdW5jdGlvbihjb25kaXRpb24pIHtcbiAgICByZXR1cm4gbmV3IFdoZXJlKGNvbmRpdGlvbik7XG4gIH0sXG5cbiAgT2JqZWN0SW5jbHVkaW5nOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RJbmNsdWRpbmcocGF0dGVybilcbiAgfSxcblxuICBPYmplY3RXaXRoVmFsdWVzOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RXaXRoVmFsdWVzKHBhdHRlcm4pO1xuICB9LFxuXG4gIC8vIE1hdGNoZXMgb25seSBzaWduZWQgMzItYml0IGludGVnZXJzXG4gIEludGVnZXI6IFsnX19pbnRlZ2VyX18nXSxcblxuICAvLyBYWFggbWF0Y2hlcnMgc2hvdWxkIGtub3cgaG93IHRvIGRlc2NyaWJlIHRoZW1zZWx2ZXMgZm9yIGVycm9yc1xuICBFcnJvcjogTWV0ZW9yLm1ha2VFcnJvclR5cGUoJ01hdGNoLkVycm9yJywgZnVuY3Rpb24gKG1zZykge1xuICAgIHRoaXMubWVzc2FnZSA9IGBNYXRjaCBlcnJvcjogJHttc2d9YDtcblxuICAgIC8vIFRoZSBwYXRoIG9mIHRoZSB2YWx1ZSB0aGF0IGZhaWxlZCB0byBtYXRjaC4gSW5pdGlhbGx5IGVtcHR5LCB0aGlzIGdldHNcbiAgICAvLyBwb3B1bGF0ZWQgYnkgY2F0Y2hpbmcgYW5kIHJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBhcyBpdCBnb2VzIGJhY2sgdXAgdGhlXG4gICAgLy8gc3RhY2suXG4gICAgLy8gRS5nLjogXCJ2YWxzWzNdLmVudGl0eS5jcmVhdGVkXCJcbiAgICB0aGlzLnBhdGggPSAnJztcblxuICAgIC8vIElmIHRoaXMgZ2V0cyBzZW50IG92ZXIgRERQLCBkb24ndCBnaXZlIGZ1bGwgaW50ZXJuYWwgZGV0YWlscyBidXQgYXQgbGVhc3RcbiAgICAvLyBwcm92aWRlIHNvbWV0aGluZyBiZXR0ZXIgdGhhbiA1MDAgSW50ZXJuYWwgc2VydmVyIGVycm9yLlxuICAgIHRoaXMuc2FuaXRpemVkRXJyb3IgPSBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ01hdGNoIGZhaWxlZCcpO1xuICB9KSxcblxuICAvLyBUZXN0cyB0byBzZWUgaWYgdmFsdWUgbWF0Y2hlcyBwYXR0ZXJuLiBVbmxpa2UgY2hlY2ssIGl0IG1lcmVseSByZXR1cm5zIHRydWVcbiAgLy8gb3IgZmFsc2UgKHVubGVzcyBhbiBlcnJvciBvdGhlciB0aGFuIE1hdGNoLkVycm9yIHdhcyB0aHJvd24pLiBJdCBkb2VzIG5vdFxuICAvLyBpbnRlcmFjdCB3aXRoIF9mYWlsSWZBcmd1bWVudHNBcmVOb3RBbGxDaGVja2VkLlxuICAvLyBYWFggbWF5YmUgYWxzbyBpbXBsZW1lbnQgYSBNYXRjaC5tYXRjaCB3aGljaCByZXR1cm5zIG1vcmUgaW5mb3JtYXRpb24gYWJvdXRcbiAgLy8gICAgIGZhaWx1cmVzIGJ1dCB3aXRob3V0IHVzaW5nIGV4Y2VwdGlvbiBoYW5kbGluZyBvciBkb2luZyB3aGF0IGNoZWNrKClcbiAgLy8gICAgIGRvZXMgd2l0aCBfZmFpbElmQXJndW1lbnRzQXJlTm90QWxsQ2hlY2tlZCBhbmQgTWV0ZW9yLkVycm9yIGNvbnZlcnNpb25cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBwYXR0ZXJuLlxuICAgKiBAbG9jdXMgQW55d2hlcmVcbiAgICogQHBhcmFtIHtBbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuICAgKiBAcGFyYW0ge01hdGNoUGF0dGVybn0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBgdmFsdWVgIGFnYWluc3RcbiAgICovXG4gIHRlc3QodmFsdWUsIHBhdHRlcm4pIHtcbiAgICByZXR1cm4gIXRlc3RTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuKTtcbiAgfSxcblxuICAvLyBSdW5zIGBmLmFwcGx5KGNvbnRleHQsIGFyZ3MpYC4gSWYgY2hlY2soKSBpcyBub3QgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2ZcbiAgLy8gYGFyZ3NgIChlaXRoZXIgZGlyZWN0bHkgb3IgaW4gdGhlIGZpcnN0IGxldmVsIG9mIGFuIGFycmF5KSwgdGhyb3dzIGFuIGVycm9yXG4gIC8vICh1c2luZyBgZGVzY3JpcHRpb25gIGluIHRoZSBtZXNzYWdlKS5cbiAgX2ZhaWxJZkFyZ3VtZW50c0FyZU5vdEFsbENoZWNrZWQoZiwgY29udGV4dCwgYXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBjb25zdCBhcmdDaGVja2VyID0gbmV3IEFyZ3VtZW50Q2hlY2tlcihhcmdzLCBkZXNjcmlwdGlvbik7XG4gICAgY29uc3QgcmVzdWx0ID0gY3VycmVudEFyZ3VtZW50Q2hlY2tlci53aXRoVmFsdWUoXG4gICAgICBhcmdDaGVja2VyLCBcbiAgICAgICgpID0+IGYuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICApO1xuXG4gICAgLy8gSWYgZiBkaWRuJ3QgaXRzZWxmIHRocm93LCBtYWtlIHN1cmUgaXQgY2hlY2tlZCBhbGwgb2YgaXRzIGFyZ3VtZW50cy5cbiAgICBhcmdDaGVja2VyLnRocm93VW5sZXNzQWxsQXJndW1lbnRzSGF2ZUJlZW5DaGVja2VkKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxuY2xhc3MgT3B0aW9uYWwge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxufVxuXG5jbGFzcyBNYXliZSB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG59XG5cbmNsYXNzIE9uZU9mIHtcbiAgY29uc3RydWN0b3IoY2hvaWNlcykge1xuICAgIGlmICghY2hvaWNlcyB8fCBjaG9pY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGNob2ljZSB0byBNYXRjaC5PbmVPZicpO1xuICAgIH1cblxuICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7XG4gIH1cbn1cblxuY2xhc3MgV2hlcmUge1xuICBjb25zdHJ1Y3Rvcihjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgfVxufVxuXG5jbGFzcyBPYmplY3RJbmNsdWRpbmcge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxufVxuXG5jbGFzcyBPYmplY3RXaXRoVmFsdWVzIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG4gIH1cbn1cblxuY29uc3Qgc3RyaW5nRm9yRXJyb3JNZXNzYWdlID0gKHZhbHVlLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgaWYgKCBvcHRpb25zLm9ubHlTaG93VHlwZSApIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlO1xuICB9XG5cbiAgLy8gWW91ciBhdmVyYWdlIG5vbi1vYmplY3QgdGhpbmdzLiAgU2F2ZXMgZnJvbSBkb2luZyB0aGUgdHJ5L2NhdGNoIGJlbG93IGZvci5cbiAgaWYgKCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICkge1xuICAgIHJldHVybiBFSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICB0cnkge1xuXG4gICAgLy8gRmluZCBvYmplY3RzIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcyBzaW5jZSBFSlNPTiBkb2Vzbid0IHN1cHBvcnQgdGhlbSB5ZXQgKElzc3VlICM0Nzc4ICsgVW5hY2NlcHRlZCBQUilcbiAgICAvLyBJZiB0aGUgbmF0aXZlIHN0cmluZ2lmeSBpcyBnb2luZyB0byBjaG9rZSwgRUpTT04uc3RyaW5naWZ5IGlzIGdvaW5nIHRvIGNob2tlIHRvby5cbiAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2ggKHN0cmluZ2lmeUVycm9yKSB7XG4gICAgaWYgKCBzdHJpbmdpZnlFcnJvci5uYW1lID09PSAnVHlwZUVycm9yJyApIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEVKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59O1xuXG5jb25zdCB0eXBlb2ZDaGVja3MgPSBbXG4gIFtTdHJpbmcsICdzdHJpbmcnXSxcbiAgW051bWJlciwgJ251bWJlciddLFxuICBbQm9vbGVhbiwgJ2Jvb2xlYW4nXSxcblxuICAvLyBXaGlsZSB3ZSBkb24ndCBhbGxvdyB1bmRlZmluZWQvZnVuY3Rpb24gaW4gRUpTT04sIHRoaXMgaXMgZ29vZCBmb3Igb3B0aW9uYWxcbiAgLy8gYXJndW1lbnRzIHdpdGggT25lT2YuXG4gIFtGdW5jdGlvbiwgJ2Z1bmN0aW9uJ10sXG4gIFt1bmRlZmluZWQsICd1bmRlZmluZWQnXSxcbl07XG5cbi8vIFJldHVybiBgZmFsc2VgIGlmIGl0IG1hdGNoZXMuIE90aGVyd2lzZSwgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGEgYG1lc3NhZ2VgIGFuZCBhIGBwYXRoYCBmaWVsZC5cbmNvbnN0IHRlc3RTdWJ0cmVlID0gKHZhbHVlLCBwYXR0ZXJuKSA9PiB7XG5cbiAgLy8gTWF0Y2ggYW55dGhpbmchXG4gIGlmIChwYXR0ZXJuID09PSBNYXRjaC5BbnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBhdG9taWMgdHlwZXMuXG4gIC8vIERvIG5vdCBtYXRjaCBib3hlZCBvYmplY3RzIChlLmcuIFN0cmluZywgQm9vbGVhbilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlb2ZDaGVja3MubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAocGF0dGVybiA9PT0gdHlwZW9mQ2hlY2tzW2ldWzBdKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSB0eXBlb2ZDaGVja3NbaV1bMV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHt0eXBlb2ZDaGVja3NbaV1bMV19LCBnb3QgJHtzdHJpbmdGb3JFcnJvck1lc3NhZ2UodmFsdWUsIHsgb25seVNob3dUeXBlOiB0cnVlIH0pfWAsXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF0dGVybiA9PT0gbnVsbCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgbnVsbCwgZ290ICR7c3RyaW5nRm9yRXJyb3JNZXNzYWdlKHZhbHVlKX1gLFxuICAgICAgcGF0aDogJycsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFN0cmluZ3MsIG51bWJlcnMsIGFuZCBib29sZWFucyBtYXRjaCBsaXRlcmFsbHkuIEdvZXMgd2VsbCB3aXRoIE1hdGNoLk9uZU9mLlxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXR0ZXJuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcGF0dGVybiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgaWYgKHZhbHVlID09PSBwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhdHRlcm59LCBnb3QgJHtzdHJpbmdGb3JFcnJvck1lc3NhZ2UodmFsdWUpfWAsXG4gICAgICBwYXRoOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gTWF0Y2guSW50ZWdlciBpcyBzcGVjaWFsIHR5cGUgZW5jb2RlZCB3aXRoIGFycmF5XG4gIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JbnRlZ2VyKSB7XG5cbiAgICAvLyBUaGVyZSBpcyBubyBjb25zaXN0ZW50IGFuZCByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYSA2NC1iaXRcbiAgICAvLyBpbnRlZ2VyLiBPbmUgb2YgdGhlIHBvcHVsYXIgc29sdXRpb25zIGlzIHRvIGdldCByZW1pbmRlciBvZiBkaXZpc2lvbiBieSAxXG4gICAgLy8gYnV0IHRoaXMgbWV0aG9kIGZhaWxzIG9uIHJlYWxseSBsYXJnZSBmbG9hdHMgd2l0aCBiaWcgcHJlY2lzaW9uLlxuICAgIC8vIEUuZy46IDEuMzQ4MTkyMzA4NDkxODI0ZSsyMyAlIDEgPT09IDAgaW4gVjhcbiAgICAvLyBCaXR3aXNlIG9wZXJhdG9ycyB3b3JrIGNvbnNpc3RhbnRseSBidXQgYWx3YXlzIGNhc3QgdmFyaWFibGUgdG8gMzItYml0XG4gICAgLy8gc2lnbmVkIGludGVnZXIgYWNjb3JkaW5nIHRvIEphdmFTY3JpcHQgc3BlY3MuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgKHZhbHVlIHwgMCkgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgSW50ZWdlciwgZ290ICR7c3RyaW5nRm9yRXJyb3JNZXNzYWdlKHZhbHVlKX1gLFxuICAgICAgcGF0aDogJycsXG4gICAgfTtcbiAgfVxuXG4gIC8vICdPYmplY3QnIGlzIHNob3J0aGFuZCBmb3IgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcbiAgaWYgKHBhdHRlcm4gPT09IE9iamVjdCkge1xuICAgIHBhdHRlcm4gPSBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe30pO1xuICB9XG5cbiAgLy8gQXJyYXkgKGNoZWNrZWQgQUZURVIgQW55LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhbiBBcnJheSkuXG4gIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBpZiAocGF0dGVybi5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGBCYWQgcGF0dGVybjogYXJyYXlzIG11c3QgaGF2ZSBvbmUgdHlwZSBlbGVtZW50ICR7c3RyaW5nRm9yRXJyb3JNZXNzYWdlKHBhdHRlcm4pfWAsXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmICFpc0FyZ3VtZW50cyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCBhcnJheSwgZ290ICR7c3RyaW5nRm9yRXJyb3JNZXNzYWdlKHZhbHVlKX1gLFxuICAgICAgICBwYXRoOiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXN0U3VidHJlZSh2YWx1ZVtpXSwgcGF0dGVyblswXSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wYXRoID0gX3ByZXBlbmRQYXRoKGksIHJlc3VsdC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQXJiaXRyYXJ5IHZhbGlkYXRpb24gY2hlY2tzLiBUaGUgY29uZGl0aW9uIGNhbiByZXR1cm4gZmFsc2Ugb3IgdGhyb3cgYVxuICAvLyBNYXRjaC5FcnJvciAoaWUsIGl0IGNhbiBpbnRlcm5hbGx5IHVzZSBjaGVjaygpKSB0byBmYWlsLlxuICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFdoZXJlKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gcGF0dGVybi5jb25kaXRpb24odmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIHBhdGg6IGVyci5wYXRoXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBYWFggdGhpcyBlcnJvciBpcyB0ZXJyaWJsZVxuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiAnRmFpbGVkIE1hdGNoLldoZXJlIHZhbGlkYXRpb24nLFxuICAgICAgcGF0aDogJycsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgTWF5YmUpIHtcbiAgICBwYXR0ZXJuID0gTWF0Y2guT25lT2YodW5kZWZpbmVkLCBudWxsLCBwYXR0ZXJuLnBhdHRlcm4pO1xuICB9IGVsc2UgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPcHRpb25hbCkge1xuICAgIHBhdHRlcm4gPSBNYXRjaC5PbmVPZih1bmRlZmluZWQsIHBhdHRlcm4ucGF0dGVybik7XG4gIH1cblxuICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9uZU9mKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuLmNob2ljZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuLmNob2ljZXNbaV0pO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcblxuICAgICAgICAvLyBObyBlcnJvcj8gWWF5LCByZXR1cm4uXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWF0Y2ggZXJyb3JzIGp1c3QgbWVhbiB0cnkgYW5vdGhlciBjaG9pY2UuXG4gICAgfVxuXG4gICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogJ0ZhaWxlZCBNYXRjaC5PbmVPZiwgTWF0Y2guTWF5YmUgb3IgTWF0Y2guT3B0aW9uYWwgdmFsaWRhdGlvbicsXG4gICAgICBwYXRoOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSBmdW5jdGlvbiB0aGF0IGlzbid0IHNvbWV0aGluZyB3ZSBzcGVjaWFsLWNhc2UgaXMgYXNzdW1lZCB0byBiZSBhXG4gIC8vIGNvbnN0cnVjdG9yLlxuICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXR0ZXJuLm5hbWUgfHwgJ3BhcnRpY3VsYXIgY29uc3RydWN0b3InfWAsXG4gICAgICBwYXRoOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHVua25vd25LZXlzQWxsb3dlZCA9IGZhbHNlO1xuICBsZXQgdW5rbm93bktleVBhdHRlcm47XG4gIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SW5jbHVkaW5nKSB7XG4gICAgdW5rbm93bktleXNBbGxvd2VkID0gdHJ1ZTtcbiAgICBwYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICB9XG5cbiAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RXaXRoVmFsdWVzKSB7XG4gICAgdW5rbm93bktleXNBbGxvd2VkID0gdHJ1ZTtcbiAgICB1bmtub3duS2V5UGF0dGVybiA9IFtwYXR0ZXJuLnBhdHRlcm5dO1xuICAgIHBhdHRlcm4gPSB7fTsgIC8vIG5vIHJlcXVpcmVkIGtleXNcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogJ0JhZCBwYXR0ZXJuOiB1bmtub3duIHBhdHRlcm4gdHlwZScsXG4gICAgICBwYXRoOiAnJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gQW4gb2JqZWN0LCB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBrZXlzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBkb1xuICAvLyBzdHJ1Y3R1cmFsIG1hdGNoZXMgYWdhaW5zdCBvYmplY3RzIG9mIHNwZWNpYWwgdHlwZXMgdGhhdCBoYXBwZW4gdG8gbWF0Y2hcbiAgLy8gdGhlIHBhdHRlcm46IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGEgcGxhaW4gb2xkIHtPYmplY3R9IVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgb2JqZWN0LCBnb3QgJHt0eXBlb2YgdmFsdWV9YCxcbiAgICAgIHBhdGg6ICcnLFxuICAgIH07XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogYEV4cGVjdGVkIG9iamVjdCwgZ290IG51bGxgLFxuICAgICAgcGF0aDogJycsXG4gICAgfTtcbiAgfVxuXG4gIGlmICghIGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCBwbGFpbiBvYmplY3RgLFxuICAgICAgcGF0aDogJycsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlcXVpcmVkUGF0dGVybnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCBvcHRpb25hbFBhdHRlcm5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBPYmplY3Qua2V5cyhwYXR0ZXJuKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3Qgc3ViUGF0dGVybiA9IHBhdHRlcm5ba2V5XTtcbiAgICBpZiAoc3ViUGF0dGVybiBpbnN0YW5jZW9mIE9wdGlvbmFsIHx8XG4gICAgICAgIHN1YlBhdHRlcm4gaW5zdGFuY2VvZiBNYXliZSkge1xuICAgICAgb3B0aW9uYWxQYXR0ZXJuc1trZXldID0gc3ViUGF0dGVybi5wYXR0ZXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1aXJlZFBhdHRlcm5zW2tleV0gPSBzdWJQYXR0ZXJuO1xuICAgIH1cbiAgfSk7XG5cbiAgZm9yIChsZXQga2V5IGluIE9iamVjdCh2YWx1ZSkpIHtcbiAgICBjb25zdCBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgaWYgKGhhc093bi5jYWxsKHJlcXVpcmVkUGF0dGVybnMsIGtleSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RTdWJ0cmVlKHN1YlZhbHVlLCByZXF1aXJlZFBhdHRlcm5zW2tleV0pO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucGF0aCA9IF9wcmVwZW5kUGF0aChrZXksIHJlc3VsdC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIHJlcXVpcmVkUGF0dGVybnNba2V5XTtcbiAgICB9IGVsc2UgaWYgKGhhc093bi5jYWxsKG9wdGlvbmFsUGF0dGVybnMsIGtleSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RTdWJ0cmVlKHN1YlZhbHVlLCBvcHRpb25hbFBhdHRlcm5zW2tleV0pO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucGF0aCA9IF9wcmVwZW5kUGF0aChrZXksIHJlc3VsdC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXVua25vd25LZXlzQWxsb3dlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1lc3NhZ2U6ICdVbmtub3duIGtleScsXG4gICAgICAgICAgcGF0aDoga2V5LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodW5rbm93bktleVBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVzdFN1YnRyZWUoc3ViVmFsdWUsIHVua25vd25LZXlQYXR0ZXJuWzBdKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdC5wYXRoID0gX3ByZXBlbmRQYXRoKGtleSwgcmVzdWx0LnBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVxdWlyZWRQYXR0ZXJucyk7XG4gIGlmIChrZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBgTWlzc2luZyBrZXkgJyR7a2V5c1swXX0nYCxcbiAgICAgIHBhdGg6ICcnLFxuICAgIH07XG4gIH1cbn07XG5cbmNsYXNzIEFyZ3VtZW50Q2hlY2tlciB7XG4gIGNvbnN0cnVjdG9yIChhcmdzLCBkZXNjcmlwdGlvbikge1xuXG4gICAgLy8gTWFrZSBhIFNIQUxMT1cgY29weSBvZiB0aGUgYXJndW1lbnRzLiAoV2UnbGwgYmUgZG9pbmcgaWRlbnRpdHkgY2hlY2tzXG4gICAgLy8gYWdhaW5zdCBpdHMgY29udGVudHMuKVxuICAgIHRoaXMuYXJncyA9IFsuLi5hcmdzXTtcblxuICAgIC8vIFNpbmNlIHRoZSBjb21tb24gY2FzZSB3aWxsIGJlIHRvIGNoZWNrIGFyZ3VtZW50cyBpbiBvcmRlciwgYW5kIHdlIHNwbGljZVxuICAgIC8vIG91dCBhcmd1bWVudHMgd2hlbiB3ZSBjaGVjayB0aGVtLCBtYWtlIGl0IHNvIHdlIHNwbGljZSBvdXQgZnJvbSB0aGUgZW5kXG4gICAgLy8gcmF0aGVyIHRoYW4gdGhlIGJlZ2lubmluZy5cbiAgICB0aGlzLmFyZ3MucmV2ZXJzZSgpO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGNoZWNraW5nKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX2NoZWNraW5nT25lVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgY2hlY2soYXJndW1lbnRzLCBbU3RyaW5nXSkgb3IgY2hlY2soYXJndW1lbnRzLnNsaWNlKDEpLCBbU3RyaW5nXSlcbiAgICAvLyBvciBjaGVjayhbZm9vLCBiYXJdLCBbU3RyaW5nXSkgdG8gY291bnQuLi4gYnV0IG9ubHkgaWYgdmFsdWUgd2Fzbid0XG4gICAgLy8gaXRzZWxmIGFuIGFyZ3VtZW50LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpIHtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodmFsdWUsIHRoaXMuX2NoZWNraW5nT25lVmFsdWUuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgX2NoZWNraW5nT25lVmFsdWUodmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAvLyBJcyB0aGlzIHZhbHVlIG9uZSBvZiB0aGUgYXJndW1lbnRzPyAoVGhpcyBjYW4gaGF2ZSBhIGZhbHNlIHBvc2l0aXZlIGlmXG4gICAgICAvLyB0aGUgYXJndW1lbnQgaXMgYW4gaW50ZXJuZWQgcHJpbWl0aXZlLCBidXQgaXQncyBzdGlsbCBhIGdvb2QgZW5vdWdoXG4gICAgICAvLyBjaGVjay4pXG4gICAgICAvLyAoTmFOIGlzIG5vdCA9PT0gdG8gaXRzZWxmLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIHNwZWNpYWxseS4pXG4gICAgICBpZiAodmFsdWUgPT09IHRoaXMuYXJnc1tpXSB8fFxuICAgICAgICAgIChOdW1iZXIuaXNOYU4odmFsdWUpICYmIE51bWJlci5pc05hTih0aGlzLmFyZ3NbaV0pKSkge1xuICAgICAgICB0aGlzLmFyZ3Muc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhyb3dVbmxlc3NBbGxBcmd1bWVudHNIYXZlQmVlbkNoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuYXJncy5sZW5ndGggPiAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGNoZWNrKCkgYWxsIGFyZ3VtZW50cyBkdXJpbmcgJHt0aGlzLmRlc2NyaXB0aW9ufWApO1xuICB9XG59XG5cbmNvbnN0IF9qc0tleXdvcmRzID0gWydkbycsICdpZicsICdpbicsICdmb3InLCAnbGV0JywgJ25ldycsICd0cnknLCAndmFyJywgJ2Nhc2UnLFxuICAnZWxzZScsICdlbnVtJywgJ2V2YWwnLCAnZmFsc2UnLCAnbnVsbCcsICd0aGlzJywgJ3RydWUnLCAndm9pZCcsICd3aXRoJyxcbiAgJ2JyZWFrJywgJ2NhdGNoJywgJ2NsYXNzJywgJ2NvbnN0JywgJ3N1cGVyJywgJ3Rocm93JywgJ3doaWxlJywgJ3lpZWxkJyxcbiAgJ2RlbGV0ZScsICdleHBvcnQnLCAnaW1wb3J0JywgJ3B1YmxpYycsICdyZXR1cm4nLCAnc3RhdGljJywgJ3N3aXRjaCcsXG4gICd0eXBlb2YnLCAnZGVmYXVsdCcsICdleHRlbmRzJywgJ2ZpbmFsbHknLCAncGFja2FnZScsICdwcml2YXRlJywgJ2NvbnRpbnVlJyxcbiAgJ2RlYnVnZ2VyJywgJ2Z1bmN0aW9uJywgJ2FyZ3VtZW50cycsICdpbnRlcmZhY2UnLCAncHJvdGVjdGVkJywgJ2ltcGxlbWVudHMnLFxuICAnaW5zdGFuY2VvZiddO1xuXG4vLyBBc3N1bWVzIHRoZSBiYXNlIG9mIHBhdGggaXMgYWxyZWFkeSBlc2NhcGVkIHByb3Blcmx5XG4vLyByZXR1cm5zIGtleSArIGJhc2VcbmNvbnN0IF9wcmVwZW5kUGF0aCA9IChrZXksIGJhc2UpID0+IHtcbiAgaWYgKCh0eXBlb2Yga2V5KSA9PT0gJ251bWJlcicgfHwga2V5Lm1hdGNoKC9eWzAtOV0rJC8pKSB7XG4gICAga2V5ID0gYFske2tleX1dYDtcbiAgfSBlbHNlIGlmICgha2V5Lm1hdGNoKC9eW2Etel8kXVswLTlhLXpfJF0qJC9pKSB8fFxuICAgICAgICAgICAgIF9qc0tleXdvcmRzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2tleV0pO1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgYmFzZVswXSAhPT0gJ1snKSB7XG4gICAgcmV0dXJuIGAke2tleX0uJHtiYXNlfWA7XG4gIH1cblxuICByZXR1cm4ga2V5ICsgYmFzZTtcbn1cblxuY29uc3QgaXNPYmplY3QgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xuXG5jb25zdCBiYXNlSXNBcmd1bWVudHMgPSBpdGVtID0+XG4gIGlzT2JqZWN0KGl0ZW0pICYmXG4gIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbmNvbnN0IGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID9cbiAgYmFzZUlzQXJndW1lbnRzIDpcbiAgdmFsdWUgPT4gaXNPYmplY3QodmFsdWUpICYmIHR5cGVvZiB2YWx1ZS5jYWxsZWUgPT09ICdmdW5jdGlvbic7XG4iLCIvLyBDb3B5IG9mIGpRdWVyeS5pc1BsYWluT2JqZWN0IGZvciB0aGUgc2VydmVyIHNpZGUgZnJvbSBqUXVlcnkgdjMuMS4xLlxuXG5jb25zdCBjbGFzczJ0eXBlID0ge307XG5cbmNvbnN0IHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuY29uc3QgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxuY29uc3QgT2JqZWN0RnVuY3Rpb25TdHJpbmcgPSBmblRvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuY29uc3QgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbmV4cG9ydCBjb25zdCBpc1BsYWluT2JqZWN0ID0gb2JqID0+IHtcbiAgbGV0IHByb3RvO1xuICBsZXQgQ3RvcjtcblxuICAvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcbiAgLy8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG4gIGlmICghb2JqIHx8IHRvU3RyaW5nLmNhbGwob2JqKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90byA9IGdldFByb3RvKG9iaik7XG5cbiAgLy8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuICBpZiAoIXByb3RvKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuICBDdG9yID0gaGFzT3duLmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgXG4gICAgZm5Ub1N0cmluZy5jYWxsKEN0b3IpID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcbn07XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/check/match.js","meteor://💻app/packages/check/isPlainObject.js"],"names":["module","export","check","Match","isPlainObject","link","v","currentArgumentChecker","Meteor","EnvironmentVariable","hasOwn","Object","prototype","hasOwnProperty","value","pattern","argChecker","getOrNullIfOutsideFiber","checking","result","testSubtree","err","Error","message","path","Optional","Maybe","OneOf","args","Any","Where","condition","ObjectIncluding","ObjectWithValues","Integer","makeErrorType","msg","sanitizedError","test","_failIfArgumentsAreNotAllChecked","f","context","description","ArgumentChecker","withValue","apply","throwUnlessAllArgumentsHaveBeenChecked","constructor","choices","length","stringForErrorMessage","options","onlyShowType","EJSON","stringify","JSON","stringifyError","name","typeofChecks","String","Number","Boolean","Function","undefined","i","Array","isArray","isArguments","_prependPath","unknownKeysAllowed","unknownKeyPattern","requiredPatterns","create","optionalPatterns","keys","forEach","key","subPattern","subValue","call","reverse","_checkingOneValue","bind","isNaN","splice","_jsKeywords","base","match","indexOf","isObject","baseIsArguments","item","toString","arguments","callee","class2type","fnToString","ObjectFunctionString","getProto","getPrototypeOf","obj","proto","Ctor"],"mappings":"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","file":"/packages/check.js","sourcesContent":["// XXX docs\nimport { isPlainObject } from './isPlainObject';\n\n// Things we explicitly do NOT support:\n// - heterogenous arrays\n\nconst currentArgumentChecker = new Meteor.EnvironmentVariable;\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n/**\n * @summary Check that a value matches a [pattern](#matchpatterns).\n * If the value does not match the pattern, throw a `Match.Error`.\n *\n * Particularly useful to assert that arguments to a function have the right\n * types and structure.\n * @locus Anywhere\n * @param {Any} value The value to check\n * @param {MatchPattern} pattern The pattern to match `value` against\n */\nexport function check(value, pattern) {\n // Record that check got called, if somebody cared.\n //\n // We use getOrNullIfOutsideFiber so that it's OK to call check()\n // from non-Fiber server contexts; the downside is that if you forget to\n // bindEnvironment on some random callback in your method/publisher,\n // it might not find the argumentChecker and you'll get an error about\n // not checking an argument that it looks like you're checking (instead\n // of just getting a \"Node code must run in a Fiber\" error).\n const argChecker = currentArgumentChecker.getOrNullIfOutsideFiber();\n if (argChecker) {\n argChecker.checking(value);\n }\n\n const result = testSubtree(value, pattern);\n if (result) {\n const err = new Match.Error(result.message);\n if (result.path) {\n err.message += ` in field ${result.path}`;\n err.path = result.path;\n }\n\n throw err;\n }\n};\n\n/**\n * @namespace Match\n * @summary The namespace for all Match types and methods.\n */\nexport const Match = {\n Optional: function(pattern) {\n return new Optional(pattern);\n },\n\n Maybe: function(pattern) {\n return new Maybe(pattern);\n },\n\n OneOf: function(...args) {\n return new OneOf(args);\n },\n\n Any: ['__any__'],\n Where: function(condition) {\n return new Where(condition);\n },\n\n ObjectIncluding: function(pattern) {\n return new ObjectIncluding(pattern)\n },\n\n ObjectWithValues: function(pattern) {\n return new ObjectWithValues(pattern);\n },\n\n // Matches only signed 32-bit integers\n Integer: ['__integer__'],\n\n // XXX matchers should know how to describe themselves for errors\n Error: Meteor.makeErrorType('Match.Error', function (msg) {\n this.message = `Match error: ${msg}`;\n\n // The path of the value that failed to match. Initially empty, this gets\n // populated by catching and rethrowing the exception as it goes back up the\n // stack.\n // E.g.: \"vals[3].entity.created\"\n this.path = '';\n\n // If this gets sent over DDP, don't give full internal details but at least\n // provide something better than 500 Internal server error.\n this.sanitizedError = new Meteor.Error(400, 'Match failed');\n }),\n\n // Tests to see if value matches pattern. Unlike check, it merely returns true\n // or false (unless an error other than Match.Error was thrown). It does not\n // interact with _failIfArgumentsAreNotAllChecked.\n // XXX maybe also implement a Match.match which returns more information about\n // failures but without using exception handling or doing what check()\n // does with _failIfArgumentsAreNotAllChecked and Meteor.Error conversion\n\n /**\n * @summary Returns true if the value matches the pattern.\n * @locus Anywhere\n * @param {Any} value The value to check\n * @param {MatchPattern} pattern The pattern to match `value` against\n */\n test(value, pattern) {\n return !testSubtree(value, pattern);\n },\n\n // Runs `f.apply(context, args)`. If check() is not called on every element of\n // `args` (either directly or in the first level of an array), throws an error\n // (using `description` in the message).\n _failIfArgumentsAreNotAllChecked(f, context, args, description) {\n const argChecker = new ArgumentChecker(args, description);\n const result = currentArgumentChecker.withValue(\n argChecker, \n () => f.apply(context, args)\n );\n\n // If f didn't itself throw, make sure it checked all of its arguments.\n argChecker.throwUnlessAllArgumentsHaveBeenChecked();\n return result;\n }\n};\n\nclass Optional {\n constructor(pattern) {\n this.pattern = pattern;\n }\n}\n\nclass Maybe {\n constructor(pattern) {\n this.pattern = pattern;\n }\n}\n\nclass OneOf {\n constructor(choices) {\n if (!choices || choices.length === 0) {\n throw new Error('Must provide at least one choice to Match.OneOf');\n }\n\n this.choices = choices;\n }\n}\n\nclass Where {\n constructor(condition) {\n this.condition = condition;\n }\n}\n\nclass ObjectIncluding {\n constructor(pattern) {\n this.pattern = pattern;\n }\n}\n\nclass ObjectWithValues {\n constructor(pattern) {\n this.pattern = pattern;\n }\n}\n\nconst stringForErrorMessage = (value, options = {}) => {\n if ( value === null ) {\n return 'null';\n }\n\n if ( options.onlyShowType ) {\n return typeof value;\n }\n\n // Your average non-object things. Saves from doing the try/catch below for.\n if ( typeof value !== 'object' ) {\n return EJSON.stringify(value)\n }\n\n try {\n\n // Find objects with circular references since EJSON doesn't support them yet (Issue #4778 + Unaccepted PR)\n // If the native stringify is going to choke, EJSON.stringify is going to choke too.\n JSON.stringify(value);\n } catch (stringifyError) {\n if ( stringifyError.name === 'TypeError' ) {\n return typeof value;\n }\n }\n\n return EJSON.stringify(value);\n};\n\nconst typeofChecks = [\n [String, 'string'],\n [Number, 'number'],\n [Boolean, 'boolean'],\n\n // While we don't allow undefined/function in EJSON, this is good for optional\n // arguments with OneOf.\n [Function, 'function'],\n [undefined, 'undefined'],\n];\n\n// Return `false` if it matches. Otherwise, return an object with a `message` and a `path` field.\nconst testSubtree = (value, pattern) => {\n\n // Match anything!\n if (pattern === Match.Any) {\n return false;\n }\n\n // Basic atomic types.\n // Do not match boxed objects (e.g. String, Boolean)\n for (let i = 0; i < typeofChecks.length; ++i) {\n if (pattern === typeofChecks[i][0]) {\n if (typeof value === typeofChecks[i][1]) {\n return false;\n }\n\n return {\n message: `Expected ${typeofChecks[i][1]}, got ${stringForErrorMessage(value, { onlyShowType: true })}`,\n path: '',\n };\n }\n }\n\n if (pattern === null) {\n if (value === null) {\n return false;\n }\n\n return {\n message: `Expected null, got ${stringForErrorMessage(value)}`,\n path: '',\n };\n }\n\n // Strings, numbers, and booleans match literally. Goes well with Match.OneOf.\n if (typeof pattern === 'string' || typeof pattern === 'number' || typeof pattern === 'boolean') {\n if (value === pattern) {\n return false;\n }\n\n return {\n message: `Expected ${pattern}, got ${stringForErrorMessage(value)}`,\n path: '',\n };\n }\n\n // Match.Integer is special type encoded with array\n if (pattern === Match.Integer) {\n\n // There is no consistent and reliable way to check if variable is a 64-bit\n // integer. One of the popular solutions is to get reminder of division by 1\n // but this method fails on really large floats with big precision.\n // E.g.: 1.348192308491824e+23 % 1 === 0 in V8\n // Bitwise operators work consistantly but always cast variable to 32-bit\n // signed integer according to JavaScript specs.\n if (typeof value === 'number' && (value | 0) === value) {\n return false;\n }\n \n return {\n message: `Expected Integer, got ${stringForErrorMessage(value)}`,\n path: '',\n };\n }\n\n // 'Object' is shorthand for Match.ObjectIncluding({});\n if (pattern === Object) {\n pattern = Match.ObjectIncluding({});\n }\n\n // Array (checked AFTER Any, which is implemented as an Array).\n if (pattern instanceof Array) {\n if (pattern.length !== 1) {\n return {\n message: `Bad pattern: arrays must have one type element ${stringForErrorMessage(pattern)}`,\n path: '',\n };\n }\n\n if (!Array.isArray(value) && !isArguments(value)) {\n return {\n message: `Expected array, got ${stringForErrorMessage(value)}`,\n path: '',\n };\n }\n\n for (let i = 0, length = value.length; i < length; i++) {\n const result = testSubtree(value[i], pattern[0]);\n if (result) {\n result.path = _prependPath(i, result.path);\n return result;\n }\n }\n \n return false;\n }\n\n // Arbitrary validation checks. The condition can return false or throw a\n // Match.Error (ie, it can internally use check()) to fail.\n if (pattern instanceof Where) {\n let result;\n try {\n result = pattern.condition(value);\n } catch (err) {\n if (!(err instanceof Match.Error)) {\n throw err;\n }\n \n return {\n message: err.message,\n path: err.path\n };\n }\n\n if (result) {\n return false;\n }\n\n // XXX this error is terrible\n return {\n message: 'Failed Match.Where validation',\n path: '',\n };\n }\n\n if (pattern instanceof Maybe) {\n pattern = Match.OneOf(undefined, null, pattern.pattern);\n } else if (pattern instanceof Optional) {\n pattern = Match.OneOf(undefined, pattern.pattern);\n }\n\n if (pattern instanceof OneOf) {\n for (let i = 0; i < pattern.choices.length; ++i) {\n const result = testSubtree(value, pattern.choices[i]);\n if (!result) {\n\n // No error? Yay, return.\n return false;\n }\n\n // Match errors just mean try another choice.\n }\n\n // XXX this error is terrible\n return {\n message: 'Failed Match.OneOf, Match.Maybe or Match.Optional validation',\n path: '',\n };\n }\n\n // A function that isn't something we special-case is assumed to be a\n // constructor.\n if (pattern instanceof Function) {\n if (value instanceof pattern) {\n return false;\n }\n\n return {\n message: `Expected ${pattern.name || 'particular constructor'}`,\n path: '',\n };\n }\n\n let unknownKeysAllowed = false;\n let unknownKeyPattern;\n if (pattern instanceof ObjectIncluding) {\n unknownKeysAllowed = true;\n pattern = pattern.pattern;\n }\n\n if (pattern instanceof ObjectWithValues) {\n unknownKeysAllowed = true;\n unknownKeyPattern = [pattern.pattern];\n pattern = {}; // no required keys\n }\n\n if (typeof pattern !== 'object') {\n return {\n message: 'Bad pattern: unknown pattern type',\n path: '',\n };\n }\n\n // An object, with required and optional keys. Note that this does NOT do\n // structural matches against objects of special types that happen to match\n // the pattern: this really needs to be a plain old {Object}!\n if (typeof value !== 'object') {\n return {\n message: `Expected object, got ${typeof value}`,\n path: '',\n };\n }\n\n if (value === null) {\n return {\n message: `Expected object, got null`,\n path: '',\n };\n }\n\n if (! isPlainObject(value)) {\n return {\n message: `Expected plain object`,\n path: '',\n };\n }\n\n const requiredPatterns = Object.create(null);\n const optionalPatterns = Object.create(null);\n\n Object.keys(pattern).forEach(key => {\n const subPattern = pattern[key];\n if (subPattern instanceof Optional ||\n subPattern instanceof Maybe) {\n optionalPatterns[key] = subPattern.pattern;\n } else {\n requiredPatterns[key] = subPattern;\n }\n });\n\n for (let key in Object(value)) {\n const subValue = value[key];\n if (hasOwn.call(requiredPatterns, key)) {\n const result = testSubtree(subValue, requiredPatterns[key]);\n if (result) {\n result.path = _prependPath(key, result.path);\n return result;\n }\n\n delete requiredPatterns[key];\n } else if (hasOwn.call(optionalPatterns, key)) {\n const result = testSubtree(subValue, optionalPatterns[key]);\n if (result) {\n result.path = _prependPath(key, result.path);\n return result;\n }\n\n } else {\n if (!unknownKeysAllowed) {\n return {\n message: 'Unknown key',\n path: key,\n };\n }\n\n if (unknownKeyPattern) {\n const result = testSubtree(subValue, unknownKeyPattern[0]);\n if (result) {\n result.path = _prependPath(key, result.path);\n return result;\n }\n }\n }\n }\n\n const keys = Object.keys(requiredPatterns);\n if (keys.length) {\n return {\n message: `Missing key '${keys[0]}'`,\n path: '',\n };\n }\n};\n\nclass ArgumentChecker {\n constructor (args, description) {\n\n // Make a SHALLOW copy of the arguments. (We'll be doing identity checks\n // against its contents.)\n this.args = [...args];\n\n // Since the common case will be to check arguments in order, and we splice\n // out arguments when we check them, make it so we splice out from the end\n // rather than the beginning.\n this.args.reverse();\n this.description = description;\n }\n\n checking(value) {\n if (this._checkingOneValue(value)) {\n return;\n }\n\n // Allow check(arguments, [String]) or check(arguments.slice(1), [String])\n // or check([foo, bar], [String]) to count... but only if value wasn't\n // itself an argument.\n if (Array.isArray(value) || isArguments(value)) {\n Array.prototype.forEach.call(value, this._checkingOneValue.bind(this));\n }\n }\n\n _checkingOneValue(value) {\n for (let i = 0; i < this.args.length; ++i) {\n\n // Is this value one of the arguments? (This can have a false positive if\n // the argument is an interned primitive, but it's still a good enough\n // check.)\n // (NaN is not === to itself, so we have to check specially.)\n if (value === this.args[i] ||\n (Number.isNaN(value) && Number.isNaN(this.args[i]))) {\n this.args.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n throwUnlessAllArgumentsHaveBeenChecked() {\n if (this.args.length > 0)\n throw new Error(`Did not check() all arguments during ${this.description}`);\n }\n}\n\nconst _jsKeywords = ['do', 'if', 'in', 'for', 'let', 'new', 'try', 'var', 'case',\n 'else', 'enum', 'eval', 'false', 'null', 'this', 'true', 'void', 'with',\n 'break', 'catch', 'class', 'const', 'super', 'throw', 'while', 'yield',\n 'delete', 'export', 'import', 'public', 'return', 'static', 'switch',\n 'typeof', 'default', 'extends', 'finally', 'package', 'private', 'continue',\n 'debugger', 'function', 'arguments', 'interface', 'protected', 'implements',\n 'instanceof'];\n\n// Assumes the base of path is already escaped properly\n// returns key + base\nconst _prependPath = (key, base) => {\n if ((typeof key) === 'number' || key.match(/^[0-9]+$/)) {\n key = `[${key}]`;\n } else if (!key.match(/^[a-z_$][0-9a-z_$]*$/i) ||\n _jsKeywords.indexOf(key) >= 0) {\n key = JSON.stringify([key]);\n }\n\n if (base && base[0] !== '[') {\n return `${key}.${base}`;\n }\n\n return key + base;\n}\n\nconst isObject = value => typeof value === 'object' && value !== null;\n\nconst baseIsArguments = item =>\n isObject(item) &&\n Object.prototype.toString.call(item) === '[object Arguments]';\n\nconst isArguments = baseIsArguments(function() { return arguments; }()) ?\n baseIsArguments :\n value => isObject(value) && typeof value.callee === 'function';\n","// Copy of jQuery.isPlainObject for the server side from jQuery v3.1.1.\n\nconst class2type = {};\n\nconst toString = class2type.toString;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nconst fnToString = hasOwn.toString;\n\nconst ObjectFunctionString = fnToString.call(Object);\n\nconst getProto = Object.getPrototypeOf;\n\nexport const isPlainObject = obj => {\n let proto;\n let Ctor;\n\n // Detect obvious negatives\n // Use toString instead of jQuery.type to catch host objects\n if (!obj || toString.call(obj) !== '[object Object]') {\n return false;\n }\n\n proto = getProto(obj);\n\n // Objects with no prototype (e.g., `Object.create( null )`) are plain\n if (!proto) {\n return true;\n }\n\n // Objects with prototype are plain iff they were constructed by a global Object function\n Ctor = hasOwn.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor === 'function' && \n fnToString.call(Ctor) === ObjectFunctionString;\n};\n"]}
\ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var check = Package.check.check;
var Match = Package.check.Match;
var Random = Package.random.Random;
var ECMAScript = Package.ecmascript.ECMAScript;
var EJSON = Package.ejson.EJSON;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
var Retry = Package.retry.Retry;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var DDPCommon;
var require = meteorInstall({"node_modules":{"meteor":{"ddp-common":{"namespace.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-common/namespace.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/**
* @namespace DDPCommon
* @summary Namespace for DDPCommon-related methods/classes. Shared between
* `ddp-client` and `ddp-server`, where the ddp-client is the implementation
* of a ddp client for both client AND server; and the ddp server is the
* implementation of the livedata server and stream server. Common
* functionality shared between both can be shared under this namespace
*/
DDPCommon = {};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"heartbeat.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-common/heartbeat.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Heartbeat options:
// heartbeatInterval: interval to send pings, in milliseconds.
// heartbeatTimeout: timeout to close the connection if a reply isn't
// received, in milliseconds.
// sendPing: function to call to send a ping on the connection.
// onTimeout: function to call to close the connection.
DDPCommon.Heartbeat = class Heartbeat {
constructor(options) {
this.heartbeatInterval = options.heartbeatInterval;
this.heartbeatTimeout = options.heartbeatTimeout;
this._sendPing = options.sendPing;
this._onTimeout = options.onTimeout;
this._seenPacket = false;
this._heartbeatIntervalHandle = null;
this._heartbeatTimeoutHandle = null;
}
stop() {
this._clearHeartbeatIntervalTimer();
this._clearHeartbeatTimeoutTimer();
}
start() {
this.stop();
this._startHeartbeatIntervalTimer();
}
_startHeartbeatIntervalTimer() {
this._heartbeatIntervalHandle = Meteor.setInterval(() => this._heartbeatIntervalFired(), this.heartbeatInterval);
}
_startHeartbeatTimeoutTimer() {
this._heartbeatTimeoutHandle = Meteor.setTimeout(() => this._heartbeatTimeoutFired(), this.heartbeatTimeout);
}
_clearHeartbeatIntervalTimer() {
if (this._heartbeatIntervalHandle) {
Meteor.clearInterval(this._heartbeatIntervalHandle);
this._heartbeatIntervalHandle = null;
}
}
_clearHeartbeatTimeoutTimer() {
if (this._heartbeatTimeoutHandle) {
Meteor.clearTimeout(this._heartbeatTimeoutHandle);
this._heartbeatTimeoutHandle = null;
}
} // The heartbeat interval timer is fired when we should send a ping.
_heartbeatIntervalFired() {
// don't send ping if we've seen a packet since we last checked,
// *or* if we have already sent a ping and are awaiting a timeout.
// That shouldn't happen, but it's possible if
// `this.heartbeatInterval` is smaller than
// `this.heartbeatTimeout`.
if (!this._seenPacket && !this._heartbeatTimeoutHandle) {
this._sendPing(); // Set up timeout, in case a pong doesn't arrive in time.
this._startHeartbeatTimeoutTimer();
}
this._seenPacket = false;
} // The heartbeat timeout timer is fired when we sent a ping, but we
// timed out waiting for the pong.
_heartbeatTimeoutFired() {
this._heartbeatTimeoutHandle = null;
this._onTimeout();
}
messageReceived() {
// Tell periodic checkin that we have seen a packet, and thus it
// does not need to send a ping this cycle.
this._seenPacket = true; // If we were waiting for a pong, we got it.
if (this._heartbeatTimeoutHandle) {
this._clearHeartbeatTimeoutTimer();
}
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"utils.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-common/utils.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
"use strict";
module.export({
hasOwn: () => hasOwn,
slice: () => slice,
keys: () => keys,
isEmpty: () => isEmpty,
last: () => last
});
const hasOwn = Object.prototype.hasOwnProperty;
const slice = Array.prototype.slice;
function keys(obj) {
return Object.keys(Object(obj));
}
function isEmpty(obj) {
if (obj == null) {
return true;
}
if (Array.isArray(obj) || typeof obj === "string") {
return obj.length === 0;
}
for (const key in obj) {
if (hasOwn.call(obj, key)) {
return false;
}
}
return true;
}
function last(array, n, guard) {
if (array == null) {
return;
}
if (n == null || guard) {
return array[array.length - 1];
}
return slice.call(array, Math.max(array.length - n, 0));
}
DDPCommon.SUPPORTED_DDP_VERSIONS = ['1', 'pre2', 'pre1'];
DDPCommon.parseDDP = function (stringMessage) {
try {
var msg = JSON.parse(stringMessage);
} catch (e) {
Meteor._debug("Discarding message with invalid JSON", stringMessage);
return null;
} // DDP messages must be objects.
if (msg === null || typeof msg !== 'object') {
Meteor._debug("Discarding non-object DDP message", stringMessage);
return null;
} // massage msg to get it into "abstract ddp" rather than "wire ddp" format.
// switch between "cleared" rep of unsetting fields and "undefined"
// rep of same
if (hasOwn.call(msg, 'cleared')) {
if (!hasOwn.call(msg, 'fields')) {
msg.fields = {};
}
msg.cleared.forEach(clearKey => {
msg.fields[clearKey] = undefined;
});
delete msg.cleared;
}
['fields', 'params', 'result'].forEach(field => {
if (hasOwn.call(msg, field)) {
msg[field] = EJSON._adjustTypesFromJSONValue(msg[field]);
}
});
return msg;
};
DDPCommon.stringifyDDP = function (msg) {
const copy = EJSON.clone(msg); // swizzle 'changed' messages from 'fields undefined' rep to 'fields
// and cleared' rep
if (hasOwn.call(msg, 'fields')) {
const cleared = [];
Object.keys(msg.fields).forEach(key => {
const value = msg.fields[key];
if (typeof value === "undefined") {
cleared.push(key);
delete copy.fields[key];
}
});
if (!isEmpty(cleared)) {
copy.cleared = cleared;
}
if (isEmpty(copy.fields)) {
delete copy.fields;
}
} // adjust types to basic
['fields', 'params', 'result'].forEach(field => {
if (hasOwn.call(copy, field)) {
copy[field] = EJSON._adjustTypesToJSONValue(copy[field]);
}
});
if (msg.id && typeof msg.id !== 'string') {
throw new Error("Message id is not a string");
}
return JSON.stringify(copy);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"method_invocation.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-common/method_invocation.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Instance name is this because it is usually referred to as this inside a
// method definition
/**
* @summary The state for a single invocation of a method, referenced by this
* inside a method definition.
* @param {Object} options
* @instanceName this
* @showInstanceName true
*/
DDPCommon.MethodInvocation = class MethodInvocation {
constructor(options) {
// true if we're running not the actual method, but a stub (that is,
// if we're on a client (which may be a browser, or in the future a
// server connecting to another server) and presently running a
// simulation of a server-side method for latency compensation
// purposes). not currently true except in a client such as a browser,
// since there's usually no point in running stubs unless you have a
// zero-latency connection to the user.
/**
* @summary Access inside a method invocation. Boolean value, true if this invocation is a stub.
* @locus Anywhere
* @name isSimulation
* @memberOf DDPCommon.MethodInvocation
* @instance
* @type {Boolean}
*/
this.isSimulation = options.isSimulation; // call this function to allow other method invocations (from the
// same client) to continue running without waiting for this one to
// complete.
this._unblock = options.unblock || function () {};
this._calledUnblock = false; // current user id
/**
* @summary The id of the user that made this method call, or `null` if no user was logged in.
* @locus Anywhere
* @name userId
* @memberOf DDPCommon.MethodInvocation
* @instance
*/
this.userId = options.userId; // sets current user id in all appropriate server contexts and
// reruns subscriptions
this._setUserId = options.setUserId || function () {}; // On the server, the connection this method call came in on.
/**
* @summary Access inside a method invocation. The [connection](#meteor_onconnection) that this method was received on. `null` if the method is not associated with a connection, eg. a server initiated method call. Calls to methods made from a server method which was in turn initiated from the client share the same `connection`.
* @locus Server
* @name connection
* @memberOf DDPCommon.MethodInvocation
* @instance
*/
this.connection = options.connection; // The seed for randomStream value generation
this.randomSeed = options.randomSeed; // This is set by RandomStream.get; and holds the random stream state
this.randomStream = null;
}
/**
* @summary Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber.
* @locus Server
* @memberOf DDPCommon.MethodInvocation
* @instance
*/
unblock() {
this._calledUnblock = true;
this._unblock();
}
/**
* @summary Set the logged in user.
* @locus Server
* @memberOf DDPCommon.MethodInvocation
* @instance
* @param {String | null} userId The value that should be returned by `userId` on this connection.
*/
setUserId(userId) {
if (this._calledUnblock) {
throw new Error("Can't call setUserId in a method after calling unblock");
}
this.userId = userId;
this._setUserId(userId);
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"random_stream.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ddp-common/random_stream.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RandomStream allows for generation of pseudo-random values, from a seed.
//
// We use this for consistent 'random' numbers across the client and server.
// We want to generate probably-unique IDs on the client, and we ideally want
// the server to generate the same IDs when it executes the method.
//
// For generated values to be the same, we must seed ourselves the same way,
// and we must keep track of the current state of our pseudo-random generators.
// We call this state the scope. By default, we use the current DDP method
// invocation as our scope. DDP now allows the client to specify a randomSeed.
// If a randomSeed is provided it will be used to seed our random sequences.
// In this way, client and server method calls will generate the same values.
//
// We expose multiple named streams; each stream is independent
// and is seeded differently (but predictably from the name).
// By using multiple streams, we support reordering of requests,
// as long as they occur on different streams.
//
// @param options {Optional Object}
// seed: Array or value - Seed value(s) for the generator.
// If an array, will be used as-is
// If a value, will be converted to a single-value array
// If omitted, a random array will be used as the seed.
DDPCommon.RandomStream = class RandomStream {
constructor(options) {
this.seed = [].concat(options.seed || randomToken());
this.sequences = Object.create(null);
} // Get a random sequence with the specified name, creating it if does not exist.
// New sequences are seeded with the seed concatenated with the name.
// By passing a seed into Random.create, we use the Alea generator.
_sequence(name) {
var self = this;
var sequence = self.sequences[name] || null;
if (sequence === null) {
var sequenceSeed = self.seed.concat(name);
for (var i = 0; i < sequenceSeed.length; i++) {
if (typeof sequenceSeed[i] === "function") {
sequenceSeed[i] = sequenceSeed[i]();
}
}
self.sequences[name] = sequence = Random.createWithSeeds.apply(null, sequenceSeed);
}
return sequence;
}
}; // Returns a random string of sufficient length for a random seed.
// This is a placeholder function; a similar function is planned
// for Random itself; when that is added we should remove this function,
// and call Random's randomToken instead.
function randomToken() {
return Random.hexString(20);
}
; // Returns the random stream with the specified name, in the specified
// scope. If a scope is passed, then we use that to seed a (not
// cryptographically secure) PRNG using the fast Alea algorithm. If
// scope is null (or otherwise falsey) then we use a generated seed.
//
// However, scope will normally be the current DDP method invocation,
// so we'll use the stream with the specified name, and we should get
// consistent values on the client and server sides of a method call.
DDPCommon.RandomStream.get = function (scope, name) {
if (!name) {
name = "default";
}
if (!scope) {
// There was no scope passed in; the sequence won't actually be
// reproducible. but make it fast (and not cryptographically
// secure) anyways, so that the behavior is similar to what you'd
// get by passing in a scope.
return Random.insecure;
}
var randomStream = scope.randomStream;
if (!randomStream) {
scope.randomStream = randomStream = new DDPCommon.RandomStream({
seed: scope.randomSeed
});
}
return randomStream._sequence(name);
}; // Creates a randomSeed for passing to a method call.
// Note that we take enclosing as an argument,
// though we expect it to be DDP._CurrentMethodInvocation.get()
// However, we often evaluate makeRpcSeed lazily, and thus the relevant
// invocation may not be the one currently in scope.
// If enclosing is null, we'll use Random and values won't be repeatable.
DDPCommon.makeRpcSeed = function (enclosing, methodName) {
var stream = DDPCommon.RandomStream.get(enclosing, '/rpc/' + methodName);
return stream.hexString(20);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/ddp-common/namespace.js");
require("/node_modules/meteor/ddp-common/heartbeat.js");
require("/node_modules/meteor/ddp-common/utils.js");
require("/node_modules/meteor/ddp-common/method_invocation.js");
require("/node_modules/meteor/ddp-common/random_stream.js");
/* Exports */
Package._define("ddp-common", {
DDPCommon: DDPCommon
});
})();
//# sourceURL=meteor://💻app/packages/ddp-common.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGRwLWNvbW1vbi9uYW1lc3BhY2UuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL2RkcC1jb21tb24vaGVhcnRiZWF0LmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtY29tbW9uL3V0aWxzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtY29tbW9uL21ldGhvZF9pbnZvY2F0aW9uLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9kZHAtY29tbW9uL3JhbmRvbV9zdHJlYW0uanMiXSwibmFtZXMiOlsiRERQQ29tbW9uIiwiSGVhcnRiZWF0IiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiaGVhcnRiZWF0SW50ZXJ2YWwiLCJoZWFydGJlYXRUaW1lb3V0IiwiX3NlbmRQaW5nIiwic2VuZFBpbmciLCJfb25UaW1lb3V0Iiwib25UaW1lb3V0IiwiX3NlZW5QYWNrZXQiLCJfaGVhcnRiZWF0SW50ZXJ2YWxIYW5kbGUiLCJfaGVhcnRiZWF0VGltZW91dEhhbmRsZSIsInN0b3AiLCJfY2xlYXJIZWFydGJlYXRJbnRlcnZhbFRpbWVyIiwiX2NsZWFySGVhcnRiZWF0VGltZW91dFRpbWVyIiwic3RhcnQiLCJfc3RhcnRIZWFydGJlYXRJbnRlcnZhbFRpbWVyIiwiTWV0ZW9yIiwic2V0SW50ZXJ2YWwiLCJfaGVhcnRiZWF0SW50ZXJ2YWxGaXJlZCIsIl9zdGFydEhlYXJ0YmVhdFRpbWVvdXRUaW1lciIsInNldFRpbWVvdXQiLCJfaGVhcnRiZWF0VGltZW91dEZpcmVkIiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsIm1lc3NhZ2VSZWNlaXZlZCIsIm1vZHVsZSIsImV4cG9ydCIsImhhc093biIsInNsaWNlIiwia2V5cyIsImlzRW1wdHkiLCJsYXN0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJBcnJheSIsIm9iaiIsImlzQXJyYXkiLCJsZW5ndGgiLCJrZXkiLCJjYWxsIiwiYXJyYXkiLCJuIiwiZ3VhcmQiLCJNYXRoIiwibWF4IiwiU1VQUE9SVEVEX0REUF9WRVJTSU9OUyIsInBhcnNlRERQIiwic3RyaW5nTWVzc2FnZSIsIm1zZyIsIkpTT04iLCJwYXJzZSIsImUiLCJfZGVidWciLCJmaWVsZHMiLCJjbGVhcmVkIiwiZm9yRWFjaCIsImNsZWFyS2V5IiwidW5kZWZpbmVkIiwiZmllbGQiLCJFSlNPTiIsIl9hZGp1c3RUeXBlc0Zyb21KU09OVmFsdWUiLCJzdHJpbmdpZnlERFAiLCJjb3B5IiwiY2xvbmUiLCJ2YWx1ZSIsInB1c2giLCJfYWRqdXN0VHlwZXNUb0pTT05WYWx1ZSIsImlkIiwiRXJyb3IiLCJzdHJpbmdpZnkiLCJNZXRob2RJbnZvY2F0aW9uIiwiaXNTaW11bGF0aW9uIiwiX3VuYmxvY2siLCJ1bmJsb2NrIiwiX2NhbGxlZFVuYmxvY2siLCJ1c2VySWQiLCJfc2V0VXNlcklkIiwic2V0VXNlcklkIiwiY29ubmVjdGlvbiIsInJhbmRvbVNlZWQiLCJyYW5kb21TdHJlYW0iLCJSYW5kb21TdHJlYW0iLCJzZWVkIiwiY29uY2F0IiwicmFuZG9tVG9rZW4iLCJzZXF1ZW5jZXMiLCJjcmVhdGUiLCJfc2VxdWVuY2UiLCJuYW1lIiwic2VsZiIsInNlcXVlbmNlIiwic2VxdWVuY2VTZWVkIiwiaSIsIlJhbmRvbSIsImNyZWF0ZVdpdGhTZWVkcyIsImFwcGx5IiwiaGV4U3RyaW5nIiwiZ2V0Iiwic2NvcGUiLCJpbnNlY3VyZSIsIm1ha2VScGNTZWVkIiwiZW5jbG9zaW5nIiwibWV0aG9kTmFtZSIsInN0cmVhbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7QUFRQUEsU0FBUyxHQUFHLEVBQVosQzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQUEsU0FBUyxDQUFDQyxTQUFWLEdBQXNCLE1BQU1BLFNBQU4sQ0FBZ0I7QUFDcENDLGFBQVcsQ0FBQ0Ms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Q0FBUDtBQUNELENBSEQsQyIsImZpbGUiOiIvcGFja2FnZXMvZGRwLWNvbW1vbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG5hbWVzcGFjZSBERFBDb21tb25cbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZSBmb3IgRERQQ29tbW9uLXJlbGF0ZWQgbWV0aG9kcy9jbGFzc2VzLiBTaGFyZWQgYmV0d2VlbiBcbiAqIGBkZHAtY2xpZW50YCBhbmQgYGRkcC1zZXJ2ZXJgLCB3aGVyZSB0aGUgZGRwLWNsaWVudCBpcyB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIGEgZGRwIGNsaWVudCBmb3IgYm90aCBjbGllbnQgQU5EIHNlcnZlcjsgYW5kIHRoZSBkZHAgc2VydmVyIGlzIHRoZVxuICogaW1wbGVtZW50YXRpb24gb2YgdGhlIGxpdmVkYXRhIHNlcnZlciBhbmQgc3RyZWFtIHNlcnZlci4gQ29tbW9uIFxuICogZnVuY3Rpb25hbGl0eSBzaGFyZWQgYmV0d2VlbiBib3RoIGNhbiBiZSBzaGFyZWQgdW5kZXIgdGhpcyBuYW1lc3BhY2VcbiAqL1xuRERQQ29tbW9uID0ge307XG4iLCIvLyBIZWFydGJlYXQgb3B0aW9uczpcbi8vICAgaGVhcnRiZWF0SW50ZXJ2YWw6IGludGVydmFsIHRvIHNlbmQgcGluZ3MsIGluIG1pbGxpc2Vjb25kcy5cbi8vICAgaGVhcnRiZWF0VGltZW91dDogdGltZW91dCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBpZiBhIHJlcGx5IGlzbid0XG4vLyAgICAgcmVjZWl2ZWQsIGluIG1pbGxpc2Vjb25kcy5cbi8vICAgc2VuZFBpbmc6IGZ1bmN0aW9uIHRvIGNhbGwgdG8gc2VuZCBhIHBpbmcgb24gdGhlIGNvbm5lY3Rpb24uXG4vLyAgIG9uVGltZW91dDogZnVuY3Rpb24gdG8gY2FsbCB0byBjbG9zZSB0aGUgY29ubmVjdGlvbi5cblxuRERQQ29tbW9uLkhlYXJ0YmVhdCA9IGNsYXNzIEhlYXJ0YmVhdCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsID0gb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbDtcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQgPSBvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQ7XG4gICAgdGhpcy5fc2VuZFBpbmcgPSBvcHRpb25zLnNlbmRQaW5nO1xuICAgIHRoaXMuX29uVGltZW91dCA9IG9wdGlvbnMub25UaW1lb3V0O1xuICAgIHRoaXMuX3NlZW5QYWNrZXQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2hlYXJ0YmVhdEludGVydmFsSGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLl9oZWFydGJlYXRUaW1lb3V0SGFuZGxlID0gbnVsbDtcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5fY2xlYXJIZWFydGJlYXRJbnRlcnZhbFRpbWVyKCk7XG4gICAgdGhpcy5fY2xlYXJIZWFydGJlYXRUaW1lb3V0VGltZXIoKTtcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0SW50ZXJ2YWxUaW1lcigpO1xuICB9XG5cbiAgX3N0YXJ0SGVhcnRiZWF0SW50ZXJ2YWxUaW1lcigpIHtcbiAgICB0aGlzLl9oZWFydGJlYXRJbnRlcnZhbEhhbmRsZSA9IE1ldGVvci5zZXRJbnRlcnZhbChcbiAgICAgICgpID0+IHRoaXMuX2hlYXJ0YmVhdEludGVydmFsRmlyZWQoKSxcbiAgICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxcbiAgICApO1xuICB9XG5cbiAgX3N0YXJ0SGVhcnRiZWF0VGltZW91dFRpbWVyKCkge1xuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXRIYW5kbGUgPSBNZXRlb3Iuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXRGaXJlZCgpLFxuICAgICAgdGhpcy5oZWFydGJlYXRUaW1lb3V0XG4gICAgKTtcbiAgfVxuXG4gIF9jbGVhckhlYXJ0YmVhdEludGVydmFsVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdEludGVydmFsSGFuZGxlKSB7XG4gICAgICBNZXRlb3IuY2xlYXJJbnRlcnZhbCh0aGlzLl9oZWFydGJlYXRJbnRlcnZhbEhhbmRsZSk7XG4gICAgICB0aGlzLl9oZWFydGJlYXRJbnRlcnZhbEhhbmRsZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2NsZWFySGVhcnRiZWF0VGltZW91dFRpbWVyKCkge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRUaW1lb3V0SGFuZGxlKSB7XG4gICAgICBNZXRlb3IuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXRIYW5kbGUpO1xuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZW91dEhhbmRsZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGhlYXJ0YmVhdCBpbnRlcnZhbCB0aW1lciBpcyBmaXJlZCB3aGVuIHdlIHNob3VsZCBzZW5kIGEgcGluZy5cbiAgX2hlYXJ0YmVhdEludGVydmFsRmlyZWQoKSB7XG4gICAgLy8gZG9uJ3Qgc2VuZCBwaW5nIGlmIHdlJ3ZlIHNlZW4gYSBwYWNrZXQgc2luY2Ugd2UgbGFzdCBjaGVja2VkLFxuICAgIC8vICpvciogaWYgd2UgaGF2ZSBhbHJlYWR5IHNlbnQgYSBwaW5nIGFuZCBhcmUgYXdhaXRpbmcgYSB0aW1lb3V0LlxuICAgIC8vIFRoYXQgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGl0J3MgcG9zc2libGUgaWZcbiAgICAvLyBgdGhpcy5oZWFydGJlYXRJbnRlcnZhbGAgaXMgc21hbGxlciB0aGFuXG4gICAgLy8gYHRoaXMuaGVhcnRiZWF0VGltZW91dGAuXG4gICAgaWYgKCEgdGhpcy5fc2VlblBhY2tldCAmJiAhIHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXRIYW5kbGUpIHtcbiAgICAgIHRoaXMuX3NlbmRQaW5nKCk7XG4gICAgICAvLyBTZXQgdXAgdGltZW91dCwgaW4gY2FzZSBhIHBvbmcgZG9lc24ndCBhcnJpdmUgaW4gdGltZS5cbiAgICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0VGltZW91dFRpbWVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3NlZW5QYWNrZXQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBoZWFydGJlYXQgdGltZW91dCB0aW1lciBpcyBmaXJlZCB3aGVuIHdlIHNlbnQgYSBwaW5nLCBidXQgd2VcbiAgLy8gdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBwb25nLlxuICBfaGVhcnRiZWF0VGltZW91dEZpcmVkKCkge1xuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVvdXRIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMuX29uVGltZW91dCgpO1xuICB9XG5cbiAgbWVzc2FnZVJlY2VpdmVkKCkge1xuICAgIC8vIFRlbGwgcGVyaW9kaWMgY2hlY2tpbiB0aGF0IHdlIGhhdmUgc2VlbiBhIHBhY2tldCwgYW5kIHRodXMgaXRcbiAgICAvLyBkb2VzIG5vdCBuZWVkIHRvIHNlbmQgYSBwaW5nIHRoaXMgY3ljbGUuXG4gICAgdGhpcy5fc2VlblBhY2tldCA9IHRydWU7XG4gICAgLy8gSWYgd2Ugd2VyZSB3YWl0aW5nIGZvciBhIHBvbmcsIHdlIGdvdCBpdC5cbiAgICBpZiAodGhpcy5faGVhcnRiZWF0VGltZW91dEhhbmRsZSkge1xuICAgICAgdGhpcy5fY2xlYXJIZWFydGJlYXRUaW1lb3V0VGltZXIoKTtcbiAgICB9XG4gIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IGNvbnN0IGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5leHBvcnQgY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBrZXlzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0KG9iaikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgICB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0KGFycmF5LCBuLCBndWFyZCkge1xuICBpZiAoYXJyYXkgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICgobiA9PSBudWxsKSB8fCBndWFyZCkge1xuICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBNYXRoLm1heChhcnJheS5sZW5ndGggLSBuLCAwKSk7XG59XG5cbkREUENvbW1vbi5TVVBQT1JURURfRERQX1ZFUlNJT05TID0gWyAnMScsICdwcmUyJywgJ3ByZTEnIF07XG5cbkREUENvbW1vbi5wYXJzZUREUCA9IGZ1bmN0aW9uIChzdHJpbmdNZXNzYWdlKSB7XG4gIHRyeSB7XG4gICAgdmFyIG1zZyA9IEpTT04ucGFyc2Uoc3RyaW5nTWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBNZXRlb3IuX2RlYnVnKFwiRGlzY2FyZGluZyBtZXNzYWdlIHdpdGggaW52YWxpZCBKU09OXCIsIHN0cmluZ01lc3NhZ2UpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIEREUCBtZXNzYWdlcyBtdXN0IGJlIG9iamVjdHMuXG4gIGlmIChtc2cgPT09IG51bGwgfHwgdHlwZW9mIG1zZyAhPT0gJ29iamVjdCcpIHtcbiAgICBNZXRlb3IuX2RlYnVnKFwiRGlzY2FyZGluZyBub24tb2JqZWN0IEREUCBtZXNzYWdlXCIsIHN0cmluZ01lc3NhZ2UpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gbWFzc2FnZSBtc2cgdG8gZ2V0IGl0IGludG8gXCJhYnN0cmFjdCBkZHBcIiByYXRoZXIgdGhhbiBcIndpcmUgZGRwXCIgZm9ybWF0LlxuXG4gIC8vIHN3aXRjaCBiZXR3ZWVuIFwiY2xlYXJlZFwiIHJlcCBvZiB1bnNldHRpbmcgZmllbGRzIGFuZCBcInVuZGVmaW5lZFwiXG4gIC8vIHJlcCBvZiBzYW1lXG4gIGlmIChoYXNPd24uY2FsbChtc2csICdjbGVhcmVkJykpIHtcbiAgICBpZiAoISBoYXNPd24uY2FsbChtc2csICdmaWVsZHMnKSkge1xuICAgICAgbXNnLmZpZWxkcyA9IHt9O1xuICAgIH1cbiAgICBtc2cuY2xlYXJlZC5mb3JFYWNoKGNsZWFyS2V5ID0+IHtcbiAgICAgIG1zZy5maWVsZHNbY2xlYXJLZXldID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGRlbGV0ZSBtc2cuY2xlYXJlZDtcbiAgfVxuXG4gIFsnZmllbGRzJywgJ3BhcmFtcycsICdyZXN1bHQnXS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBpZiAoaGFzT3duLmNhbGwobXNnLCBmaWVsZCkpIHtcbiAgICAgIG1zZ1tmaWVsZF0gPSBFSlNPTi5fYWRqdXN0VHlwZXNGcm9tSlNPTlZhbHVlKG1zZ1tmaWVsZF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1zZztcbn07XG5cbkREUENvbW1vbi5zdHJpbmdpZnlERFAgPSBmdW5jdGlvbiAobXNnKSB7XG4gIGNvbnN0IGNvcHkgPSBFSlNPTi5jbG9uZShtc2cpO1xuXG4gIC8vIHN3aXp6bGUgJ2NoYW5nZWQnIG1lc3NhZ2VzIGZyb20gJ2ZpZWxkcyB1bmRlZmluZWQnIHJlcCB0byAnZmllbGRzXG4gIC8vIGFuZCBjbGVhcmVkJyByZXBcbiAgaWYgKGhhc093bi5jYWxsKG1zZywgJ2ZpZWxkcycpKSB7XG4gICAgY29uc3QgY2xlYXJlZCA9IFtdO1xuXG4gICAgT2JqZWN0LmtleXMobXNnLmZpZWxkcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBtc2cuZmllbGRzW2tleV07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY2xlYXJlZC5wdXNoKGtleSk7XG4gICAgICAgIGRlbGV0ZSBjb3B5LmZpZWxkc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCEgaXNFbXB0eShjbGVhcmVkKSkge1xuICAgICAgY29weS5jbGVhcmVkID0gY2xlYXJlZDtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShjb3B5LmZpZWxkcykpIHtcbiAgICAgIGRlbGV0ZSBjb3B5LmZpZWxkcztcbiAgICB9XG4gIH1cblxuICAvLyBhZGp1c3QgdHlwZXMgdG8gYmFzaWNcbiAgWydmaWVsZHMnLCAncGFyYW1zJywgJ3Jlc3VsdCddLmZvckVhY2goZmllbGQgPT4ge1xuICAgIGlmIChoYXNPd24uY2FsbChjb3B5LCBmaWVsZCkpIHtcbiAgICAgIGNvcHlbZmllbGRdID0gRUpTT04uX2FkanVzdFR5cGVzVG9KU09OVmFsdWUoY29weVtmaWVsZF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG1zZy5pZCAmJiB0eXBlb2YgbXNnLmlkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2UgaWQgaXMgbm90IGEgc3RyaW5nXCIpO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvcHkpO1xufTtcbiIsIi8vIEluc3RhbmNlIG5hbWUgaXMgdGhpcyBiZWNhdXNlIGl0IGlzIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgdGhpcyBpbnNpZGUgYVxuLy8gbWV0aG9kIGRlZmluaXRpb25cbi8qKlxuICogQHN1bW1hcnkgVGhlIHN0YXRlIGZvciBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kLCByZWZlcmVuY2VkIGJ5IHRoaXNcbiAqIGluc2lkZSBhIG1ldGhvZCBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBpbnN0YW5jZU5hbWUgdGhpc1xuICogQHNob3dJbnN0YW5jZU5hbWUgdHJ1ZVxuICovXG5ERFBDb21tb24uTWV0aG9kSW52b2NhdGlvbiA9IGNsYXNzIE1ldGhvZEludm9jYXRpb24ge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgLy8gdHJ1ZSBpZiB3ZSdyZSBydW5uaW5nIG5vdCB0aGUgYWN0dWFsIG1ldGhvZCwgYnV0IGEgc3R1YiAodGhhdCBpcyxcbiAgICAvLyBpZiB3ZSdyZSBvbiBhIGNsaWVudCAod2hpY2ggbWF5IGJlIGEgYnJvd3Nlciwgb3IgaW4gdGhlIGZ1dHVyZSBhXG4gICAgLy8gc2VydmVyIGNvbm5lY3RpbmcgdG8gYW5vdGhlciBzZXJ2ZXIpIGFuZCBwcmVzZW50bHkgcnVubmluZyBhXG4gICAgLy8gc2ltdWxhdGlvbiBvZiBhIHNlcnZlci1zaWRlIG1ldGhvZCBmb3IgbGF0ZW5jeSBjb21wZW5zYXRpb25cbiAgICAvLyBwdXJwb3NlcykuIG5vdCBjdXJyZW50bHkgdHJ1ZSBleGNlcHQgaW4gYSBjbGllbnQgc3VjaCBhcyBhIGJyb3dzZXIsXG4gICAgLy8gc2luY2UgdGhlcmUncyB1c3VhbGx5IG5vIHBvaW50IGluIHJ1bm5pbmcgc3R1YnMgdW5sZXNzIHlvdSBoYXZlIGFcbiAgICAvLyB6ZXJvLWxhdGVuY3kgY29ubmVjdGlvbiB0byB0aGUgdXNlci5cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEFjY2VzcyBpbnNpZGUgYSBtZXRob2QgaW52b2NhdGlvbi4gIEJvb2xlYW4gdmFsdWUsIHRydWUgaWYgdGhpcyBpbnZvY2F0aW9uIGlzIGEgc3R1Yi5cbiAgICAgKiBAbG9jdXMgQW55d2hlcmVcbiAgICAgKiBAbmFtZSAgaXNTaW11bGF0aW9uXG4gICAgICogQG1lbWJlck9mIEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pc1NpbXVsYXRpb24gPSBvcHRpb25zLmlzU2ltdWxhdGlvbjtcblxuICAgIC8vIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBhbGxvdyBvdGhlciBtZXRob2QgaW52b2NhdGlvbnMgKGZyb20gdGhlXG4gICAgLy8gc2FtZSBjbGllbnQpIHRvIGNvbnRpbnVlIHJ1bm5pbmcgd2l0aG91dCB3YWl0aW5nIGZvciB0aGlzIG9uZSB0b1xuICAgIC8vIGNvbXBsZXRlLlxuICAgIHRoaXMuX3VuYmxvY2sgPSBvcHRpb25zLnVuYmxvY2sgfHwgZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fY2FsbGVkVW5ibG9jayA9IGZhbHNlO1xuXG4gICAgLy8gY3VycmVudCB1c2VyIGlkXG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBUaGUgaWQgb2YgdGhlIHVzZXIgdGhhdCBtYWRlIHRoaXMgbWV0aG9kIGNhbGwsIG9yIGBudWxsYCBpZiBubyB1c2VyIHdhcyBsb2dnZWQgaW4uXG4gICAgICogQGxvY3VzIEFueXdoZXJlXG4gICAgICogQG5hbWUgIHVzZXJJZFxuICAgICAqIEBtZW1iZXJPZiBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHRoaXMudXNlcklkID0gb3B0aW9ucy51c2VySWQ7XG5cbiAgICAvLyBzZXRzIGN1cnJlbnQgdXNlciBpZCBpbiBhbGwgYXBwcm9wcmlhdGUgc2VydmVyIGNvbnRleHRzIGFuZFxuICAgIC8vIHJlcnVucyBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy5fc2V0VXNlcklkID0gb3B0aW9ucy5zZXRVc2VySWQgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBPbiB0aGUgc2VydmVyLCB0aGUgY29ubmVjdGlvbiB0aGlzIG1ldGhvZCBjYWxsIGNhbWUgaW4gb24uXG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBY2Nlc3MgaW5zaWRlIGEgbWV0aG9kIGludm9jYXRpb24uIFRoZSBbY29ubmVjdGlvbl0oI21ldGVvcl9vbmNvbm5lY3Rpb24pIHRoYXQgdGhpcyBtZXRob2Qgd2FzIHJlY2VpdmVkIG9uLiBgbnVsbGAgaWYgdGhlIG1ldGhvZCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiwgZWcuIGEgc2VydmVyIGluaXRpYXRlZCBtZXRob2QgY2FsbC4gQ2FsbHMgdG8gbWV0aG9kcyBtYWRlIGZyb20gYSBzZXJ2ZXIgbWV0aG9kIHdoaWNoIHdhcyBpbiB0dXJuIGluaXRpYXRlZCBmcm9tIHRoZSBjbGllbnQgc2hhcmUgdGhlIHNhbWUgYGNvbm5lY3Rpb25gLlxuICAgICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICAgKiBAbmFtZSAgY29ubmVjdGlvblxuICAgICAqIEBtZW1iZXJPZiBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvbjtcblxuICAgIC8vIFRoZSBzZWVkIGZvciByYW5kb21TdHJlYW0gdmFsdWUgZ2VuZXJhdGlvblxuICAgIHRoaXMucmFuZG9tU2VlZCA9IG9wdGlvbnMucmFuZG9tU2VlZDtcblxuICAgIC8vIFRoaXMgaXMgc2V0IGJ5IFJhbmRvbVN0cmVhbS5nZXQ7IGFuZCBob2xkcyB0aGUgcmFuZG9tIHN0cmVhbSBzdGF0ZVxuICAgIHRoaXMucmFuZG9tU3RyZWFtID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDYWxsIGluc2lkZSBhIG1ldGhvZCBpbnZvY2F0aW9uLiAgQWxsb3cgc3Vic2VxdWVudCBtZXRob2QgZnJvbSB0aGlzIGNsaWVudCB0byBiZWdpbiBydW5uaW5nIGluIGEgbmV3IGZpYmVyLlxuICAgKiBAbG9jdXMgU2VydmVyXG4gICAqIEBtZW1iZXJPZiBERFBDb21tb24uTWV0aG9kSW52b2NhdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIHVuYmxvY2soKSB7XG4gICAgdGhpcy5fY2FsbGVkVW5ibG9jayA9IHRydWU7XG4gICAgdGhpcy5fdW5ibG9jaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldCB0aGUgbG9nZ2VkIGluIHVzZXIuXG4gICAqIEBsb2N1cyBTZXJ2ZXJcbiAgICogQG1lbWJlck9mIEREUENvbW1vbi5NZXRob2RJbnZvY2F0aW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N0cmluZyB8IG51bGx9IHVzZXJJZCBUaGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgYHVzZXJJZGAgb24gdGhpcyBjb25uZWN0aW9uLlxuICAgKi9cbiAgc2V0VXNlcklkKHVzZXJJZCkge1xuICAgIGlmICh0aGlzLl9jYWxsZWRVbmJsb2NrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjYWxsIHNldFVzZXJJZCBpbiBhIG1ldGhvZCBhZnRlciBjYWxsaW5nIHVuYmxvY2tcIik7XG4gICAgfVxuICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgIHRoaXMuX3NldFVzZXJJZCh1c2VySWQpO1xuICB9XG59O1xuIiwiLy8gUmFuZG9tU3RyZWFtIGFsbG93cyBmb3IgZ2VuZXJhdGlvbiBvZiBwc2V1ZG8tcmFuZG9tIHZhbHVlcywgZnJvbSBhIHNlZWQuXG4vL1xuLy8gV2UgdXNlIHRoaXMgZm9yIGNvbnNpc3RlbnQgJ3JhbmRvbScgbnVtYmVycyBhY3Jvc3MgdGhlIGNsaWVudCBhbmQgc2VydmVyLlxuLy8gV2Ugd2FudCB0byBnZW5lcmF0ZSBwcm9iYWJseS11bmlxdWUgSURzIG9uIHRoZSBjbGllbnQsIGFuZCB3ZSBpZGVhbGx5IHdhbnRcbi8vIHRoZSBzZXJ2ZXIgdG8gZ2VuZXJhdGUgdGhlIHNhbWUgSURzIHdoZW4gaXQgZXhlY3V0ZXMgdGhlIG1ldGhvZC5cbi8vXG4vLyBGb3IgZ2VuZXJhdGVkIHZhbHVlcyB0byBiZSB0aGUgc2FtZSwgd2UgbXVzdCBzZWVkIG91cnNlbHZlcyB0aGUgc2FtZSB3YXksXG4vLyBhbmQgd2UgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIG91ciBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvcnMuXG4vLyBXZSBjYWxsIHRoaXMgc3RhdGUgdGhlIHNjb3BlLiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIGN1cnJlbnQgRERQIG1ldGhvZFxuLy8gaW52b2NhdGlvbiBhcyBvdXIgc2NvcGUuICBERFAgbm93IGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgYSByYW5kb21TZWVkLlxuLy8gSWYgYSByYW5kb21TZWVkIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgdXNlZCB0byBzZWVkIG91ciByYW5kb20gc2VxdWVuY2VzLlxuLy8gSW4gdGhpcyB3YXksIGNsaWVudCBhbmQgc2VydmVyIG1ldGhvZCBjYWxscyB3aWxsIGdlbmVyYXRlIHRoZSBzYW1lIHZhbHVlcy5cbi8vXG4vLyBXZSBleHBvc2UgbXVsdGlwbGUgbmFtZWQgc3RyZWFtczsgZWFjaCBzdHJlYW0gaXMgaW5kZXBlbmRlbnRcbi8vIGFuZCBpcyBzZWVkZWQgZGlmZmVyZW50bHkgKGJ1dCBwcmVkaWN0YWJseSBmcm9tIHRoZSBuYW1lKS5cbi8vIEJ5IHVzaW5nIG11bHRpcGxlIHN0cmVhbXMsIHdlIHN1cHBvcnQgcmVvcmRlcmluZyBvZiByZXF1ZXN0cyxcbi8vIGFzIGxvbmcgYXMgdGhleSBvY2N1ciBvbiBkaWZmZXJlbnQgc3RyZWFtcy5cbi8vXG4vLyBAcGFyYW0gb3B0aW9ucyB7T3B0aW9uYWwgT2JqZWN0fVxuLy8gICBzZWVkOiBBcnJheSBvciB2YWx1ZSAtIFNlZWQgdmFsdWUocykgZm9yIHRoZSBnZW5lcmF0b3IuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYW4gYXJyYXksIHdpbGwgYmUgdXNlZCBhcy1pc1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIGEgdmFsdWUsIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc2luZ2xlLXZhbHVlIGFycmF5XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYSByYW5kb20gYXJyYXkgd2lsbCBiZSB1c2VkIGFzIHRoZSBzZWVkLlxuRERQQ29tbW9uLlJhbmRvbVN0cmVhbSA9IGNsYXNzIFJhbmRvbVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnNlZWQgPSBbXS5jb25jYXQob3B0aW9ucy5zZWVkIHx8IHJhbmRvbVRva2VuKCkpO1xuICAgIHRoaXMuc2VxdWVuY2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIEdldCBhIHJhbmRvbSBzZXF1ZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgY3JlYXRpbmcgaXQgaWYgZG9lcyBub3QgZXhpc3QuXG4gIC8vIE5ldyBzZXF1ZW5jZXMgYXJlIHNlZWRlZCB3aXRoIHRoZSBzZWVkIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBuYW1lLlxuICAvLyBCeSBwYXNzaW5nIGEgc2VlZCBpbnRvIFJhbmRvbS5jcmVhdGUsIHdlIHVzZSB0aGUgQWxlYSBnZW5lcmF0b3IuXG4gIF9zZXF1ZW5jZShuYW1lKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHNlcXVlbmNlID0gc2VsZi5zZXF1ZW5jZXNbbmFtZV0gfHwgbnVsbDtcbiAgICBpZiAoc2VxdWVuY2UgPT09IG51bGwpIHtcbiAgICAgIHZhciBzZXF1ZW5jZVNlZWQgPSBzZWxmLnNlZWQuY29uY2F0KG5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXF1ZW5jZVNlZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXF1ZW5jZVNlZWRbaV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHNlcXVlbmNlU2VlZFtpXSA9IHNlcXVlbmNlU2VlZFtpXSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWxmLnNlcXVlbmNlc1tuYW1lXSA9IHNlcXVlbmNlID0gUmFuZG9tLmNyZWF0ZVdpdGhTZWVkcy5hcHBseShudWxsLCBzZXF1ZW5jZVNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VxdWVuY2U7XG4gIH1cbn07XG5cbi8vIFJldHVybnMgYSByYW5kb20gc3RyaW5nIG9mIHN1ZmZpY2llbnQgbGVuZ3RoIGZvciBhIHJhbmRvbSBzZWVkLlxuLy8gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZ1bmN0aW9uOyBhIHNpbWlsYXIgZnVuY3Rpb24gaXMgcGxhbm5lZFxuLy8gZm9yIFJhbmRvbSBpdHNlbGY7IHdoZW4gdGhhdCBpcyBhZGRlZCB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgZnVuY3Rpb24sXG4vLyBhbmQgY2FsbCBSYW5kb20ncyByYW5kb21Ub2tlbiBpbnN0ZWFkLlxuZnVuY3Rpb24gcmFuZG9tVG9rZW4oKSB7XG4gIHJldHVybiBSYW5kb20uaGV4U3RyaW5nKDIwKTtcbn07XG5cbi8vIFJldHVybnMgdGhlIHJhbmRvbSBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGluIHRoZSBzcGVjaWZpZWRcbi8vIHNjb3BlLiBJZiBhIHNjb3BlIGlzIHBhc3NlZCwgdGhlbiB3ZSB1c2UgdGhhdCB0byBzZWVkIGEgKG5vdFxuLy8gY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlKSBQUk5HIHVzaW5nIHRoZSBmYXN0IEFsZWEgYWxnb3JpdGhtLiAgSWZcbi8vIHNjb3BlIGlzIG51bGwgKG9yIG90aGVyd2lzZSBmYWxzZXkpIHRoZW4gd2UgdXNlIGEgZ2VuZXJhdGVkIHNlZWQuXG4vL1xuLy8gSG93ZXZlciwgc2NvcGUgd2lsbCBub3JtYWxseSBiZSB0aGUgY3VycmVudCBERFAgbWV0aG9kIGludm9jYXRpb24sXG4vLyBzbyB3ZSdsbCB1c2UgdGhlIHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgYW5kIHdlIHNob3VsZCBnZXRcbi8vIGNvbnNpc3RlbnQgdmFsdWVzIG9uIHRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlcyBvZiBhIG1ldGhvZCBjYWxsLlxuRERQQ29tbW9uLlJhbmRvbVN0cmVhbS5nZXQgPSBmdW5jdGlvbiAoc2NvcGUsIG5hbWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgbmFtZSA9IFwiZGVmYXVsdFwiO1xuICB9XG4gIGlmICghc2NvcGUpIHtcbiAgICAvLyBUaGVyZSB3YXMgbm8gc2NvcGUgcGFzc2VkIGluOyB0aGUgc2VxdWVuY2Ugd29uJ3QgYWN0dWFsbHkgYmVcbiAgICAvLyByZXByb2R1Y2libGUuIGJ1dCBtYWtlIGl0IGZhc3QgKGFuZCBub3QgY3J5cHRvZ3JhcGhpY2FsbHlcbiAgICAvLyBzZWN1cmUpIGFueXdheXMsIHNvIHRoYXQgdGhlIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8gd2hhdCB5b3UnZFxuICAgIC8vIGdldCBieSBwYXNzaW5nIGluIGEgc2NvcGUuXG4gICAgcmV0dXJuIFJhbmRvbS5pbnNlY3VyZTtcbiAgfVxuICB2YXIgcmFuZG9tU3RyZWFtID0gc2NvcGUucmFuZG9tU3RyZWFtO1xuICBpZiAoIXJhbmRvbVN0cmVhbSkge1xuICAgIHNjb3BlLnJhbmRvbVN0cmVhbSA9IHJhbmRvbVN0cmVhbSA9IG5ldyBERFBDb21tb24uUmFuZG9tU3RyZWFtKHtcbiAgICAgIHNlZWQ6IHNjb3BlLnJhbmRvbVNlZWRcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmFuZG9tU3RyZWFtLl9zZXF1ZW5jZShuYW1lKTtcbn07XG5cbi8vIENyZWF0ZXMgYSByYW5kb21TZWVkIGZvciBwYXNzaW5nIHRvIGEgbWV0aG9kIGNhbGwuXG4vLyBOb3RlIHRoYXQgd2UgdGFrZSBlbmNsb3NpbmcgYXMgYW4gYXJndW1lbnQsXG4vLyB0aG91Z2ggd2UgZXhwZWN0IGl0IHRvIGJlIEREUC5fQ3VycmVudE1ldGhvZEludm9jYXRpb24uZ2V0KClcbi8vIEhvd2V2ZXIsIHdlIG9mdGVuIGV2YWx1YXRlIG1ha2VScGNTZWVkIGxhemlseSwgYW5kIHRodXMgdGhlIHJlbGV2YW50XG4vLyBpbnZvY2F0aW9uIG1heSBub3QgYmUgdGhlIG9uZSBjdXJyZW50bHkgaW4gc2NvcGUuXG4vLyBJZiBlbmNsb3NpbmcgaXMgbnVsbCwgd2UnbGwgdXNlIFJhbmRvbSBhbmQgdmFsdWVzIHdvbid0IGJlIHJlcGVhdGFibGUuXG5ERFBDb21tb24ubWFrZVJwY1NlZWQgPSBmdW5jdGlvbiAoZW5jbG9zaW5nLCBtZXRob2ROYW1lKSB7XG4gIHZhciBzdHJlYW0gPSBERFBDb21tb24uUmFuZG9tU3RyZWFtLmdldChlbmNsb3NpbmcsICcvcnBjLycgKyBtZXRob2ROYW1lKTtcbiAgcmV0dXJuIHN0cmVhbS5oZXhTdHJpbmcoMjApO1xufTtcbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/ddp-common/namespace.js","meteor://💻app/packages/ddp-common/heartbeat.js","meteor://💻app/packages/ddp-common/utils.js","meteor://💻app/packages/ddp-common/method_invocation.js","meteor://💻app/packages/ddp-common/random_stream.js"],"names":["DDPCommon","Heartbeat","constructor","options","heartbeatInterval","heartbeatTimeout","_sendPing","sendPing","_onTimeout","onTimeout","_seenPacket","_heartbeatIntervalHandle","_heartbeatTimeoutHandle","stop","_clearHeartbeatIntervalTimer","_clearHeartbeatTimeoutTimer","start","_startHeartbeatIntervalTimer","Meteor","setInterval","_heartbeatIntervalFired","_startHeartbeatTimeoutTimer","setTimeout","_heartbeatTimeoutFired","clearInterval","clearTimeout","messageReceived","module","export","hasOwn","slice","keys","isEmpty","last","Object","prototype","hasOwnProperty","Array","obj","isArray","length","key","call","array","n","guard","Math","max","SUPPORTED_DDP_VERSIONS","parseDDP","stringMessage","msg","JSON","parse","e","_debug","fields","cleared","forEach","clearKey","undefined","field","EJSON","_adjustTypesFromJSONValue","stringifyDDP","copy","clone","value","push","_adjustTypesToJSONValue","id","Error","stringify","MethodInvocation","isSimulation","_unblock","unblock","_calledUnblock","userId","_setUserId","setUserId","connection","randomSeed","randomStream","RandomStream","seed","concat","randomToken","sequences","create","_sequence","name","self","sequence","sequenceSeed","i","Random","createWithSeeds","apply","hexString","get","scope","insecure","makeRpcSeed","enclosing","methodName","stream"],"mappings":"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","file":"/packages/ddp-common.js","sourcesContent":["/**\n * @namespace DDPCommon\n * @summary Namespace for DDPCommon-related methods/classes. Shared between \n * `ddp-client` and `ddp-server`, where the ddp-client is the implementation\n * of a ddp client for both client AND server; and the ddp server is the\n * implementation of the livedata server and stream server. Common \n * functionality shared between both can be shared under this namespace\n */\nDDPCommon = {};\n","// Heartbeat options:\n// heartbeatInterval: interval to send pings, in milliseconds.\n// heartbeatTimeout: timeout to close the connection if a reply isn't\n// received, in milliseconds.\n// sendPing: function to call to send a ping on the connection.\n// onTimeout: function to call to close the connection.\n\nDDPCommon.Heartbeat = class Heartbeat {\n constructor(options) {\n this.heartbeatInterval = options.heartbeatInterval;\n this.heartbeatTimeout = options.heartbeatTimeout;\n this._sendPing = options.sendPing;\n this._onTimeout = options.onTimeout;\n this._seenPacket = false;\n\n this._heartbeatIntervalHandle = null;\n this._heartbeatTimeoutHandle = null;\n }\n\n stop() {\n this._clearHeartbeatIntervalTimer();\n this._clearHeartbeatTimeoutTimer();\n }\n\n start() {\n this.stop();\n this._startHeartbeatIntervalTimer();\n }\n\n _startHeartbeatIntervalTimer() {\n this._heartbeatIntervalHandle = Meteor.setInterval(\n () => this._heartbeatIntervalFired(),\n this.heartbeatInterval\n );\n }\n\n _startHeartbeatTimeoutTimer() {\n this._heartbeatTimeoutHandle = Meteor.setTimeout(\n () => this._heartbeatTimeoutFired(),\n this.heartbeatTimeout\n );\n }\n\n _clearHeartbeatIntervalTimer() {\n if (this._heartbeatIntervalHandle) {\n Meteor.clearInterval(this._heartbeatIntervalHandle);\n this._heartbeatIntervalHandle = null;\n }\n }\n\n _clearHeartbeatTimeoutTimer() {\n if (this._heartbeatTimeoutHandle) {\n Meteor.clearTimeout(this._heartbeatTimeoutHandle);\n this._heartbeatTimeoutHandle = null;\n }\n }\n\n // The heartbeat interval timer is fired when we should send a ping.\n _heartbeatIntervalFired() {\n // don't send ping if we've seen a packet since we last checked,\n // *or* if we have already sent a ping and are awaiting a timeout.\n // That shouldn't happen, but it's possible if\n // `this.heartbeatInterval` is smaller than\n // `this.heartbeatTimeout`.\n if (! this._seenPacket && ! this._heartbeatTimeoutHandle) {\n this._sendPing();\n // Set up timeout, in case a pong doesn't arrive in time.\n this._startHeartbeatTimeoutTimer();\n }\n this._seenPacket = false;\n }\n\n // The heartbeat timeout timer is fired when we sent a ping, but we\n // timed out waiting for the pong.\n _heartbeatTimeoutFired() {\n this._heartbeatTimeoutHandle = null;\n this._onTimeout();\n }\n\n messageReceived() {\n // Tell periodic checkin that we have seen a packet, and thus it\n // does not need to send a ping this cycle.\n this._seenPacket = true;\n // If we were waiting for a pong, we got it.\n if (this._heartbeatTimeoutHandle) {\n this._clearHeartbeatTimeoutTimer();\n }\n }\n};\n","\"use strict\";\n\nexport const hasOwn = Object.prototype.hasOwnProperty;\nexport const slice = Array.prototype.slice;\n\nexport function keys(obj) {\n return Object.keys(Object(obj));\n}\n\nexport function isEmpty(obj) {\n if (obj == null) {\n return true;\n }\n\n if (Array.isArray(obj) ||\n typeof obj === \"string\") {\n return obj.length === 0;\n }\n\n for (const key in obj) {\n if (hasOwn.call(obj, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function last(array, n, guard) {\n if (array == null) {\n return;\n }\n\n if ((n == null) || guard) {\n return array[array.length - 1];\n }\n\n return slice.call(array, Math.max(array.length - n, 0));\n}\n\nDDPCommon.SUPPORTED_DDP_VERSIONS = [ '1', 'pre2', 'pre1' ];\n\nDDPCommon.parseDDP = function (stringMessage) {\n try {\n var msg = JSON.parse(stringMessage);\n } catch (e) {\n Meteor._debug(\"Discarding message with invalid JSON\", stringMessage);\n return null;\n }\n // DDP messages must be objects.\n if (msg === null || typeof msg !== 'object') {\n Meteor._debug(\"Discarding non-object DDP message\", stringMessage);\n return null;\n }\n\n // massage msg to get it into \"abstract ddp\" rather than \"wire ddp\" format.\n\n // switch between \"cleared\" rep of unsetting fields and \"undefined\"\n // rep of same\n if (hasOwn.call(msg, 'cleared')) {\n if (! hasOwn.call(msg, 'fields')) {\n msg.fields = {};\n }\n msg.cleared.forEach(clearKey => {\n msg.fields[clearKey] = undefined;\n });\n delete msg.cleared;\n }\n\n ['fields', 'params', 'result'].forEach(field => {\n if (hasOwn.call(msg, field)) {\n msg[field] = EJSON._adjustTypesFromJSONValue(msg[field]);\n }\n });\n\n return msg;\n};\n\nDDPCommon.stringifyDDP = function (msg) {\n const copy = EJSON.clone(msg);\n\n // swizzle 'changed' messages from 'fields undefined' rep to 'fields\n // and cleared' rep\n if (hasOwn.call(msg, 'fields')) {\n const cleared = [];\n\n Object.keys(msg.fields).forEach(key => {\n const value = msg.fields[key];\n\n if (typeof value === \"undefined\") {\n cleared.push(key);\n delete copy.fields[key];\n }\n });\n\n if (! isEmpty(cleared)) {\n copy.cleared = cleared;\n }\n\n if (isEmpty(copy.fields)) {\n delete copy.fields;\n }\n }\n\n // adjust types to basic\n ['fields', 'params', 'result'].forEach(field => {\n if (hasOwn.call(copy, field)) {\n copy[field] = EJSON._adjustTypesToJSONValue(copy[field]);\n }\n });\n\n if (msg.id && typeof msg.id !== 'string') {\n throw new Error(\"Message id is not a string\");\n }\n\n return JSON.stringify(copy);\n};\n","// Instance name is this because it is usually referred to as this inside a\n// method definition\n/**\n * @summary The state for a single invocation of a method, referenced by this\n * inside a method definition.\n * @param {Object} options\n * @instanceName this\n * @showInstanceName true\n */\nDDPCommon.MethodInvocation = class MethodInvocation {\n constructor(options) {\n // true if we're running not the actual method, but a stub (that is,\n // if we're on a client (which may be a browser, or in the future a\n // server connecting to another server) and presently running a\n // simulation of a server-side method for latency compensation\n // purposes). not currently true except in a client such as a browser,\n // since there's usually no point in running stubs unless you have a\n // zero-latency connection to the user.\n\n /**\n * @summary Access inside a method invocation. Boolean value, true if this invocation is a stub.\n * @locus Anywhere\n * @name isSimulation\n * @memberOf DDPCommon.MethodInvocation\n * @instance\n * @type {Boolean}\n */\n this.isSimulation = options.isSimulation;\n\n // call this function to allow other method invocations (from the\n // same client) to continue running without waiting for this one to\n // complete.\n this._unblock = options.unblock || function () {};\n this._calledUnblock = false;\n\n // current user id\n\n /**\n * @summary The id of the user that made this method call, or `null` if no user was logged in.\n * @locus Anywhere\n * @name userId\n * @memberOf DDPCommon.MethodInvocation\n * @instance\n */\n this.userId = options.userId;\n\n // sets current user id in all appropriate server contexts and\n // reruns subscriptions\n this._setUserId = options.setUserId || function () {};\n\n // On the server, the connection this method call came in on.\n\n /**\n * @summary Access inside a method invocation. The [connection](#meteor_onconnection) that this method was received on. `null` if the method is not associated with a connection, eg. a server initiated method call. Calls to methods made from a server method which was in turn initiated from the client share the same `connection`.\n * @locus Server\n * @name connection\n * @memberOf DDPCommon.MethodInvocation\n * @instance\n */\n this.connection = options.connection;\n\n // The seed for randomStream value generation\n this.randomSeed = options.randomSeed;\n\n // This is set by RandomStream.get; and holds the random stream state\n this.randomStream = null;\n }\n\n /**\n * @summary Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber.\n * @locus Server\n * @memberOf DDPCommon.MethodInvocation\n * @instance\n */\n unblock() {\n this._calledUnblock = true;\n this._unblock();\n }\n\n /**\n * @summary Set the logged in user.\n * @locus Server\n * @memberOf DDPCommon.MethodInvocation\n * @instance\n * @param {String | null} userId The value that should be returned by `userId` on this connection.\n */\n setUserId(userId) {\n if (this._calledUnblock) {\n throw new Error(\"Can't call setUserId in a method after calling unblock\");\n }\n this.userId = userId;\n this._setUserId(userId);\n }\n};\n","// RandomStream allows for generation of pseudo-random values, from a seed.\n//\n// We use this for consistent 'random' numbers across the client and server.\n// We want to generate probably-unique IDs on the client, and we ideally want\n// the server to generate the same IDs when it executes the method.\n//\n// For generated values to be the same, we must seed ourselves the same way,\n// and we must keep track of the current state of our pseudo-random generators.\n// We call this state the scope. By default, we use the current DDP method\n// invocation as our scope. DDP now allows the client to specify a randomSeed.\n// If a randomSeed is provided it will be used to seed our random sequences.\n// In this way, client and server method calls will generate the same values.\n//\n// We expose multiple named streams; each stream is independent\n// and is seeded differently (but predictably from the name).\n// By using multiple streams, we support reordering of requests,\n// as long as they occur on different streams.\n//\n// @param options {Optional Object}\n// seed: Array or value - Seed value(s) for the generator.\n// If an array, will be used as-is\n// If a value, will be converted to a single-value array\n// If omitted, a random array will be used as the seed.\nDDPCommon.RandomStream = class RandomStream {\n constructor(options) {\n this.seed = [].concat(options.seed || randomToken());\n this.sequences = Object.create(null);\n }\n\n // Get a random sequence with the specified name, creating it if does not exist.\n // New sequences are seeded with the seed concatenated with the name.\n // By passing a seed into Random.create, we use the Alea generator.\n _sequence(name) {\n var self = this;\n\n var sequence = self.sequences[name] || null;\n if (sequence === null) {\n var sequenceSeed = self.seed.concat(name);\n for (var i = 0; i < sequenceSeed.length; i++) {\n if (typeof sequenceSeed[i] === \"function\") {\n sequenceSeed[i] = sequenceSeed[i]();\n }\n }\n self.sequences[name] = sequence = Random.createWithSeeds.apply(null, sequenceSeed);\n }\n return sequence;\n }\n};\n\n// Returns a random string of sufficient length for a random seed.\n// This is a placeholder function; a similar function is planned\n// for Random itself; when that is added we should remove this function,\n// and call Random's randomToken instead.\nfunction randomToken() {\n return Random.hexString(20);\n};\n\n// Returns the random stream with the specified name, in the specified\n// scope. If a scope is passed, then we use that to seed a (not\n// cryptographically secure) PRNG using the fast Alea algorithm. If\n// scope is null (or otherwise falsey) then we use a generated seed.\n//\n// However, scope will normally be the current DDP method invocation,\n// so we'll use the stream with the specified name, and we should get\n// consistent values on the client and server sides of a method call.\nDDPCommon.RandomStream.get = function (scope, name) {\n if (!name) {\n name = \"default\";\n }\n if (!scope) {\n // There was no scope passed in; the sequence won't actually be\n // reproducible. but make it fast (and not cryptographically\n // secure) anyways, so that the behavior is similar to what you'd\n // get by passing in a scope.\n return Random.insecure;\n }\n var randomStream = scope.randomStream;\n if (!randomStream) {\n scope.randomStream = randomStream = new DDPCommon.RandomStream({\n seed: scope.randomSeed\n });\n }\n return randomStream._sequence(name);\n};\n\n// Creates a randomSeed for passing to a method call.\n// Note that we take enclosing as an argument,\n// though we expect it to be DDP._CurrentMethodInvocation.get()\n// However, we often evaluate makeRpcSeed lazily, and thus the relevant\n// invocation may not be the one currently in scope.\n// If enclosing is null, we'll use Random and values won't be repeatable.\nDDPCommon.makeRpcSeed = function (enclosing, methodName) {\n var stream = DDPCommon.RandomStream.get(enclosing, '/rpc/' + methodName);\n return stream.hexString(20);\n};\n"]}
\ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
(function () {
/* Imports */
var DDP = Package['ddp-client'].DDP;
var DDPServer = Package['ddp-server'].DDPServer;
/* Exports */
Package._define("ddp", {
DDP: DDP,
DDPServer: DDPServer
});
})();
(function () {
/* Imports */
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
/* Exports */
Package._define("deps", {
Tracker: Tracker,
Deps: Deps
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var EJSON = Package.ejson.EJSON;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var DiffSequence;
var require = meteorInstall({"node_modules":{"meteor":{"diff-sequence":{"diff.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/diff-sequence/diff.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
DiffSequence: () => DiffSequence
});
const DiffSequence = {};
const hasOwn = Object.prototype.hasOwnProperty;
function isObjEmpty(obj) {
for (let key in Object(obj)) {
if (hasOwn.call(obj, key)) {
return false;
}
}
return true;
} // ordered: bool.
// old_results and new_results: collections of documents.
// if ordered, they are arrays.
// if unordered, they are IdMaps
DiffSequence.diffQueryChanges = function (ordered, oldResults, newResults, observer, options) {
if (ordered) DiffSequence.diffQueryOrderedChanges(oldResults, newResults, observer, options);else DiffSequence.diffQueryUnorderedChanges(oldResults, newResults, observer, options);
};
DiffSequence.diffQueryUnorderedChanges = function (oldResults, newResults, observer, options) {
options = options || {};
var projectionFn = options.projectionFn || EJSON.clone;
if (observer.movedBefore) {
throw new Error("_diffQueryUnordered called with a movedBefore observer!");
}
newResults.forEach(function (newDoc, id) {
var oldDoc = oldResults.get(id);
if (oldDoc) {
if (observer.changed && !EJSON.equals(oldDoc, newDoc)) {
var projectedNew = projectionFn(newDoc);
var projectedOld = projectionFn(oldDoc);
var changedFields = DiffSequence.makeChangedFields(projectedNew, projectedOld);
if (!isObjEmpty(changedFields)) {
observer.changed(id, changedFields);
}
}
} else if (observer.added) {
var fields = projectionFn(newDoc);
delete fields._id;
observer.added(newDoc._id, fields);
}
});
if (observer.removed) {
oldResults.forEach(function (oldDoc, id) {
if (!newResults.has(id)) observer.removed(id);
});
}
};
DiffSequence.diffQueryOrderedChanges = function (old_results, new_results, observer, options) {
options = options || {};
var projectionFn = options.projectionFn || EJSON.clone;
var new_presence_of_id = {};
new_results.forEach(function (doc) {
if (new_presence_of_id[doc._id]) Meteor._debug("Duplicate _id in new_results");
new_presence_of_id[doc._id] = true;
});
var old_index_of_id = {};
old_results.forEach(function (doc, i) {
if (doc._id in old_index_of_id) Meteor._debug("Duplicate _id in old_results");
old_index_of_id[doc._id] = i;
}); // ALGORITHM:
//
// To determine which docs should be considered "moved" (and which
// merely change position because of other docs moving) we run
// a "longest common subsequence" (LCS) algorithm. The LCS of the
// old doc IDs and the new doc IDs gives the docs that should NOT be
// considered moved.
// To actually call the appropriate callbacks to get from the old state to the
// new state:
// First, we call removed() on all the items that only appear in the old
// state.
// Then, once we have the items that should not move, we walk through the new
// results array group-by-group, where a "group" is a set of items that have
// moved, anchored on the end by an item that should not move. One by one, we
// move each of those elements into place "before" the anchoring end-of-group
// item, and fire changed events on them if necessary. Then we fire a changed
// event on the anchor, and move on to the next group. There is always at
// least one group; the last group is anchored by a virtual "null" id at the
// end.
// Asymptotically: O(N k) where k is number of ops, or potentially
// O(N log N) if inner loop of LCS were made to be binary search.
//////// LCS (longest common sequence, with respect to _id)
// (see Wikipedia article on Longest Increasing Subsequence,
// where the LIS is taken of the sequence of old indices of the
// docs in new_results)
//
// unmoved: the output of the algorithm; members of the LCS,
// in the form of indices into new_results
var unmoved = []; // max_seq_len: length of LCS found so far
var max_seq_len = 0; // seq_ends[i]: the index into new_results of the last doc in a
// common subsequence of length of i+1 <= max_seq_len
var N = new_results.length;
var seq_ends = new Array(N); // ptrs: the common subsequence ending with new_results[n] extends
// a common subsequence ending with new_results[ptr[n]], unless
// ptr[n] is -1.
var ptrs = new Array(N); // virtual sequence of old indices of new results
var old_idx_seq = function (i_new) {
return old_index_of_id[new_results[i_new]._id];
}; // for each item in new_results, use it to extend a common subsequence
// of length j <= max_seq_len
for (var i = 0; i < N; i++) {
if (old_index_of_id[new_results[i]._id] !== undefined) {
var j = max_seq_len; // this inner loop would traditionally be a binary search,
// but scanning backwards we will likely find a subseq to extend
// pretty soon, bounded for example by the total number of ops.
// If this were to be changed to a binary search, we'd still want
// to scan backwards a bit as an optimization.
while (j > 0) {
if (old_idx_seq(seq_ends[j - 1]) < old_idx_seq(i)) break;
j--;
}
ptrs[i] = j === 0 ? -1 : seq_ends[j - 1];
seq_ends[j] = i;
if (j + 1 > max_seq_len) max_seq_len = j + 1;
}
} // pull out the LCS/LIS into unmoved
var idx = max_seq_len === 0 ? -1 : seq_ends[max_seq_len - 1];
while (idx >= 0) {
unmoved.push(idx);
idx = ptrs[idx];
} // the unmoved item list is built backwards, so fix that
unmoved.reverse(); // the last group is always anchored by the end of the result list, which is
// an id of "null"
unmoved.push(new_results.length);
old_results.forEach(function (doc) {
if (!new_presence_of_id[doc._id]) observer.removed && observer.removed(doc._id);
}); // for each group of things in the new_results that is anchored by an unmoved
// element, iterate through the things before it.
var startOfGroup = 0;
unmoved.forEach(function (endOfGroup) {
var groupId = new_results[endOfGroup] ? new_results[endOfGroup]._id : null;
var oldDoc, newDoc, fields, projectedNew, projectedOld;
for (var i = startOfGroup; i < endOfGroup; i++) {
newDoc = new_results[i];
if (!hasOwn.call(old_index_of_id, newDoc._id)) {
fields = projectionFn(newDoc);
delete fields._id;
observer.addedBefore && observer.addedBefore(newDoc._id, fields, groupId);
observer.added && observer.added(newDoc._id, fields);
} else {
// moved
oldDoc = old_results[old_index_of_id[newDoc._id]];
projectedNew = projectionFn(newDoc);
projectedOld = projectionFn(oldDoc);
fields = DiffSequence.makeChangedFields(projectedNew, projectedOld);
if (!isObjEmpty(fields)) {
observer.changed && observer.changed(newDoc._id, fields);
}
observer.movedBefore && observer.movedBefore(newDoc._id, groupId);
}
}
if (groupId) {
newDoc = new_results[endOfGroup];
oldDoc = old_results[old_index_of_id[newDoc._id]];
projectedNew = projectionFn(newDoc);
projectedOld = projectionFn(oldDoc);
fields = DiffSequence.makeChangedFields(projectedNew, projectedOld);
if (!isObjEmpty(fields)) {
observer.changed && observer.changed(newDoc._id, fields);
}
}
startOfGroup = endOfGroup + 1;
});
}; // General helper for diff-ing two objects.
// callbacks is an object like so:
// { leftOnly: function (key, leftValue) {...},
// rightOnly: function (key, rightValue) {...},
// both: function (key, leftValue, rightValue) {...},
// }
DiffSequence.diffObjects = function (left, right, callbacks) {
Object.keys(left).forEach(key => {
const leftValue = left[key];
if (hasOwn.call(right, key)) {
callbacks.both && callbacks.both(key, leftValue, right[key]);
} else {
callbacks.leftOnly && callbacks.leftOnly(key, leftValue);
}
});
if (callbacks.rightOnly) {
Object.keys(right).forEach(key => {
const rightValue = right[key];
if (!hasOwn.call(left, key)) {
callbacks.rightOnly(key, rightValue);
}
});
}
};
DiffSequence.diffMaps = function (left, right, callbacks) {
left.forEach(function (leftValue, key) {
if (right.has(key)) {
callbacks.both && callbacks.both(key, leftValue, right.get(key));
} else {
callbacks.leftOnly && callbacks.leftOnly(key, leftValue);
}
});
if (callbacks.rightOnly) {
right.forEach(function (rightValue, key) {
if (!left.has(key)) {
callbacks.rightOnly(key, rightValue);
}
});
}
};
DiffSequence.makeChangedFields = function (newDoc, oldDoc) {
var fields = {};
DiffSequence.diffObjects(oldDoc, newDoc, {
leftOnly: function (key, value) {
fields[key] = undefined;
},
rightOnly: function (key, value) {
fields[key] = value;
},
both: function (key, leftValue, rightValue) {
if (!EJSON.equals(leftValue, rightValue)) fields[key] = rightValue;
}
});
return fields;
};
DiffSequence.applyChanges = function (doc, changeFields) {
Object.keys(changeFields).forEach(key => {
const value = changeFields[key];
if (typeof value === "undefined") {
delete doc[key];
} else {
doc[key] = value;
}
});
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/diff-sequence/diff.js");
/* Exports */
Package._define("diff-sequence", exports, {
DiffSequence: DiffSequence
});
})();
//# sourceURL=meteor://💻app/packages/diff-sequence.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZGlmZi1zZXF1ZW5jZS9kaWZmLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydCIsIkRpZmZTZXF1ZW5jZSIsImhhc093biIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaXNPYmpFbXB0eSIsIm9iaiIsImtleSIsImNhbGwiLCJkaWZmUXVlcnlDaGFuZ2VzIiwib3JkZXJlZCIsIm9sZFJlc3VsdHMiLCJuZXdSZXN1bHRzIiwib2JzZXJ2ZXIiLCJvcHRpb25zIiwiZGlmZlF1ZXJ5T3JkZXJlZENoYW5nZXMiLCJkaWZmUXVlcnlVbm9yZGVyZWRDaGFuZ2VzIiwicHJvamVjdGlvbkZuIiwiRUpTT04iLCJjbG9uZSIsIm1vdmVkQmVmb3JlIiwiRXJyb3IiLCJmb3JFYWNoIiwibmV3RG9jIiwiaWQiLCJvbGREb2MiLCJnZXQiLCJjaGFuZ2VkIiwiZXF1YWxzIiwicHJvamVjdGVkTmV3IiwicHJvamVjdGVkT2xkIiwiY2hhbmdlZEZpZWxkcyIsIm1ha2VDaGFuZ2VkRmllbGRzIiwiYWRkZWQiLCJmaWVsZHMiLCJfaWQiLCJyZW1vdmVkIiwiaGFzIiwib2xkX3Jlc3VsdHMiLCJuZXdfcmVzdWx0cyIsIm5ld19wcmVzZW5jZV9vZl9pZCIsImRvYyIsIk1ldGVvciIsIl9kZWJ1ZyIsIm9sZF9pbmRleF9vZl9pZCIsImkiLCJ1bm1vdmVkIiwibWF4X3NlcV9sZW4iLCJOIiwibGVuZ3RoIiwic2VxX2VuZHMiLCJBcnJheSIsInB0cnMiLCJvbGRfaWR4X3NlcSIsImlfbmV3IiwidW5kZWZpbmVkIiwiaiIsImlkeCIsInB1c2giLCJyZXZlcnNlIiwic3RhcnRPZkdyb3VwIiwiZW5kT2ZHcm91cCIsImdyb3VwSWQiLCJhZGRlZEJlZm9yZSIsImRpZmZPYmplY3RzIiwibGVmdCIsInJpZ2h0IiwiY2FsbGJhY2tzIiwia2V5cyIsImxlZnRWYWx1ZSIsImJvdGgiLCJsZWZ0T25seSIsInJpZ2h0T25s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QU9sQyxHQUFHLENBQUNsQyxHQUFELENBQVY7QUFDRCxLQUZELE1BRU87QUFDTGtDLFNBQUcsQ0FBQ2xDLEdBQUQsQ0FBSCxHQUFXb0UsS0FBWDtBQUNEO0FBQ0YsR0FQRDtBQVFELENBVEQsQyIsImZpbGUiOiIvcGFja2FnZXMvZGlmZi1zZXF1ZW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBEaWZmU2VxdWVuY2UgPSB7fTtcblxuY29uc3QgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gaXNPYmpFbXB0eShvYmopIHtcbiAgZm9yIChsZXQga2V5IGluIE9iamVjdChvYmopKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gb3JkZXJlZDogYm9vbC5cbi8vIG9sZF9yZXN1bHRzIGFuZCBuZXdfcmVzdWx0czogY29sbGVjdGlvbnMgb2YgZG9jdW1lbnRzLlxuLy8gICAgaWYgb3JkZXJlZCwgdGhleSBhcmUgYXJyYXlzLlxuLy8gICAgaWYgdW5vcmRlcmVkLCB0aGV5IGFyZSBJZE1hcHNcbkRpZmZTZXF1ZW5jZS5kaWZmUXVlcnlDaGFuZ2VzID0gZnVuY3Rpb24gKG9yZGVyZWQsIG9sZFJlc3VsdHMsIG5ld1Jlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIsIG9wdGlvbnMpIHtcbiAgaWYgKG9yZGVyZWQpXG4gICAgRGlmZlNlcXVlbmNlLmRpZmZRdWVyeU9yZGVyZWRDaGFuZ2VzKFxuICAgICAgb2xkUmVzdWx0cywgbmV3UmVzdWx0cywgb2JzZXJ2ZXIsIG9wdGlvbnMpO1xuICBlbHNlXG4gICAgRGlmZlNlcXVlbmNlLmRpZmZRdWVyeVVub3JkZXJlZENoYW5nZXMoXG4gICAgICBvbGRSZXN1bHRzLCBuZXdSZXN1bHRzLCBvYnNlcnZlciwgb3B0aW9ucyk7XG59O1xuXG5EaWZmU2VxdWVuY2UuZGlmZlF1ZXJ5VW5vcmRlcmVkQ2hhbmdlcyA9IGZ1bmN0aW9uIChvbGRSZXN1bHRzLCBuZXdSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcHJvamVjdGlvbkZuID0gb3B0aW9ucy5wcm9qZWN0aW9uRm4gfHwgRUpTT04uY2xvbmU7XG5cbiAgaWYgKG9ic2VydmVyLm1vdmVkQmVmb3JlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiX2RpZmZRdWVyeVVub3JkZXJlZCBjYWxsZWQgd2l0aCBhIG1vdmVkQmVmb3JlIG9ic2VydmVyIVwiKTtcbiAgfVxuXG4gIG5ld1Jlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAobmV3RG9jLCBpZCkge1xuICAgIHZhciBvbGREb2MgPSBvbGRSZXN1bHRzLmdldChpZCk7XG4gICAgaWYgKG9sZERvYykge1xuICAgICAgaWYgKG9ic2VydmVyLmNoYW5nZWQgJiYgIUVKU09OLmVxdWFscyhvbGREb2MsIG5ld0RvYykpIHtcbiAgICAgICAgdmFyIHByb2plY3RlZE5ldyA9IHByb2plY3Rpb25GbihuZXdEb2MpO1xuICAgICAgICB2YXIgcHJvamVjdGVkT2xkID0gcHJvamVjdGlvbkZuKG9sZERvYyk7XG4gICAgICAgIHZhciBjaGFuZ2VkRmllbGRzID1cbiAgICAgICAgICAgICAgRGlmZlNlcXVlbmNlLm1ha2VDaGFuZ2VkRmllbGRzKHByb2plY3RlZE5ldywgcHJvamVjdGVkT2xkKTtcbiAgICAgICAgaWYgKCEgaXNPYmpFbXB0eShjaGFuZ2VkRmllbGRzKSkge1xuICAgICAgICAgIG9ic2VydmVyLmNoYW5nZWQoaWQsIGNoYW5nZWRGaWVsZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYnNlcnZlci5hZGRlZCkge1xuICAgICAgdmFyIGZpZWxkcyA9IHByb2plY3Rpb25GbihuZXdEb2MpO1xuICAgICAgZGVsZXRlIGZpZWxkcy5faWQ7XG4gICAgICBvYnNlcnZlci5hZGRlZChuZXdEb2MuX2lkLCBmaWVsZHMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9ic2VydmVyLnJlbW92ZWQpIHtcbiAgICBvbGRSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKG9sZERvYywgaWQpIHtcbiAgICAgIGlmICghbmV3UmVzdWx0cy5oYXMoaWQpKVxuICAgICAgICBvYnNlcnZlci5yZW1vdmVkKGlkKTtcbiAgICB9KTtcbiAgfVxufTtcblxuRGlmZlNlcXVlbmNlLmRpZmZRdWVyeU9yZGVyZWRDaGFuZ2VzID0gZnVuY3Rpb24gKG9sZF9yZXN1bHRzLCBuZXdfcmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBwcm9qZWN0aW9uRm4gPSBvcHRpb25zLnByb2plY3Rpb25GbiB8fCBFSlNPTi5jbG9uZTtcblxuICB2YXIgbmV3X3ByZXNlbmNlX29mX2lkID0ge307XG4gIG5ld19yZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKGRvYykge1xuICAgIGlmIChuZXdfcHJlc2VuY2Vfb2ZfaWRbZG9jLl9pZF0pXG4gICAgICBNZXRlb3IuX2RlYnVnKFwiRHVwbGljYXRlIF9pZCBpbiBuZXdfcmVzdWx0c1wiKTtcbiAgICBuZXdfcHJlc2VuY2Vfb2ZfaWRbZG9jLl9pZF0gPSB0cnVlO1xuICB9KTtcblxuICB2YXIgb2xkX2luZGV4X29mX2lkID0ge307XG4gIG9sZF9yZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKGRvYywgaSkge1xuICAgIGlmIChkb2MuX2lkIGluIG9sZF9pbmRleF9vZl9pZClcbiAgICAgIE1ldGVvci5fZGVidWcoXCJEdXBsaWNhdGUgX2lkIGluIG9sZF9yZXN1bHRzXCIpO1xuICAgIG9sZF9pbmRleF9vZl9pZFtkb2MuX2lkXSA9IGk7XG4gIH0pO1xuXG4gIC8vIEFMR09SSVRITTpcbiAgLy9cbiAgLy8gVG8gZGV0ZXJtaW5lIHdoaWNoIGRvY3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgXCJtb3ZlZFwiIChhbmQgd2hpY2hcbiAgLy8gbWVyZWx5IGNoYW5nZSBwb3NpdGlvbiBiZWNhdXNlIG9mIG90aGVyIGRvY3MgbW92aW5nKSB3ZSBydW5cbiAgLy8gYSBcImxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlXCIgKExDUykgYWxnb3JpdGhtLiAgVGhlIExDUyBvZiB0aGVcbiAgLy8gb2xkIGRvYyBJRHMgYW5kIHRoZSBuZXcgZG9jIElEcyBnaXZlcyB0aGUgZG9jcyB0aGF0IHNob3VsZCBOT1QgYmVcbiAgLy8gY29uc2lkZXJlZCBtb3ZlZC5cblxuICAvLyBUbyBhY3R1YWxseSBjYWxsIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MgdG8gZ2V0IGZyb20gdGhlIG9sZCBzdGF0ZSB0byB0aGVcbiAgLy8gbmV3IHN0YXRlOlxuXG4gIC8vIEZpcnN0LCB3ZSBjYWxsIHJlbW92ZWQoKSBvbiBhbGwgdGhlIGl0ZW1zIHRoYXQgb25seSBhcHBlYXIgaW4gdGhlIG9sZFxuICAvLyBzdGF0ZS5cblxuICAvLyBUaGVuLCBvbmNlIHdlIGhhdmUgdGhlIGl0ZW1zIHRoYXQgc2hvdWxkIG5vdCBtb3ZlLCB3ZSB3YWxrIHRocm91Z2ggdGhlIG5ld1xuICAvLyByZXN1bHRzIGFycmF5IGdyb3VwLWJ5LWdyb3VwLCB3aGVyZSBhIFwiZ3JvdXBcIiBpcyBhIHNldCBvZiBpdGVtcyB0aGF0IGhhdmVcbiAgLy8gbW92ZWQsIGFuY2hvcmVkIG9uIHRoZSBlbmQgYnkgYW4gaXRlbSB0aGF0IHNob3VsZCBub3QgbW92ZS4gIE9uZSBieSBvbmUsIHdlXG4gIC8vIG1vdmUgZWFjaCBvZiB0aG9zZSBlbGVtZW50cyBpbnRvIHBsYWNlIFwiYmVmb3JlXCIgdGhlIGFuY2hvcmluZyBlbmQtb2YtZ3JvdXBcbiAgLy8gaXRlbSwgYW5kIGZpcmUgY2hhbmdlZCBldmVudHMgb24gdGhlbSBpZiBuZWNlc3NhcnkuICBUaGVuIHdlIGZpcmUgYSBjaGFuZ2VkXG4gIC8vIGV2ZW50IG9uIHRoZSBhbmNob3IsIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGdyb3VwLiAgVGhlcmUgaXMgYWx3YXlzIGF0XG4gIC8vIGxlYXN0IG9uZSBncm91cDsgdGhlIGxhc3QgZ3JvdXAgaXMgYW5jaG9yZWQgYnkgYSB2aXJ0dWFsIFwibnVsbFwiIGlkIGF0IHRoZVxuICAvLyBlbmQuXG5cbiAgLy8gQXN5bXB0b3RpY2FsbHk6IE8oTiBrKSB3aGVyZSBrIGlzIG51bWJlciBvZiBvcHMsIG9yIHBvdGVudGlhbGx5XG4gIC8vIE8oTiBsb2cgTikgaWYgaW5uZXIgbG9vcCBvZiBMQ1Mgd2VyZSBtYWRlIHRvIGJlIGJpbmFyeSBzZWFyY2guXG5cblxuICAvLy8vLy8vLyBMQ1MgKGxvbmdlc3QgY29tbW9uIHNlcXVlbmNlLCB3aXRoIHJlc3BlY3QgdG8gX2lkKVxuICAvLyAoc2VlIFdpa2lwZWRpYSBhcnRpY2xlIG9uIExvbmdlc3QgSW5jcmVhc2luZyBTdWJzZXF1ZW5jZSxcbiAgLy8gd2hlcmUgdGhlIExJUyBpcyB0YWtlbiBvZiB0aGUgc2VxdWVuY2Ugb2Ygb2xkIGluZGljZXMgb2YgdGhlXG4gIC8vIGRvY3MgaW4gbmV3X3Jlc3VsdHMpXG4gIC8vXG4gIC8vIHVubW92ZWQ6IHRoZSBvdXRwdXQgb2YgdGhlIGFsZ29yaXRobTsgbWVtYmVycyBvZiB0aGUgTENTLFxuICAvLyBpbiB0aGUgZm9ybSBvZiBpbmRpY2VzIGludG8gbmV3X3Jlc3VsdHNcbiAgdmFyIHVubW92ZWQgPSBbXTtcbiAgLy8gbWF4X3NlcV9sZW46IGxlbmd0aCBvZiBMQ1MgZm91bmQgc28gZmFyXG4gIHZhciBtYXhfc2VxX2xlbiA9IDA7XG4gIC8vIHNlcV9lbmRzW2ldOiB0aGUgaW5kZXggaW50byBuZXdfcmVzdWx0cyBvZiB0aGUgbGFzdCBkb2MgaW4gYVxuICAvLyBjb21tb24gc3Vic2VxdWVuY2Ugb2YgbGVuZ3RoIG9mIGkrMSA8PSBtYXhfc2VxX2xlblxuICB2YXIgTiA9IG5ld19yZXN1bHRzLmxlbmd0aDtcbiAgdmFyIHNlcV9lbmRzID0gbmV3IEFycmF5KE4pO1xuICAvLyBwdHJzOiAgdGhlIGNvbW1vbiBzdWJzZXF1ZW5jZSBlbmRpbmcgd2l0aCBuZXdfcmVzdWx0c1tuXSBleHRlbmRzXG4gIC8vIGEgY29tbW9uIHN1YnNlcXVlbmNlIGVuZGluZyB3aXRoIG5ld19yZXN1bHRzW3B0cltuXV0sIHVubGVzc1xuICAvLyBwdHJbbl0gaXMgLTEuXG4gIHZhciBwdHJzID0gbmV3IEFycmF5KE4pO1xuICAvLyB2aXJ0dWFsIHNlcXVlbmNlIG9mIG9sZCBpbmRpY2VzIG9mIG5ldyByZXN1bHRzXG4gIHZhciBvbGRfaWR4X3NlcSA9IGZ1bmN0aW9uKGlfbmV3KSB7XG4gICAgcmV0dXJuIG9sZF9pbmRleF9vZl9pZFtuZXdfcmVzdWx0c1tpX25ld10uX2lkXTtcbiAgfTtcbiAgLy8gZm9yIGVhY2ggaXRlbSBpbiBuZXdfcmVzdWx0cywgdXNlIGl0IHRvIGV4dGVuZCBhIGNvbW1vbiBzdWJzZXF1ZW5jZVxuICAvLyBvZiBsZW5ndGggaiA8PSBtYXhfc2VxX2xlblxuICBmb3IodmFyIGk9MDsgaTxOOyBpKyspIHtcbiAgICBpZiAob2xkX2luZGV4X29mX2lkW25ld19yZXN1bHRzW2ldLl9pZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGogPSBtYXhfc2VxX2xlbjtcbiAgICAgIC8vIHRoaXMgaW5uZXIgbG9vcCB3b3VsZCB0cmFkaXRpb25hbGx5IGJlIGEgYmluYXJ5IHNlYXJjaCxcbiAgICAgIC8vIGJ1dCBzY2FubmluZyBiYWNrd2FyZHMgd2Ugd2lsbCBsaWtlbHkgZmluZCBhIHN1YnNlcSB0byBleHRlbmRcbiAgICAgIC8vIHByZXR0eSBzb29uLCBib3VuZGVkIGZvciBleGFtcGxlIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BzLlxuICAgICAgLy8gSWYgdGhpcyB3ZXJlIHRvIGJlIGNoYW5nZWQgdG8gYSBiaW5hcnkgc2VhcmNoLCB3ZSdkIHN0aWxsIHdhbnRcbiAgICAgIC8vIHRvIHNjYW4gYmFja3dhcmRzIGEgYml0IGFzIGFuIG9wdGltaXphdGlvbi5cbiAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICBpZiAob2xkX2lkeF9zZXEoc2VxX2VuZHNbai0xXSkgPCBvbGRfaWR4X3NlcShpKSlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgai0tO1xuICAgICAgfVxuXG4gICAgICBwdHJzW2ldID0gKGogPT09IDAgPyAtMSA6IHNlcV9lbmRzW2otMV0pO1xuICAgICAgc2VxX2VuZHNbal0gPSBpO1xuICAgICAgaWYgKGorMSA+IG1heF9zZXFfbGVuKVxuICAgICAgICBtYXhfc2VxX2xlbiA9IGorMTtcbiAgICB9XG4gIH1cblxuICAvLyBwdWxsIG91dCB0aGUgTENTL0xJUyBpbnRvIHVubW92ZWRcbiAgdmFyIGlkeCA9IChtYXhfc2VxX2xlbiA9PT0gMCA/IC0xIDogc2VxX2VuZHNbbWF4X3NlcV9sZW4tMV0pO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB1bm1vdmVkLnB1c2goaWR4KTtcbiAgICBpZHggPSBwdHJzW2lkeF07XG4gIH1cbiAgLy8gdGhlIHVubW92ZWQgaXRlbSBsaXN0IGlzIGJ1aWx0IGJhY2t3YXJkcywgc28gZml4IHRoYXRcbiAgdW5tb3ZlZC5yZXZlcnNlKCk7XG5cbiAgLy8gdGhlIGxhc3QgZ3JvdXAgaXMgYWx3YXlzIGFuY2hvcmVkIGJ5IHRoZSBlbmQgb2YgdGhlIHJlc3VsdCBsaXN0LCB3aGljaCBpc1xuICAvLyBhbiBpZCBvZiBcIm51bGxcIlxuICB1bm1vdmVkLnB1c2gobmV3X3Jlc3VsdHMubGVuZ3RoKTtcblxuICBvbGRfcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChkb2MpIHtcbiAgICBpZiAoIW5ld19wcmVzZW5jZV9vZl9pZFtkb2MuX2lkXSlcbiAgICAgIG9ic2VydmVyLnJlbW92ZWQgJiYgb2JzZXJ2ZXIucmVtb3ZlZChkb2MuX2lkKTtcbiAgfSk7XG5cbiAgLy8gZm9yIGVhY2ggZ3JvdXAgb2YgdGhpbmdzIGluIHRoZSBuZXdfcmVzdWx0cyB0aGF0IGlzIGFuY2hvcmVkIGJ5IGFuIHVubW92ZWRcbiAgLy8gZWxlbWVudCwgaXRlcmF0ZSB0aHJvdWdoIHRoZSB0aGluZ3MgYmVmb3JlIGl0LlxuICB2YXIgc3RhcnRPZkdyb3VwID0gMDtcbiAgdW5tb3ZlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbmRPZkdyb3VwKSB7XG4gICAgdmFyIGdyb3VwSWQgPSBuZXdfcmVzdWx0c1tlbmRPZkdyb3VwXSA/IG5ld19yZXN1bHRzW2VuZE9mR3JvdXBdLl9pZCA6IG51bGw7XG4gICAgdmFyIG9sZERvYywgbmV3RG9jLCBmaWVsZHMsIHByb2plY3RlZE5ldywgcHJvamVjdGVkT2xkO1xuICAgIGZvciAodmFyIGkgPSBzdGFydE9mR3JvdXA7IGkgPCBlbmRPZkdyb3VwOyBpKyspIHtcbiAgICAgIG5ld0RvYyA9IG5ld19yZXN1bHRzW2ldO1xuICAgICAgaWYgKCFoYXNPd24uY2FsbChvbGRfaW5kZXhfb2ZfaWQsIG5ld0RvYy5faWQpKSB7XG4gICAgICAgIGZpZWxkcyA9IHByb2plY3Rpb25GbihuZXdEb2MpO1xuICAgICAgICBkZWxldGUgZmllbGRzLl9pZDtcbiAgICAgICAgb2JzZXJ2ZXIuYWRkZWRCZWZvcmUgJiYgb2JzZXJ2ZXIuYWRkZWRCZWZvcmUobmV3RG9jLl9pZCwgZmllbGRzLCBncm91cElkKTtcbiAgICAgICAgb2JzZXJ2ZXIuYWRkZWQgJiYgb2JzZXJ2ZXIuYWRkZWQobmV3RG9jLl9pZCwgZmllbGRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1vdmVkXG4gICAgICAgIG9sZERvYyA9IG9sZF9yZXN1bHRzW29sZF9pbmRleF9vZl9pZFtuZXdEb2MuX2lkXV07XG4gICAgICAgIHByb2plY3RlZE5ldyA9IHByb2plY3Rpb25GbihuZXdEb2MpO1xuICAgICAgICBwcm9qZWN0ZWRPbGQgPSBwcm9qZWN0aW9uRm4ob2xkRG9jKTtcbiAgICAgICAgZmllbGRzID0gRGlmZlNlcXVlbmNlLm1ha2VDaGFuZ2VkRmllbGRzKHByb2plY3RlZE5ldywgcHJvamVjdGVkT2xkKTtcbiAgICAgICAgaWYgKCFpc09iakVtcHR5KGZpZWxkcykpIHtcbiAgICAgICAgICBvYnNlcnZlci5jaGFuZ2VkICYmIG9ic2VydmVyLmNoYW5nZWQobmV3RG9jLl9pZCwgZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5tb3ZlZEJlZm9yZSAmJiBvYnNlcnZlci5tb3ZlZEJlZm9yZShuZXdEb2MuX2lkLCBncm91cElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgIG5ld0RvYyA9IG5ld19yZXN1bHRzW2VuZE9mR3JvdXBdO1xuICAgICAgb2xkRG9jID0gb2xkX3Jlc3VsdHNbb2xkX2luZGV4X29mX2lkW25ld0RvYy5faWRdXTtcbiAgICAgIHByb2plY3RlZE5ldyA9IHByb2plY3Rpb25GbihuZXdEb2MpO1xuICAgICAgcHJvamVjdGVkT2xkID0gcHJvamVjdGlvbkZuKG9sZERvYyk7XG4gICAgICBmaWVsZHMgPSBEaWZmU2VxdWVuY2UubWFrZUNoYW5nZWRGaWVsZHMocHJvamVjdGVkTmV3LCBwcm9qZWN0ZWRPbGQpO1xuICAgICAgaWYgKCFpc09iakVtcHR5KGZpZWxkcykpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY2hhbmdlZCAmJiBvYnNlcnZlci5jaGFuZ2VkKG5ld0RvYy5faWQsIGZpZWxkcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXJ0T2ZHcm91cCA9IGVuZE9mR3JvdXArMTtcbiAgfSk7XG5cblxufTtcblxuXG4vLyBHZW5lcmFsIGhlbHBlciBmb3IgZGlmZi1pbmcgdHdvIG9iamVjdHMuXG4vLyBjYWxsYmFja3MgaXMgYW4gb2JqZWN0IGxpa2Ugc286XG4vLyB7IGxlZnRPbmx5OiBmdW5jdGlvbiAoa2V5LCBsZWZ0VmFsdWUpIHsuLi59LFxuLy8gICByaWdodE9ubHk6IGZ1bmN0aW9uIChrZXksIHJpZ2h0VmFsdWUpIHsuLi59LFxuLy8gICBib3RoOiBmdW5jdGlvbiAoa2V5LCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpIHsuLi59LFxuLy8gfVxuRGlmZlNlcXVlbmNlLmRpZmZPYmplY3RzID0gZnVuY3Rpb24gKGxlZnQsIHJpZ2h0LCBjYWxsYmFja3MpIHtcbiAgT2JqZWN0LmtleXMobGVmdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgIGNvbnN0IGxlZnRWYWx1ZSA9IGxlZnRba2V5XTtcbiAgICBpZiAoaGFzT3duLmNhbGwocmlnaHQsIGtleSkpIHtcbiAgICAgIGNhbGxiYWNrcy5ib3RoICYmIGNhbGxiYWNrcy5ib3RoKGtleSwgbGVmdFZhbHVlLCByaWdodFtrZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2tzLmxlZnRPbmx5ICYmIGNhbGxiYWNrcy5sZWZ0T25seShrZXksIGxlZnRWYWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICBpZiAoY2FsbGJhY2tzLnJpZ2h0T25seSkge1xuICAgIE9iamVjdC5rZXlzKHJpZ2h0KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCByaWdodFZhbHVlID0gcmlnaHRba2V5XTtcbiAgICAgIGlmICghIGhhc093bi5jYWxsKGxlZnQsIGtleSkpIHtcbiAgICAgICAgY2FsbGJhY2tzLnJpZ2h0T25seShrZXksIHJpZ2h0VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG5EaWZmU2VxdWVuY2UuZGlmZk1hcHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGNhbGxiYWNrcykge1xuICBsZWZ0LmZvckVhY2goZnVuY3Rpb24gKGxlZnRWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHJpZ2h0LmhhcyhrZXkpKXtcbiAgICAgIGNhbGxiYWNrcy5ib3RoICYmIGNhbGxiYWNrcy5ib3RoKGtleSwgbGVmdFZhbHVlLCByaWdodC5nZXQoa2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrcy5sZWZ0T25seSAmJiBjYWxsYmFja3MubGVmdE9ubHkoa2V5LCBsZWZ0VmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGNhbGxiYWNrcy5yaWdodE9ubHkpIHtcbiAgICByaWdodC5mb3JFYWNoKGZ1bmN0aW9uIChyaWdodFZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICghbGVmdC5oYXMoa2V5KSl7XG4gICAgICAgIGNhbGxiYWNrcy5yaWdodE9ubHkoa2V5LCByaWdodFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuXG5EaWZmU2VxdWVuY2UubWFrZUNoYW5nZWRGaWVsZHMgPSBmdW5jdGlvbiAobmV3RG9jLCBvbGREb2MpIHtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBEaWZmU2VxdWVuY2UuZGlmZk9iamVjdHMob2xkRG9jLCBuZXdEb2MsIHtcbiAgICBsZWZ0T25seTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGZpZWxkc1trZXldID0gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcmlnaHRPbmx5OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgZmllbGRzW2tleV0gPSB2YWx1ZTtcbiAgICB9LFxuICAgIGJvdGg6IGZ1bmN0aW9uIChrZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkge1xuICAgICAgaWYgKCFFSlNPTi5lcXVhbHMobGVmdFZhbHVlLCByaWdodFZhbHVlKSlcbiAgICAgICAgZmllbGRzW2tleV0gPSByaWdodFZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5EaWZmU2VxdWVuY2UuYXBwbHlDaGFuZ2VzID0gZnVuY3Rpb24gKGRvYywgY2hhbmdlRmllbGRzKSB7XG4gIE9iamVjdC5rZXlzKGNoYW5nZUZpZWxkcykuZm9yRWFjaChrZXkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlRmllbGRzW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgZGVsZXRlIGRvY1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2Nba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/diff-sequence/diff.js"],"names":["module","export","DiffSequence","hasOwn","Object","prototype","hasOwnProperty","isObjEmpty","obj","key","call","diffQueryChanges","ordered","oldResults","newResults","observer","options","diffQueryOrderedChanges","diffQueryUnorderedChanges","projectionFn","EJSON","clone","movedBefore","Error","forEach","newDoc","id","oldDoc","get","changed","equals","projectedNew","projectedOld","changedFields","makeChangedFields","added","fields","_id","removed","has","old_results","new_results","new_presence_of_id","doc","Meteor","_debug","old_index_of_id","i","unmoved","max_seq_len","N","length","seq_ends","Array","ptrs","old_idx_seq","i_new","undefined","j","idx","push","reverse","startOfGroup","endOfGroup","groupId","addedBefore","diffObjects","left","right","callbacks","keys","leftValue","both","leftOnly","rightOnly","rightValue","diffMaps","value","applyChanges","changeFields"],"mappings":"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","file":"/packages/diff-sequence.js","sourcesContent":["export const DiffSequence = {};\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nfunction isObjEmpty(obj) {\n for (let key in Object(obj)) {\n if (hasOwn.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\n\n// ordered: bool.\n// old_results and new_results: collections of documents.\n// if ordered, they are arrays.\n// if unordered, they are IdMaps\nDiffSequence.diffQueryChanges = function (ordered, oldResults, newResults,\n observer, options) {\n if (ordered)\n DiffSequence.diffQueryOrderedChanges(\n oldResults, newResults, observer, options);\n else\n DiffSequence.diffQueryUnorderedChanges(\n oldResults, newResults, observer, options);\n};\n\nDiffSequence.diffQueryUnorderedChanges = function (oldResults, newResults,\n observer, options) {\n options = options || {};\n var projectionFn = options.projectionFn || EJSON.clone;\n\n if (observer.movedBefore) {\n throw new Error(\"_diffQueryUnordered called with a movedBefore observer!\");\n }\n\n newResults.forEach(function (newDoc, id) {\n var oldDoc = oldResults.get(id);\n if (oldDoc) {\n if (observer.changed && !EJSON.equals(oldDoc, newDoc)) {\n var projectedNew = projectionFn(newDoc);\n var projectedOld = projectionFn(oldDoc);\n var changedFields =\n DiffSequence.makeChangedFields(projectedNew, projectedOld);\n if (! isObjEmpty(changedFields)) {\n observer.changed(id, changedFields);\n }\n }\n } else if (observer.added) {\n var fields = projectionFn(newDoc);\n delete fields._id;\n observer.added(newDoc._id, fields);\n }\n });\n\n if (observer.removed) {\n oldResults.forEach(function (oldDoc, id) {\n if (!newResults.has(id))\n observer.removed(id);\n });\n }\n};\n\nDiffSequence.diffQueryOrderedChanges = function (old_results, new_results,\n observer, options) {\n options = options || {};\n var projectionFn = options.projectionFn || EJSON.clone;\n\n var new_presence_of_id = {};\n new_results.forEach(function (doc) {\n if (new_presence_of_id[doc._id])\n Meteor._debug(\"Duplicate _id in new_results\");\n new_presence_of_id[doc._id] = true;\n });\n\n var old_index_of_id = {};\n old_results.forEach(function (doc, i) {\n if (doc._id in old_index_of_id)\n Meteor._debug(\"Duplicate _id in old_results\");\n old_index_of_id[doc._id] = i;\n });\n\n // ALGORITHM:\n //\n // To determine which docs should be considered \"moved\" (and which\n // merely change position because of other docs moving) we run\n // a \"longest common subsequence\" (LCS) algorithm. The LCS of the\n // old doc IDs and the new doc IDs gives the docs that should NOT be\n // considered moved.\n\n // To actually call the appropriate callbacks to get from the old state to the\n // new state:\n\n // First, we call removed() on all the items that only appear in the old\n // state.\n\n // Then, once we have the items that should not move, we walk through the new\n // results array group-by-group, where a \"group\" is a set of items that have\n // moved, anchored on the end by an item that should not move. One by one, we\n // move each of those elements into place \"before\" the anchoring end-of-group\n // item, and fire changed events on them if necessary. Then we fire a changed\n // event on the anchor, and move on to the next group. There is always at\n // least one group; the last group is anchored by a virtual \"null\" id at the\n // end.\n\n // Asymptotically: O(N k) where k is number of ops, or potentially\n // O(N log N) if inner loop of LCS were made to be binary search.\n\n\n //////// LCS (longest common sequence, with respect to _id)\n // (see Wikipedia article on Longest Increasing Subsequence,\n // where the LIS is taken of the sequence of old indices of the\n // docs in new_results)\n //\n // unmoved: the output of the algorithm; members of the LCS,\n // in the form of indices into new_results\n var unmoved = [];\n // max_seq_len: length of LCS found so far\n var max_seq_len = 0;\n // seq_ends[i]: the index into new_results of the last doc in a\n // common subsequence of length of i+1 <= max_seq_len\n var N = new_results.length;\n var seq_ends = new Array(N);\n // ptrs: the common subsequence ending with new_results[n] extends\n // a common subsequence ending with new_results[ptr[n]], unless\n // ptr[n] is -1.\n var ptrs = new Array(N);\n // virtual sequence of old indices of new results\n var old_idx_seq = function(i_new) {\n return old_index_of_id[new_results[i_new]._id];\n };\n // for each item in new_results, use it to extend a common subsequence\n // of length j <= max_seq_len\n for(var i=0; i<N; i++) {\n if (old_index_of_id[new_results[i]._id] !== undefined) {\n var j = max_seq_len;\n // this inner loop would traditionally be a binary search,\n // but scanning backwards we will likely find a subseq to extend\n // pretty soon, bounded for example by the total number of ops.\n // If this were to be changed to a binary search, we'd still want\n // to scan backwards a bit as an optimization.\n while (j > 0) {\n if (old_idx_seq(seq_ends[j-1]) < old_idx_seq(i))\n break;\n j--;\n }\n\n ptrs[i] = (j === 0 ? -1 : seq_ends[j-1]);\n seq_ends[j] = i;\n if (j+1 > max_seq_len)\n max_seq_len = j+1;\n }\n }\n\n // pull out the LCS/LIS into unmoved\n var idx = (max_seq_len === 0 ? -1 : seq_ends[max_seq_len-1]);\n while (idx >= 0) {\n unmoved.push(idx);\n idx = ptrs[idx];\n }\n // the unmoved item list is built backwards, so fix that\n unmoved.reverse();\n\n // the last group is always anchored by the end of the result list, which is\n // an id of \"null\"\n unmoved.push(new_results.length);\n\n old_results.forEach(function (doc) {\n if (!new_presence_of_id[doc._id])\n observer.removed && observer.removed(doc._id);\n });\n\n // for each group of things in the new_results that is anchored by an unmoved\n // element, iterate through the things before it.\n var startOfGroup = 0;\n unmoved.forEach(function (endOfGroup) {\n var groupId = new_results[endOfGroup] ? new_results[endOfGroup]._id : null;\n var oldDoc, newDoc, fields, projectedNew, projectedOld;\n for (var i = startOfGroup; i < endOfGroup; i++) {\n newDoc = new_results[i];\n if (!hasOwn.call(old_index_of_id, newDoc._id)) {\n fields = projectionFn(newDoc);\n delete fields._id;\n observer.addedBefore && observer.addedBefore(newDoc._id, fields, groupId);\n observer.added && observer.added(newDoc._id, fields);\n } else {\n // moved\n oldDoc = old_results[old_index_of_id[newDoc._id]];\n projectedNew = projectionFn(newDoc);\n projectedOld = projectionFn(oldDoc);\n fields = DiffSequence.makeChangedFields(projectedNew, projectedOld);\n if (!isObjEmpty(fields)) {\n observer.changed && observer.changed(newDoc._id, fields);\n }\n observer.movedBefore && observer.movedBefore(newDoc._id, groupId);\n }\n }\n if (groupId) {\n newDoc = new_results[endOfGroup];\n oldDoc = old_results[old_index_of_id[newDoc._id]];\n projectedNew = projectionFn(newDoc);\n projectedOld = projectionFn(oldDoc);\n fields = DiffSequence.makeChangedFields(projectedNew, projectedOld);\n if (!isObjEmpty(fields)) {\n observer.changed && observer.changed(newDoc._id, fields);\n }\n }\n startOfGroup = endOfGroup+1;\n });\n\n\n};\n\n\n// General helper for diff-ing two objects.\n// callbacks is an object like so:\n// { leftOnly: function (key, leftValue) {...},\n// rightOnly: function (key, rightValue) {...},\n// both: function (key, leftValue, rightValue) {...},\n// }\nDiffSequence.diffObjects = function (left, right, callbacks) {\n Object.keys(left).forEach(key => {\n const leftValue = left[key];\n if (hasOwn.call(right, key)) {\n callbacks.both && callbacks.both(key, leftValue, right[key]);\n } else {\n callbacks.leftOnly && callbacks.leftOnly(key, leftValue);\n }\n });\n\n if (callbacks.rightOnly) {\n Object.keys(right).forEach(key => {\n const rightValue = right[key];\n if (! hasOwn.call(left, key)) {\n callbacks.rightOnly(key, rightValue);\n }\n });\n }\n};\n\nDiffSequence.diffMaps = function (left, right, callbacks) {\n left.forEach(function (leftValue, key) {\n if (right.has(key)){\n callbacks.both && callbacks.both(key, leftValue, right.get(key));\n } else {\n callbacks.leftOnly && callbacks.leftOnly(key, leftValue);\n }\n });\n\n if (callbacks.rightOnly) {\n right.forEach(function (rightValue, key) {\n if (!left.has(key)){\n callbacks.rightOnly(key, rightValue);\n }\n });\n }\n};\n\n\nDiffSequence.makeChangedFields = function (newDoc, oldDoc) {\n var fields = {};\n DiffSequence.diffObjects(oldDoc, newDoc, {\n leftOnly: function (key, value) {\n fields[key] = undefined;\n },\n rightOnly: function (key, value) {\n fields[key] = value;\n },\n both: function (key, leftValue, rightValue) {\n if (!EJSON.equals(leftValue, rightValue))\n fields[key] = rightValue;\n }\n });\n return fields;\n};\n\nDiffSequence.applyChanges = function (doc, changeFields) {\n Object.keys(changeFields).forEach(key => {\n const value = changeFields[key];\n if (typeof value === \"undefined\") {\n delete doc[key];\n } else {\n doc[key] = value;\n }\n });\n};\n\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var Promise = Package.promise.Promise;
var fetch = Package.fetch.fetch;
var require = meteorInstall({"node_modules":{"meteor":{"dynamic-import":{"server.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/server.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
"use strict";
const assert = require("assert");
const { readFileSync } = require("fs");
const {
join: pathJoin,
normalize: pathNormalize,
} = require("path");
const { fetchURL } = require("./common.js");
const { Meteor } = require("meteor/meteor");
const { isModern } = require("meteor/modern-browsers");
const hasOwn = Object.prototype.hasOwnProperty;
require("./security.js");
const client = require("./client.js");
Meteor.startup(() => {
if (! Package.webapp) {
// If the webapp package is not in use, there's no way for the
// dynamic-import package to fetch dynamic modules, so we should
// abandon the rest of the logic in this module.
//
// If api.use("webapp") appeared in dynamic-import/package.js, then
// Package.webapp would always be defined here, of course, but that
// would be a bad idea, because the dynamic-import package should not
// single-handedly force a dependency on webapp if the program does
// not otherwise need a web server (e.g., when the program is an
// isopacket or build plugin instead of a web application).
//
// Note that the client.js module (imported above) still defines
// Module.prototype.dynamicImport, which will work as long as no
// modules need to be fetched.
return;
}
Object.keys(dynamicImportInfo).forEach(setUpPlatform);
Package.webapp.WebAppInternals.meteorInternalHandlers.use(
fetchURL,
middleware
);
});
function setUpPlatform(platform) {
const info = dynamicImportInfo[platform];
if (info.dynamicRoot) {
info.dynamicRoot = pathNormalize(info.dynamicRoot);
}
if (platform === "server") {
client.setSecretKey(info.key = randomId(40));
}
}
function randomId(n) {
let s = "";
while (s.length < n) {
s += Math.random().toString(36).slice(2);
}
return s.slice(0, n);
}
function middleware(request, response) {
// Allow dynamic import() requests from any origin.
response.setHeader("Access-Control-Allow-Origin", "*");
if (request.method === "OPTIONS") {
const acrh = request.headers["access-control-request-headers"];
response.setHeader(
"Access-Control-Allow-Headers",
typeof acrh === "string" ? acrh : "*"
);
response.setHeader("Access-Control-Allow-Methods", "POST");
response.end();
} else if (request.method === "POST") {
const chunks = [];
request.on("data", chunk => chunks.push(chunk));
request.on("end", () => {
try {
const tree = JSON.stringify(readTree(
JSON.parse(Buffer.concat(chunks)),
getPlatform(request)
), null, 2);
response.writeHead(200, {
"Content-Type": "application/json"
});
response.end(tree);
} catch (e) {
response.writeHead(400, {
"Content-Type": "application/json"
});
response.end(JSON.stringify(
Meteor.isDevelopment && e.message || "bad request"
));
}
});
} else {
response.writeHead(405, {
"Cache-Control": "no-cache"
});
response.end(`method ${request.method} not allowed`);
}
}
function getPlatform(request) {
const { identifyBrowser } = Package.webapp.WebAppInternals;
const browser = identifyBrowser(request.headers["user-agent"]);
let platform = isModern(browser)
? "web.browser"
: "web.browser.legacy";
// If the __dynamicImport request includes a secret key, and it matches
// dynamicImportInfo[platform].key, use platform instead of the default
// platform, web.browser.
const secretKey = request.query.key;
if (typeof secretKey === "string") {
Object.keys(dynamicImportInfo).some(p => {
if (secretKey === dynamicImportInfo[p].key) {
platform = p;
return true;
}
});
}
return platform;
}
function readTree(tree, platform) {
const pathParts = [];
function walk(node) {
if (! node) {
return null;
}
if (typeof node !== "object") {
return read(pathParts, platform);
}
let empty = true;
Object.keys(node).forEach(name => {
pathParts.push(name);
const result = walk(node[name]);
if (result === null) {
// If the read function returns null, omit this module from the
// resulting tree.
delete node[name];
} else {
node[name] = result;
empty = false;
}
assert.strictEqual(pathParts.pop(), name);
});
if (empty) {
// If every recursive call to walk(node[name]) returned null,
// remove this node from the resulting tree by returning null.
return null;
}
return node;
}
return walk(tree);
}
function read(pathParts, platform) {
const { dynamicRoot } = dynamicImportInfo[platform];
const absPath = pathNormalize(pathJoin(
dynamicRoot,
pathJoin(...pathParts).replace(/:/g, "_")
));
if (! absPath.startsWith(dynamicRoot)) {
console.error("bad dynamic import path:", absPath);
return null;
}
const cache = getCache(platform);
if (hasOwn.call(cache, absPath)) {
return cache[absPath];
}
try {
return cache[absPath] = readFileSync(absPath, "utf8");
} catch (e) {
console.error(e.stack || e);
return null;
}
}
const cachesByPlatform = Object.create(null);
function getCache(platform) {
return hasOwn.call(cachesByPlatform, platform)
? cachesByPlatform[platform]
: cachesByPlatform[platform] = Object.create(null);
}
const { onMessage } = require("meteor/inter-process-messaging");
onMessage("client-refresh", () => {
// The caches for the web.browser[.legacy] platforms need to be
// discarded whenever a client-only refresh occurs, so the new client
// bundle does not fetch stale module data from dynamic import(). This
// message is sent by tools/runners/run-app.js and also consumed by the
// autoupdate package.
Object.keys(cachesByPlatform).forEach(platform => {
delete cachesByPlatform[platform];
});
});
/////////////////////////////////////////////////////////////////////////////////
},"cache.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/cache.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
var dbPromise;
var canUseCache =
// The server doesn't benefit from dynamic module fetching, and almost
// certainly doesn't support IndexedDB.
Meteor.isClient &&
// Cordova bundles all modules into the monolithic initial bundle, so
// the dynamic module cache won't be necessary.
! Meteor.isCordova &&
// Caching can be confusing in development, and is designed to be a
// transparent optimization for production performance.
Meteor.isProduction;
function getIDB() {
if (typeof indexedDB !== "undefined") return indexedDB;
if (typeof webkitIndexedDB !== "undefined") return webkitIndexedDB;
if (typeof mozIndexedDB !== "undefined") return mozIndexedDB;
if (typeof OIndexedDB !== "undefined") return OIndexedDB;
if (typeof msIndexedDB !== "undefined") return msIndexedDB;
}
function withDB(callback) {
dbPromise = dbPromise || new Promise(function (resolve, reject) {
var idb = getIDB();
if (! idb) {
throw new Error("IndexedDB not available");
}
// Incrementing the version number causes all existing object stores
// to be deleted and recreates those specified by objectStoreMap.
var request = idb.open("MeteorDynamicImportCache", 2);
request.onupgradeneeded = function (event) {
var db = event.target.result;
// It's fine to delete existing object stores since onupgradeneeded
// is only called when we change the DB version number, and the data
// we're storing is disposable/reconstructible.
Array.from(db.objectStoreNames).forEach(db.deleteObjectStore, db);
Object.keys(objectStoreMap).forEach(function (name) {
db.createObjectStore(name, objectStoreMap[name]);
});
};
request.onerror = makeOnError(reject, "indexedDB.open");
request.onsuccess = function (event) {
resolve(event.target.result);
};
});
return dbPromise.then(callback, function (error) {
return callback(null);
});
}
var objectStoreMap = {
sourcesByVersion: { keyPath: "version" }
};
function makeOnError(reject, source) {
return function (event) {
reject(new Error(
"IndexedDB failure in " + source + " " +
JSON.stringify(event.target)
));
// Returning true from an onerror callback function prevents an
// InvalidStateError in Firefox during Private Browsing. Silencing
// that error is safe because we handle the error more gracefully by
// passing it to the Promise reject function above.
// https://github.com/meteor/meteor/issues/8697
return true;
};
}
var checkCount = 0;
exports.checkMany = function (versions) {
var ids = Object.keys(versions);
var sourcesById = Object.create(null);
// Initialize sourcesById with null values to indicate all sources are
// missing (unless replaced with actual sources below).
ids.forEach(function (id) {
sourcesById[id] = null;
});
if (! canUseCache) {
return Promise.resolve(sourcesById);
}
return withDB(function (db) {
if (! db) {
// We thought we could used IndexedDB, but something went wrong
// while opening the database, so err on the side of safety.
return sourcesById;
}
var txn = db.transaction([
"sourcesByVersion"
], "readonly");
var sourcesByVersion = txn.objectStore("sourcesByVersion");
++checkCount;
function finish() {
--checkCount;
return sourcesById;
}
return Promise.all(ids.map(function (id) {
return new Promise(function (resolve, reject) {
var version = versions[id];
if (version) {
var sourceRequest = sourcesByVersion.get(version);
sourceRequest.onerror = makeOnError(reject, "sourcesByVersion.get");
sourceRequest.onsuccess = function (event) {
var result = event.target.result;
if (result) {
sourcesById[id] = result.source;
}
resolve();
};
} else resolve();
});
})).then(finish, finish);
});
};
var pendingVersionsAndSourcesById = Object.create(null);
exports.setMany = function (versionsAndSourcesById) {
if (canUseCache) {
Object.assign(
pendingVersionsAndSourcesById,
versionsAndSourcesById
);
// Delay the call to flushSetMany so that it doesn't contribute to the
// amount of time it takes to call module.dynamicImport.
if (! flushSetMany.timer) {
flushSetMany.timer = setTimeout(flushSetMany, 100);
}
}
};
function flushSetMany() {
if (checkCount > 0) {
// If checkMany is currently underway, postpone the flush until later,
// since updating the cache is less important than reading from it.
return flushSetMany.timer = setTimeout(flushSetMany, 100);
}
flushSetMany.timer = null;
var versionsAndSourcesById = pendingVersionsAndSourcesById;
pendingVersionsAndSourcesById = Object.create(null);
return withDB(function (db) {
if (! db) {
// We thought we could used IndexedDB, but something went wrong
// while opening the database, so err on the side of safety.
return;
}
var setTxn = db.transaction([
"sourcesByVersion"
], "readwrite");
var sourcesByVersion = setTxn.objectStore("sourcesByVersion");
return Promise.all(
Object.keys(versionsAndSourcesById).map(function (id) {
var info = versionsAndSourcesById[id];
return new Promise(function (resolve, reject) {
var request = sourcesByVersion.put({
version: info.version,
source: info.source
});
request.onerror = makeOnError(reject, "sourcesByVersion.put");
request.onsuccess = resolve;
});
})
);
});
}
/////////////////////////////////////////////////////////////////////////////////
},"client.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/client.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
var Module = module.constructor;
var cache = require("./cache.js");
var meteorInstall = require("meteor/modules").meteorInstall;
// Call module.dynamicImport(id) to fetch a module and any/all of its
// dependencies that have not already been fetched, and evaluate them as
// soon as they arrive. This runtime API makes it very easy to implement
// ECMAScript dynamic import(...) syntax.
Module.prototype.dynamicImport = function (id) {
var module = this;
return module.prefetch(id).then(function () {
return getNamespace(module, id);
});
};
// Called by Module.prototype.prefetch if there are any missing dynamic
// modules that need to be fetched.
meteorInstall.fetch = function (ids) {
var tree = Object.create(null);
var versions = Object.create(null);
var dynamicVersions = require("./dynamic-versions.js");
var missing;
function addSource(id, source) {
addToTree(tree, id, makeModuleFunction(id, source, ids[id].options));
}
function addMissing(id) {
addToTree(missing = missing || Object.create(null), id, 1);
}
Object.keys(ids).forEach(function (id) {
var version = dynamicVersions.get(id);
if (version) {
versions[id] = version;
} else {
addMissing(id);
}
});
return cache.checkMany(versions).then(function (sources) {
Object.keys(sources).forEach(function (id) {
var source = sources[id];
if (source) {
addSource(id, source);
} else {
addMissing(id);
}
});
return missing && fetchMissing(missing).then(function (results) {
var versionsAndSourcesById = Object.create(null);
var flatResults = flattenModuleTree(results);
Object.keys(flatResults).forEach(function (id) {
var source = flatResults[id];
addSource(id, source);
var version = dynamicVersions.get(id);
if (version) {
versionsAndSourcesById[id] = {
version: version,
source: source
};
}
});
cache.setMany(versionsAndSourcesById);
});
}).then(function () {
return tree;
});
};
function flattenModuleTree(tree) {
var parts = [""];
var result = Object.create(null);
function walk(t) {
if (t && typeof t === "object") {
Object.keys(t).forEach(function (key) {
parts.push(key);
walk(t[key]);
parts.pop();
});
} else if (typeof t === "string") {
result[parts.join("/")] = t;
}
}
walk(tree);
return result;
}
function makeModuleFunction(id, source, options) {
// By calling (options && options.eval || eval) in a wrapper function,
// we delay the cost of parsing and evaluating the module code until the
// module is first imported.
return function () {
// If an options.eval function was provided in the second argument to
// meteorInstall when this bundle was first installed, use that
// function to parse and evaluate the dynamic module code in the scope
// of the package. Otherwise fall back to indirect (global) eval.
return (options && options.eval || eval)(
// Wrap the function(require,exports,module){...} expression in
// parentheses to force it to be parsed as an expression.
"(" + source + ")\n//# sourceURL=" + id
).apply(this, arguments);
};
}
var secretKey = null;
exports.setSecretKey = function (key) {
secretKey = key;
};
var fetchURL = require("./common.js").fetchURL;
function fetchMissing(missingTree) {
// If the hostname of the URL returned by Meteor.absoluteUrl differs
// from location.host, then we'll be making a cross-origin request here,
// but that's fine because the dynamic-import server sets appropriate
// CORS headers to enable fetching dynamic modules from any
// origin. Browsers that check CORS do so by sending an additional
// preflight OPTIONS request, which may add latency to the first dynamic
// import() request, so it's a good idea for ROOT_URL to match
// location.host if possible, though not strictly necessary.
var url = Meteor.absoluteUrl(fetchURL);
if (secretKey) {
url += "key=" + secretKey;
}
return fetch(url, {
method: "POST",
body: JSON.stringify(missingTree)
}).then(function (res) {
if (! res.ok) throw res;
return res.json();
});
}
function addToTree(tree, id, value) {
var parts = id.split("/");
var lastIndex = parts.length - 1;
parts.forEach(function (part, i) {
if (part) {
tree = tree[part] = tree[part] ||
(i < lastIndex ? Object.create(null) : value);
}
});
}
function getNamespace(module, id) {
var namespace;
module.link(id, {
"*": function (ns) {
namespace = ns;
}
});
// This helps with Babel interop, since we're not just returning the
// module.exports object.
Object.defineProperty(namespace, "__esModule", {
value: true,
enumerable: false
});
return namespace;
}
/////////////////////////////////////////////////////////////////////////////////
},"common.js":function(require,exports){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/common.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
exports.fetchURL = "/__meteor__/dynamic-import/fetch";
/////////////////////////////////////////////////////////////////////////////////
},"dynamic-versions.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/dynamic-versions.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
// This magic double-underscored identifier gets replaced in
// tools/isobuild/bundler.js with a tree of hashes of all dynamic
// modules, for use in client.js and cache.js.
var versions = {};
exports.get = function (id) {
var tree = versions;
var version = null;
id.split("/").some(function (part) {
if (part) {
// If the tree contains identifiers for Meteor packages with colons
// in their names, the colons should not have been replaced by
// underscores, but there's a bug that results in that behavior, so
// for now it seems safest to be tolerant of underscores here.
// https://github.com/meteor/meteor/pull/9103
tree = tree[part] || tree[part.replace(":", "_")];
}
if (! tree) {
// Terminate the search without reassigning version.
return true;
}
if (typeof tree === "string") {
version = tree;
return true;
}
});
return version;
};
function getFlatModuleArray(tree) {
var parts = [""];
var result = [];
function walk(t) {
if (t && typeof t === "object") {
Object.keys(t).forEach(function (key) {
parts.push(key);
walk(t[key]);
parts.pop();
});
} else if (typeof t === "string") {
result.push(parts.join("/"));
}
}
walk(tree);
return result;
}
// If Package.appcache is loaded, preload additional modules after the
// core bundle has been loaded.
function precacheOnLoad(event) {
// Check inside onload to make sure Package.appcache has had a chance to
// become available.
if (! Package.appcache) {
return;
}
// Prefetch in chunks to reduce overhead. If we call module.prefetch(id)
// multiple times in the same tick of the event loop, all those modules
// will be fetched in one HTTP POST request.
function prefetchInChunks(modules, amount) {
Promise.all(modules.splice(0, amount).map(function (id) {
return module.prefetch(id);
})).then(function () {
if (modules.length > 0) {
setTimeout(function () {
prefetchInChunks(modules, amount);
}, 0);
}
});
}
// Get a flat array of modules and start prefetching.
prefetchInChunks(getFlatModuleArray(versions), 50);
}
// Use window.onload to only prefetch after the main bundle has loaded.
if (global.addEventListener) {
global.addEventListener('load', precacheOnLoad, false);
} else if (global.attachEvent) {
global.attachEvent('onload', precacheOnLoad);
}
/////////////////////////////////////////////////////////////////////////////////
},"security.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////
// //
// packages/dynamic-import/security.js //
// //
/////////////////////////////////////////////////////////////////////////////////
//
Meteor.startup(function () {
const bpc = Package["browser-policy-content"];
const BP = bpc && bpc.BrowserPolicy;
const BPc = BP && BP.content;
if (BPc) {
// The ability to evaluate new code is essential for loading dynamic
// modules. Without eval, we would be forced to load modules using
// <script src=...> tags, and then there would be no way to save those
// modules to a local cache (or load them from the cache) without the
// unique response caching abilities of service workers, which are not
// available in all browsers, and cannot be polyfilled in a way that
// satisfies Content Security Policy eval restrictions. Moreover, eval
// allows us to evaluate dynamic module code in the original package
// scope, which would never be possible using <script> tags. If you're
// deploying an app in an environment that demands a Content Security
// Policy that forbids eval, your only option is to bundle all dynamic
// modules in the initial bundle. Fortunately, that works perfectly
// well; you just won't get the performance benefits of dynamic module
// fetching.
BPc.allowEval();
}
});
/////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/dynamic-import/server.js");
/* Exports */
Package._define("dynamic-import", exports);
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var Promise = Package.promise.Promise;
var require = meteorInstall({"node_modules":{"meteor":{"ecmascript-runtime-client":{"versions.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/ecmascript-runtime-client/versions.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
const {
setMinimumBrowserVersions,
} = require("meteor/modern-browsers");
setMinimumBrowserVersions({
chrome: 49,
edge: 12,
// Since there is no IE11, this effectively excludes Internet Explorer
// (pre-Edge) from the modern classification. #9818 #9839
ie: 12,
firefox: 45,
mobileSafari: 10,
opera: 38,
safari: 10,
// Electron 1.6.0+ matches Chromium 55, per
// https://github.com/Kilian/electron-to-chromium/blob/master/full-versions.js
electron: [1, 6],
}, module.id);
///////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/ecmascript-runtime-client/versions.js");
/* Exports */
Package._define("ecmascript-runtime-client", exports);
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var require = meteorInstall({"node_modules":{"meteor":{"ecmascript-runtime-server":{"runtime.js":function(require){
/////////////////////////////////////////////////////////////////////////////
// //
// packages/ecmascript-runtime-server/runtime.js //
// //
/////////////////////////////////////////////////////////////////////////////
//
// The ecmascript-runtime-server package depends on its own copy of
// core-js using Npm.depends, so we don't have to check that core-js is
// available (as we do in ecmascript-runtime-client/runtime.js).
// List of polyfills generated by babel-preset-env with the following
// .babelrc configuration:
//
// {
// "presets": [
// ["env", {
// "targets": {
// "node": 8
// },
// "modules": false,
// "polyfill": true,
// "useBuiltIns": true
// }]
// ]
// }
//
// Note that the es6.reflect.* and es6.typed.* modules have been commented
// out for bundle size reasons.
require("core-js/modules/es7.string.pad-start");
require("core-js/modules/es7.string.pad-end");
/////////////////////////////////////////////////////////////////////////////
},"node_modules":{"core-js":{"modules":{"es7.string.pad-start.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ecmascript-runtime-server/node_modules/core-js/modu //
// //
/////////////////////////////////////////////////////////////////////////////
//
module.useNode();
/////////////////////////////////////////////////////////////////////////////
},"es7.string.pad-end.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/ecmascript-runtime-server/node_modules/core-js/modu //
// //
/////////////////////////////////////////////////////////////////////////////
//
module.useNode();
/////////////////////////////////////////////////////////////////////////////
}}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/ecmascript-runtime-server/runtime.js");
/* Exports */
Package._define("ecmascript-runtime-server", exports);
})();
(function () {
/* Exports */
Package._define("ecmascript-runtime");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Babel = Package['babel-compiler'].Babel;
var BabelCompiler = Package['babel-compiler'].BabelCompiler;
/* Package-scope variables */
var ECMAScript;
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/ecmascript/ecmascript.js //
// //
///////////////////////////////////////////////////////////////////////
//
ECMAScript = {
compileForShell(command, cacheOptions) {
const babelOptions = Babel.getDefaultOptions({
nodeMajorVersion: parseInt(process.versions.node, 10)
});
delete babelOptions.sourceMap;
delete babelOptions.sourceMaps;
babelOptions.ast = false;
return Babel.compile(command, babelOptions, cacheOptions).code;
}
};
///////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("ecmascript", {
ECMAScript: ECMAScript
});
})();
//# sourceURL=meteor://💻app/packages/ecmascript.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZWNtYXNjcmlwdC9lY21hc2NyaXB0LmpzIl0sIm5hbWVzIjpbIkVDTUFTY3JpcHQiLCJjb21waWxlRm9yU2hlbGwiLCJjb21tYW5kIiwiY2FjaGVPcHRpb25zIiwiYmFiZWxPcHRpb25zIiwiQmFiZWwiLCJnZXREZWZhdWx0T3B0aW9ucyIsIm5vZGVNYWpvclZlcnNpb24iLCJwYXJzZUludCIsInByb2Nlc3MiLCJ2ZXJzaW9ucyIsIm5vZGUiLCJzb3VyY2VNYXAiLCJzb3VyY2VNYXBzIiwiYXN0IiwiY29tcGlsZSIsImNvZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUFBLFVBQVUsR0FBRztBQUNYQyxpQkFBZSxDQUFDQyxPQUFELEVBQVVDLFlBQVYsRUFBd0I7QUFDckMsVUFBTUMsWUFBWSxHQUFHQyxLQUFLLENBQUNDLGlCQUFOLENBQXdCO0FBQzNDQyxzQkFBZ0IsRUFBRUMsUUFBUSxDQUFDQyxPQUFPLENBQUNDLFFBQVIsQ0FBaUJDLElBQWxCLEVBQXdCLEVBQXhCO0FBRGlCLEtBQXhCLENBQXJCO0FBR0EsV0FBT1AsWUFBWSxDQUFDUSxTQUFwQjtBQUNBLFdBQU9SLFlBQVksQ0FBQ1MsVUFBcEI7QUFDQVQsZ0JBQVksQ0FBQ1UsR0FBYixHQUFtQixLQUFuQjtBQUNBLFdBQU9ULEtBQUssQ0FBQ1UsT0FBTixDQUFjYixPQUFkLEVBQXVCRSxZQUF2QixFQUFxQ0QsWUFBckMsRUFBbURhLElBQTFEO0FBQ0Q7O0FBVFUsQ0FBYixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9lY21hc2NyaXB0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiRUNNQVNjcmlwdCA9IHtcbiAgY29tcGlsZUZvclNoZWxsKGNvbW1hbmQsIGNhY2hlT3B0aW9ucykge1xuICAgIGNvbnN0IGJhYmVsT3B0aW9ucyA9IEJhYmVsLmdldERlZmF1bHRPcHRpb25zKHtcbiAgICAgIG5vZGVNYWpvclZlcnNpb246IHBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMubm9kZSwgMTApXG4gICAgfSk7XG4gICAgZGVsZXRlIGJhYmVsT3B0aW9ucy5zb3VyY2VNYXA7XG4gICAgZGVsZXRlIGJhYmVsT3B0aW9ucy5zb3VyY2VNYXBzO1xuICAgIGJhYmVsT3B0aW9ucy5hc3QgPSBmYWxzZTtcbiAgICByZXR1cm4gQmFiZWwuY29tcGlsZShjb21tYW5kLCBiYWJlbE9wdGlvbnMsIGNhY2hlT3B0aW9ucykuY29kZTtcbiAgfVxufTtcbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/ecmascript/ecmascript.js"],"names":["ECMAScript","compileForShell","command","cacheOptions","babelOptions","Babel","getDefaultOptions","nodeMajorVersion","parseInt","process","versions","node","sourceMap","sourceMaps","ast","compile","code"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAAA,UAAU,GAAG;AACXC,iBAAe,CAACC,OAAD,EAAUC,YAAV,EAAwB;AACrC,UAAMC,YAAY,GAAGC,KAAK,CAACC,iBAAN,CAAwB;AAC3CC,sBAAgB,EAAEC,QAAQ,CAACC,OAAO,CAACC,QAAR,CAAiBC,IAAlB,EAAwB,EAAxB;AADiB,KAAxB,CAArB;AAGA,WAAOP,YAAY,CAACQ,SAApB;AACA,WAAOR,YAAY,CAACS,UAApB;AACAT,gBAAY,CAACU,GAAb,GAAmB,KAAnB;AACA,WAAOT,KAAK,CAACU,OAAN,CAAcb,OAAd,EAAuBE,YAAvB,EAAqCD,YAArC,EAAmDa,IAA1D;AACD;;AATU,CAAb,C","file":"/packages/ecmascript.js","sourcesContent":["ECMAScript = {\n compileForShell(command, cacheOptions) {\n const babelOptions = Babel.getDefaultOptions({\n nodeMajorVersion: parseInt(process.versions.node, 10)\n });\n delete babelOptions.sourceMap;\n delete babelOptions.sourceMaps;\n babelOptions.ast = false;\n return Babel.compile(command, babelOptions, cacheOptions).code;\n }\n};\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var Base64 = Package.base64.Base64;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var v, EJSON;
var require = meteorInstall({"node_modules":{"meteor":{"ejson":{"ejson.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ejson/ejson.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
EJSON: () => EJSON
});
/**
* @namespace
* @summary Namespace for EJSON functions
*/
const EJSON = {}; // Custom type interface definition
/**
* @class CustomType
* @instanceName customType
* @memberOf EJSON
* @summary The interface that a class must satisfy to be able to become an
* EJSON custom type via EJSON.addType.
*/
/**
* @function typeName
* @memberOf EJSON.CustomType
* @summary Return the tag used to identify this type. This must match the
* tag used to register this type with
* [`EJSON.addType`](#ejson_add_type).
* @locus Anywhere
* @instance
*/
/**
* @function toJSONValue
* @memberOf EJSON.CustomType
* @summary Serialize this instance into a JSON-compatible value.
* @locus Anywhere
* @instance
*/
/**
* @function clone
* @memberOf EJSON.CustomType
* @summary Return a value `r` such that `this.equals(r)` is true, and
* modifications to `r` do not affect `this` and vice versa.
* @locus Anywhere
* @instance
*/
/**
* @function equals
* @memberOf EJSON.CustomType
* @summary Return `true` if `other` has a value equal to `this`; `false`
* otherwise.
* @locus Anywhere
* @param {Object} other Another object to compare this to.
* @instance
*/
const customTypes = {};
const hasOwn = (obj, prop) => ({}).hasOwnProperty.call(obj, prop);
const isArguments = obj => obj != null && hasOwn(obj, 'callee');
const isInfOrNan = obj => Number.isNaN(obj) || obj === Infinity || obj === -Infinity; // Add a custom type, using a method of your choice to get to and
// from a basic JSON-able representation. The factory argument
// is a function of JSON-able --> your object
// The type you add must have:
// - A toJSONValue() method, so that Meteor can serialize it
// - a typeName() method, to show how to look it up in our type table.
// It is okay if these methods are monkey-patched on.
// EJSON.clone will use toJSONValue and the given factory to produce
// a clone, but you may specify a method clone() that will be
// used instead.
// Similarly, EJSON.equals will use toJSONValue to make comparisons,
// but you may provide a method equals() instead.
/**
* @summary Add a custom datatype to EJSON.
* @locus Anywhere
* @param {String} name A tag for your custom type; must be unique among
* custom data types defined in your project, and must
* match the result of your type's `typeName` method.
* @param {Function} factory A function that deserializes a JSON-compatible
* value into an instance of your type. This should
* match the serialization performed by your
* type's `toJSONValue` method.
*/
EJSON.addType = (name, factory) => {
if (hasOwn(customTypes, name)) {
throw new Error(`Type ${name} already present`);
}
customTypes[name] = factory;
};
const builtinConverters = [{
// Date
matchJSONValue(obj) {
return hasOwn(obj, '$date') && Object.keys(obj).length === 1;
},
matchObject(obj) {
return obj instanceof Date;
},
toJSONValue(obj) {
return {
$date: obj.getTime()
};
},
fromJSONValue(obj) {
return new Date(obj.$date);
}
}, {
// RegExp
matchJSONValue(obj) {
return hasOwn(obj, '$regexp') && hasOwn(obj, '$flags') && Object.keys(obj).length === 2;
},
matchObject(obj) {
return obj instanceof RegExp;
},
toJSONValue(regexp) {
return {
$regexp: regexp.source,
$flags: regexp.flags
};
},
fromJSONValue(obj) {
// Replaces duplicate / invalid flags.
return new RegExp(obj.$regexp, obj.$flags // Cut off flags at 50 chars to avoid abusing RegExp for DOS.
.slice(0, 50).replace(/[^gimuy]/g, '').replace(/(.)(?=.*\1)/g, ''));
}
}, {
// NaN, Inf, -Inf. (These are the only objects with typeof !== 'object'
// which we match.)
matchJSONValue(obj) {
return hasOwn(obj, '$InfNaN') && Object.keys(obj).length === 1;
},
matchObject: isInfOrNan,
toJSONValue(obj) {
let sign;
if (Number.isNaN(obj)) {
sign = 0;
} else if (obj === Infinity) {
sign = 1;
} else {
sign = -1;
}
return {
$InfNaN: sign
};
},
fromJSONValue(obj) {
return obj.$InfNaN / 0;
}
}, {
// Binary
matchJSONValue(obj) {
return hasOwn(obj, '$binary') && Object.keys(obj).length === 1;
},
matchObject(obj) {
return typeof Uint8Array !== 'undefined' && obj instanceof Uint8Array || obj && hasOwn(obj, '$Uint8ArrayPolyfill');
},
toJSONValue(obj) {
return {
$binary: Base64.encode(obj)
};
},
fromJSONValue(obj) {
return Base64.decode(obj.$binary);
}
}, {
// Escaping one level
matchJSONValue(obj) {
return hasOwn(obj, '$escape') && Object.keys(obj).length === 1;
},
matchObject(obj) {
let match = false;
if (obj) {
const keyCount = Object.keys(obj).length;
if (keyCount === 1 || keyCount === 2) {
match = builtinConverters.some(converter => converter.matchJSONValue(obj));
}
}
return match;
},
toJSONValue(obj) {
const newObj = {};
Object.keys(obj).forEach(key => {
newObj[key] = EJSON.toJSONValue(obj[key]);
});
return {
$escape: newObj
};
},
fromJSONValue(obj) {
const newObj = {};
Object.keys(obj.$escape).forEach(key => {
newObj[key] = EJSON.fromJSONValue(obj.$escape[key]);
});
return newObj;
}
}, {
// Custom
matchJSONValue(obj) {
return hasOwn(obj, '$type') && hasOwn(obj, '$value') && Object.keys(obj).length === 2;
},
matchObject(obj) {
return EJSON._isCustomType(obj);
},
toJSONValue(obj) {
const jsonValue = Meteor._noYieldsAllowed(() => obj.toJSONValue());
return {
$type: obj.typeName(),
$value: jsonValue
};
},
fromJSONValue(obj) {
const typeName = obj.$type;
if (!hasOwn(customTypes, typeName)) {
throw new Error(`Custom EJSON type ${typeName} is not defined`);
}
const converter = customTypes[typeName];
return Meteor._noYieldsAllowed(() => converter(obj.$value));
}
}];
EJSON._isCustomType = obj => obj && typeof obj.toJSONValue === 'function' && typeof obj.typeName === 'function' && hasOwn(customTypes, obj.typeName());
EJSON._getTypes = () => customTypes;
EJSON._getConverters = () => builtinConverters; // Either return the JSON-compatible version of the argument, or undefined (if
// the item isn't itself replaceable, but maybe some fields in it are)
const toJSONValueHelper = item => {
for (let i = 0; i < builtinConverters.length; i++) {
const converter = builtinConverters[i];
if (converter.matchObject(item)) {
return converter.toJSONValue(item);
}
}
return undefined;
}; // for both arrays and objects, in-place modification.
const adjustTypesToJSONValue = obj => {
// Is it an atom that we need to adjust?
if (obj === null) {
return null;
}
const maybeChanged = toJSONValueHelper(obj);
if (maybeChanged !== undefined) {
return maybeChanged;
} // Other atoms are unchanged.
if (typeof obj !== 'object') {
return obj;
} // Iterate over array or object structure.
Object.keys(obj).forEach(key => {
const value = obj[key];
if (typeof value !== 'object' && value !== undefined && !isInfOrNan(value)) {
return; // continue
}
const changed = toJSONValueHelper(value);
if (changed) {
obj[key] = changed;
return; // on to the next key
} // if we get here, value is an object but not adjustable
// at this level. recurse.
adjustTypesToJSONValue(value);
});
return obj;
};
EJSON._adjustTypesToJSONValue = adjustTypesToJSONValue;
/**
* @summary Serialize an EJSON-compatible value into its plain JSON
* representation.
* @locus Anywhere
* @param {EJSON} val A value to serialize to plain JSON.
*/
EJSON.toJSONValue = item => {
const changed = toJSONValueHelper(item);
if (changed !== undefined) {
return changed;
}
let newItem = item;
if (typeof item === 'object') {
newItem = EJSON.clone(item);
adjustTypesToJSONValue(newItem);
}
return newItem;
}; // Either return the argument changed to have the non-json
// rep of itself (the Object version) or the argument itself.
// DOES NOT RECURSE. For actually getting the fully-changed value, use
// EJSON.fromJSONValue
const fromJSONValueHelper = value => {
if (typeof value === 'object' && value !== null) {
const keys = Object.keys(value);
if (keys.length <= 2 && keys.every(k => typeof k === 'string' && k.substr(0, 1) === '$')) {
for (let i = 0; i < builtinConverters.length; i++) {
const converter = builtinConverters[i];
if (converter.matchJSONValue(value)) {
return converter.fromJSONValue(value);
}
}
}
}
return value;
}; // for both arrays and objects. Tries its best to just
// use the object you hand it, but may return something
// different if the object you hand it itself needs changing.
const adjustTypesFromJSONValue = obj => {
if (obj === null) {
return null;
}
const maybeChanged = fromJSONValueHelper(obj);
if (maybeChanged !== obj) {
return maybeChanged;
} // Other atoms are unchanged.
if (typeof obj !== 'object') {
return obj;
}
Object.keys(obj).forEach(key => {
const value = obj[key];
if (typeof value === 'object') {
const changed = fromJSONValueHelper(value);
if (value !== changed) {
obj[key] = changed;
return;
} // if we get here, value is an object but not adjustable
// at this level. recurse.
adjustTypesFromJSONValue(value);
}
});
return obj;
};
EJSON._adjustTypesFromJSONValue = adjustTypesFromJSONValue;
/**
* @summary Deserialize an EJSON value from its plain JSON representation.
* @locus Anywhere
* @param {JSONCompatible} val A value to deserialize into EJSON.
*/
EJSON.fromJSONValue = item => {
let changed = fromJSONValueHelper(item);
if (changed === item && typeof item === 'object') {
changed = EJSON.clone(item);
adjustTypesFromJSONValue(changed);
}
return changed;
};
/**
* @summary Serialize a value to a string. For EJSON values, the serialization
* fully represents the value. For non-EJSON values, serializes the
* same way as `JSON.stringify`.
* @locus Anywhere
* @param {EJSON} val A value to stringify.
* @param {Object} [options]
* @param {Boolean | Integer | String} options.indent Indents objects and
* arrays for easy readability. When `true`, indents by 2 spaces; when an
* integer, indents by that number of spaces; and when a string, uses the
* string as the indentation pattern.
* @param {Boolean} options.canonical When `true`, stringifies keys in an
* object in sorted order.
*/
EJSON.stringify = (item, options) => {
let serialized;
const json = EJSON.toJSONValue(item);
if (options && (options.canonical || options.indent)) {
let canonicalStringify;
module.link("./stringify", {
default(v) {
canonicalStringify = v;
}
}, 0);
serialized = canonicalStringify(json, options);
} else {
serialized = JSON.stringify(json);
}
return serialized;
};
/**
* @summary Parse a string into an EJSON value. Throws an error if the string
* is not valid EJSON.
* @locus Anywhere
* @param {String} str A string to parse into an EJSON value.
*/
EJSON.parse = item => {
if (typeof item !== 'string') {
throw new Error('EJSON.parse argument should be a string');
}
return EJSON.fromJSONValue(JSON.parse(item));
};
/**
* @summary Returns true if `x` is a buffer of binary data, as returned from
* [`EJSON.newBinary`](#ejson_new_binary).
* @param {Object} x The variable to check.
* @locus Anywhere
*/
EJSON.isBinary = obj => {
return !!(typeof Uint8Array !== 'undefined' && obj instanceof Uint8Array || obj && obj.$Uint8ArrayPolyfill);
};
/**
* @summary Return true if `a` and `b` are equal to each other. Return false
* otherwise. Uses the `equals` method on `a` if present, otherwise
* performs a deep comparison.
* @locus Anywhere
* @param {EJSON} a
* @param {EJSON} b
* @param {Object} [options]
* @param {Boolean} options.keyOrderSensitive Compare in key sensitive order,
* if supported by the JavaScript implementation. For example, `{a: 1, b: 2}`
* is equal to `{b: 2, a: 1}` only when `keyOrderSensitive` is `false`. The
* default is `false`.
*/
EJSON.equals = (a, b, options) => {
let i;
const keyOrderSensitive = !!(options && options.keyOrderSensitive);
if (a === b) {
return true;
} // This differs from the IEEE spec for NaN equality, b/c we don't want
// anything ever with a NaN to be poisoned from becoming equal to anything.
if (Number.isNaN(a) && Number.isNaN(b)) {
return true;
} // if either one is falsy, they'd have to be === to be equal
if (!a || !b) {
return false;
}
if (!(typeof a === 'object' && typeof b === 'object')) {
return false;
}
if (a instanceof Date && b instanceof Date) {
return a.valueOf() === b.valueOf();
}
if (EJSON.isBinary(a) && EJSON.isBinary(b)) {
if (a.length !== b.length) {
return false;
}
for (i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
if (typeof a.equals === 'function') {
return a.equals(b, options);
}
if (typeof b.equals === 'function') {
return b.equals(a, options);
}
if (a instanceof Array) {
if (!(b instanceof Array)) {
return false;
}
if (a.length !== b.length) {
return false;
}
for (i = 0; i < a.length; i++) {
if (!EJSON.equals(a[i], b[i], options)) {
return false;
}
}
return true;
} // fallback for custom types that don't implement their own equals
switch (EJSON._isCustomType(a) + EJSON._isCustomType(b)) {
case 1:
return false;
case 2:
return EJSON.equals(EJSON.toJSONValue(a), EJSON.toJSONValue(b));
default: // Do nothing
} // fall back to structural equality of objects
let ret;
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
if (keyOrderSensitive) {
i = 0;
ret = aKeys.every(key => {
if (i >= bKeys.length) {
return false;
}
if (key !== bKeys[i]) {
return false;
}
if (!EJSON.equals(a[key], b[bKeys[i]], options)) {
return false;
}
i++;
return true;
});
} else {
i = 0;
ret = aKeys.every(key => {
if (!hasOwn(b, key)) {
return false;
}
if (!EJSON.equals(a[key], b[key], options)) {
return false;
}
i++;
return true;
});
}
return ret && i === bKeys.length;
};
/**
* @summary Return a deep copy of `val`.
* @locus Anywhere
* @param {EJSON} val A value to copy.
*/
EJSON.clone = v => {
let ret;
if (typeof v !== 'object') {
return v;
}
if (v === null) {
return null; // null has typeof "object"
}
if (v instanceof Date) {
return new Date(v.getTime());
} // RegExps are not really EJSON elements (eg we don't define a serialization
// for them), but they're immutable anyway, so we can support them in clone.
if (v instanceof RegExp) {
return v;
}
if (EJSON.isBinary(v)) {
ret = EJSON.newBinary(v.length);
for (let i = 0; i < v.length; i++) {
ret[i] = v[i];
}
return ret;
}
if (Array.isArray(v)) {
return v.map(value => EJSON.clone(value));
}
if (isArguments(v)) {
return Array.from(v).map(value => EJSON.clone(value));
} // handle general user-defined typed Objects if they have a clone method
if (typeof v.clone === 'function') {
return v.clone();
} // handle other custom types
if (EJSON._isCustomType(v)) {
return EJSON.fromJSONValue(EJSON.clone(EJSON.toJSONValue(v)), true);
} // handle other objects
ret = {};
Object.keys(v).forEach(key => {
ret[key] = EJSON.clone(v[key]);
});
return ret;
};
/**
* @summary Allocate a new buffer of binary data that EJSON can serialize.
* @locus Anywhere
* @param {Number} size The number of bytes of binary data to allocate.
*/
// EJSON.newBinary is the public documented API for this functionality,
// but the implementation is in the 'base64' package to avoid
// introducing a circular dependency. (If the implementation were here,
// then 'base64' would have to use EJSON.newBinary, and 'ejson' would
// also have to use 'base64'.)
EJSON.newBinary = Base64.newBinary;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"stringify.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ejson/stringify.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Based on json2.js from https://github.com/douglascrockford/JSON-js
//
// json2.js
// 2012-10-08
//
// Public Domain.
//
// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
function quote(string) {
return JSON.stringify(string);
}
const str = (key, holder, singleIndent, outerIndent, canonical) => {
const value = holder[key]; // What happens next depends on the value's type.
switch (typeof value) {
case 'string':
return quote(value);
case 'number':
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite(value) ? String(value) : 'null';
case 'boolean':
return String(value);
// If the type is 'object', we might be dealing with an object or an array or
// null.
case 'object':
// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.
if (!value) {
return 'null';
} // Make an array to hold the partial results of stringifying this object
// value.
const innerIndent = outerIndent + singleIndent;
const partial = []; // Is the value an array?
if (Array.isArray(value) || {}.hasOwnProperty.call(value, 'callee')) {
// The value is an array. Stringify every element. Use null as a
// placeholder for non-JSON values.
const length = value.length;
for (let i = 0; i < length; i += 1) {
partial[i] = str(i, value, singleIndent, innerIndent, canonical) || 'null';
} // Join all of the elements together, separated with commas, and wrap
// them in brackets.
let v;
if (partial.length === 0) {
v = '[]';
} else if (innerIndent) {
v = '[\n' + innerIndent + partial.join(',\n' + innerIndent) + '\n' + outerIndent + ']';
} else {
v = '[' + partial.join(',') + ']';
}
return v;
} // Iterate through all of the keys in the object.
let keys = Object.keys(value);
if (canonical) {
keys = keys.sort();
}
keys.forEach(k => {
v = str(k, value, singleIndent, innerIndent, canonical);
if (v) {
partial.push(quote(k) + (innerIndent ? ': ' : ':') + v);
}
}); // Join all of the member texts together, separated with commas,
// and wrap them in braces.
if (partial.length === 0) {
v = '{}';
} else if (innerIndent) {
v = '{\n' + innerIndent + partial.join(',\n' + innerIndent) + '\n' + outerIndent + '}';
} else {
v = '{' + partial.join(',') + '}';
}
return v;
default: // Do nothing
}
}; // If the JSON object does not yet have a stringify method, give it one.
const canonicalStringify = (value, options) => {
// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.
const allOptions = Object.assign({
indent: '',
canonical: false
}, options);
if (allOptions.indent === true) {
allOptions.indent = ' ';
} else if (typeof allOptions.indent === 'number') {
let newIndent = '';
for (let i = 0; i < allOptions.indent; i++) {
newIndent += ' ';
}
allOptions.indent = newIndent;
}
return str('', {
'': value
}, allOptions.indent, '', allOptions.canonical);
};
module.exportDefault(canonicalStringify);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/ejson/ejson.js");
/* Exports */
Package._define("ejson", exports, {
EJSON: EJSON
});
})();
//# sourceURL=meteor://💻app/packages/ejson.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvZWpzb24vZWpzb24uanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL2Vqc29uL3N0cmluZ2lmeS5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnQiLCJFSlNPTiIsImN1c3RvbVR5cGVzIiwiaGFzT3duIiwib2JqIiwicHJvcCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImlzQXJndW1lbnRzIiwiaXNJbmZPck5hbiIsIk51bWJlciIsImlzTmFOIiwiSW5maW5pdHkiLCJhZGRUeXBlIiwibmFtZSIsImZhY3RvcnkiLCJFcnJvciIsImJ1aWx0aW5Db252ZXJ0ZXJzIiwibWF0Y2hKU09OVmFsdWUiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwibWF0Y2hPYmplY3QiLCJEYXRlIiwidG9KU09OVmFsdWUiLCIkZGF0ZSIsImdldFRpbWUiLCJmcm9tSlNPTlZhbHVlIiwiUmVnRXhwIiwicmVnZXhwIiwiJHJlZ2V4cCIsInNvdXJjZSIsIiRmbGFncyIsImZsYWdzIiwic2xpY2UiLCJyZXBsYWNlIiwic2lnbiIsIiRJbmZOYU4iLCJVaW50OEFycmF5IiwiJGJpbmFyeSIsIkJhc2U2NCIsImVuY29kZSIsImRlY29kZSIsIm1hdGNoIiwia2V5Q291bnQiLCJzb21lIiwiY29udmVydGVyIiwibmV3T2JqIiwiZm9yRWFjaCIsImtleSIsIiRlc2NhcGUiLCJfaXNDdXN0b21UeXBlIiwianNvblZhbHVlIiwiTWV0ZW9yIiwiX25vWWllbGRzQWxsb3dlZCIsIiR0eXBlIiwidHlwZU5hbWUiLCIkdmFsdWUiLCJfZ2V0VHlwZXMiLCJfZ2V0Q29udmVydGVycyIsInRvSlNPTlZhbHVlSGVscGVyIiwiaXRlbSIsImkiLCJ1bmRlZmluZWQiLCJhZGp1c3RUeXBlc1RvSlNPTlZhbHVlIiwibWF5YmVDaGFuZ2VkIiwidmFsdWUiLCJjaGFuZ2VkIiwiX2FkanVzdFR5cGVzVG9KU09OVmFsdWUiLCJuZXdJdGVtIiwiY2xvbmUiLCJmcm9tSlNPTlZhbHVlSGVscGVyIiwiZXZlcnkiLCJrIiwic3Vic3RyIiwiYWRqdXN0VHlwZXNGcm9tSlNPTlZhbHVlIiwiX2FkanVzdFR5cGVzRnJvbUpTT05WYWx1ZSIsInN0cmluZ2lmeSIsIm9wdGlvbnMiLCJzZXJpYWxpemVkIiwianNvbiIsImNhbm9uaWNhbCIsImluZGVudCIsImNhbm9uaWNhbFN0cmluZ2lmeSIsImxpbmsiLCJkZWZhdWx0IiwidiIsIkpTT04iLCJwYXJzZSIsImlzQmluYXJ5IiwiJFVpbnQ4QXJyYXlQb2x5ZmlsbCIsImVxdWFscyIsImEiLCJiIiwia2V5T3JkZXJTZW5zaXRpdmUiLCJ2YWx1ZU9mIiwiQXJyYXkiLCJyZXQiLCJhS2V5cyIsImJLZXlzIiwibmV3QmluYXJ5IiwiaXNBcnJheSIsIm1hcCIsImZyb20iLCJxdW90ZSIsInN0cmluZyIsInN0ciIsImhvbGRlciIsInNpbmdsZUluZGVudCIsIm91dGVySW5kZW50IiwiaXNGaW5pdGUiLCJTdHJpbmciLCJpbm5lckluZGVudCIsInBhcnRpYWwiLCJqb2luIiwic29ydCIsInB1c2giLCJhbGxPcHRpb25zIiwiYXNzaWduIiwibmV3SW5kZW50IiwiZXhwb3J0RGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ0MsT0FBSyxFQUFDLE1BQUlBO0FBQVgsQ0FBZDs7QUFBQTs7OztBQUlBLE1BQU1BLEtBQUssR0FBRyxFQUFkLEMsQ0FFQTs7QUFDQTs7Ozs7Ozs7QUFRQTs7Ozs7Ozs7OztBQVVBOzs7Ozs7OztBQVFBOzs7Ozs7Ozs7QUFTQTs7Ozs7Ozs7OztBQVVBLE1BQU1DLFdBQVcsR0FBRyxFQUFwQjs7QUFFQSxNQUFNQyxNQUFNLEdBQUcsQ0FBQ0MsR0FBRCxFQUFNQyxJQUFOLEtBQWUsQ0FBQyxFQUFELEVBQUtDLGNBQUwsQ0FBb0JDLElBQXBCLENBQXlCSCxHQUF6QixFQUE4QkMsSUFBOUIsQ0FBOUI7O0FBRUEsTUFBTUcsV0FB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ckdBbEYsTUFBTSxDQUFDeUgsYUFBUCxDQXdIZXJDLGtCQXhIZixFIiwiZmlsZSI6Ii9wYWNrYWdlcy9lanNvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG5hbWVzcGFjZVxuICogQHN1bW1hcnkgTmFtZXNwYWNlIGZvciBFSlNPTiBmdW5jdGlvbnNcbiAqL1xuY29uc3QgRUpTT04gPSB7fTtcblxuLy8gQ3VzdG9tIHR5cGUgaW50ZXJmYWNlIGRlZmluaXRpb25cbi8qKlxuICogQGNsYXNzIEN1c3RvbVR5cGVcbiAqIEBpbnN0YW5jZU5hbWUgY3VzdG9tVHlwZVxuICogQG1lbWJlck9mIEVKU09OXG4gKiBAc3VtbWFyeSBUaGUgaW50ZXJmYWNlIHRoYXQgYSBjbGFzcyBtdXN0IHNhdGlzZnkgdG8gYmUgYWJsZSB0byBiZWNvbWUgYW5cbiAqIEVKU09OIGN1c3RvbSB0eXBlIHZpYSBFSlNPTi5hZGRUeXBlLlxuICovXG5cbi8qKlxuICogQGZ1bmN0aW9uIHR5cGVOYW1lXG4gKiBAbWVtYmVyT2YgRUpTT04uQ3VzdG9tVHlwZVxuICogQHN1bW1hcnkgUmV0dXJuIHRoZSB0YWcgdXNlZCB0byBpZGVudGlmeSB0aGlzIHR5cGUuICBUaGlzIG11c3QgbWF0Y2ggdGhlXG4gKiAgICAgICAgICB0YWcgdXNlZCB0byByZWdpc3RlciB0aGlzIHR5cGUgd2l0aFxuICogICAgICAgICAgW2BFSlNPTi5hZGRUeXBlYF0oI2Vqc29uX2FkZF90eXBlKS5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQGluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAZnVuY3Rpb24gdG9KU09OVmFsdWVcbiAqIEBtZW1iZXJPZiBFSlNPTi5DdXN0b21UeXBlXG4gKiBAc3VtbWFyeSBTZXJpYWxpemUgdGhpcyBpbnN0YW5jZSBpbnRvIGEgSlNPTi1jb21wYXRpYmxlIHZhbHVlLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEBmdW5jdGlvbiBjbG9uZVxuICogQG1lbWJlck9mIEVKU09OLkN1c3RvbVR5cGVcbiAqIEBzdW1tYXJ5IFJldHVybiBhIHZhbHVlIGByYCBzdWNoIHRoYXQgYHRoaXMuZXF1YWxzKHIpYCBpcyB0cnVlLCBhbmRcbiAqICAgICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gYHJgIGRvIG5vdCBhZmZlY3QgYHRoaXNgIGFuZCB2aWNlIHZlcnNhLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEBmdW5jdGlvbiBlcXVhbHNcbiAqIEBtZW1iZXJPZiBFSlNPTi5DdXN0b21UeXBlXG4gKiBAc3VtbWFyeSBSZXR1cm4gYHRydWVgIGlmIGBvdGhlcmAgaGFzIGEgdmFsdWUgZXF1YWwgdG8gYHRoaXNgOyBgZmFsc2VgXG4gKiAgICAgICAgICBvdGhlcndpc2UuXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBBbm90aGVyIG9iamVjdCB0byBjb21wYXJlIHRoaXMgdG8uXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG5jb25zdCBjdXN0b21UeXBlcyA9IHt9O1xuXG5jb25zdCBoYXNPd24gPSAob2JqLCBwcm9wKSA9PiAoe30pLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcblxuY29uc3QgaXNBcmd1bWVudHMgPSBvYmogPT4gb2JqICE9IG51bGwgJiYgaGFzT3duKG9iaiwgJ2NhbGxlZScpO1xuXG5jb25zdCBpc0luZk9yTmFuID1cbiAgb2JqID0+IE51bWJlci5pc05hTihvYmopIHx8IG9iaiA9PT0gSW5maW5pdHkgfHwgb2JqID09PSAtSW5maW5pdHk7XG5cbi8vIEFkZCBhIGN1c3RvbSB0eXBlLCB1c2luZyBhIG1ldGhvZCBvZiB5b3VyIGNob2ljZSB0byBnZXQgdG8gYW5kXG4vLyBmcm9tIGEgYmFzaWMgSlNPTi1hYmxlIHJlcHJlc2VudGF0aW9uLiAgVGhlIGZhY3RvcnkgYXJndW1lbnRcbi8vIGlzIGEgZnVuY3Rpb24gb2YgSlNPTi1hYmxlIC0tPiB5b3VyIG9iamVjdFxuLy8gVGhlIHR5cGUgeW91IGFkZCBtdXN0IGhhdmU6XG4vLyAtIEEgdG9KU09OVmFsdWUoKSBtZXRob2QsIHNvIHRoYXQgTWV0ZW9yIGNhbiBzZXJpYWxpemUgaXRcbi8vIC0gYSB0eXBlTmFtZSgpIG1ldGhvZCwgdG8gc2hvdyBob3cgdG8gbG9vayBpdCB1cCBpbiBvdXIgdHlwZSB0YWJsZS5cbi8vIEl0IGlzIG9rYXkgaWYgdGhlc2UgbWV0aG9kcyBhcmUgbW9ua2V5LXBhdGNoZWQgb24uXG4vLyBFSlNPTi5jbG9uZSB3aWxsIHVzZSB0b0pTT05WYWx1ZSBhbmQgdGhlIGdpdmVuIGZhY3RvcnkgdG8gcHJvZHVjZVxuLy8gYSBjbG9uZSwgYnV0IHlvdSBtYXkgc3BlY2lmeSBhIG1ldGhvZCBjbG9uZSgpIHRoYXQgd2lsbCBiZVxuLy8gdXNlZCBpbnN0ZWFkLlxuLy8gU2ltaWxhcmx5LCBFSlNPTi5lcXVhbHMgd2lsbCB1c2UgdG9KU09OVmFsdWUgdG8gbWFrZSBjb21wYXJpc29ucyxcbi8vIGJ1dCB5b3UgbWF5IHByb3ZpZGUgYSBtZXRob2QgZXF1YWxzKCkgaW5zdGVhZC5cbi8qKlxuICogQHN1bW1hcnkgQWRkIGEgY3VzdG9tIGRhdGF0eXBlIHRvIEVKU09OLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBBIHRhZyBmb3IgeW91ciBjdXN0b20gdHlwZTsgbXVzdCBiZSB1bmlxdWUgYW1vbmdcbiAqICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBkYXRhIHR5cGVzIGRlZmluZWQgaW4geW91ciBwcm9qZWN0LCBhbmQgbXVzdFxuICogICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdGhlIHJlc3VsdCBvZiB5b3VyIHR5cGUncyBgdHlwZU5hbWVgIG1ldGhvZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgQSBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIEpTT04tY29tcGF0aWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnRvIGFuIGluc3RhbmNlIG9mIHlvdXIgdHlwZS4gIFRoaXMgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBzZXJpYWxpemF0aW9uIHBlcmZvcm1lZCBieSB5b3VyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUncyBgdG9KU09OVmFsdWVgIG1ldGhvZC5cbiAqL1xuRUpTT04uYWRkVHlwZSA9IChuYW1lLCBmYWN0b3J5KSA9PiB7XG4gIGlmIChoYXNPd24oY3VzdG9tVHlwZXMsIG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7bmFtZX0gYWxyZWFkeSBwcmVzZW50YCk7XG4gIH1cbiAgY3VzdG9tVHlwZXNbbmFtZV0gPSBmYWN0b3J5O1xufTtcblxuY29uc3QgYnVpbHRpbkNvbnZlcnRlcnMgPSBbXG4gIHsgLy8gRGF0ZVxuICAgIG1hdGNoSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIGhhc093bihvYmosICckZGF0ZScpICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAxO1xuICAgIH0sXG4gICAgbWF0Y2hPYmplY3Qob2JqKSB7XG4gICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRGF0ZTtcbiAgICB9LFxuICAgIHRvSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIHskZGF0ZTogb2JqLmdldFRpbWUoKX07XG4gICAgfSxcbiAgICBmcm9tSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iai4kZGF0ZSk7XG4gICAgfSxcbiAgfSxcbiAgeyAvLyBSZWdFeHBcbiAgICBtYXRjaEpTT05WYWx1ZShvYmopIHtcbiAgICAgIHJldHVybiBoYXNPd24ob2JqLCAnJHJlZ2V4cCcpXG4gICAgICAgICYmIGhhc093bihvYmosICckZmxhZ3MnKVxuICAgICAgICAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMjtcbiAgICB9LFxuICAgIG1hdGNoT2JqZWN0KG9iaikge1xuICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlZ0V4cDtcbiAgICB9LFxuICAgIHRvSlNPTlZhbHVlKHJlZ2V4cCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHJlZ2V4cDogcmVnZXhwLnNvdXJjZSxcbiAgICAgICAgJGZsYWdzOiByZWdleHAuZmxhZ3NcbiAgICAgIH07XG4gICAgfSxcbiAgICBmcm9tSlNPTlZhbHVlKG9iaikge1xuICAgICAgLy8gUmVwbGFjZXMgZHVwbGljYXRlIC8gaW52YWxpZCBmbGFncy5cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgICBvYmouJHJlZ2V4cCxcbiAgICAgICAgb2JqLiRmbGFnc1xuICAgICAgICAgIC8vIEN1dCBvZmYgZmxhZ3MgYXQgNTAgY2hhcnMgdG8gYXZvaWQgYWJ1c2luZyBSZWdFeHAgZm9yIERPUy5cbiAgICAgICAgICAuc2xpY2UoMCwgNTApXG4gICAgICAgICAgLnJlcGxhY2UoL1teZ2ltdXldL2csJycpXG4gICAgICAgICAgLnJlcGxhY2UoLyguKSg/PS4qXFwxKS9nLCAnJylcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgeyAvLyBOYU4sIEluZiwgLUluZi4gKFRoZXNlIGFyZSB0aGUgb25seSBvYmplY3RzIHdpdGggdHlwZW9mICE9PSAnb2JqZWN0J1xuICAgIC8vIHdoaWNoIHdlIG1hdGNoLilcbiAgICBtYXRjaEpTT05WYWx1ZShvYmopIHtcbiAgICAgIHJldHVybiBoYXNPd24ob2JqLCAnJEluZk5hTicpICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAxO1xuICAgIH0sXG4gICAgbWF0Y2hPYmplY3Q6IGlzSW5mT3JOYW4sXG4gICAgdG9KU09OVmFsdWUob2JqKSB7XG4gICAgICBsZXQgc2lnbjtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ob2JqKSkge1xuICAgICAgICBzaWduID0gMDtcbiAgICAgIH0gZWxzZSBpZiAob2JqID09PSBJbmZpbml0eSkge1xuICAgICAgICBzaWduID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ24gPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7JEluZk5hTjogc2lnbn07XG4gICAgfSxcbiAgICBmcm9tSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIG9iai4kSW5mTmFOIC8gMDtcbiAgICB9LFxuICB9LFxuICB7IC8vIEJpbmFyeVxuICAgIG1hdGNoSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIGhhc093bihvYmosICckYmluYXJ5JykgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDE7XG4gICAgfSxcbiAgICBtYXRjaE9iamVjdChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgICB8fCAob2JqICYmIGhhc093bihvYmosICckVWludDhBcnJheVBvbHlmaWxsJykpO1xuICAgIH0sXG4gICAgdG9KU09OVmFsdWUob2JqKSB7XG4gICAgICByZXR1cm4geyRiaW5hcnk6IEJhc2U2NC5lbmNvZGUob2JqKX07XG4gICAgfSxcbiAgICBmcm9tSlNPTlZhbHVlKG9iaikge1xuICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUob2JqLiRiaW5hcnkpO1xuICAgIH0sXG4gIH0sXG4gIHsgLy8gRXNjYXBpbmcgb25lIGxldmVsXG4gICAgbWF0Y2hKU09OVmFsdWUob2JqKSB7XG4gICAgICByZXR1cm4gaGFzT3duKG9iaiwgJyRlc2NhcGUnKSAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMTtcbiAgICB9LFxuICAgIG1hdGNoT2JqZWN0KG9iaikge1xuICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICBpZiAob2JqKSB7XG4gICAgICAgIGNvbnN0IGtleUNvdW50ID0gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7XG4gICAgICAgIGlmIChrZXlDb3VudCA9PT0gMSB8fCBrZXlDb3VudCA9PT0gMikge1xuICAgICAgICAgIG1hdGNoID1cbiAgICAgICAgICAgIGJ1aWx0aW5Db252ZXJ0ZXJzLnNvbWUoY29udmVydGVyID0+IGNvbnZlcnRlci5tYXRjaEpTT05WYWx1ZShvYmopKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0sXG4gICAgdG9KU09OVmFsdWUob2JqKSB7XG4gICAgICBjb25zdCBuZXdPYmogPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBuZXdPYmpba2V5XSA9IEVKU09OLnRvSlNPTlZhbHVlKG9ialtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHskZXNjYXBlOiBuZXdPYmp9O1xuICAgIH0sXG4gICAgZnJvbUpTT05WYWx1ZShvYmopIHtcbiAgICAgIGNvbnN0IG5ld09iaiA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob2JqLiRlc2NhcGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgbmV3T2JqW2tleV0gPSBFSlNPTi5mcm9tSlNPTlZhbHVlKG9iai4kZXNjYXBlW2tleV0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH0sXG4gIH0sXG4gIHsgLy8gQ3VzdG9tXG4gICAgbWF0Y2hKU09OVmFsdWUob2JqKSB7XG4gICAgICByZXR1cm4gaGFzT3duKG9iaiwgJyR0eXBlJylcbiAgICAgICAgJiYgaGFzT3duKG9iaiwgJyR2YWx1ZScpICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAyO1xuICAgIH0sXG4gICAgbWF0Y2hPYmplY3Qob2JqKSB7XG4gICAgICByZXR1cm4gRUpTT04uX2lzQ3VzdG9tVHlwZShvYmopO1xuICAgIH0sXG4gICAgdG9KU09OVmFsdWUob2JqKSB7XG4gICAgICBjb25zdCBqc29uVmFsdWUgPSBNZXRlb3IuX25vWWllbGRzQWxsb3dlZCgoKSA9PiBvYmoudG9KU09OVmFsdWUoKSk7XG4gICAgICByZXR1cm4geyR0eXBlOiBvYmoudHlwZU5hbWUoKSwgJHZhbHVlOiBqc29uVmFsdWV9O1xuICAgIH0sXG4gICAgZnJvbUpTT05WYWx1ZShvYmopIHtcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gb2JqLiR0eXBlO1xuICAgICAgaWYgKCFoYXNPd24oY3VzdG9tVHlwZXMsIHR5cGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1c3RvbSBFSlNPTiB0eXBlICR7dHlwZU5hbWV9IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPSBjdXN0b21UeXBlc1t0eXBlTmFtZV07XG4gICAgICByZXR1cm4gTWV0ZW9yLl9ub1lpZWxkc0FsbG93ZWQoKCkgPT4gY29udmVydGVyKG9iai4kdmFsdWUpKTtcbiAgICB9LFxuICB9LFxuXTtcblxuRUpTT04uX2lzQ3VzdG9tVHlwZSA9IChvYmopID0+IChcbiAgb2JqICYmXG4gIHR5cGVvZiBvYmoudG9KU09OVmFsdWUgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIG9iai50eXBlTmFtZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICBoYXNPd24oY3VzdG9tVHlwZXMsIG9iai50eXBlTmFtZSgpKVxuKTtcblxuRUpTT04uX2dldFR5cGVzID0gKCkgPT4gY3VzdG9tVHlwZXM7XG5cbkVKU09OLl9nZXRDb252ZXJ0ZXJzID0gKCkgPT4gYnVpbHRpbkNvbnZlcnRlcnM7XG5cbi8vIEVpdGhlciByZXR1cm4gdGhlIEpTT04tY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCwgb3IgdW5kZWZpbmVkIChpZlxuLy8gdGhlIGl0ZW0gaXNuJ3QgaXRzZWxmIHJlcGxhY2VhYmxlLCBidXQgbWF5YmUgc29tZSBmaWVsZHMgaW4gaXQgYXJlKVxuY29uc3QgdG9KU09OVmFsdWVIZWxwZXIgPSBpdGVtID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWlsdGluQ29udmVydGVycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvbnZlcnRlciA9IGJ1aWx0aW5Db252ZXJ0ZXJzW2ldO1xuICAgIGlmIChjb252ZXJ0ZXIubWF0Y2hPYmplY3QoaXRlbSkpIHtcbiAgICAgIHJldHVybiBjb252ZXJ0ZXIudG9KU09OVmFsdWUoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vLyBmb3IgYm90aCBhcnJheXMgYW5kIG9iamVjdHMsIGluLXBsYWNlIG1vZGlmaWNhdGlvbi5cbmNvbnN0IGFkanVzdFR5cGVzVG9KU09OVmFsdWUgPSBvYmogPT4ge1xuICAvLyBJcyBpdCBhbiBhdG9tIHRoYXQgd2UgbmVlZCB0byBhZGp1c3Q/XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1heWJlQ2hhbmdlZCA9IHRvSlNPTlZhbHVlSGVscGVyKG9iaik7XG4gIGlmIChtYXliZUNoYW5nZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtYXliZUNoYW5nZWQ7XG4gIH1cblxuICAvLyBPdGhlciBhdG9tcyBhcmUgdW5jaGFuZ2VkLlxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IG9yIG9iamVjdCBzdHJ1Y3R1cmUuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhaXNJbmZPck5hbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VkID0gdG9KU09OVmFsdWVIZWxwZXIodmFsdWUpO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICBvYmpba2V5XSA9IGNoYW5nZWQ7XG4gICAgICByZXR1cm47IC8vIG9uIHRvIHRoZSBuZXh0IGtleVxuICAgIH1cbiAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgdmFsdWUgaXMgYW4gb2JqZWN0IGJ1dCBub3QgYWRqdXN0YWJsZVxuICAgIC8vIGF0IHRoaXMgbGV2ZWwuICByZWN1cnNlLlxuICAgIGFkanVzdFR5cGVzVG9KU09OVmFsdWUodmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbkVKU09OLl9hZGp1c3RUeXBlc1RvSlNPTlZhbHVlID0gYWRqdXN0VHlwZXNUb0pTT05WYWx1ZTtcblxuLyoqXG4gKiBAc3VtbWFyeSBTZXJpYWxpemUgYW4gRUpTT04tY29tcGF0aWJsZSB2YWx1ZSBpbnRvIGl0cyBwbGFpbiBKU09OXG4gKiAgICAgICAgICByZXByZXNlbnRhdGlvbi5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQHBhcmFtIHtFSlNPTn0gdmFsIEEgdmFsdWUgdG8gc2VyaWFsaXplIHRvIHBsYWluIEpTT04uXG4gKi9cbkVKU09OLnRvSlNPTlZhbHVlID0gaXRlbSA9PiB7XG4gIGNvbnN0IGNoYW5nZWQgPSB0b0pTT05WYWx1ZUhlbHBlcihpdGVtKTtcbiAgaWYgKGNoYW5nZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgbGV0IG5ld0l0ZW0gPSBpdGVtO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgbmV3SXRlbSA9IEVKU09OLmNsb25lKGl0ZW0pO1xuICAgIGFkanVzdFR5cGVzVG9KU09OVmFsdWUobmV3SXRlbSk7XG4gIH1cbiAgcmV0dXJuIG5ld0l0ZW07XG59O1xuXG4vLyBFaXRoZXIgcmV0dXJuIHRoZSBhcmd1bWVudCBjaGFuZ2VkIHRvIGhhdmUgdGhlIG5vbi1qc29uXG4vLyByZXAgb2YgaXRzZWxmICh0aGUgT2JqZWN0IHZlcnNpb24pIG9yIHRoZSBhcmd1bWVudCBpdHNlbGYuXG4vLyBET0VTIE5PVCBSRUNVUlNFLiAgRm9yIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZ1bGx5LWNoYW5nZWQgdmFsdWUsIHVzZVxuLy8gRUpTT04uZnJvbUpTT05WYWx1ZVxuY29uc3QgZnJvbUpTT05WYWx1ZUhlbHBlciA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA8PSAyXG4gICAgICAgICYmIGtleXMuZXZlcnkoayA9PiB0eXBlb2YgayA9PT0gJ3N0cmluZycgJiYgay5zdWJzdHIoMCwgMSkgPT09ICckJykpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVpbHRpbkNvbnZlcnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gYnVpbHRpbkNvbnZlcnRlcnNbaV07XG4gICAgICAgIGlmIChjb252ZXJ0ZXIubWF0Y2hKU09OVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5mcm9tSlNPTlZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBmb3IgYm90aCBhcnJheXMgYW5kIG9iamVjdHMuIFRyaWVzIGl0cyBiZXN0IHRvIGp1c3Rcbi8vIHVzZSB0aGUgb2JqZWN0IHlvdSBoYW5kIGl0LCBidXQgbWF5IHJldHVybiBzb21ldGhpbmdcbi8vIGRpZmZlcmVudCBpZiB0aGUgb2JqZWN0IHlvdSBoYW5kIGl0IGl0c2VsZiBuZWVkcyBjaGFuZ2luZy5cbmNvbnN0IGFkanVzdFR5cGVzRnJvbUpTT05WYWx1ZSA9IG9iaiA9PiB7XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1heWJlQ2hhbmdlZCA9IGZyb21KU09OVmFsdWVIZWxwZXIob2JqKTtcbiAgaWYgKG1heWJlQ2hhbmdlZCAhPT0gb2JqKSB7XG4gICAgcmV0dXJuIG1heWJlQ2hhbmdlZDtcbiAgfVxuXG4gIC8vIE90aGVyIGF0b21zIGFyZSB1bmNoYW5nZWQuXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBjaGFuZ2VkID0gZnJvbUpTT05WYWx1ZUhlbHBlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgIT09IGNoYW5nZWQpIHtcbiAgICAgICAgb2JqW2tleV0gPSBjaGFuZ2VkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBpZiB3ZSBnZXQgaGVyZSwgdmFsdWUgaXMgYW4gb2JqZWN0IGJ1dCBub3QgYWRqdXN0YWJsZVxuICAgICAgLy8gYXQgdGhpcyBsZXZlbC4gIHJlY3Vyc2UuXG4gICAgICBhZGp1c3RUeXBlc0Zyb21KU09OVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59O1xuXG5FSlNPTi5fYWRqdXN0VHlwZXNGcm9tSlNPTlZhbHVlID0gYWRqdXN0VHlwZXNGcm9tSlNPTlZhbHVlO1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlc2VyaWFsaXplIGFuIEVKU09OIHZhbHVlIGZyb20gaXRzIHBsYWluIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqIEBwYXJhbSB7SlNPTkNvbXBhdGlibGV9IHZhbCBBIHZhbHVlIHRvIGRlc2VyaWFsaXplIGludG8gRUpTT04uXG4gKi9cbkVKU09OLmZyb21KU09OVmFsdWUgPSBpdGVtID0+IHtcbiAgbGV0IGNoYW5nZWQgPSBmcm9tSlNPTlZhbHVlSGVscGVyKGl0ZW0pO1xuICBpZiAoY2hhbmdlZCA9PT0gaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICBjaGFuZ2VkID0gRUpTT04uY2xvbmUoaXRlbSk7XG4gICAgYWRqdXN0VHlwZXNGcm9tSlNPTlZhbHVlKGNoYW5nZWQpO1xuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSBTZXJpYWxpemUgYSB2YWx1ZSB0byBhIHN0cmluZy4gRm9yIEVKU09OIHZhbHVlcywgdGhlIHNlcmlhbGl6YXRpb25cbiAqICAgICAgICAgIGZ1bGx5IHJlcHJlc2VudHMgdGhlIHZhbHVlLiBGb3Igbm9uLUVKU09OIHZhbHVlcywgc2VyaWFsaXplcyB0aGVcbiAqICAgICAgICAgIHNhbWUgd2F5IGFzIGBKU09OLnN0cmluZ2lmeWAuXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqIEBwYXJhbSB7RUpTT059IHZhbCBBIHZhbHVlIHRvIHN0cmluZ2lmeS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Qm9vbGVhbiB8IEludGVnZXIgfCBTdHJpbmd9IG9wdGlvbnMuaW5kZW50IEluZGVudHMgb2JqZWN0cyBhbmRcbiAqIGFycmF5cyBmb3IgZWFzeSByZWFkYWJpbGl0eS4gIFdoZW4gYHRydWVgLCBpbmRlbnRzIGJ5IDIgc3BhY2VzOyB3aGVuIGFuXG4gKiBpbnRlZ2VyLCBpbmRlbnRzIGJ5IHRoYXQgbnVtYmVyIG9mIHNwYWNlczsgYW5kIHdoZW4gYSBzdHJpbmcsIHVzZXMgdGhlXG4gKiBzdHJpbmcgYXMgdGhlIGluZGVudGF0aW9uIHBhdHRlcm4uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuY2Fub25pY2FsIFdoZW4gYHRydWVgLCBzdHJpbmdpZmllcyBrZXlzIGluIGFuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbiBzb3J0ZWQgb3JkZXIuXG4gKi9cbkVKU09OLnN0cmluZ2lmeSA9IChpdGVtLCBvcHRpb25zKSA9PiB7XG4gIGxldCBzZXJpYWxpemVkO1xuICBjb25zdCBqc29uID0gRUpTT04udG9KU09OVmFsdWUoaXRlbSk7XG4gIGlmIChvcHRpb25zICYmIChvcHRpb25zLmNhbm9uaWNhbCB8fCBvcHRpb25zLmluZGVudCkpIHtcbiAgICBpbXBvcnQgY2Fub25pY2FsU3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5JztcbiAgICBzZXJpYWxpemVkID0gY2Fub25pY2FsU3RyaW5naWZ5KGpzb24sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShqc29uKTtcbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgUGFyc2UgYSBzdHJpbmcgaW50byBhbiBFSlNPTiB2YWx1ZS4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzdHJpbmdcbiAqICAgICAgICAgIGlzIG5vdCB2YWxpZCBFSlNPTi5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBBIHN0cmluZyB0byBwYXJzZSBpbnRvIGFuIEVKU09OIHZhbHVlLlxuICovXG5FSlNPTi5wYXJzZSA9IGl0ZW0gPT4ge1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFSlNPTi5wYXJzZSBhcmd1bWVudCBzaG91bGQgYmUgYSBzdHJpbmcnKTtcbiAgfVxuICByZXR1cm4gRUpTT04uZnJvbUpTT05WYWx1ZShKU09OLnBhcnNlKGl0ZW0pKTtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0dXJucyB0cnVlIGlmIGB4YCBpcyBhIGJ1ZmZlciBvZiBiaW5hcnkgZGF0YSwgYXMgcmV0dXJuZWQgZnJvbVxuICogICAgICAgICAgW2BFSlNPTi5uZXdCaW5hcnlgXSgjZWpzb25fbmV3X2JpbmFyeSkuXG4gKiBAcGFyYW0ge09iamVjdH0geCBUaGUgdmFyaWFibGUgdG8gY2hlY2suXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqL1xuRUpTT04uaXNCaW5hcnkgPSBvYmogPT4ge1xuICByZXR1cm4gISEoKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fFxuICAgIChvYmogJiYgb2JqLiRVaW50OEFycmF5UG9seWZpbGwpKTtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0dXJuIHRydWUgaWYgYGFgIGFuZCBgYmAgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIuICBSZXR1cm4gZmFsc2VcbiAqICAgICAgICAgIG90aGVyd2lzZS4gIFVzZXMgdGhlIGBlcXVhbHNgIG1ldGhvZCBvbiBgYWAgaWYgcHJlc2VudCwgb3RoZXJ3aXNlXG4gKiAgICAgICAgICBwZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbi5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQHBhcmFtIHtFSlNPTn0gYVxuICogQHBhcmFtIHtFSlNPTn0gYlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmtleU9yZGVyU2Vuc2l0aXZlIENvbXBhcmUgaW4ga2V5IHNlbnNpdGl2ZSBvcmRlcixcbiAqIGlmIHN1cHBvcnRlZCBieSB0aGUgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbi4gIEZvciBleGFtcGxlLCBge2E6IDEsIGI6IDJ9YFxuICogaXMgZXF1YWwgdG8gYHtiOiAyLCBhOiAxfWAgb25seSB3aGVuIGBrZXlPcmRlclNlbnNpdGl2ZWAgaXMgYGZhbHNlYC4gIFRoZVxuICogZGVmYXVsdCBpcyBgZmFsc2VgLlxuICovXG5FSlNPTi5lcXVhbHMgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBsZXQgaTtcbiAgY29uc3Qga2V5T3JkZXJTZW5zaXRpdmUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMua2V5T3JkZXJTZW5zaXRpdmUpO1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gVGhpcyBkaWZmZXJzIGZyb20gdGhlIElFRUUgc3BlYyBmb3IgTmFOIGVxdWFsaXR5LCBiL2Mgd2UgZG9uJ3Qgd2FudFxuICAvLyBhbnl0aGluZyBldmVyIHdpdGggYSBOYU4gdG8gYmUgcG9pc29uZWQgZnJvbSBiZWNvbWluZyBlcXVhbCB0byBhbnl0aGluZy5cbiAgaWYgKE51bWJlci5pc05hTihhKSAmJiBOdW1iZXIuaXNOYU4oYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlmIGVpdGhlciBvbmUgaXMgZmFsc3ksIHRoZXknZCBoYXZlIHRvIGJlID09PSB0byBiZSBlcXVhbFxuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gIH1cblxuICBpZiAoRUpTT04uaXNCaW5hcnkoYSkgJiYgRUpTT04uaXNCaW5hcnkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiAoYS5lcXVhbHMpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGEuZXF1YWxzKGIsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiAoYi5lcXVhbHMpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGIuZXF1YWxzKGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIGlmICghKGIgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFFSlNPTi5lcXVhbHMoYVtpXSwgYltpXSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGZhbGxiYWNrIGZvciBjdXN0b20gdHlwZXMgdGhhdCBkb24ndCBpbXBsZW1lbnQgdGhlaXIgb3duIGVxdWFsc1xuICBzd2l0Y2ggKEVKU09OLl9pc0N1c3RvbVR5cGUoYSkgKyBFSlNPTi5faXNDdXN0b21UeXBlKGIpKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSAyOiByZXR1cm4gRUpTT04uZXF1YWxzKEVKU09OLnRvSlNPTlZhbHVlKGEpLCBFSlNPTi50b0pTT05WYWx1ZShiKSk7XG4gICAgZGVmYXVsdDogLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgLy8gZmFsbCBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkgb2Ygb2JqZWN0c1xuICBsZXQgcmV0O1xuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoa2V5T3JkZXJTZW5zaXRpdmUpIHtcbiAgICBpID0gMDtcbiAgICByZXQgPSBhS2V5cy5ldmVyeShrZXkgPT4ge1xuICAgICAgaWYgKGkgPj0gYktleXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgIT09IGJLZXlzW2ldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghRUpTT04uZXF1YWxzKGFba2V5XSwgYltiS2V5c1tpXV0sIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGkgPSAwO1xuICAgIHJldCA9IGFLZXlzLmV2ZXJ5KGtleSA9PiB7XG4gICAgICBpZiAoIWhhc093bihiLCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghRUpTT04uZXF1YWxzKGFba2V5XSwgYltrZXldLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0ICYmIGkgPT09IGJLZXlzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0dXJuIGEgZGVlcCBjb3B5IG9mIGB2YWxgLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAcGFyYW0ge0VKU09OfSB2YWwgQSB2YWx1ZSB0byBjb3B5LlxuICovXG5FSlNPTi5jbG9uZSA9IHYgPT4ge1xuICBsZXQgcmV0O1xuICBpZiAodHlwZW9mIHYgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBpZiAodiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyBudWxsIGhhcyB0eXBlb2YgXCJvYmplY3RcIlxuICB9XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHYuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIFJlZ0V4cHMgYXJlIG5vdCByZWFsbHkgRUpTT04gZWxlbWVudHMgKGVnIHdlIGRvbid0IGRlZmluZSBhIHNlcmlhbGl6YXRpb25cbiAgLy8gZm9yIHRoZW0pLCBidXQgdGhleSdyZSBpbW11dGFibGUgYW55d2F5LCBzbyB3ZSBjYW4gc3VwcG9ydCB0aGVtIGluIGNsb25lLlxuICBpZiAodiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiB2O1xuICB9XG5cbiAgaWYgKEVKU09OLmlzQmluYXJ5KHYpKSB7XG4gICAgcmV0ID0gRUpTT04ubmV3QmluYXJ5KHYubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHZbaV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgIHJldHVybiB2Lm1hcCh2YWx1ZSA9PiBFSlNPTi5jbG9uZSh2YWx1ZSkpO1xuICB9XG5cbiAgaWYgKGlzQXJndW1lbnRzKHYpKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odikubWFwKHZhbHVlID0+IEVKU09OLmNsb25lKHZhbHVlKSk7XG4gIH1cblxuICAvLyBoYW5kbGUgZ2VuZXJhbCB1c2VyLWRlZmluZWQgdHlwZWQgT2JqZWN0cyBpZiB0aGV5IGhhdmUgYSBjbG9uZSBtZXRob2RcbiAgaWYgKHR5cGVvZiB2LmNsb25lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHYuY2xvbmUoKTtcbiAgfVxuXG4gIC8vIGhhbmRsZSBvdGhlciBjdXN0b20gdHlwZXNcbiAgaWYgKEVKU09OLl9pc0N1c3RvbVR5cGUodikpIHtcbiAgICByZXR1cm4gRUpTT04uZnJvbUpTT05WYWx1ZShFSlNPTi5jbG9uZShFSlNPTi50b0pTT05WYWx1ZSh2KSksIHRydWUpO1xuICB9XG5cbiAgLy8gaGFuZGxlIG90aGVyIG9iamVjdHNcbiAgcmV0ID0ge307XG4gIE9iamVjdC5rZXlzKHYpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJldFtrZXldID0gRUpTT04uY2xvbmUodltrZXldKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvZiBiaW5hcnkgZGF0YSB0aGF0IEVKU09OIGNhbiBzZXJpYWxpemUuXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYmluYXJ5IGRhdGEgdG8gYWxsb2NhdGUuXG4gKi9cbi8vIEVKU09OLm5ld0JpbmFyeSBpcyB0aGUgcHVibGljIGRvY3VtZW50ZWQgQVBJIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHksXG4vLyBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHRoZSAnYmFzZTY0JyBwYWNrYWdlIHRvIGF2b2lkXG4vLyBpbnRyb2R1Y2luZyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuIChJZiB0aGUgaW1wbGVtZW50YXRpb24gd2VyZSBoZXJlLFxuLy8gdGhlbiAnYmFzZTY0JyB3b3VsZCBoYXZlIHRvIHVzZSBFSlNPTi5uZXdCaW5hcnksIGFuZCAnZWpzb24nIHdvdWxkXG4vLyBhbHNvIGhhdmUgdG8gdXNlICdiYXNlNjQnLilcbkVKU09OLm5ld0JpbmFyeSA9IEJhc2U2NC5uZXdCaW5hcnk7XG5cbmV4cG9ydCB7IEVKU09OIH07XG4iLCIvLyBCYXNlZCBvbiBqc29uMi5qcyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanNcbi8vXG4vLyAgICBqc29uMi5qc1xuLy8gICAgMjAxMi0xMC0wOFxuLy9cbi8vICAgIFB1YmxpYyBEb21haW4uXG4vL1xuLy8gICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLlxuXG5mdW5jdGlvbiBxdW90ZShzdHJpbmcpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN0cmluZyk7XG59XG5cbmNvbnN0IHN0ciA9IChrZXksIGhvbGRlciwgc2luZ2xlSW5kZW50LCBvdXRlckluZGVudCwgY2Fub25pY2FsKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gaG9sZGVyW2tleV07XG5cbiAgLy8gV2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB0aGUgdmFsdWUncyB0eXBlLlxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICBjYXNlICdzdHJpbmcnOlxuICAgIHJldHVybiBxdW90ZSh2YWx1ZSk7XG4gIGNhc2UgJ251bWJlcic6XG4gICAgLy8gSlNPTiBudW1iZXJzIG11c3QgYmUgZmluaXRlLiBFbmNvZGUgbm9uLWZpbml0ZSBudW1iZXJzIGFzIG51bGwuXG4gICAgcmV0dXJuIGlzRmluaXRlKHZhbHVlKSA/IFN0cmluZyh2YWx1ZSkgOiAnbnVsbCc7XG4gIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAvLyBJZiB0aGUgdHlwZSBpcyAnb2JqZWN0Jywgd2UgbWlnaHQgYmUgZGVhbGluZyB3aXRoIGFuIG9iamVjdCBvciBhbiBhcnJheSBvclxuICAvLyBudWxsLlxuICBjYXNlICdvYmplY3QnOlxuICAgIC8vIER1ZSB0byBhIHNwZWNpZmljYXRpb24gYmx1bmRlciBpbiBFQ01BU2NyaXB0LCB0eXBlb2YgbnVsbCBpcyAnb2JqZWN0JyxcbiAgICAvLyBzbyB3YXRjaCBvdXQgZm9yIHRoYXQgY2FzZS5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICAvLyBNYWtlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBhcnRpYWwgcmVzdWx0cyBvZiBzdHJpbmdpZnlpbmcgdGhpcyBvYmplY3RcbiAgICAvLyB2YWx1ZS5cbiAgICBjb25zdCBpbm5lckluZGVudCA9IG91dGVySW5kZW50ICsgc2luZ2xlSW5kZW50O1xuICAgIGNvbnN0IHBhcnRpYWwgPSBbXTtcblxuICAgIC8vIElzIHRoZSB2YWx1ZSBhbiBhcnJheT9cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykpIHtcbiAgICAgIC8vIFRoZSB2YWx1ZSBpcyBhbiBhcnJheS4gU3RyaW5naWZ5IGV2ZXJ5IGVsZW1lbnQuIFVzZSBudWxsIGFzIGFcbiAgICAgIC8vIHBsYWNlaG9sZGVyIGZvciBub24tSlNPTiB2YWx1ZXMuXG4gICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHBhcnRpYWxbaV0gPVxuICAgICAgICAgIHN0cihpLCB2YWx1ZSwgc2luZ2xlSW5kZW50LCBpbm5lckluZGVudCwgY2Fub25pY2FsKSB8fCAnbnVsbCc7XG4gICAgICB9XG5cbiAgICAgIC8vIEpvaW4gYWxsIG9mIHRoZSBlbGVtZW50cyB0b2dldGhlciwgc2VwYXJhdGVkIHdpdGggY29tbWFzLCBhbmQgd3JhcFxuICAgICAgLy8gdGhlbSBpbiBicmFja2V0cy5cbiAgICAgIGxldCB2O1xuICAgICAgaWYgKHBhcnRpYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHYgPSAnW10nO1xuICAgICAgfSBlbHNlIGlmIChpbm5lckluZGVudCkge1xuICAgICAgICB2ID0gJ1tcXG4nICtcbiAgICAgICAgICBpbm5lckluZGVudCArXG4gICAgICAgICAgcGFydGlhbC5qb2luKCcsXFxuJyArXG4gICAgICAgICAgaW5uZXJJbmRlbnQpICtcbiAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgb3V0ZXJJbmRlbnQgK1xuICAgICAgICAgICddJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHYgPSAnWycgKyBwYXJ0aWFsLmpvaW4oJywnKSArICddJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2O1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIGtleXMgaW4gdGhlIG9iamVjdC5cbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICBrZXlzID0ga2V5cy5zb3J0KCk7XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrID0+IHtcbiAgICAgIHYgPSBzdHIoaywgdmFsdWUsIHNpbmdsZUluZGVudCwgaW5uZXJJbmRlbnQsIGNhbm9uaWNhbCk7XG4gICAgICBpZiAodikge1xuICAgICAgICBwYXJ0aWFsLnB1c2gocXVvdGUoaykgKyAoaW5uZXJJbmRlbnQgPyAnOiAnIDogJzonKSArIHYpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSm9pbiBhbGwgb2YgdGhlIG1lbWJlciB0ZXh0cyB0b2dldGhlciwgc2VwYXJhdGVkIHdpdGggY29tbWFzLFxuICAgIC8vIGFuZCB3cmFwIHRoZW0gaW4gYnJhY2VzLlxuICAgIGlmIChwYXJ0aWFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdiA9ICd7fSc7XG4gICAgfSBlbHNlIGlmIChpbm5lckluZGVudCkge1xuICAgICAgdiA9ICd7XFxuJyArXG4gICAgICAgIGlubmVySW5kZW50ICtcbiAgICAgICAgcGFydGlhbC5qb2luKCcsXFxuJyArXG4gICAgICAgIGlubmVySW5kZW50KSArXG4gICAgICAgICdcXG4nICtcbiAgICAgICAgb3V0ZXJJbmRlbnQgK1xuICAgICAgICAnfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHYgPSAneycgKyBwYXJ0aWFsLmpvaW4oJywnKSArICd9JztcbiAgICB9XG4gICAgcmV0dXJuIHY7XG5cbiAgZGVmYXVsdDogLy8gRG8gbm90aGluZ1xuICB9XG59O1xuXG4vLyBJZiB0aGUgSlNPTiBvYmplY3QgZG9lcyBub3QgeWV0IGhhdmUgYSBzdHJpbmdpZnkgbWV0aG9kLCBnaXZlIGl0IG9uZS5cbmNvbnN0IGNhbm9uaWNhbFN0cmluZ2lmeSA9ICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAvLyBNYWtlIGEgZmFrZSByb290IG9iamVjdCBjb250YWluaW5nIG91ciB2YWx1ZSB1bmRlciB0aGUga2V5IG9mICcnLlxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiBzdHJpbmdpZnlpbmcgdGhlIHZhbHVlLlxuICBjb25zdCBhbGxPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgaW5kZW50OiAnJyxcbiAgICBjYW5vbmljYWw6IGZhbHNlLFxuICB9LCBvcHRpb25zKTtcbiAgaWYgKGFsbE9wdGlvbnMuaW5kZW50ID09PSB0cnVlKSB7XG4gICAgYWxsT3B0aW9ucy5pbmRlbnQgPSAnICAnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhbGxPcHRpb25zLmluZGVudCA9PT0gJ251bWJlcicpIHtcbiAgICBsZXQgbmV3SW5kZW50ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxPcHRpb25zLmluZGVudDsgaSsrKSB7XG4gICAgICBuZXdJbmRlbnQgKz0gJyAnO1xuICAgIH1cbiAgICBhbGxPcHRpb25zLmluZGVudCA9IG5ld0luZGVudDtcbiAgfVxuICByZXR1cm4gc3RyKCcnLCB7Jyc6IHZhbHVlfSwgYWxsT3B0aW9ucy5pbmRlbnQsICcnLCBhbGxPcHRpb25zLmNhbm9uaWNhbCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjYW5vbmljYWxTdHJpbmdpZnk7XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/ejson/ejson.js","meteor://💻app/packages/ejson/stringify.js"],"names":["module","export","EJSON","customTypes","hasOwn","obj","prop","hasOwnProperty","call","isArguments","isInfOrNan","Number","isNaN","Infinity","addType","name","factory","Error","builtinConverters","matchJSONValue","Object","keys","length","matchObject","Date","toJSONValue","$date","getTime","fromJSONValue","RegExp","regexp","$regexp","source","$flags","flags","slice","replace","sign","$InfNaN","Uint8Array","$binary","Base64","encode","decode","match","keyCount","some","converter","newObj","forEach","key","$escape","_isCustomType","jsonValue","Meteor","_noYieldsAllowed","$type","typeName","$value","_getTypes","_getConverters","toJSONValueHelper","item","i","undefined","adjustTypesToJSONValue","maybeChanged","value","changed","_adjustTypesToJSONValue","newItem","clone","fromJSONValueHelper","every","k","substr","adjustTypesFromJSONValue","_adjustTypesFromJSONValue","stringify","options","serialized","json","canonical","indent","canonicalStringify","link","default","v","JSON","parse","isBinary","$Uint8ArrayPolyfill","equals","a","b","keyOrderSensitive","valueOf","Array","ret","aKeys","bKeys","newBinary","isArray","map","from","quote","string","str","holder","singleIndent","outerIndent","isFinite","String","innerIndent","partial","join","sort","push","allOptions","assign","newIndent","exportDefault"],"mappings":"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","file":"/packages/ejson.js","sourcesContent":["/**\n * @namespace\n * @summary Namespace for EJSON functions\n */\nconst EJSON = {};\n\n// Custom type interface definition\n/**\n * @class CustomType\n * @instanceName customType\n * @memberOf EJSON\n * @summary The interface that a class must satisfy to be able to become an\n * EJSON custom type via EJSON.addType.\n */\n\n/**\n * @function typeName\n * @memberOf EJSON.CustomType\n * @summary Return the tag used to identify this type. This must match the\n * tag used to register this type with\n * [`EJSON.addType`](#ejson_add_type).\n * @locus Anywhere\n * @instance\n */\n\n/**\n * @function toJSONValue\n * @memberOf EJSON.CustomType\n * @summary Serialize this instance into a JSON-compatible value.\n * @locus Anywhere\n * @instance\n */\n\n/**\n * @function clone\n * @memberOf EJSON.CustomType\n * @summary Return a value `r` such that `this.equals(r)` is true, and\n * modifications to `r` do not affect `this` and vice versa.\n * @locus Anywhere\n * @instance\n */\n\n/**\n * @function equals\n * @memberOf EJSON.CustomType\n * @summary Return `true` if `other` has a value equal to `this`; `false`\n * otherwise.\n * @locus Anywhere\n * @param {Object} other Another object to compare this to.\n * @instance\n */\n\nconst customTypes = {};\n\nconst hasOwn = (obj, prop) => ({}).hasOwnProperty.call(obj, prop);\n\nconst isArguments = obj => obj != null && hasOwn(obj, 'callee');\n\nconst isInfOrNan =\n obj => Number.isNaN(obj) || obj === Infinity || obj === -Infinity;\n\n// Add a custom type, using a method of your choice to get to and\n// from a basic JSON-able representation. The factory argument\n// is a function of JSON-able --> your object\n// The type you add must have:\n// - A toJSONValue() method, so that Meteor can serialize it\n// - a typeName() method, to show how to look it up in our type table.\n// It is okay if these methods are monkey-patched on.\n// EJSON.clone will use toJSONValue and the given factory to produce\n// a clone, but you may specify a method clone() that will be\n// used instead.\n// Similarly, EJSON.equals will use toJSONValue to make comparisons,\n// but you may provide a method equals() instead.\n/**\n * @summary Add a custom datatype to EJSON.\n * @locus Anywhere\n * @param {String} name A tag for your custom type; must be unique among\n * custom data types defined in your project, and must\n * match the result of your type's `typeName` method.\n * @param {Function} factory A function that deserializes a JSON-compatible\n * value into an instance of your type. This should\n * match the serialization performed by your\n * type's `toJSONValue` method.\n */\nEJSON.addType = (name, factory) => {\n if (hasOwn(customTypes, name)) {\n throw new Error(`Type ${name} already present`);\n }\n customTypes[name] = factory;\n};\n\nconst builtinConverters = [\n { // Date\n matchJSONValue(obj) {\n return hasOwn(obj, '$date') && Object.keys(obj).length === 1;\n },\n matchObject(obj) {\n return obj instanceof Date;\n },\n toJSONValue(obj) {\n return {$date: obj.getTime()};\n },\n fromJSONValue(obj) {\n return new Date(obj.$date);\n },\n },\n { // RegExp\n matchJSONValue(obj) {\n return hasOwn(obj, '$regexp')\n && hasOwn(obj, '$flags')\n && Object.keys(obj).length === 2;\n },\n matchObject(obj) {\n return obj instanceof RegExp;\n },\n toJSONValue(regexp) {\n return {\n $regexp: regexp.source,\n $flags: regexp.flags\n };\n },\n fromJSONValue(obj) {\n // Replaces duplicate / invalid flags.\n return new RegExp(\n obj.$regexp,\n obj.$flags\n // Cut off flags at 50 chars to avoid abusing RegExp for DOS.\n .slice(0, 50)\n .replace(/[^gimuy]/g,'')\n .replace(/(.)(?=.*\\1)/g, '')\n );\n },\n },\n { // NaN, Inf, -Inf. (These are the only objects with typeof !== 'object'\n // which we match.)\n matchJSONValue(obj) {\n return hasOwn(obj, '$InfNaN') && Object.keys(obj).length === 1;\n },\n matchObject: isInfOrNan,\n toJSONValue(obj) {\n let sign;\n if (Number.isNaN(obj)) {\n sign = 0;\n } else if (obj === Infinity) {\n sign = 1;\n } else {\n sign = -1;\n }\n return {$InfNaN: sign};\n },\n fromJSONValue(obj) {\n return obj.$InfNaN / 0;\n },\n },\n { // Binary\n matchJSONValue(obj) {\n return hasOwn(obj, '$binary') && Object.keys(obj).length === 1;\n },\n matchObject(obj) {\n return typeof Uint8Array !== 'undefined' && obj instanceof Uint8Array\n || (obj && hasOwn(obj, '$Uint8ArrayPolyfill'));\n },\n toJSONValue(obj) {\n return {$binary: Base64.encode(obj)};\n },\n fromJSONValue(obj) {\n return Base64.decode(obj.$binary);\n },\n },\n { // Escaping one level\n matchJSONValue(obj) {\n return hasOwn(obj, '$escape') && Object.keys(obj).length === 1;\n },\n matchObject(obj) {\n let match = false;\n if (obj) {\n const keyCount = Object.keys(obj).length;\n if (keyCount === 1 || keyCount === 2) {\n match =\n builtinConverters.some(converter => converter.matchJSONValue(obj));\n }\n }\n return match;\n },\n toJSONValue(obj) {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n newObj[key] = EJSON.toJSONValue(obj[key]);\n });\n return {$escape: newObj};\n },\n fromJSONValue(obj) {\n const newObj = {};\n Object.keys(obj.$escape).forEach(key => {\n newObj[key] = EJSON.fromJSONValue(obj.$escape[key]);\n });\n return newObj;\n },\n },\n { // Custom\n matchJSONValue(obj) {\n return hasOwn(obj, '$type')\n && hasOwn(obj, '$value') && Object.keys(obj).length === 2;\n },\n matchObject(obj) {\n return EJSON._isCustomType(obj);\n },\n toJSONValue(obj) {\n const jsonValue = Meteor._noYieldsAllowed(() => obj.toJSONValue());\n return {$type: obj.typeName(), $value: jsonValue};\n },\n fromJSONValue(obj) {\n const typeName = obj.$type;\n if (!hasOwn(customTypes, typeName)) {\n throw new Error(`Custom EJSON type ${typeName} is not defined`);\n }\n const converter = customTypes[typeName];\n return Meteor._noYieldsAllowed(() => converter(obj.$value));\n },\n },\n];\n\nEJSON._isCustomType = (obj) => (\n obj &&\n typeof obj.toJSONValue === 'function' &&\n typeof obj.typeName === 'function' &&\n hasOwn(customTypes, obj.typeName())\n);\n\nEJSON._getTypes = () => customTypes;\n\nEJSON._getConverters = () => builtinConverters;\n\n// Either return the JSON-compatible version of the argument, or undefined (if\n// the item isn't itself replaceable, but maybe some fields in it are)\nconst toJSONValueHelper = item => {\n for (let i = 0; i < builtinConverters.length; i++) {\n const converter = builtinConverters[i];\n if (converter.matchObject(item)) {\n return converter.toJSONValue(item);\n }\n }\n return undefined;\n};\n\n// for both arrays and objects, in-place modification.\nconst adjustTypesToJSONValue = obj => {\n // Is it an atom that we need to adjust?\n if (obj === null) {\n return null;\n }\n\n const maybeChanged = toJSONValueHelper(obj);\n if (maybeChanged !== undefined) {\n return maybeChanged;\n }\n\n // Other atoms are unchanged.\n if (typeof obj !== 'object') {\n return obj;\n }\n\n // Iterate over array or object structure.\n Object.keys(obj).forEach(key => {\n const value = obj[key];\n if (typeof value !== 'object' && value !== undefined &&\n !isInfOrNan(value)) {\n return; // continue\n }\n\n const changed = toJSONValueHelper(value);\n if (changed) {\n obj[key] = changed;\n return; // on to the next key\n }\n // if we get here, value is an object but not adjustable\n // at this level. recurse.\n adjustTypesToJSONValue(value);\n });\n return obj;\n};\n\nEJSON._adjustTypesToJSONValue = adjustTypesToJSONValue;\n\n/**\n * @summary Serialize an EJSON-compatible value into its plain JSON\n * representation.\n * @locus Anywhere\n * @param {EJSON} val A value to serialize to plain JSON.\n */\nEJSON.toJSONValue = item => {\n const changed = toJSONValueHelper(item);\n if (changed !== undefined) {\n return changed;\n }\n\n let newItem = item;\n if (typeof item === 'object') {\n newItem = EJSON.clone(item);\n adjustTypesToJSONValue(newItem);\n }\n return newItem;\n};\n\n// Either return the argument changed to have the non-json\n// rep of itself (the Object version) or the argument itself.\n// DOES NOT RECURSE. For actually getting the fully-changed value, use\n// EJSON.fromJSONValue\nconst fromJSONValueHelper = value => {\n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n if (keys.length <= 2\n && keys.every(k => typeof k === 'string' && k.substr(0, 1) === '$')) {\n for (let i = 0; i < builtinConverters.length; i++) {\n const converter = builtinConverters[i];\n if (converter.matchJSONValue(value)) {\n return converter.fromJSONValue(value);\n }\n }\n }\n }\n return value;\n};\n\n// for both arrays and objects. Tries its best to just\n// use the object you hand it, but may return something\n// different if the object you hand it itself needs changing.\nconst adjustTypesFromJSONValue = obj => {\n if (obj === null) {\n return null;\n }\n\n const maybeChanged = fromJSONValueHelper(obj);\n if (maybeChanged !== obj) {\n return maybeChanged;\n }\n\n // Other atoms are unchanged.\n if (typeof obj !== 'object') {\n return obj;\n }\n\n Object.keys(obj).forEach(key => {\n const value = obj[key];\n if (typeof value === 'object') {\n const changed = fromJSONValueHelper(value);\n if (value !== changed) {\n obj[key] = changed;\n return;\n }\n // if we get here, value is an object but not adjustable\n // at this level. recurse.\n adjustTypesFromJSONValue(value);\n }\n });\n return obj;\n};\n\nEJSON._adjustTypesFromJSONValue = adjustTypesFromJSONValue;\n\n/**\n * @summary Deserialize an EJSON value from its plain JSON representation.\n * @locus Anywhere\n * @param {JSONCompatible} val A value to deserialize into EJSON.\n */\nEJSON.fromJSONValue = item => {\n let changed = fromJSONValueHelper(item);\n if (changed === item && typeof item === 'object') {\n changed = EJSON.clone(item);\n adjustTypesFromJSONValue(changed);\n }\n return changed;\n};\n\n/**\n * @summary Serialize a value to a string. For EJSON values, the serialization\n * fully represents the value. For non-EJSON values, serializes the\n * same way as `JSON.stringify`.\n * @locus Anywhere\n * @param {EJSON} val A value to stringify.\n * @param {Object} [options]\n * @param {Boolean | Integer | String} options.indent Indents objects and\n * arrays for easy readability. When `true`, indents by 2 spaces; when an\n * integer, indents by that number of spaces; and when a string, uses the\n * string as the indentation pattern.\n * @param {Boolean} options.canonical When `true`, stringifies keys in an\n * object in sorted order.\n */\nEJSON.stringify = (item, options) => {\n let serialized;\n const json = EJSON.toJSONValue(item);\n if (options && (options.canonical || options.indent)) {\n import canonicalStringify from './stringify';\n serialized = canonicalStringify(json, options);\n } else {\n serialized = JSON.stringify(json);\n }\n return serialized;\n};\n\n/**\n * @summary Parse a string into an EJSON value. Throws an error if the string\n * is not valid EJSON.\n * @locus Anywhere\n * @param {String} str A string to parse into an EJSON value.\n */\nEJSON.parse = item => {\n if (typeof item !== 'string') {\n throw new Error('EJSON.parse argument should be a string');\n }\n return EJSON.fromJSONValue(JSON.parse(item));\n};\n\n/**\n * @summary Returns true if `x` is a buffer of binary data, as returned from\n * [`EJSON.newBinary`](#ejson_new_binary).\n * @param {Object} x The variable to check.\n * @locus Anywhere\n */\nEJSON.isBinary = obj => {\n return !!((typeof Uint8Array !== 'undefined' && obj instanceof Uint8Array) ||\n (obj && obj.$Uint8ArrayPolyfill));\n};\n\n/**\n * @summary Return true if `a` and `b` are equal to each other. Return false\n * otherwise. Uses the `equals` method on `a` if present, otherwise\n * performs a deep comparison.\n * @locus Anywhere\n * @param {EJSON} a\n * @param {EJSON} b\n * @param {Object} [options]\n * @param {Boolean} options.keyOrderSensitive Compare in key sensitive order,\n * if supported by the JavaScript implementation. For example, `{a: 1, b: 2}`\n * is equal to `{b: 2, a: 1}` only when `keyOrderSensitive` is `false`. The\n * default is `false`.\n */\nEJSON.equals = (a, b, options) => {\n let i;\n const keyOrderSensitive = !!(options && options.keyOrderSensitive);\n if (a === b) {\n return true;\n }\n\n // This differs from the IEEE spec for NaN equality, b/c we don't want\n // anything ever with a NaN to be poisoned from becoming equal to anything.\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true;\n }\n\n // if either one is falsy, they'd have to be === to be equal\n if (!a || !b) {\n return false;\n }\n\n if (!(typeof a === 'object' && typeof b === 'object')) {\n return false;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.valueOf() === b.valueOf();\n }\n\n if (EJSON.isBinary(a) && EJSON.isBinary(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n\n if (typeof (a.equals) === 'function') {\n return a.equals(b, options);\n }\n\n if (typeof (b.equals) === 'function') {\n return b.equals(a, options);\n }\n\n if (a instanceof Array) {\n if (!(b instanceof Array)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (i = 0; i < a.length; i++) {\n if (!EJSON.equals(a[i], b[i], options)) {\n return false;\n }\n }\n return true;\n }\n\n // fallback for custom types that don't implement their own equals\n switch (EJSON._isCustomType(a) + EJSON._isCustomType(b)) {\n case 1: return false;\n case 2: return EJSON.equals(EJSON.toJSONValue(a), EJSON.toJSONValue(b));\n default: // Do nothing\n }\n\n // fall back to structural equality of objects\n let ret;\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (keyOrderSensitive) {\n i = 0;\n ret = aKeys.every(key => {\n if (i >= bKeys.length) {\n return false;\n }\n if (key !== bKeys[i]) {\n return false;\n }\n if (!EJSON.equals(a[key], b[bKeys[i]], options)) {\n return false;\n }\n i++;\n return true;\n });\n } else {\n i = 0;\n ret = aKeys.every(key => {\n if (!hasOwn(b, key)) {\n return false;\n }\n if (!EJSON.equals(a[key], b[key], options)) {\n return false;\n }\n i++;\n return true;\n });\n }\n return ret && i === bKeys.length;\n};\n\n/**\n * @summary Return a deep copy of `val`.\n * @locus Anywhere\n * @param {EJSON} val A value to copy.\n */\nEJSON.clone = v => {\n let ret;\n if (typeof v !== 'object') {\n return v;\n }\n\n if (v === null) {\n return null; // null has typeof \"object\"\n }\n\n if (v instanceof Date) {\n return new Date(v.getTime());\n }\n\n // RegExps are not really EJSON elements (eg we don't define a serialization\n // for them), but they're immutable anyway, so we can support them in clone.\n if (v instanceof RegExp) {\n return v;\n }\n\n if (EJSON.isBinary(v)) {\n ret = EJSON.newBinary(v.length);\n for (let i = 0; i < v.length; i++) {\n ret[i] = v[i];\n }\n return ret;\n }\n\n if (Array.isArray(v)) {\n return v.map(value => EJSON.clone(value));\n }\n\n if (isArguments(v)) {\n return Array.from(v).map(value => EJSON.clone(value));\n }\n\n // handle general user-defined typed Objects if they have a clone method\n if (typeof v.clone === 'function') {\n return v.clone();\n }\n\n // handle other custom types\n if (EJSON._isCustomType(v)) {\n return EJSON.fromJSONValue(EJSON.clone(EJSON.toJSONValue(v)), true);\n }\n\n // handle other objects\n ret = {};\n Object.keys(v).forEach((key) => {\n ret[key] = EJSON.clone(v[key]);\n });\n return ret;\n};\n\n/**\n * @summary Allocate a new buffer of binary data that EJSON can serialize.\n * @locus Anywhere\n * @param {Number} size The number of bytes of binary data to allocate.\n */\n// EJSON.newBinary is the public documented API for this functionality,\n// but the implementation is in the 'base64' package to avoid\n// introducing a circular dependency. (If the implementation were here,\n// then 'base64' would have to use EJSON.newBinary, and 'ejson' would\n// also have to use 'base64'.)\nEJSON.newBinary = Base64.newBinary;\n\nexport { EJSON };\n","// Based on json2.js from https://github.com/douglascrockford/JSON-js\n//\n// json2.js\n// 2012-10-08\n//\n// Public Domain.\n//\n// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\nfunction quote(string) {\n return JSON.stringify(string);\n}\n\nconst str = (key, holder, singleIndent, outerIndent, canonical) => {\n const value = holder[key];\n\n // What happens next depends on the value's type.\n switch (typeof value) {\n case 'string':\n return quote(value);\n case 'number':\n // JSON numbers must be finite. Encode non-finite numbers as null.\n return isFinite(value) ? String(value) : 'null';\n case 'boolean':\n return String(value);\n // If the type is 'object', we might be dealing with an object or an array or\n // null.\n case 'object':\n // Due to a specification blunder in ECMAScript, typeof null is 'object',\n // so watch out for that case.\n if (!value) {\n return 'null';\n }\n // Make an array to hold the partial results of stringifying this object\n // value.\n const innerIndent = outerIndent + singleIndent;\n const partial = [];\n\n // Is the value an array?\n if (Array.isArray(value) || ({}).hasOwnProperty.call(value, 'callee')) {\n // The value is an array. Stringify every element. Use null as a\n // placeholder for non-JSON values.\n const length = value.length;\n for (let i = 0; i < length; i += 1) {\n partial[i] =\n str(i, value, singleIndent, innerIndent, canonical) || 'null';\n }\n\n // Join all of the elements together, separated with commas, and wrap\n // them in brackets.\n let v;\n if (partial.length === 0) {\n v = '[]';\n } else if (innerIndent) {\n v = '[\\n' +\n innerIndent +\n partial.join(',\\n' +\n innerIndent) +\n '\\n' +\n outerIndent +\n ']';\n } else {\n v = '[' + partial.join(',') + ']';\n }\n return v;\n }\n\n // Iterate through all of the keys in the object.\n let keys = Object.keys(value);\n if (canonical) {\n keys = keys.sort();\n }\n keys.forEach(k => {\n v = str(k, value, singleIndent, innerIndent, canonical);\n if (v) {\n partial.push(quote(k) + (innerIndent ? ': ' : ':') + v);\n }\n });\n\n // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n if (partial.length === 0) {\n v = '{}';\n } else if (innerIndent) {\n v = '{\\n' +\n innerIndent +\n partial.join(',\\n' +\n innerIndent) +\n '\\n' +\n outerIndent +\n '}';\n } else {\n v = '{' + partial.join(',') + '}';\n }\n return v;\n\n default: // Do nothing\n }\n};\n\n// If the JSON object does not yet have a stringify method, give it one.\nconst canonicalStringify = (value, options) => {\n // Make a fake root object containing our value under the key of ''.\n // Return the result of stringifying the value.\n const allOptions = Object.assign({\n indent: '',\n canonical: false,\n }, options);\n if (allOptions.indent === true) {\n allOptions.indent = ' ';\n } else if (typeof allOptions.indent === 'number') {\n let newIndent = '';\n for (let i = 0; i < allOptions.indent; i++) {\n newIndent += ' ';\n }\n allOptions.indent = newIndent;\n }\n return str('', {'': value}, allOptions.indent, '', allOptions.canonical);\n};\n\nexport default canonicalStringify;\n"]}
\ No newline at end of file
(function () {
/* Exports */
Package._define("es5-shim");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var fetch;
var require = meteorInstall({"node_modules":{"meteor":{"fetch":{"server.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/fetch/server.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
const fetch = require("node-fetch");
exports.fetch = fetch;
exports.Headers = fetch.Headers;
exports.Request = fetch.Request;
exports.Response = fetch.Response;
const { setMinimumBrowserVersions } = require("meteor/modern-browsers");
// https://caniuse.com/#feat=fetch
setMinimumBrowserVersions({
chrome: 42,
edge: 14,
firefox: 39,
mobile_safari: [10, 3],
opera: 29,
safari: [10, 1],
phantomjs: Infinity,
// https://github.com/Kilian/electron-to-chromium/blob/master/full-versions.js
electron: [0, 25],
}, module.id);
///////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"node-fetch":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/fetch/node_modules/node-fetch/package.json //
// //
///////////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "node-fetch",
"version": "2.3.0",
"main": "lib/index"
};
///////////////////////////////////////////////////////////////////////////////////
},"lib":{"index.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/fetch/node_modules/node-fetch/lib/index.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////
}}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/fetch/server.js");
/* Exports */
Package._define("fetch", exports, {
fetch: fetch
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
/* Package-scope variables */
var GeoJSON;
var require = meteorInstall({"node_modules":{"meteor":{"geojson-utils":{"main.js":function(require,exports){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/geojson-utils/main.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
exports.GeoJSON = require("./geojson-utils.js");
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"geojson-utils.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/geojson-utils/geojson-utils.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
(function () {
var gju = {};
// Export the geojson object for **CommonJS**
if (typeof module !== 'undefined' && module.exports) {
module.exports = gju;
}
// adapted from http://www.kevlindev.com/gui/math/intersection/Intersection.js
gju.lineStringsIntersect = function (l1, l2) {
var intersects = [];
for (var i = 0; i <= l1.coordinates.length - 2; ++i) {
for (var j = 0; j <= l2.coordinates.length - 2; ++j) {
var a1 = {
x: l1.coordinates[i][1],
y: l1.coordinates[i][0]
},
a2 = {
x: l1.coordinates[i + 1][1],
y: l1.coordinates[i + 1][0]
},
b1 = {
x: l2.coordinates[j][1],
y: l2.coordinates[j][0]
},
b2 = {
x: l2.coordinates[j + 1][1],
y: l2.coordinates[j + 1][0]
},
ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),
ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),
u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
if (u_b != 0) {
var ua = ua_t / u_b,
ub = ub_t / u_b;
if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {
intersects.push({
'type': 'Point',
'coordinates': [a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)]
});
}
}
}
}
if (intersects.length == 0) intersects = false;
return intersects;
}
// Bounding Box
function boundingBoxAroundPolyCoords (coords) {
var xAll = [], yAll = []
for (var i = 0; i < coords[0].length; i++) {
xAll.push(coords[0][i][1])
yAll.push(coords[0][i][0])
}
xAll = xAll.sort(function (a,b) { return a - b })
yAll = yAll.sort(function (a,b) { return a - b })
return [ [xAll[0], yAll[0]], [xAll[xAll.length - 1], yAll[yAll.length - 1]] ]
}
gju.pointInBoundingBox = function (point, bounds) {
return !(point.coordinates[1] < bounds[0][0] || point.coordinates[1] > bounds[1][0] || point.coordinates[0] < bounds[0][1] || point.coordinates[0] > bounds[1][1])
}
// Point in Polygon
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html#Listing the Vertices
function pnpoly (x,y,coords) {
var vert = [ [0,0] ]
for (var i = 0; i < coords.length; i++) {
for (var j = 0; j < coords[i].length; j++) {
vert.push(coords[i][j])
}
vert.push([0,0])
}
var inside = false
for (var i = 0, j = vert.length - 1; i < vert.length; j = i++) {
if (((vert[i][0] > y) != (vert[j][0] > y)) && (x < (vert[j][1] - vert[i][1]) * (y - vert[i][0]) / (vert[j][0] - vert[i][0]) + vert[i][1])) inside = !inside
}
return inside
}
gju.pointInPolygon = function (p, poly) {
var coords = (poly.type == "Polygon") ? [ poly.coordinates ] : poly.coordinates
var insideBox = false
for (var i = 0; i < coords.length; i++) {
if (gju.pointInBoundingBox(p, boundingBoxAroundPolyCoords(coords[i]))) insideBox = true
}
if (!insideBox) return false
var insidePoly = false
for (var i = 0; i < coords.length; i++) {
if (pnpoly(p.coordinates[1], p.coordinates[0], coords[i])) insidePoly = true
}
return insidePoly
}
gju.numberToRadius = function (number) {
return number * Math.PI / 180;
}
gju.numberToDegree = function (number) {
return number * 180 / Math.PI;
}
// written with help from @tautologe
gju.drawCircle = function (radiusInMeters, centerPoint, steps) {
var center = [centerPoint.coordinates[1], centerPoint.coordinates[0]],
dist = (radiusInMeters / 1000) / 6371,
// convert meters to radiant
radCenter = [gju.numberToRadius(center[0]), gju.numberToRadius(center[1])],
steps = steps || 15,
// 15 sided circle
poly = [[center[0], center[1]]];
for (var i = 0; i < steps; i++) {
var brng = 2 * Math.PI * i / steps;
var lat = Math.asin(Math.sin(radCenter[0]) * Math.cos(dist)
+ Math.cos(radCenter[0]) * Math.sin(dist) * Math.cos(brng));
var lng = radCenter[1] + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(radCenter[0]),
Math.cos(dist) - Math.sin(radCenter[0]) * Math.sin(lat));
poly[i] = [];
poly[i][1] = gju.numberToDegree(lat);
poly[i][0] = gju.numberToDegree(lng);
}
return {
"type": "Polygon",
"coordinates": [poly]
};
}
// assumes rectangle starts at lower left point
gju.rectangleCentroid = function (rectangle) {
var bbox = rectangle.coordinates[0];
var xmin = bbox[0][0],
ymin = bbox[0][1],
xmax = bbox[2][0],
ymax = bbox[2][1];
var xwidth = xmax - xmin;
var ywidth = ymax - ymin;
return {
'type': 'Point',
'coordinates': [xmin + xwidth / 2, ymin + ywidth / 2]
};
}
// from http://www.movable-type.co.uk/scripts/latlong.html
gju.pointDistance = function (pt1, pt2) {
var lon1 = pt1.coordinates[0],
lat1 = pt1.coordinates[1],
lon2 = pt2.coordinates[0],
lat2 = pt2.coordinates[1],
dLat = gju.numberToRadius(lat2 - lat1),
dLon = gju.numberToRadius(lon2 - lon1),
a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(gju.numberToRadius(lat1))
* Math.cos(gju.numberToRadius(lat2)) * Math.pow(Math.sin(dLon / 2), 2),
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
// Earth radius is 6371 km
return (6371 * c) * 1000; // returns meters
},
// checks if geometry lies entirely within a circle
// works with Point, LineString, Polygon
gju.geometryWithinRadius = function (geometry, center, radius) {
if (geometry.type == 'Point') {
return gju.pointDistance(geometry, center) <= radius;
} else if (geometry.type == 'LineString' || geometry.type == 'Polygon') {
var point = {};
var coordinates;
if (geometry.type == 'Polygon') {
// it's enough to check the exterior ring of the Polygon
coordinates = geometry.coordinates[0];
} else {
coordinates = geometry.coordinates;
}
for (var i in coordinates) {
point.coordinates = coordinates[i];
if (gju.pointDistance(point, center) > radius) {
return false;
}
}
}
return true;
}
// adapted from http://paulbourke.net/geometry/polyarea/javascript.txt
gju.area = function (polygon) {
var area = 0;
// TODO: polygon holes at coordinates[1]
var points = polygon.coordinates[0];
var j = points.length - 1;
var p1, p2;
for (var i = 0; i < points.length; j = i++) {
var p1 = {
x: points[i][1],
y: points[i][0]
};
var p2 = {
x: points[j][1],
y: points[j][0]
};
area += p1.x * p2.y;
area -= p1.y * p2.x;
}
area /= 2;
return area;
},
// adapted from http://paulbourke.net/geometry/polyarea/javascript.txt
gju.centroid = function (polygon) {
var f, x = 0,
y = 0;
// TODO: polygon holes at coordinates[1]
var points = polygon.coordinates[0];
var j = points.length - 1;
var p1, p2;
for (var i = 0; i < points.length; j = i++) {
var p1 = {
x: points[i][1],
y: points[i][0]
};
var p2 = {
x: points[j][1],
y: points[j][0]
};
f = p1.x * p2.y - p2.x * p1.y;
x += (p1.x + p2.x) * f;
y += (p1.y + p2.y) * f;
}
f = gju.area(polygon) * 6;
return {
'type': 'Point',
'coordinates': [y / f, x / f]
};
},
gju.simplify = function (source, kink) { /* source[] array of geojson points */
/* kink in metres, kinks above this depth kept */
/* kink depth is the height of the triangle abc where a-b and b-c are two consecutive line segments */
kink = kink || 20;
source = source.map(function (o) {
return {
lng: o.coordinates[0],
lat: o.coordinates[1]
}
});
var n_source, n_stack, n_dest, start, end, i, sig;
var dev_sqr, max_dev_sqr, band_sqr;
var x12, y12, d12, x13, y13, d13, x23, y23, d23;
var F = (Math.PI / 180.0) * 0.5;
var index = new Array(); /* aray of indexes of source points to include in the reduced line */
var sig_start = new Array(); /* indices of start & end of working section */
var sig_end = new Array();
/* check for simple cases */
if (source.length < 3) return (source); /* one or two points */
/* more complex case. initialize stack */
n_source = source.length;
band_sqr = kink * 360.0 / (2.0 * Math.PI * 6378137.0); /* Now in degrees */
band_sqr *= band_sqr;
n_dest = 0;
sig_start[0] = 0;
sig_end[0] = n_source - 1;
n_stack = 1;
/* while the stack is not empty ... */
while (n_stack > 0) {
/* ... pop the top-most entries off the stacks */
start = sig_start[n_stack - 1];
end = sig_end[n_stack - 1];
n_stack--;
if ((end - start) > 1) { /* any intermediate points ? */
/* ... yes, so find most deviant intermediate point to
either side of line joining start & end points */
x12 = (source[end].lng() - source[start].lng());
y12 = (source[end].lat() - source[start].lat());
if (Math.abs(x12) > 180.0) x12 = 360.0 - Math.abs(x12);
x12 *= Math.cos(F * (source[end].lat() + source[start].lat())); /* use avg lat to reduce lng */
d12 = (x12 * x12) + (y12 * y12);
for (i = start + 1, sig = start, max_dev_sqr = -1.0; i < end; i++) {
x13 = source[i].lng() - source[start].lng();
y13 = source[i].lat() - source[start].lat();
if (Math.abs(x13) > 180.0) x13 = 360.0 - Math.abs(x13);
x13 *= Math.cos(F * (source[i].lat() + source[start].lat()));
d13 = (x13 * x13) + (y13 * y13);
x23 = source[i].lng() - source[end].lng();
y23 = source[i].lat() - source[end].lat();
if (Math.abs(x23) > 180.0) x23 = 360.0 - Math.abs(x23);
x23 *= Math.cos(F * (source[i].lat() + source[end].lat()));
d23 = (x23 * x23) + (y23 * y23);
if (d13 >= (d12 + d23)) dev_sqr = d23;
else if (d23 >= (d12 + d13)) dev_sqr = d13;
else dev_sqr = (x13 * y12 - y13 * x12) * (x13 * y12 - y13 * x12) / d12; // solve triangle
if (dev_sqr > max_dev_sqr) {
sig = i;
max_dev_sqr = dev_sqr;
}
}
if (max_dev_sqr < band_sqr) { /* is there a sig. intermediate point ? */
/* ... no, so transfer current start point */
index[n_dest] = start;
n_dest++;
} else { /* ... yes, so push two sub-sections on stack for further processing */
n_stack++;
sig_start[n_stack - 1] = sig;
sig_end[n_stack - 1] = end;
n_stack++;
sig_start[n_stack - 1] = start;
sig_end[n_stack - 1] = sig;
}
} else { /* ... no intermediate points, so transfer current start point */
index[n_dest] = start;
n_dest++;
}
}
/* transfer last point */
index[n_dest] = n_source - 1;
n_dest++;
/* make return array */
var r = new Array();
for (var i = 0; i < n_dest; i++)
r.push(source[index[i]]);
return r.map(function (o) {
return {
type: "Point",
coordinates: [o.lng, o.lat]
}
});
}
// http://www.movable-type.co.uk/scripts/latlong.html#destPoint
gju.destinationPoint = function (pt, brng, dist) {
dist = dist/6371; // convert dist to angular distance in radians
brng = gju.numberToRadius(brng);
var lat1 = gju.numberToRadius(pt.coordinates[0]);
var lon1 = gju.numberToRadius(pt.coordinates[1]);
var lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) +
Math.cos(lat1)*Math.sin(dist)*Math.cos(brng) );
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),
Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
lon2 = (lon2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180º
return {
'type': 'Point',
'coordinates': [gju.numberToDegree(lat2), gju.numberToDegree(lon2)]
};
};
})();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/geojson-utils/main.js");
/* Exports */
Package._define("geojson-utils", exports, {
GeoJSON: GeoJSON
});
})();
(function () {
/* Exports */
Package._define("hot-code-push");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
/* Package-scope variables */
var HTML, IDENTITY, SLICE;
(function(){
////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/htmljs/preamble.js //
// //
////////////////////////////////////////////////////////////////////////////////////////
//
HTML = {};
IDENTITY = function (x) { return x; };
SLICE = Array.prototype.slice;
////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/htmljs/visitors.js //
// //
////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////// VISITORS
// _assign is like _.extend or the upcoming Object.assign.
// Copy src's own, enumerable properties onto tgt and return
// tgt.
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _assign = function (tgt, src) {
for (var k in src) {
if (_hasOwnProperty.call(src, k))
tgt[k] = src[k];
}
return tgt;
};
HTML.Visitor = function (props) {
_assign(this, props);
};
HTML.Visitor.def = function (options) {
_assign(this.prototype, options);
};
HTML.Visitor.extend = function (options) {
var curType = this;
var subType = function HTMLVisitorSubtype(/*arguments*/) {
HTML.Visitor.apply(this, arguments);
};
subType.prototype = new curType;
subType.extend = curType.extend;
subType.def = curType.def;
if (options)
_assign(subType.prototype, options);
return subType;
};
HTML.Visitor.def({
visit: function (content/*, ...*/) {
if (content == null)
// null or undefined.
return this.visitNull.apply(this, arguments);
if (typeof content === 'object') {
if (content.htmljsType) {
switch (content.htmljsType) {
case HTML.Tag.htmljsType:
return this.visitTag.apply(this, arguments);
case HTML.CharRef.htmljsType:
return this.visitCharRef.apply(this, arguments);
case HTML.Comment.htmljsType:
return this.visitComment.apply(this, arguments);
case HTML.Raw.htmljsType:
return this.visitRaw.apply(this, arguments);
default:
throw new Error("Unknown htmljs type: " + content.htmljsType);
}
}
if (HTML.isArray(content))
return this.visitArray.apply(this, arguments);
return this.visitObject.apply(this, arguments);
} else if ((typeof content === 'string') ||
(typeof content === 'boolean') ||
(typeof content === 'number')) {
return this.visitPrimitive.apply(this, arguments);
} else if (typeof content === 'function') {
return this.visitFunction.apply(this, arguments);
}
throw new Error("Unexpected object in htmljs: " + content);
},
visitNull: function (nullOrUndefined/*, ...*/) {},
visitPrimitive: function (stringBooleanOrNumber/*, ...*/) {},
visitArray: function (array/*, ...*/) {},
visitComment: function (comment/*, ...*/) {},
visitCharRef: function (charRef/*, ...*/) {},
visitRaw: function (raw/*, ...*/) {},
visitTag: function (tag/*, ...*/) {},
visitObject: function (obj/*, ...*/) {
throw new Error("Unexpected object in htmljs: " + obj);
},
visitFunction: function (fn/*, ...*/) {
throw new Error("Unexpected function in htmljs: " + fn);
}
});
HTML.TransformingVisitor = HTML.Visitor.extend();
HTML.TransformingVisitor.def({
visitNull: IDENTITY,
visitPrimitive: IDENTITY,
visitArray: function (array/*, ...*/) {
var argsCopy = SLICE.call(arguments);
var result = array;
for (var i = 0; i < array.length; i++) {
var oldItem = array[i];
argsCopy[0] = oldItem;
var newItem = this.visit.apply(this, argsCopy);
if (newItem !== oldItem) {
// copy `array` on write
if (result === array)
result = array.slice();
result[i] = newItem;
}
}
return result;
},
visitComment: IDENTITY,
visitCharRef: IDENTITY,
visitRaw: IDENTITY,
visitObject: IDENTITY,
visitFunction: IDENTITY,
visitTag: function (tag/*, ...*/) {
var oldChildren = tag.children;
var argsCopy = SLICE.call(arguments);
argsCopy[0] = oldChildren;
var newChildren = this.visitChildren.apply(this, argsCopy);
var oldAttrs = tag.attrs;
argsCopy[0] = oldAttrs;
var newAttrs = this.visitAttributes.apply(this, argsCopy);
if (newAttrs === oldAttrs && newChildren === oldChildren)
return tag;
var newTag = HTML.getTag(tag.tagName).apply(null, newChildren);
newTag.attrs = newAttrs;
return newTag;
},
visitChildren: function (children/*, ...*/) {
return this.visitArray.apply(this, arguments);
},
// Transform the `.attrs` property of a tag, which may be a dictionary,
// an array, or in some uses, a foreign object (such as
// a template tag).
visitAttributes: function (attrs/*, ...*/) {
if (HTML.isArray(attrs)) {
var argsCopy = SLICE.call(arguments);
var result = attrs;
for (var i = 0; i < attrs.length; i++) {
var oldItem = attrs[i];
argsCopy[0] = oldItem;
var newItem = this.visitAttributes.apply(this, argsCopy);
if (newItem !== oldItem) {
// copy on write
if (result === attrs)
result = attrs.slice();
result[i] = newItem;
}
}
return result;
}
if (attrs && HTML.isConstructedObject(attrs)) {
throw new Error("The basic HTML.TransformingVisitor does not support " +
"foreign objects in attributes. Define a custom " +
"visitAttributes for this case.");
}
var oldAttrs = attrs;
var newAttrs = oldAttrs;
if (oldAttrs) {
var attrArgs = [null, null];
attrArgs.push.apply(attrArgs, arguments);
for (var k in oldAttrs) {
var oldValue = oldAttrs[k];
attrArgs[0] = k;
attrArgs[1] = oldValue;
var newValue = this.visitAttribute.apply(this, attrArgs);
if (newValue !== oldValue) {
// copy on write
if (newAttrs === oldAttrs)
newAttrs = _assign({}, oldAttrs);
newAttrs[k] = newValue;
}
}
}
return newAttrs;
},
// Transform the value of one attribute name/value in an
// attributes dictionary.
visitAttribute: function (name, value, tag/*, ...*/) {
var args = SLICE.call(arguments, 2);
args[0] = value;
return this.visit.apply(this, args);
}
});
HTML.ToTextVisitor = HTML.Visitor.extend();
HTML.ToTextVisitor.def({
visitNull: function (nullOrUndefined) {
return '';
},
visitPrimitive: function (stringBooleanOrNumber) {
var str = String(stringBooleanOrNumber);
if (this.textMode === HTML.TEXTMODE.RCDATA) {
return str.replace(/&/g, '&amp;').replace(/</g, '&lt;');
} else if (this.textMode === HTML.TEXTMODE.ATTRIBUTE) {
// escape `&` and `"` this time, not `&` and `<`
return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
} else {
return str;
}
},
visitArray: function (array) {
var parts = [];
for (var i = 0; i < array.length; i++)
parts.push(this.visit(array[i]));
return parts.join('');
},
visitComment: function (comment) {
throw new Error("Can't have a comment here");
},
visitCharRef: function (charRef) {
if (this.textMode === HTML.TEXTMODE.RCDATA ||
this.textMode === HTML.TEXTMODE.ATTRIBUTE) {
return charRef.html;
} else {
return charRef.str;
}
},
visitRaw: function (raw) {
return raw.value;
},
visitTag: function (tag) {
// Really we should just disallow Tags here. However, at the
// moment it's useful to stringify any HTML we find. In
// particular, when you include a template within `{{#markdown}}`,
// we render the template as text, and since there's currently
// no way to make the template be *parsed* as text (e.g. `<template
// type="text">`), we hackishly support HTML tags in markdown
// in templates by parsing them and stringifying them.
return this.visit(this.toHTML(tag));
},
visitObject: function (x) {
throw new Error("Unexpected object in htmljs in toText: " + x);
},
toHTML: function (node) {
return HTML.toHTML(node);
}
});
HTML.ToHTMLVisitor = HTML.Visitor.extend();
HTML.ToHTMLVisitor.def({
visitNull: function (nullOrUndefined) {
return '';
},
visitPrimitive: function (stringBooleanOrNumber) {
var str = String(stringBooleanOrNumber);
return str.replace(/&/g, '&amp;').replace(/</g, '&lt;');
},
visitArray: function (array) {
var parts = [];
for (var i = 0; i < array.length; i++)
parts.push(this.visit(array[i]));
return parts.join('');
},
visitComment: function (comment) {
return '<!--' + comment.sanitizedValue + '-->';
},
visitCharRef: function (charRef) {
return charRef.html;
},
visitRaw: function (raw) {
return raw.value;
},
visitTag: function (tag) {
var attrStrs = [];
var tagName = tag.tagName;
var children = tag.children;
var attrs = tag.attrs;
if (attrs) {
attrs = HTML.flattenAttributes(attrs);
for (var k in attrs) {
if (k === 'value' && tagName === 'textarea') {
children = [attrs[k], children];
} else {
var v = this.toText(attrs[k], HTML.TEXTMODE.ATTRIBUTE);
attrStrs.push(' ' + k + '="' + v + '"');
}
}
}
var startTag = '<' + tagName + attrStrs.join('') + '>';
var childStrs = [];
var content;
if (tagName === 'textarea') {
for (var i = 0; i < children.length; i++)
childStrs.push(this.toText(children[i], HTML.TEXTMODE.RCDATA));
content = childStrs.join('');
if (content.slice(0, 1) === '\n')
// TEXTAREA will absorb a newline, so if we see one, add
// another one.
content = '\n' + content;
} else {
for (var i = 0; i < children.length; i++)
childStrs.push(this.visit(children[i]));
content = childStrs.join('');
}
var result = startTag + content;
if (children.length || ! HTML.isVoidElement(tagName)) {
// "Void" elements like BR are the only ones that don't get a close
// tag in HTML5. They shouldn't have contents, either, so we could
// throw an error upon seeing contents here.
result += '</' + tagName + '>';
}
return result;
},
visitObject: function (x) {
throw new Error("Unexpected object in htmljs in toHTML: " + x);
},
toText: function (node, textMode) {
return HTML.toText(node, textMode);
}
});
////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/htmljs/html.js //
// //
////////////////////////////////////////////////////////////////////////////////////////
//
HTML.Tag = function () {};
HTML.Tag.prototype.tagName = ''; // this will be set per Tag subclass
HTML.Tag.prototype.attrs = null;
HTML.Tag.prototype.children = Object.freeze ? Object.freeze([]) : [];
HTML.Tag.prototype.htmljsType = HTML.Tag.htmljsType = ['Tag'];
// Given "p" create the function `HTML.P`.
var makeTagConstructor = function (tagName) {
// HTMLTag is the per-tagName constructor of a HTML.Tag subclass
var HTMLTag = function (/*arguments*/) {
// Work with or without `new`. If not called with `new`,
// perform instantiation by recursively calling this constructor.
// We can't pass varargs, so pass no args.
var instance = (this instanceof HTML.Tag) ? this : new HTMLTag;
var i = 0;
var attrs = arguments.length && arguments[0];
if (attrs && (typeof attrs === 'object')) {
// Treat vanilla JS object as an attributes dictionary.
if (! HTML.isConstructedObject(attrs)) {
instance.attrs = attrs;
i++;
} else if (attrs instanceof HTML.Attrs) {
var array = attrs.value;
if (array.length === 1) {
instance.attrs = array[0];
} else if (array.length > 1) {
instance.attrs = array;
}
i++;
}
}
// If no children, don't create an array at all, use the prototype's
// (frozen, empty) array. This way we don't create an empty array
// every time someone creates a tag without `new` and this constructor
// calls itself with no arguments (above).
if (i < arguments.length)
instance.children = SLICE.call(arguments, i);
return instance;
};
HTMLTag.prototype = new HTML.Tag;
HTMLTag.prototype.constructor = HTMLTag;
HTMLTag.prototype.tagName = tagName;
return HTMLTag;
};
// Not an HTMLjs node, but a wrapper to pass multiple attrs dictionaries
// to a tag (for the purpose of implementing dynamic attributes).
var Attrs = HTML.Attrs = function (/*attrs dictionaries*/) {
// Work with or without `new`. If not called with `new`,
// perform instantiation by recursively calling this constructor.
// We can't pass varargs, so pass no args.
var instance = (this instanceof Attrs) ? this : new Attrs;
instance.value = SLICE.call(arguments);
return instance;
};
////////////////////////////// KNOWN ELEMENTS
HTML.getTag = function (tagName) {
var symbolName = HTML.getSymbolName(tagName);
if (symbolName === tagName) // all-caps tagName
throw new Error("Use the lowercase or camelCase form of '" + tagName + "' here");
if (! HTML[symbolName])
HTML[symbolName] = makeTagConstructor(tagName);
return HTML[symbolName];
};
HTML.ensureTag = function (tagName) {
HTML.getTag(tagName); // don't return it
};
HTML.isTagEnsured = function (tagName) {
return HTML.isKnownElement(tagName);
};
HTML.getSymbolName = function (tagName) {
// "foo-bar" -> "FOO_BAR"
return tagName.toUpperCase().replace(/-/g, '_');
};
HTML.knownElementNames = 'a abbr acronym address applet area article aside audio b base basefont bdi bdo big blockquote body br button canvas caption center cite code col colgroup command data datagrid datalist dd del details dfn dir div dl dt em embed eventsource fieldset figcaption figure font footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins isindex kbd keygen label legend li link main map mark menu meta meter nav noframes noscript object ol optgroup option output p param pre progress q rp rt ruby s samp script section select small source span strike strong style sub summary sup table tbody td textarea tfoot th thead time title tr track tt u ul var video wbr'.split(' ');
// (we add the SVG ones below)
HTML.knownSVGElementNames = 'altGlyph altGlyphDef altGlyphItem animate animateColor animateMotion animateTransform circle clipPath color-profile cursor defs desc ellipse feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence filter font font-face font-face-format font-face-name font-face-src font-face-uri foreignObject g glyph glyphRef hkern image line linearGradient marker mask metadata missing-glyph path pattern polygon polyline radialGradient rect set stop style svg switch symbol text textPath title tref tspan use view vkern'.split(' ');
// Append SVG element names to list of known element names
HTML.knownElementNames = HTML.knownElementNames.concat(HTML.knownSVGElementNames);
HTML.voidElementNames = 'area base br col command embed hr img input keygen link meta param source track wbr'.split(' ');
// Speed up search through lists of known elements by creating internal "sets"
// of strings.
var YES = {yes:true};
var makeSet = function (array) {
var set = {};
for (var i = 0; i < array.length; i++)
set[array[i]] = YES;
return set;
};
var voidElementSet = makeSet(HTML.voidElementNames);
var knownElementSet = makeSet(HTML.knownElementNames);
var knownSVGElementSet = makeSet(HTML.knownSVGElementNames);
HTML.isKnownElement = function (tagName) {
return knownElementSet[tagName] === YES;
};
HTML.isKnownSVGElement = function (tagName) {
return knownSVGElementSet[tagName] === YES;
};
HTML.isVoidElement = function (tagName) {
return voidElementSet[tagName] === YES;
};
// Ensure tags for all known elements
for (var i = 0; i < HTML.knownElementNames.length; i++)
HTML.ensureTag(HTML.knownElementNames[i]);
var CharRef = HTML.CharRef = function (attrs) {
if (! (this instanceof CharRef))
// called without `new`
return new CharRef(attrs);
if (! (attrs && attrs.html && attrs.str))
throw new Error(
"HTML.CharRef must be constructed with ({html:..., str:...})");
this.html = attrs.html;
this.str = attrs.str;
};
CharRef.prototype.htmljsType = CharRef.htmljsType = ['CharRef'];
var Comment = HTML.Comment = function (value) {
if (! (this instanceof Comment))
// called without `new`
return new Comment(value);
if (typeof value !== 'string')
throw new Error('HTML.Comment must be constructed with a string');
this.value = value;
// Kill illegal hyphens in comment value (no way to escape them in HTML)
this.sanitizedValue = value.replace(/^-|--+|-$/g, '');
};
Comment.prototype.htmljsType = Comment.htmljsType = ['Comment'];
var Raw = HTML.Raw = function (value) {
if (! (this instanceof Raw))
// called without `new`
return new Raw(value);
if (typeof value !== 'string')
throw new Error('HTML.Raw must be constructed with a string');
this.value = value;
};
Raw.prototype.htmljsType = Raw.htmljsType = ['Raw'];
HTML.isArray = function (x) {
// could change this to use the more convoluted Object.prototype.toString
// approach that works when objects are passed between frames, but does
// it matter?
return (x instanceof Array);
};
HTML.isConstructedObject = function (x) {
// Figure out if `x` is "an instance of some class" or just a plain
// object literal. It correctly treats an object literal like
// `{ constructor: ... }` as an object literal. It won't detect
// instances of classes that lack a `constructor` property (e.g.
// if you assign to a prototype when setting up the class as in:
// `Foo = function () { ... }; Foo.prototype = { ... }`, then
// `(new Foo).constructor` is `Object`, not `Foo`).
return (x && (typeof x === 'object') &&
(x.constructor !== Object) &&
(typeof x.constructor === 'function') &&
(x instanceof x.constructor));
};
HTML.isNully = function (node) {
if (node == null)
// null or undefined
return true;
if (HTML.isArray(node)) {
// is it an empty array or an array of all nully items?
for (var i = 0; i < node.length; i++)
if (! HTML.isNully(node[i]))
return false;
return true;
}
return false;
};
HTML.isValidAttributeName = function (name) {
return /^[:_A-Za-z][:_A-Za-z0-9.\-]*/.test(name);
};
// If `attrs` is an array of attributes dictionaries, combines them
// into one. Removes attributes that are "nully."
HTML.flattenAttributes = function (attrs) {
if (! attrs)
return attrs;
var isArray = HTML.isArray(attrs);
if (isArray && attrs.length === 0)
return null;
var result = {};
for (var i = 0, N = (isArray ? attrs.length : 1); i < N; i++) {
var oneAttrs = (isArray ? attrs[i] : attrs);
if ((typeof oneAttrs !== 'object') ||
HTML.isConstructedObject(oneAttrs))
throw new Error("Expected plain JS object as attrs, found: " + oneAttrs);
for (var name in oneAttrs) {
if (! HTML.isValidAttributeName(name))
throw new Error("Illegal HTML attribute name: " + name);
var value = oneAttrs[name];
if (! HTML.isNully(value))
result[name] = value;
}
}
return result;
};
////////////////////////////// TOHTML
HTML.toHTML = function (content) {
return (new HTML.ToHTMLVisitor).visit(content);
};
// Escaping modes for outputting text when generating HTML.
HTML.TEXTMODE = {
STRING: 1,
RCDATA: 2,
ATTRIBUTE: 3
};
HTML.toText = function (content, textMode) {
if (! textMode)
throw new Error("textMode required for HTML.toText");
if (! (textMode === HTML.TEXTMODE.STRING ||
textMode === HTML.TEXTMODE.RCDATA ||
textMode === HTML.TEXTMODE.ATTRIBUTE))
throw new Error("Unknown textMode: " + textMode);
var visitor = new HTML.ToTextVisitor({textMode: textMode});;
return visitor.visit(content);
};
////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("htmljs", {
HTML: HTML
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var EJSON = Package.ejson.EJSON;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var IdMap;
var require = meteorInstall({"node_modules":{"meteor":{"id-map":{"id-map.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/id-map/id-map.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
IdMap: () => IdMap
});
const hasOwn = Object.prototype.hasOwnProperty;
class IdMap {
constructor(idStringify, idParse) {
this.clear();
this._idStringify = idStringify || JSON.stringify;
this._idParse = idParse || JSON.parse;
} // Some of these methods are designed to match methods on OrderedDict, since
// (eg) ObserveMultiplex and _CachingChangeObserver use them interchangeably.
// (Conceivably, this should be replaced with "UnorderedDict" with a specific
// set of methods that overlap between the two.)
get(id) {
var key = this._idStringify(id);
return this._map[key];
}
set(id, value) {
var key = this._idStringify(id);
this._map[key] = value;
}
remove(id) {
var key = this._idStringify(id);
delete this._map[key];
}
has(id) {
var key = this._idStringify(id);
return hasOwn.call(this._map, key);
}
empty() {
for (let key in this._map) {
return false;
}
return true;
}
clear() {
this._map = Object.create(null);
} // Iterates over the items in the map. Return `false` to break the loop.
forEach(iterator) {
// don't use _.each, because we can't break out of it.
var keys = Object.keys(this._map);
for (var i = 0; i < keys.length; i++) {
var breakIfFalse = iterator.call(null, this._map[keys[i]], this._idParse(keys[i]));
if (breakIfFalse === false) {
return;
}
}
}
size() {
return Object.keys(this._map).length;
}
setDefault(id, def) {
var key = this._idStringify(id);
if (hasOwn.call(this._map, key)) {
return this._map[key];
}
this._map[key] = def;
return def;
} // Assumes that values are EJSON-cloneable, and that we don't need to clone
// IDs (ie, that nobody is going to mutate an ObjectId).
clone() {
var clone = new IdMap(this._idStringify, this._idParse);
this.forEach(function (value, id) {
clone.set(id, EJSON.clone(value));
});
return clone;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/id-map/id-map.js");
/* Exports */
Package._define("id-map", exports, {
IdMap: IdMap
});
})();
//# sourceURL=meteor://💻app/packages/id-map.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvaWQtbWFwL2lkLW1hcC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnQiLCJJZE1hcCIsImhhc093biIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY29uc3RydWN0b3IiLCJpZFN0cmluZ2lmeSIsImlkUGFyc2UiLCJjbGVhciIsIl9pZFN0cmluZ2lmeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJfaWRQYXJzZSIsInBhcnNlIiwiZ2V0IiwiaWQiLCJrZXkiLCJfbWFwIiwic2V0IiwidmFsdWUiLCJyZW1vdmUiLCJoYXMiLCJjYWxsIiwiZW1wdHkiLCJjcmVhdGUiLCJmb3JFYWNoIiwiaXRlcmF0b3IiLCJrZXlzIiwiaSIsImxlbmd0aCIsImJyZWFrSWZGYWxzZSIsInNpemUiLCJzZXREZWZhdWx0IiwiZGVmIiwiY2xvbmUiLCJFSlNPTiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ0MsT0FBSyxFQUFDLE1BQUlBO0FBQVgsQ0FBZDtBQUFBLE1BQU1DLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxjQUFoQzs7QUFFTyxNQUFNSixLQUFOLENBQVk7QUFDakJLLGFBQVcsQ0FBQ0MsV0FBRCxFQUFjQyxPQUFkLEVBQXVCO0FBQ2hDLFNBQUtDLEtBQUw7QUFDQSxTQUFLQyxZQUFMLEdBQW9CSCxXQUFXLElBQUlJLElBQUksQ0FBQ0MsU0FBeEM7QUFDQSxTQUFLQyxRQUFMLEdBQWdCTCxPQUFPLElBQUlHLElBQUksQ0FBQ0csS0FBaEM7QUFDRCxHQUxnQixDQU9uQjtBQUNBO0FBQ0E7QUFDQTs7O0FBRUVDLEtBQUcsQ0FBQ0MsRUFBRCxFQUFLO0FBQ04sUUFBSUMsR0FBRyxHQUFHLEtBQUtQLFlBQUwsQ0FBa0JNLEVBQWxCLENBQVY7O0FBQ0EsV0FBTyxLQUFLRSxJQUFMLENBQVVELEdBQVYsQ0FBUDtBQUNEOztBQUVERSxLQUFHLENBQUNILEVBQUQsRUFBS0ksS0FBTCxFQUFZO0FBQ2IsUUFBSUgsR0FBRyxHQUFHLEtBQUtQLFlBQUwsQ0FBa0JNLEVBQWxCLENBQVY7O0FBQ0EsU0FBS0UsSUFBTCxDQUFVRCxHQUFWLElBQWlCRyxLQUFqQjtBQUNEOztBQUVEQyxRQUFNLENBQUNMLEVBQUQsRUFBSztBQUNULFFBQUlDLEdBQUcsR0FBRyxLQUFLUCxZQUFMLENBQWtCTSxFQUFsQixDQUFWOztBQUNBLFdBQU8sS0FBS0UsSUFBTCxDQUFVRCxHQUFWLENBQVA7QUFDRDs7QUFFREssS0FBRyxDQUFDTixFQUFELEVBQUs7QUFDTixRQUFJQyxHQUFHLEdBQUcsS0FBS1AsWUFBTCxDQUFrQk0sRUFBbEIsQ0FBVjs7QUFDQSxXQUFPZCxNQUFNLENBQUNxQixJQUFQLENBQVksS0FBS0wsSUFBakIsRUFBdUJELEdBQXZCLENBQVA7QUFDRDs7QUFFRE8sT0FBSyxHQUFHO0FBQ04sU0FBSyxJQUFJUCxHQUFULElBQWdCLEtBQUtDLElBQXJCLEVBQTJCO0FBQ3pCLGFBQU8sS0FBUDtBQUNEOztBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVEVCxPQUFLLEdBQUc7QUFDTixTQUFLUyxJQUFMLEdBQVlmLE1BQU0sQ0FBQ3NCLE1BQVAsQ0FBYyxJQUFkLENBQVo7QUFDRCxHQXpDZ0IsQ0EyQ2pCOzs7QUFDQUMsU0FBTyxDQUFDQyxRQUFELEVBQVc7QUFDaEI7QUFDQSxRQUFJQyxJQUFJLEdBQUd6QixNQUFNLENBQUN5QixJQUFQLENBQVksS0FBS1YsSUFBakIsQ0FBWDs7QUFDQSxTQUFLLElBQUlXLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELElBQUksQ0FBQ0UsTUFBekIsRUFBaUNELENBQUMsRUFBbEMsRUFBc0M7QUFDcEMsVUFBSUUsWUFBWSxHQUFHSixRQUFRLENBQUNKLElBQVQsQ0FDakIsSUFEaUIsRUFFakIsS0FBS0wsSUFBTCxDQUFVVSxJQUFJLENBQUNDLENBQUQsQ0FBZCxDQUZpQixFQUdqQixLQUFLaEIsUUFBTCxDQUFjZSxJQUFJLENBQUNDLENBQUQsQ0FBbEIsQ0FIaUIsQ0FBbkI7O0FBS0EsVUFBSUUsWUFBWSxLQUFLLEtBQXJCLEVBQTRCO0FBQzFCO0FBQ0Q7QUFDRjtBQUNGOztBQUVEQyxNQUFJLEdBQUc7QUFDTCxXQUFPN0IsTUFBTSxDQUFDeUIsSUFBUCxDQUFZLEtBQUtWLElBQWpCLEVBQXVCWSxNQUE5QjtBQUNEOztBQUVERyxZQUFVLENBQUNqQixFQUFELEVBQUtrQixHQUFMLEVBQVU7QUFDbEIsUUFBSWpCLEdBQUcsR0FBRyxLQUFLUCxZQUFMLENBQWtCTSxFQUFsQixDQUFWOztBQUNBLFFBQUlkLE1BQU0sQ0FBQ3FCLElBQVAsQ0FBWSxLQUFLTCxJQUFqQixFQUF1QkQsR0FBdkIsQ0FBSixFQUFpQztBQUMvQixhQUFPLEtBQUtDLElBQUwsQ0FBVUQsR0FBVixDQUFQO0FBQ0Q7O0FBQ0QsU0FBS0MsSUFBTCxDQUFVRCxHQUFWLElBQWlCaUIsR0FBakI7QUFDQSxXQUFPQSxHQUFQO0FBQ0QsR0F0RWdCLENBd0VqQjtBQUNBOzs7QUFDQUMsT0FBSyxHQUFHO0FBQ04sUUFBSUEsS0FBSyxHQUFHLElBQUlsQyxLQUFKLENBQVUsS0FBS1MsWUFBZixFQUE2QixLQUFLRyxRQUFsQyxDQUFaO0FBQ0EsU0FBS2EsT0FBTCxDQUFhLFVBQVVOLEtBQVYsRUFBaUJKLEVBQWpCLEVBQXFCO0FBQ2hDbUIsV0FBSyxDQUFDaEIsR0FBTixDQUFVSCxFQUFWLEVBQWNvQixLQUFLLENBQUNELEtBQU4sQ0FBWWYsS0FBWixDQUFkO0FBQ0QsS0FGRDtBQUdBLFdBQU9lLEtBQVA7QUFDRDs7QUFoRmdCLEMiLCJmaWxlIjoiL3BhY2thZ2VzL2lkLW1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmV4cG9ydCBjbGFzcyBJZE1hcCB7XG4gIGNvbnN0cnVjdG9yKGlkU3RyaW5naWZ5LCBpZFBhcnNlKSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMuX2lkU3RyaW5naWZ5ID0gaWRTdHJpbmdpZnkgfHwgSlNPTi5zdHJpbmdpZnk7XG4gICAgdGhpcy5faWRQYXJzZSA9IGlkUGFyc2UgfHwgSlNPTi5wYXJzZTtcbiAgfVxuXG4vLyBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGRlc2lnbmVkIHRvIG1hdGNoIG1ldGhvZHMgb24gT3JkZXJlZERpY3QsIHNpbmNlXG4vLyAoZWcpIE9ic2VydmVNdWx0aXBsZXggYW5kIF9DYWNoaW5nQ2hhbmdlT2JzZXJ2ZXIgdXNlIHRoZW0gaW50ZXJjaGFuZ2VhYmx5LlxuLy8gKENvbmNlaXZhYmx5LCB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIFwiVW5vcmRlcmVkRGljdFwiIHdpdGggYSBzcGVjaWZpY1xuLy8gc2V0IG9mIG1ldGhvZHMgdGhhdCBvdmVybGFwIGJldHdlZW4gdGhlIHR3by4pXG5cbiAgZ2V0KGlkKSB7XG4gICAgdmFyIGtleSA9IHRoaXMuX2lkU3RyaW5naWZ5KGlkKTtcbiAgICByZXR1cm4gdGhpcy5fbWFwW2tleV07XG4gIH1cblxuICBzZXQoaWQsIHZhbHVlKSB7XG4gICAgdmFyIGtleSA9IHRoaXMuX2lkU3RyaW5naWZ5KGlkKTtcbiAgICB0aGlzLl9tYXBba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmVtb3ZlKGlkKSB7XG4gICAgdmFyIGtleSA9IHRoaXMuX2lkU3RyaW5naWZ5KGlkKTtcbiAgICBkZWxldGUgdGhpcy5fbWFwW2tleV07XG4gIH1cblxuICBoYXMoaWQpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5faWRTdHJpbmdpZnkoaWQpO1xuICAgIHJldHVybiBoYXNPd24uY2FsbCh0aGlzLl9tYXAsIGtleSk7XG4gIH1cblxuICBlbXB0eSgpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5fbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIEl0ZXJhdGVzIG92ZXIgdGhlIGl0ZW1zIGluIHRoZSBtYXAuIFJldHVybiBgZmFsc2VgIHRvIGJyZWFrIHRoZSBsb29wLlxuICBmb3JFYWNoKGl0ZXJhdG9yKSB7XG4gICAgLy8gZG9uJ3QgdXNlIF8uZWFjaCwgYmVjYXVzZSB3ZSBjYW4ndCBicmVhayBvdXQgb2YgaXQuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9tYXApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGJyZWFrSWZGYWxzZSA9IGl0ZXJhdG9yLmNhbGwoXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuX21hcFtrZXlzW2ldXSxcbiAgICAgICAgdGhpcy5faWRQYXJzZShrZXlzW2ldKVxuICAgICAgKTtcbiAgICAgIGlmIChicmVha0lmRmFsc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aDtcbiAgfVxuXG4gIHNldERlZmF1bHQoaWQsIGRlZikge1xuICAgIHZhciBrZXkgPSB0aGlzLl9pZFN0cmluZ2lmeShpZCk7XG4gICAgaWYgKGhhc093bi5jYWxsKHRoaXMuX21hcCwga2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcFtrZXldO1xuICAgIH1cbiAgICB0aGlzLl9tYXBba2V5XSA9IGRlZjtcbiAgICByZXR1cm4gZGVmO1xuICB9XG5cbiAgLy8gQXNzdW1lcyB0aGF0IHZhbHVlcyBhcmUgRUpTT04tY2xvbmVhYmxlLCBhbmQgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNsb25lXG4gIC8vIElEcyAoaWUsIHRoYXQgbm9ib2R5IGlzIGdvaW5nIHRvIG11dGF0ZSBhbiBPYmplY3RJZCkuXG4gIGNsb25lKCkge1xuICAgIHZhciBjbG9uZSA9IG5ldyBJZE1hcCh0aGlzLl9pZFN0cmluZ2lmeSwgdGhpcy5faWRQYXJzZSk7XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaWQpIHtcbiAgICAgIGNsb25lLnNldChpZCwgRUpTT04uY2xvbmUodmFsdWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbn1cbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/id-map/id-map.js"],"names":["module","export","IdMap","hasOwn","Object","prototype","hasOwnProperty","constructor","idStringify","idParse","clear","_idStringify","JSON","stringify","_idParse","parse","get","id","key","_map","set","value","remove","has","call","empty","create","forEach","iterator","keys","i","length","breakIfFalse","size","setDefault","def","clone","EJSON"],"mappings":"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","file":"/packages/id-map.js","sourcesContent":["const hasOwn = Object.prototype.hasOwnProperty;\n\nexport class IdMap {\n constructor(idStringify, idParse) {\n this.clear();\n this._idStringify = idStringify || JSON.stringify;\n this._idParse = idParse || JSON.parse;\n }\n\n// Some of these methods are designed to match methods on OrderedDict, since\n// (eg) ObserveMultiplex and _CachingChangeObserver use them interchangeably.\n// (Conceivably, this should be replaced with \"UnorderedDict\" with a specific\n// set of methods that overlap between the two.)\n\n get(id) {\n var key = this._idStringify(id);\n return this._map[key];\n }\n\n set(id, value) {\n var key = this._idStringify(id);\n this._map[key] = value;\n }\n\n remove(id) {\n var key = this._idStringify(id);\n delete this._map[key];\n }\n\n has(id) {\n var key = this._idStringify(id);\n return hasOwn.call(this._map, key);\n }\n\n empty() {\n for (let key in this._map) {\n return false;\n }\n return true;\n }\n\n clear() {\n this._map = Object.create(null);\n }\n\n // Iterates over the items in the map. Return `false` to break the loop.\n forEach(iterator) {\n // don't use _.each, because we can't break out of it.\n var keys = Object.keys(this._map);\n for (var i = 0; i < keys.length; i++) {\n var breakIfFalse = iterator.call(\n null,\n this._map[keys[i]],\n this._idParse(keys[i])\n );\n if (breakIfFalse === false) {\n return;\n }\n }\n }\n\n size() {\n return Object.keys(this._map).length;\n }\n\n setDefault(id, def) {\n var key = this._idStringify(id);\n if (hasOwn.call(this._map, key)) {\n return this._map[key];\n }\n this._map[key] = def;\n return def;\n }\n\n // Assumes that values are EJSON-cloneable, and that we don't need to clone\n // IDs (ie, that nobody is going to mutate an ObjectId).\n clone() {\n var clone = new IdMap(this._idStringify, this._idParse);\n this.forEach(function (value, id) {\n clone.set(id, EJSON.clone(value));\n });\n return clone;\n }\n}\n"]}
\ No newline at end of file
(function () {
/* Exports */
Package._define("insecure");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var Promise = Package.promise.Promise;
var require = meteorInstall({"node_modules":{"meteor":{"inter-process-messaging":{"inter-process-messaging.js":function(require,exports){
///////////////////////////////////////////////////////////////////////////////
// //
// packages/inter-process-messaging/inter-process-messaging.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
const uuid = require("uuid");
const { encode, decode } = require("arson");
const {
MESSAGE,
RESPONSE,
PING,
PONG,
} = require("./types.js");
const hasOwn = Object.prototype.hasOwnProperty;
Object.assign(exports, {
// Adds onMessage(topic, callback) and sendMessage(topic, payload)
// methods to otherProcess. These methods are an improvement over the
// native Node interfaces otherProcess.on("message", callback) and
// otherProcess.send(message) because they take a topic string as their
// first argument, which allows restricting the delivery of messages by
// topic; and they permit the receiving process to respond by returning
// a value (possibly a Promise) from the onMessage callback.
enable(otherProcess) {
if (typeof otherProcess.onMessage === "function" &&
typeof otherProcess.sendMessage === "function") {
// Calling enable more than once should be safe/idempotent.
return otherProcess;
}
const callbacksByTopic = new Map;
// To receive messages *from* otherProcess, this process should call
// otherMessage.onMessage(topic, callback). The callback will receive
// the provided payload as its first (and only) parameter. Callbacks
// may return a Promise, in which case the response will be delayed
// until all results returned by callbacks registered for this topic
// have been resolved.
otherProcess.onMessage = function onMessage(topic, callback) {
if (! callbacksByTopic.has(topic)) {
callbacksByTopic.set(topic, new Set);
}
callbacksByTopic.get(topic).add(callback);
};
const readyResolvers = new Map;
const pendingMessages = new Map;
const promisesByTopic = new Map;
const handlersByType = Object.create(null);
handlersByType[PING] = function ({ id }) {
otherProcess.send({ type: PONG, id });
};
handlersByType[PONG] = function ({ id }) {
const resolve = readyResolvers.get(id);
if (typeof resolve === "function") {
readyResolvers.delete(id);
// This resolves the child.readyForMessages Promise created above.
resolve();
}
};
handlersByType[MESSAGE] = function ({
responseId,
topic,
encodedPayload,
}) {
const newPromise = (
promisesByTopic.get(topic) || Promise.resolve()
).then(() => {
const results = [];
const callbacks = callbacksByTopic.get(topic);
if (callbacks && callbacks.size > 0) {
// Re-decode the payload for each callback to prevent one
// callback from modifying the payload seen by later callbacks.
callbacks.forEach(cb => results.push(cb(decode(encodedPayload))));
return Promise.all(results);
}
// Since there were no callbacks, this will be an empty array.
return results;
}).then(results => {
if (responseId) {
otherProcess.send({
type: RESPONSE,
responseId,
encodedResults: encode(results),
});
}
}, error => {
const serializable = {};
// Use Reflect.ownKeys to catch non-enumerable properties, since
// every Error property (including "message") seems to be
// non-enumerable by default.
Reflect.ownKeys(error).forEach(key => {
serializable[key] = error[key];
});
otherProcess.send({
type: RESPONSE,
responseId,
encodedError: encode(serializable),
});
});
// Immediately update the latest promise for this topic to the
// newPromise that we just created, before any listeners run. This
// strategy has the effect of chaining promises by topic and thus
// keeping messages and their responses strictly ordered, one after
// the last. Because we always register a non-throwing error handler
// at the end of newPromise, this queue of promises should never get
// stalled by an earlier rejection.
promisesByTopic.set(topic, newPromise);
};
handlersByType[RESPONSE] = function (message) {
const entry = pendingMessages.get(message.responseId);
if (entry) {
if (hasOwn.call(message, "encodedError")) {
entry.reject(decode(message.encodedError));
} else {
entry.resolve(decode(message.encodedResults));
}
}
};
otherProcess.on("message", message => {
const handler = handlersByType[message.type];
if (typeof handler === "function") {
handler(message);
}
});
// Call otherProcess.sendMessage(topic, payload) instead of the native
// otherProcess.send(message) to deliver a message based on a specific
// topic string, and to receive a reliable response when the other
// process has finished handling that message.
otherProcess.sendMessage = function sendMessage(topic, payload) {
otherProcess.readyForMessages =
otherProcess.readyForMessages || makeReadyPromise();
return otherProcess.readyForMessages.then(() => {
const responseId = uuid();
return new Promise((resolve, reject) => {
pendingMessages.set(responseId, { resolve, reject });
otherProcess.send({
type: MESSAGE,
responseId,
topic,
encodedPayload: encode(payload),
}, error => {
if (error) {
reject(error);
}
});
}).then(response => {
pendingMessages.delete(responseId);
return response;
}, error => {
pendingMessages.delete(responseId);
throw error;
});
});
};
function makeReadyPromise() {
return new Promise((resolve, reject) => {
const pingMessage = { type: PING, id: uuid() };
const backoff_factor = 1.1;
let delay_ms = 50;
readyResolvers.set(pingMessage.id, resolve);
function poll() {
if (readyResolvers.has(pingMessage.id)) {
otherProcess.send(pingMessage, error => {
if (error) {
reject(error);
} else {
setTimeout(poll, delay_ms);
delay_ms *= backoff_factor;
}
});
}
}
poll();
});
}
otherProcess.on("exit", (code, signal) => {
const error = new Error("process exited");
Object.assign(error, { code, signal });
// Terminate any pending messages.
pendingMessages.forEach(entry => entry.reject(error));
// Prevent future messages from being sent.
otherProcess.readyForMessages = Promise.reject(error);
// Silence UnhandledPromiseRejectionWarning
otherProcess.readyForMessages.catch(() => {});
});
return otherProcess;
},
// Call this onMessage function to listen for messages *from the parent
// process* (if the parent spawned this process with an IPC channel).
onMessage(topic, callback) {
// Do nothing by default unless exports.enable(process) is called
// below, because this process will never receive any messages unless
// we have an IPC channel open with the parent process, which is true
// only if process.send is a function.
}
});
if (typeof process.send === "function") {
// The process.send method is defined only when the current process was
// spawned with an IPC channel by the parent process. In other words,
// given that process.send can be used to send messages to the parent
// process, it makes sense to enable process.sendMessage(topic, payload)
// in the child-to-parent direction, too.
exports.enable(process);
// Override the default no-op exports.onMessage defined above.
exports.onMessage = process.onMessage;
}
///////////////////////////////////////////////////////////////////////////////
},"types.js":function(require,exports){
///////////////////////////////////////////////////////////////////////////////
// //
// packages/inter-process-messaging/types.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
exports.MESSAGE = "METEOR_IPC_MESSAGE";
exports.RESPONSE = "METEOR_IPC_RESPONSE";
exports.PING = "METEOR_IPC_PING";
exports.PONG = "METEOR_IPC_PONG";
///////////////////////////////////////////////////////////////////////////////
},"node_modules":{"uuid":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/inter-process-messaging/node_modules/uuid/package.jso //
// //
///////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "uuid",
"version": "3.3.2"
};
///////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/inter-process-messaging/node_modules/uuid/index.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////
}},"arson":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/inter-process-messaging/node_modules/arson/package.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "arson",
"version": "0.2.6",
"main": "index.js"
};
///////////////////////////////////////////////////////////////////////////////
},"index.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/inter-process-messaging/node_modules/arson/index.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////
}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/inter-process-messaging/inter-process-messaging.js");
/* Exports */
Package._define("inter-process-messaging", exports);
})();
(function () {
/* Exports */
Package._define("jquery");
})();
(function () {
/* Package-scope variables */
var LaunchScreen;
/* Exports */
Package._define("launch-screen", {
LaunchScreen: LaunchScreen
});
})();
(function () {
/* Imports */
var DDP = Package['ddp-client'].DDP;
var DDPServer = Package['ddp-server'].DDPServer;
/* Package-scope variables */
var LivedataTest;
/* Exports */
Package._define("livedata", {
DDP: DDP,
DDPServer: DDPServer,
LivedataTest: LivedataTest
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var EJSON = Package.ejson.EJSON;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Log;
var require = meteorInstall({"node_modules":{"meteor":{"logging":{"logging.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/logging/logging.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
module.export({
Log: () => Log
});
let Meteor;
module.link("meteor/meteor", {
Meteor(v) {
Meteor = v;
}
}, 0);
const hasOwn = Object.prototype.hasOwnProperty;
function Log(...args) {
Log.info(...args);
} /// FOR TESTING
let intercept = 0;
let interceptedLines = [];
let suppress = 0; // Intercept the next 'count' calls to a Log function. The actual
// lines printed to the console can be cleared and read by calling
// Log._intercepted().
Log._intercept = count => {
intercept += count;
}; // Suppress the next 'count' calls to a Log function. Use this to stop
// tests from spamming the console, especially with red errors that
// might look like a failing test.
Log._suppress = count => {
suppress += count;
}; // Returns intercepted lines and resets the intercept counter.
Log._intercepted = () => {
const lines = interceptedLines;
interceptedLines = [];
intercept = 0;
return lines;
}; // Either 'json' or 'colored-text'.
//
// When this is set to 'json', print JSON documents that are parsed by another
// process ('satellite' or 'meteor run'). This other process should call
// 'Log.format' for nice output.
//
// When this is set to 'colored-text', call 'Log.format' before printing.
// This should be used for logging from within satellite, since there is no
// other process that will be reading its standard output.
Log.outputFormat = 'json';
const LEVEL_COLORS = {
debug: 'green',
// leave info as the default color
warn: 'magenta',
error: 'red'
};
const META_COLOR = 'blue'; // Default colors cause readability problems on Windows Powershell,
// switch to bright variants. While still capable of millions of
// operations per second, the benchmark showed a 25%+ increase in
// ops per second (on Node 8) by caching "process.platform".
const isWin32 = typeof process === 'object' && process.platform === 'win32';
const platformColor = color => {
if (isWin32 && typeof color === 'string' && !color.endsWith('Bright')) {
return `${color}Bright`;
}
return color;
}; // XXX package
const RESTRICTED_KEYS = ['time', 'timeInexact', 'level', 'file', 'line', 'program', 'originApp', 'satellite', 'stderr'];
const FORMATTED_KEYS = [...RESTRICTED_KEYS, 'app', 'message'];
const logInBrowser = obj => {
const str = Log.format(obj); // XXX Some levels should be probably be sent to the server
const level = obj.level;
if (typeof console !== 'undefined' && console[level]) {
console[level](str);
} else {
// XXX Uses of Meteor._debug should probably be replaced by Log.debug or
// Log.info, and we should have another name for "do your best to
// call call console.log".
Meteor._debug(str);
}
}; // @returns {Object: { line: Number, file: String }}
Log._getCallerDetails = () => {
const getStack = () => {
// We do NOT use Error.prepareStackTrace here (a V8 extension that gets us a
// pre-parsed stack) since it's impossible to compose it with the use of
// Error.prepareStackTrace used on the server for source maps.
const err = new Error();
const stack = err.stack;
return stack;
};
const stack = getStack();
if (!stack) {
return {};
} // looking for the first line outside the logging package (or an
// eval if we find that first)
let line;
const lines = stack.split('\n').slice(1);
for (line of lines) {
if (line.match(/^\s*at eval \(eval/)) {
return {
file: "eval"
};
}
if (!line.match(/packages\/(?:local-test[:_])?logging(?:\/|\.js)/)) {
break;
}
}
const details = {}; // The format for FF is 'functionName@filePath:lineNumber'
// The format for V8 is 'functionName (packages/logging/logging.js:81)' or
// 'packages/logging/logging.js:81'
const match = /(?:[@(]| at )([^(]+?):([0-9:]+)(?:\)|$)/.exec(line);
if (!match) {
return details;
} // in case the matched block here is line:column
details.line = match[2].split(':')[0]; // Possible format: https://foo.bar.com/scripts/file.js?random=foobar
// XXX: if you can write the following in better way, please do it
// XXX: what about evals?
details.file = match[1].split('/').slice(-1)[0].split('?')[0];
return details;
};
['debug', 'info', 'warn', 'error'].forEach(level => {
// @param arg {String|Object}
Log[level] = arg => {
if (suppress) {
suppress--;
return;
}
let intercepted = false;
if (intercept) {
intercept--;
intercepted = true;
}
let obj = arg === Object(arg) && !(arg instanceof RegExp) && !(arg instanceof Date) ? arg : {
message: new String(arg).toString()
};
RESTRICTED_KEYS.forEach(key => {
if (obj[key]) {
throw new Error(`Can't set '${key}' in log message`);
}
});
if (hasOwn.call(obj, 'message') && typeof obj.message !== 'string') {
throw new Error("The 'message' field in log objects must be a string");
}
if (!obj.omitCallerDetails) {
obj = (0, _objectSpread2.default)({}, Log._getCallerDetails(), obj);
}
obj.time = new Date();
obj.level = level; // XXX allow you to enable 'debug', probably per-package
if (level === 'debug') {
return;
}
if (intercepted) {
interceptedLines.push(EJSON.stringify(obj));
} else if (Meteor.isServer) {
if (Log.outputFormat === 'colored-text') {
console.log(Log.format(obj, {
color: true
}));
} else if (Log.outputFormat === 'json') {
console.log(EJSON.stringify(obj));
} else {
throw new Error(`Unknown logging output format: ${Log.outputFormat}`);
}
} else {
logInBrowser(obj);
}
};
}); // tries to parse line as EJSON. returns object if parse is successful, or null if not
Log.parse = line => {
let obj = null;
if (line && line.startsWith('{')) {
// might be json generated from calling 'Log'
try {
obj = EJSON.parse(line);
} catch (e) {}
} // XXX should probably check fields other than 'time'
if (obj && obj.time && obj.time instanceof Date) {
return obj;
} else {
return null;
}
}; // formats a log object into colored human and machine-readable text
Log.format = (obj, options = {}) => {
obj = (0, _objectSpread2.default)({}, obj); // don't mutate the argument
let {
time,
timeInexact,
level = 'info',
file,
line: lineNumber,
app: appName = '',
originApp,
message = '',
program = '',
satellite = '',
stderr = ''
} = obj;
if (!(time instanceof Date)) {
throw new Error("'time' must be a Date object");
}
FORMATTED_KEYS.forEach(key => {
delete obj[key];
});
if (Object.keys(obj).length > 0) {
if (message) {
message += ' ';
}
message += EJSON.stringify(obj);
}
const pad2 = n => n.toString().padStart(2, '0');
const pad3 = n => n.toString().padStart(3, '0');
const dateStamp = time.getFullYear().toString() + pad2(time.getMonth() + 1
/*0-based*/
) + pad2(time.getDate());
const timeStamp = pad2(time.getHours()) + ':' + pad2(time.getMinutes()) + ':' + pad2(time.getSeconds()) + '.' + pad3(time.getMilliseconds()); // eg in San Francisco in June this will be '(-7)'
const utcOffsetStr = `(${-(new Date().getTimezoneOffset() / 60)})`;
let appInfo = '';
if (appName) {
appInfo += appName;
}
if (originApp && originApp !== appName) {
appInfo += ` via ${originApp}`;
}
if (appInfo) {
appInfo = `[${appInfo}] `;
}
const sourceInfoParts = [];
if (program) {
sourceInfoParts.push(program);
}
if (file) {
sourceInfoParts.push(file);
}
if (lineNumber) {
sourceInfoParts.push(lineNumber);
}
let sourceInfo = !sourceInfoParts.length ? '' : `(${sourceInfoParts.join(':')}) `;
if (satellite) sourceInfo += `[${satellite}]`;
const stderrIndicator = stderr ? '(STDERR) ' : '';
const metaPrefix = [level.charAt(0).toUpperCase(), dateStamp, '-', timeStamp, utcOffsetStr, timeInexact ? '? ' : ' ', appInfo, sourceInfo, stderrIndicator].join('');
const prettify = function (line, color) {
return options.color && Meteor.isServer && color ? require('cli-color')[color](line) : line;
};
return prettify(metaPrefix, platformColor(options.metaColor || META_COLOR)) + prettify(message, platformColor(LEVEL_COLORS[level]));
}; // Turn a line of text into a loggable object.
// @param line {String}
// @param override {Object}
Log.objFromText = (line, override) => {
return (0, _objectSpread2.default)({
message: line,
level: 'info',
time: new Date(),
timeInexact: true
}, override);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"cli-color":{"package.json":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/logging/node_modules/cli-color/package.json //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "cli-color",
"version": "0.2.3",
"main": "lib"
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"lib":{"index.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/logging/node_modules/cli-color/lib/index.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/logging/logging.js");
/* Exports */
Package._define("logging", exports, {
Log: Log
});
})();
//# sourceURL=meteor://💻app/packages/logging.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvbG9nZ2luZy9sb2dnaW5nLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydCIsIkxvZyIsIk1ldGVvciIsImxpbmsiLCJ2IiwiaGFzT3duIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJhcmdzIiwiaW5mbyIsImludGVyY2VwdCIsImludGVyY2VwdGVkTGluZXMiLCJzdXBwcmVzcyIsIl9pbnRlcmNlcHQiLCJjb3VudCIsIl9zdXBwcmVzcyIsIl9pbnRlcmNlcHRlZCIsImxpbmVzIiwib3V0cHV0Rm9ybWF0IiwiTEVWRUxfQ09MT1JTIiwiZGVidWciLCJ3YXJuIiwiZXJyb3IiLCJNRVRBX0NPTE9SIiwiaXNXaW4zMiIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInBsYXRmb3JtQ29sb3IiLCJjb2xvciIsImVuZHNXaXRoIiwiUkVTVFJJQ1RFRF9LRVlTIiwiRk9STUFUVEVEX0tFWVMiLCJsb2dJbkJyb3dzZXIiLCJvYmoiLCJzdHIiLCJmb3JtYXQiLCJsZXZlbCIsImNvbnNvbGUiLCJfZGVidWciLCJfZ2V0Q2FsbGVyRGV0YWlscyIsImdldFN0YWNrIiwiZXJyIiwiRXJyb3IiLCJzdGFjayIsImxpbmUiLCJzcGxpdCIsInNsaWNlIiwibWF0Y2giLCJmaWxlIiwiZGV0YWlscyIsImV4ZWMiLCJmb3JFYWNoIiwiYXJnIiwiaW50ZXJjZXB0ZWQiLCJSZWdFeHAiLCJEYXRlIiwibWVzc2FnZSIsIlN0cmluZyIsInRvU3RyaW5nIiwia2V5IiwiY2FsbCIsIm9taXRDYWxsZXJEZXRhaWxzIiwidGltZSIsInB1c2giLCJFSlNPTiIsInN0cmluZ2lmeSIsImlzU2VydmVyIiwibG9nIiwicGFyc2UiLCJzdGFydHNXaXRoIiwiZSIsIm9wdGlvbnMiLCJ0aW1lSW5leGFjdCIsImxpbmVOdW1iZXIiLCJhcHAiLCJhcHBOYW1lIiwib3JpZ2luQXBwIiwicHJvZ3JhbSIsInNhdGVsbGl0ZSIsInN0ZGVyciIsImtleXMiLCJsZW5ndGgiLCJwYWQyIiwibiIsInBhZFN0YXJ0IiwicGFkMyIsImRhdGVTdGFtcCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwidGltZVN0YW1wIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsInV0Y09mZnNldFN0ciIsImdldFRpbWV6b25lT2Zmc2V0IiwiYXBwSW5mbyIsInNvdXJjZUluZm9QYXJ0cyIsInNvdXJjZUluZm8iLCJqb2luIiwic3RkZXJySW5kaWNhdG9yIiwibWV0YVByZWZpeCIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwicHJldHRpZnkiLCJyZXF1aXJlIiwibWV0YUNvbG9yIiwib2JqRnJvbVRleHQiLCJvdmVycmlkZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUNDLEtBQUcsRUFBQyxNQUFJQTtBQUFULENBQWQ7QUFBNkIsSUFBSUMsTUFBSjtBQUFXSCxNQUFNLENBQUNJLElBQVAsQ0FBWSxlQUFaLEVBQTRCO0FBQUNELFFBQU0sQ0FBQ0UsQ0FBRCxFQUFHO0FBQUNGLFVBQU0sR0FBQ0UsQ0FBUDtBQUFTOztBQUFwQixDQUE1QixFQUFrRCxDQUFsRDtBQUV4QyxNQUFNQyxNQUFNLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBaEM7O0FBRUEsU0FBU1AsR0FBVCxDQUFhLEdBQUdRLElBQWhCLEVBQXNCO0FBQ3BCUixLQUFHLENBQUNTLElBQUosQ0FBUyxHQUFHRCxJQUFaO0FBQ0QsQyxDQUVEOzs7QUFDQSxJQUFJRSxTQUFTLEdBQUcsQ0FBaEI7QUFDQSxJQUFJQyxnQkFBZ0IsR0FBRyxFQUF2QjtBQUNBLElBQUlDLFFBQVEsR0FBRyxDQUFmLEMsQ0FFQTtBQUNBO0FBQ0E7O0FBQ0FaLEdBQUcsQ0FBQ2EsVUFBSixHQUFrQkMsS0FBRCxJQUFXO0FBQzFCSixXQUFTLElBQUlJLEtBQWI7QUFD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LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWV0ZW9yIH0gZnJvbSAnbWV0ZW9yL21ldGVvcic7XG5cbmNvbnN0IGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIExvZyguLi5hcmdzKSB7XG4gIExvZy5pbmZvKC4uLmFyZ3MpO1xufVxuXG4vLy8gRk9SIFRFU1RJTkdcbmxldCBpbnRlcmNlcHQgPSAwO1xubGV0IGludGVyY2VwdGVkTGluZXMgPSBbXTtcbmxldCBzdXBwcmVzcyA9IDA7XG5cbi8vIEludGVyY2VwdCB0aGUgbmV4dCAnY291bnQnIGNhbGxzIHRvIGEgTG9nIGZ1bmN0aW9uLiBUaGUgYWN0dWFsXG4vLyBsaW5lcyBwcmludGVkIHRvIHRoZSBjb25zb2xlIGNhbiBiZSBjbGVhcmVkIGFuZCByZWFkIGJ5IGNhbGxpbmdcbi8vIExvZy5faW50ZXJjZXB0ZWQoKS5cbkxvZy5faW50ZXJjZXB0ID0gKGNvdW50KSA9PiB7XG4gIGludGVyY2VwdCArPSBjb3VudDtcbn07XG5cbi8vIFN1cHByZXNzIHRoZSBuZXh0ICdjb3VudCcgY2FsbHMgdG8gYSBMb2cgZnVuY3Rpb24uIFVzZSB0aGlzIHRvIHN0b3Bcbi8vIHRlc3RzIGZyb20gc3BhbW1pbmcgdGhlIGNvbnNvbGUsIGVzcGVjaWFsbHkgd2l0aCByZWQgZXJyb3JzIHRoYXRcbi8vIG1pZ2h0IGxvb2sgbGlrZSBhIGZhaWxpbmcgdGVzdC5cbkxvZy5fc3VwcHJlc3MgPSAoY291bnQpID0+IHtcbiAgc3VwcHJlc3MgKz0gY291bnQ7XG59O1xuXG4vLyBSZXR1cm5zIGludGVyY2VwdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGludGVyY2VwdCBjb3VudGVyLlxuTG9nLl9pbnRlcmNlcHRlZCA9ICgpID0+IHtcbiAgY29uc3QgbGluZXMgPSBpbnRlcmNlcHRlZExpbmVzO1xuICBpbnRlcmNlcHRlZExpbmVzID0gW107XG4gIGludGVyY2VwdCA9IDA7XG4gIHJldHVybiBsaW5lcztcbn07XG5cbi8vIEVpdGhlciAnanNvbicgb3IgJ2NvbG9yZWQtdGV4dCcuXG4vL1xuLy8gV2hlbiB0aGlzIGlzIHNldCB0byAnanNvbicsIHByaW50IEpTT04gZG9jdW1lbnRzIHRoYXQgYXJlIHBhcnNlZCBieSBhbm90aGVyXG4vLyBwcm9jZXNzICgnc2F0ZWxsaXRlJyBvciAnbWV0ZW9yIHJ1bicpLiBUaGlzIG90aGVyIHByb2Nlc3Mgc2hvdWxkIGNhbGxcbi8vICdMb2cuZm9ybWF0JyBmb3IgbmljZSBvdXRwdXQuXG4vL1xuLy8gV2hlbiB0aGlzIGlzIHNldCB0byAnY29sb3JlZC10ZXh0JywgY2FsbCAnTG9nLmZvcm1hdCcgYmVmb3JlIHByaW50aW5nLlxuLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgbG9nZ2luZyBmcm9tIHdpdGhpbiBzYXRlbGxpdGUsIHNpbmNlIHRoZXJlIGlzIG5vXG4vLyBvdGhlciBwcm9jZXNzIHRoYXQgd2lsbCBiZSByZWFkaW5nIGl0cyBzdGFuZGFyZCBvdXRwdXQuXG5Mb2cub3V0cHV0Rm9ybWF0ID0gJ2pzb24nO1xuXG5jb25zdCBMRVZFTF9DT0xPUlMgPSB7XG4gIGRlYnVnOiAnZ3JlZW4nLFxuICAvLyBsZWF2ZSBpbmZvIGFzIHRoZSBkZWZhdWx0IGNvbG9yXG4gIHdhcm46ICdtYWdlbnRhJyxcbiAgZXJyb3I6ICdyZWQnXG59O1xuXG5jb25zdCBNRVRBX0NPTE9SID0gJ2JsdWUnO1xuXG4vLyBEZWZhdWx0IGNvbG9ycyBjYXVzZSByZWFkYWJpbGl0eSBwcm9ibGVtcyBvbiBXaW5kb3dzIFBvd2Vyc2hlbGwsXG4vLyBzd2l0Y2ggdG8gYnJpZ2h0IHZhcmlhbnRzLiBXaGlsZSBzdGlsbCBjYXBhYmxlIG9mIG1pbGxpb25zIG9mXG4vLyBvcGVyYXRpb25zIHBlciBzZWNvbmQsIHRoZSBiZW5jaG1hcmsgc2hvd2VkIGEgMjUlKyBpbmNyZWFzZSBpblxuLy8gb3BzIHBlciBzZWNvbmQgKG9uIE5vZGUgOCkgYnkgY2FjaGluZyBcInByb2Nlc3MucGxhdGZvcm1cIi5cbmNvbnN0IGlzV2luMzIgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmNvbnN0IHBsYXRmb3JtQ29sb3IgPSAoY29sb3IpID0+IHtcbiAgaWYgKGlzV2luMzIgJiYgdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJyAmJiAhY29sb3IuZW5kc1dpdGgoJ0JyaWdodCcpKSB7XG4gICAgcmV0dXJuIGAke2NvbG9yfUJyaWdodGA7XG4gIH1cbiAgcmV0dXJuIGNvbG9yO1xufTtcblxuLy8gWFhYIHBhY2thZ2VcbmNvbnN0IFJFU1RSSUNURURfS0VZUyA9IFsndGltZScsICd0aW1lSW5leGFjdCcsICdsZXZlbCcsICdmaWxlJywgJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2dyYW0nLCAnb3JpZ2luQXBwJywgJ3NhdGVsbGl0ZScsICdzdGRlcnInXTtcblxuY29uc3QgRk9STUFUVEVEX0tFWVMgPSBbLi4uUkVTVFJJQ1RFRF9LRVlTLCAnYXBwJywgJ21lc3NhZ2UnXTtcblxuY29uc3QgbG9nSW5Ccm93c2VyID0gb2JqID0+IHtcbiAgY29uc3Qgc3RyID0gTG9nLmZvcm1hdChvYmopO1xuXG4gIC8vIFhYWCBTb21lIGxldmVscyBzaG91bGQgYmUgcHJvYmFibHkgYmUgc2VudCB0byB0aGUgc2VydmVyXG4gIGNvbnN0IGxldmVsID0gb2JqLmxldmVsO1xuXG4gIGlmICgodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSAmJiBjb25zb2xlW2xldmVsXSkge1xuICAgIGNvbnNvbGVbbGV2ZWxdKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgLy8gWFhYIFVzZXMgb2YgTWV0ZW9yLl9kZWJ1ZyBzaG91bGQgcHJvYmFibHkgYmUgcmVwbGFjZWQgYnkgTG9nLmRlYnVnIG9yXG4gICAgLy8gICAgIExvZy5pbmZvLCBhbmQgd2Ugc2hvdWxkIGhhdmUgYW5vdGhlciBuYW1lIGZvciBcImRvIHlvdXIgYmVzdCB0b1xuICAgIC8vICAgICBjYWxsIGNhbGwgY29uc29sZS5sb2dcIi5cbiAgICBNZXRlb3IuX2RlYnVnKHN0cik7XG4gIH1cbn07XG5cbi8vIEByZXR1cm5zIHtPYmplY3Q6IHsgbGluZTogTnVtYmVyLCBmaWxlOiBTdHJpbmcgfX1cbkxvZy5fZ2V0Q2FsbGVyRGV0YWlscyA9ICgpID0+IHtcbiAgY29uc3QgZ2V0U3RhY2sgPSAoKSA9PiB7XG4gICAgLy8gV2UgZG8gTk9UIHVzZSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSBoZXJlIChhIFY4IGV4dGVuc2lvbiB0aGF0IGdldHMgdXMgYVxuICAgIC8vIHByZS1wYXJzZWQgc3RhY2spIHNpbmNlIGl0J3MgaW1wb3NzaWJsZSB0byBjb21wb3NlIGl0IHdpdGggdGhlIHVzZSBvZlxuICAgIC8vIEVycm9yLnByZXBhcmVTdGFja1RyYWNlIHVzZWQgb24gdGhlIHNlcnZlciBmb3Igc291cmNlIG1hcHMuXG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yO1xuICAgIGNvbnN0IHN0YWNrID0gZXJyLnN0YWNrO1xuICAgIHJldHVybiBzdGFjaztcbiAgfTtcblxuICBjb25zdCBzdGFjayA9IGdldFN0YWNrKCk7XG5cbiAgaWYgKCFzdGFjaykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8vIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBsaW5lIG91dHNpZGUgdGhlIGxvZ2dpbmcgcGFja2FnZSAob3IgYW5cbiAgLy8gZXZhbCBpZiB3ZSBmaW5kIHRoYXQgZmlyc3QpXG4gIGxldCBsaW5lO1xuICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KCdcXG4nKS5zbGljZSgxKTtcbiAgZm9yIChsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKGxpbmUubWF0Y2goL15cXHMqYXQgZXZhbCBcXChldmFsLykpIHtcbiAgICAgIHJldHVybiB7ZmlsZTogXCJldmFsXCJ9O1xuICAgIH1cblxuICAgIGlmICghbGluZS5tYXRjaCgvcGFja2FnZXNcXC8oPzpsb2NhbC10ZXN0WzpfXSk/bG9nZ2luZyg/OlxcL3xcXC5qcykvKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IHt9O1xuXG4gIC8vIFRoZSBmb3JtYXQgZm9yIEZGIGlzICdmdW5jdGlvbk5hbWVAZmlsZVBhdGg6bGluZU51bWJlcidcbiAgLy8gVGhlIGZvcm1hdCBmb3IgVjggaXMgJ2Z1bmN0aW9uTmFtZSAocGFja2FnZXMvbG9nZ2luZy9sb2dnaW5nLmpzOjgxKScgb3JcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2VzL2xvZ2dpbmcvbG9nZ2luZy5qczo4MSdcbiAgY29uc3QgbWF0Y2ggPSAvKD86W0AoXXwgYXQgKShbXihdKz8pOihbMC05Ol0rKSg/OlxcKXwkKS8uZXhlYyhsaW5lKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBkZXRhaWxzO1xuICB9XG5cbiAgLy8gaW4gY2FzZSB0aGUgbWF0Y2hlZCBibG9jayBoZXJlIGlzIGxpbmU6Y29sdW1uXG4gIGRldGFpbHMubGluZSA9IG1hdGNoWzJdLnNwbGl0KCc6JylbMF07XG5cbiAgLy8gUG9zc2libGUgZm9ybWF0OiBodHRwczovL2Zvby5iYXIuY29tL3NjcmlwdHMvZmlsZS5qcz9yYW5kb209Zm9vYmFyXG4gIC8vIFhYWDogaWYgeW91IGNhbiB3cml0ZSB0aGUgZm9sbG93aW5nIGluIGJldHRlciB3YXksIHBsZWFzZSBkbyBpdFxuICAvLyBYWFg6IHdoYXQgYWJvdXQgZXZhbHM/XG4gIGRldGFpbHMuZmlsZSA9IG1hdGNoWzFdLnNwbGl0KCcvJykuc2xpY2UoLTEpWzBdLnNwbGl0KCc/JylbMF07XG5cbiAgcmV0dXJuIGRldGFpbHM7XG59O1xuXG5bJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddLmZvckVhY2goKGxldmVsKSA9PiB7XG4gLy8gQHBhcmFtIGFyZyB7U3RyaW5nfE9iamVjdH1cbiBMb2dbbGV2ZWxdID0gKGFyZykgPT4ge1xuICBpZiAoc3VwcHJlc3MpIHtcbiAgICBzdXBwcmVzcy0tO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpbnRlcmNlcHRlZCA9IGZhbHNlO1xuICBpZiAoaW50ZXJjZXB0KSB7XG4gICAgaW50ZXJjZXB0LS07XG4gICAgaW50ZXJjZXB0ZWQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IG9iaiA9IChhcmcgPT09IE9iamVjdChhcmcpXG4gICAgJiYgIShhcmcgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgJiYgIShhcmcgaW5zdGFuY2VvZiBEYXRlKSlcbiAgICA/IGFyZ1xuICAgIDogeyBtZXNzYWdlOiBuZXcgU3RyaW5nKGFyZykudG9TdHJpbmcoKSB9O1xuXG4gIFJFU1RSSUNURURfS0VZUy5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKG9ialtrZXldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHNldCAnJHtrZXl9JyBpbiBsb2cgbWVzc2FnZWApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGhhc093bi5jYWxsKG9iaiwgJ21lc3NhZ2UnKSAmJiB0eXBlb2Ygb2JqLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlICdtZXNzYWdlJyBmaWVsZCBpbiBsb2cgb2JqZWN0cyBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICB9XG5cbiAgaWYgKCFvYmoub21pdENhbGxlckRldGFpbHMpIHtcbiAgICBvYmogPSB7IC4uLkxvZy5fZ2V0Q2FsbGVyRGV0YWlscygpLCAuLi5vYmogfTtcbiAgfVxuXG4gIG9iai50aW1lID0gbmV3IERhdGUoKTtcbiAgb2JqLmxldmVsID0gbGV2ZWw7XG5cbiAgLy8gWFhYIGFsbG93IHlvdSB0byBlbmFibGUgJ2RlYnVnJywgcHJvYmFibHkgcGVyLXBhY2thZ2VcbiAgaWYgKGxldmVsID09PSAnZGVidWcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGludGVyY2VwdGVkKSB7XG4gICAgaW50ZXJjZXB0ZWRMaW5lcy5wdXNoKEVKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICBpZiAoTG9nLm91dHB1dEZvcm1hdCA9PT0gJ2NvbG9yZWQtdGV4dCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKExvZy5mb3JtYXQob2JqLCB7Y29sb3I6IHRydWV9KSk7XG4gICAgfSBlbHNlIGlmIChMb2cub3V0cHV0Rm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIGNvbnNvbGUubG9nKEVKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxvZ2dpbmcgb3V0cHV0IGZvcm1hdDogJHtMb2cub3V0cHV0Rm9ybWF0fWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dJbkJyb3dzZXIob2JqKTtcbiAgfVxufTtcbn0pO1xuXG5cbi8vIHRyaWVzIHRvIHBhcnNlIGxpbmUgYXMgRUpTT04uIHJldHVybnMgb2JqZWN0IGlmIHBhcnNlIGlzIHN1Y2Nlc3NmdWwsIG9yIG51bGwgaWYgbm90XG5Mb2cucGFyc2UgPSAobGluZSkgPT4ge1xuICBsZXQgb2JqID0gbnVsbDtcbiAgaWYgKGxpbmUgJiYgbGluZS5zdGFydHNXaXRoKCd7JykpIHsgLy8gbWlnaHQgYmUganNvbiBnZW5lcmF0ZWQgZnJvbSBjYWxsaW5nICdMb2cnXG4gICAgdHJ5IHsgb2JqID0gRUpTT04ucGFyc2UobGluZSk7IH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICAvLyBYWFggc2hvdWxkIHByb2JhYmx5IGNoZWNrIGZpZWxkcyBvdGhlciB0aGFuICd0aW1lJ1xuICBpZiAob2JqICYmIG9iai50aW1lICYmIChvYmoudGltZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuLy8gZm9ybWF0cyBhIGxvZyBvYmplY3QgaW50byBjb2xvcmVkIGh1bWFuIGFuZCBtYWNoaW5lLXJlYWRhYmxlIHRleHRcbkxvZy5mb3JtYXQgPSAob2JqLCBvcHRpb25zID0ge30pID0+IHtcbiAgb2JqID0geyAuLi5vYmogfTsgLy8gZG9uJ3QgbXV0YXRlIHRoZSBhcmd1bWVudFxuICBsZXQge1xuICAgIHRpbWUsXG4gICAgdGltZUluZXhhY3QsXG4gICAgbGV2ZWwgPSAnaW5mbycsXG4gICAgZmlsZSxcbiAgICBsaW5lOiBsaW5lTnVtYmVyLFxuICAgIGFwcDogYXBwTmFtZSA9ICcnLFxuICAgIG9yaWdpbkFwcCxcbiAgICBtZXNzYWdlID0gJycsXG4gICAgcHJvZ3JhbSA9ICcnLFxuICAgIHNhdGVsbGl0ZSA9ICcnLFxuICAgIHN0ZGVyciA9ICcnLFxuICB9ID0gb2JqO1xuXG4gIGlmICghKHRpbWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIid0aW1lJyBtdXN0IGJlIGEgRGF0ZSBvYmplY3RcIik7XG4gIH1cblxuICBGT1JNQVRURURfS0VZUy5mb3JFYWNoKChrZXkpID0+IHsgZGVsZXRlIG9ialtrZXldOyB9KTtcblxuICBpZiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwKSB7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2UgKz0gJyAnO1xuICAgIH1cbiAgICBtZXNzYWdlICs9IEVKU09OLnN0cmluZ2lmeShvYmopO1xuICB9XG5cbiAgY29uc3QgcGFkMiA9IG4gPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IHBhZDMgPSBuID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpO1xuXG4gIGNvbnN0IGRhdGVTdGFtcCA9IHRpbWUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpICtcbiAgICBwYWQyKHRpbWUuZ2V0TW9udGgoKSArIDEgLyowLWJhc2VkKi8pICtcbiAgICBwYWQyKHRpbWUuZ2V0RGF0ZSgpKTtcbiAgY29uc3QgdGltZVN0YW1wID0gcGFkMih0aW1lLmdldEhvdXJzKCkpICtcbiAgICAgICAgJzonICtcbiAgICAgICAgcGFkMih0aW1lLmdldE1pbnV0ZXMoKSkgK1xuICAgICAgICAnOicgK1xuICAgICAgICBwYWQyKHRpbWUuZ2V0U2Vjb25kcygpKSArXG4gICAgICAgICcuJyArXG4gICAgICAgIHBhZDModGltZS5nZXRNaWxsaXNlY29uZHMoKSk7XG5cbiAgLy8gZWcgaW4gU2FuIEZyYW5jaXNjbyBpbiBKdW5lIHRoaXMgd2lsbCBiZSAnKC03KSdcbiAgY29uc3QgdXRjT2Zmc2V0U3RyID0gYCgkeygtKG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwKSl9KWA7XG5cbiAgbGV0IGFwcEluZm8gPSAnJztcbiAgaWYgKGFwcE5hbWUpIHtcbiAgICBhcHBJbmZvICs9IGFwcE5hbWU7XG4gIH1cbiAgaWYgKG9yaWdpbkFwcCAmJiBvcmlnaW5BcHAgIT09IGFwcE5hbWUpIHtcbiAgICBhcHBJbmZvICs9IGAgdmlhICR7b3JpZ2luQXBwfWA7XG4gIH1cbiAgaWYgKGFwcEluZm8pIHtcbiAgICBhcHBJbmZvID0gYFske2FwcEluZm99XSBgO1xuICB9XG5cbiAgY29uc3Qgc291cmNlSW5mb1BhcnRzID0gW107XG4gIGlmIChwcm9ncmFtKSB7XG4gICAgc291cmNlSW5mb1BhcnRzLnB1c2gocHJvZ3JhbSk7XG4gIH1cbiAgaWYgKGZpbGUpIHtcbiAgICBzb3VyY2VJbmZvUGFydHMucHVzaChmaWxlKTtcbiAgfVxuICBpZiAobGluZU51bWJlcikge1xuICAgIHNvdXJjZUluZm9QYXJ0cy5wdXNoKGxpbmVOdW1iZXIpO1xuICB9XG5cbiAgbGV0IHNvdXJjZUluZm8gPSAhc291cmNlSW5mb1BhcnRzLmxlbmd0aCA/XG4gICAgJycgOiBgKCR7c291cmNlSW5mb1BhcnRzLmpvaW4oJzonKX0pIGA7XG5cbiAgaWYgKHNhdGVsbGl0ZSlcbiAgICBzb3VyY2VJbmZvICs9IGBbJHtzYXRlbGxpdGV9XWA7XG5cbiAgY29uc3Qgc3RkZXJySW5kaWNhdG9yID0gc3RkZXJyID8gJyhTVERFUlIpICcgOiAnJztcblxuICBjb25zdCBtZXRhUHJlZml4ID0gW1xuICAgIGxldmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpLFxuICAgIGRhdGVTdGFtcCxcbiAgICAnLScsXG4gICAgdGltZVN0YW1wLFxuICAgIHV0Y09mZnNldFN0cixcbiAgICB0aW1lSW5leGFjdCA/ICc/ICcgOiAnICcsXG4gICAgYXBwSW5mbyxcbiAgICBzb3VyY2VJbmZvLFxuICAgIHN0ZGVyckluZGljYXRvcl0uam9pbignJyk7XG5cbiAgY29uc3QgcHJldHRpZnkgPSBmdW5jdGlvbiAobGluZSwgY29sb3IpIHtcbiAgICByZXR1cm4gKG9wdGlvbnMuY29sb3IgJiYgTWV0ZW9yLmlzU2VydmVyICYmIGNvbG9yKSA/XG4gICAgICByZXF1aXJlKCdjbGktY29sb3InKVtjb2xvcl0obGluZSkgOiBsaW5lO1xuICB9O1xuXG4gIHJldHVybiBwcmV0dGlmeShtZXRhUHJlZml4LCBwbGF0Zm9ybUNvbG9yKG9wdGlvbnMubWV0YUNvbG9yIHx8IE1FVEFfQ09MT1IpKSArXG4gICAgcHJldHRpZnkobWVzc2FnZSwgcGxhdGZvcm1Db2xvcihMRVZFTF9DT0xPUlNbbGV2ZWxdKSk7XG59O1xuXG4vLyBUdXJuIGEgbGluZSBvZiB0ZXh0IGludG8gYSBsb2dnYWJsZSBvYmplY3QuXG4vLyBAcGFyYW0gbGluZSB7U3RyaW5nfVxuLy8gQHBhcmFtIG92ZXJyaWRlIHtPYmplY3R9XG5Mb2cub2JqRnJvbVRleHQgPSAobGluZSwgb3ZlcnJpZGUpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBsaW5lLFxuICAgIGxldmVsOiAnaW5mbycsXG4gICAgdGltZTogbmV3IERhdGUoKSxcbiAgICB0aW1lSW5leGFjdDogdHJ1ZSxcbiAgICAuLi5vdmVycmlkZVxuICB9O1xufTtcblxuZXhwb3J0IHsgTG9nIH07XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/logging/logging.js"],"names":["module","export","Log","Meteor","link","v","hasOwn","Object","prototype","hasOwnProperty","args","info","intercept","interceptedLines","suppress","_intercept","count","_suppress","_intercepted","lines","outputFormat","LEVEL_COLORS","debug","warn","error","META_COLOR","isWin32","process","platform","platformColor","color","endsWith","RESTRICTED_KEYS","FORMATTED_KEYS","logInBrowser","obj","str","format","level","console","_debug","_getCallerDetails","getStack","err","Error","stack","line","split","slice","match","file","details","exec","forEach","arg","intercepted","RegExp","Date","message","String","toString","key","call","omitCallerDetails","time","push","EJSON","stringify","isServer","log","parse","startsWith","e","options","timeInexact","lineNumber","app","appName","originApp","program","satellite","stderr","keys","length","pad2","n","padStart","pad3","dateStamp","getFullYear","getMonth","getDate","timeStamp","getHours","getMinutes","getSeconds","getMilliseconds","utcOffsetStr","getTimezoneOffset","appInfo","sourceInfoParts","sourceInfo","join","stderrIndicator","metaPrefix","charAt","toUpperCase","prettify","require","metaColor","objFromText","override"],"mappings":"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","file":"/packages/logging.js","sourcesContent":["import { Meteor } from 'meteor/meteor';\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nfunction Log(...args) {\n Log.info(...args);\n}\n\n/// FOR TESTING\nlet intercept = 0;\nlet interceptedLines = [];\nlet suppress = 0;\n\n// Intercept the next 'count' calls to a Log function. The actual\n// lines printed to the console can be cleared and read by calling\n// Log._intercepted().\nLog._intercept = (count) => {\n intercept += count;\n};\n\n// Suppress the next 'count' calls to a Log function. Use this to stop\n// tests from spamming the console, especially with red errors that\n// might look like a failing test.\nLog._suppress = (count) => {\n suppress += count;\n};\n\n// Returns intercepted lines and resets the intercept counter.\nLog._intercepted = () => {\n const lines = interceptedLines;\n interceptedLines = [];\n intercept = 0;\n return lines;\n};\n\n// Either 'json' or 'colored-text'.\n//\n// When this is set to 'json', print JSON documents that are parsed by another\n// process ('satellite' or 'meteor run'). This other process should call\n// 'Log.format' for nice output.\n//\n// When this is set to 'colored-text', call 'Log.format' before printing.\n// This should be used for logging from within satellite, since there is no\n// other process that will be reading its standard output.\nLog.outputFormat = 'json';\n\nconst LEVEL_COLORS = {\n debug: 'green',\n // leave info as the default color\n warn: 'magenta',\n error: 'red'\n};\n\nconst META_COLOR = 'blue';\n\n// Default colors cause readability problems on Windows Powershell,\n// switch to bright variants. While still capable of millions of\n// operations per second, the benchmark showed a 25%+ increase in\n// ops per second (on Node 8) by caching \"process.platform\".\nconst isWin32 = typeof process === 'object' && process.platform === 'win32';\nconst platformColor = (color) => {\n if (isWin32 && typeof color === 'string' && !color.endsWith('Bright')) {\n return `${color}Bright`;\n }\n return color;\n};\n\n// XXX package\nconst RESTRICTED_KEYS = ['time', 'timeInexact', 'level', 'file', 'line',\n 'program', 'originApp', 'satellite', 'stderr'];\n\nconst FORMATTED_KEYS = [...RESTRICTED_KEYS, 'app', 'message'];\n\nconst logInBrowser = obj => {\n const str = Log.format(obj);\n\n // XXX Some levels should be probably be sent to the server\n const level = obj.level;\n\n if ((typeof console !== 'undefined') && console[level]) {\n console[level](str);\n } else {\n // XXX Uses of Meteor._debug should probably be replaced by Log.debug or\n // Log.info, and we should have another name for \"do your best to\n // call call console.log\".\n Meteor._debug(str);\n }\n};\n\n// @returns {Object: { line: Number, file: String }}\nLog._getCallerDetails = () => {\n const getStack = () => {\n // We do NOT use Error.prepareStackTrace here (a V8 extension that gets us a\n // pre-parsed stack) since it's impossible to compose it with the use of\n // Error.prepareStackTrace used on the server for source maps.\n const err = new Error;\n const stack = err.stack;\n return stack;\n };\n\n const stack = getStack();\n\n if (!stack) {\n return {};\n }\n\n // looking for the first line outside the logging package (or an\n // eval if we find that first)\n let line;\n const lines = stack.split('\\n').slice(1);\n for (line of lines) {\n if (line.match(/^\\s*at eval \\(eval/)) {\n return {file: \"eval\"};\n }\n\n if (!line.match(/packages\\/(?:local-test[:_])?logging(?:\\/|\\.js)/)) {\n break;\n }\n }\n\n const details = {};\n\n // The format for FF is 'functionName@filePath:lineNumber'\n // The format for V8 is 'functionName (packages/logging/logging.js:81)' or\n // 'packages/logging/logging.js:81'\n const match = /(?:[@(]| at )([^(]+?):([0-9:]+)(?:\\)|$)/.exec(line);\n if (!match) {\n return details;\n }\n\n // in case the matched block here is line:column\n details.line = match[2].split(':')[0];\n\n // Possible format: https://foo.bar.com/scripts/file.js?random=foobar\n // XXX: if you can write the following in better way, please do it\n // XXX: what about evals?\n details.file = match[1].split('/').slice(-1)[0].split('?')[0];\n\n return details;\n};\n\n['debug', 'info', 'warn', 'error'].forEach((level) => {\n // @param arg {String|Object}\n Log[level] = (arg) => {\n if (suppress) {\n suppress--;\n return;\n }\n\n let intercepted = false;\n if (intercept) {\n intercept--;\n intercepted = true;\n }\n\n let obj = (arg === Object(arg)\n && !(arg instanceof RegExp)\n && !(arg instanceof Date))\n ? arg\n : { message: new String(arg).toString() };\n\n RESTRICTED_KEYS.forEach(key => {\n if (obj[key]) {\n throw new Error(`Can't set '${key}' in log message`);\n }\n });\n\n if (hasOwn.call(obj, 'message') && typeof obj.message !== 'string') {\n throw new Error(\"The 'message' field in log objects must be a string\");\n }\n\n if (!obj.omitCallerDetails) {\n obj = { ...Log._getCallerDetails(), ...obj };\n }\n\n obj.time = new Date();\n obj.level = level;\n\n // XXX allow you to enable 'debug', probably per-package\n if (level === 'debug') {\n return;\n }\n\n if (intercepted) {\n interceptedLines.push(EJSON.stringify(obj));\n } else if (Meteor.isServer) {\n if (Log.outputFormat === 'colored-text') {\n console.log(Log.format(obj, {color: true}));\n } else if (Log.outputFormat === 'json') {\n console.log(EJSON.stringify(obj));\n } else {\n throw new Error(`Unknown logging output format: ${Log.outputFormat}`);\n }\n } else {\n logInBrowser(obj);\n }\n};\n});\n\n\n// tries to parse line as EJSON. returns object if parse is successful, or null if not\nLog.parse = (line) => {\n let obj = null;\n if (line && line.startsWith('{')) { // might be json generated from calling 'Log'\n try { obj = EJSON.parse(line); } catch (e) {}\n }\n\n // XXX should probably check fields other than 'time'\n if (obj && obj.time && (obj.time instanceof Date)) {\n return obj;\n } else {\n return null;\n }\n};\n\n// formats a log object into colored human and machine-readable text\nLog.format = (obj, options = {}) => {\n obj = { ...obj }; // don't mutate the argument\n let {\n time,\n timeInexact,\n level = 'info',\n file,\n line: lineNumber,\n app: appName = '',\n originApp,\n message = '',\n program = '',\n satellite = '',\n stderr = '',\n } = obj;\n\n if (!(time instanceof Date)) {\n throw new Error(\"'time' must be a Date object\");\n }\n\n FORMATTED_KEYS.forEach((key) => { delete obj[key]; });\n\n if (Object.keys(obj).length > 0) {\n if (message) {\n message += ' ';\n }\n message += EJSON.stringify(obj);\n }\n\n const pad2 = n => n.toString().padStart(2, '0');\n const pad3 = n => n.toString().padStart(3, '0');\n\n const dateStamp = time.getFullYear().toString() +\n pad2(time.getMonth() + 1 /*0-based*/) +\n pad2(time.getDate());\n const timeStamp = pad2(time.getHours()) +\n ':' +\n pad2(time.getMinutes()) +\n ':' +\n pad2(time.getSeconds()) +\n '.' +\n pad3(time.getMilliseconds());\n\n // eg in San Francisco in June this will be '(-7)'\n const utcOffsetStr = `(${(-(new Date().getTimezoneOffset() / 60))})`;\n\n let appInfo = '';\n if (appName) {\n appInfo += appName;\n }\n if (originApp && originApp !== appName) {\n appInfo += ` via ${originApp}`;\n }\n if (appInfo) {\n appInfo = `[${appInfo}] `;\n }\n\n const sourceInfoParts = [];\n if (program) {\n sourceInfoParts.push(program);\n }\n if (file) {\n sourceInfoParts.push(file);\n }\n if (lineNumber) {\n sourceInfoParts.push(lineNumber);\n }\n\n let sourceInfo = !sourceInfoParts.length ?\n '' : `(${sourceInfoParts.join(':')}) `;\n\n if (satellite)\n sourceInfo += `[${satellite}]`;\n\n const stderrIndicator = stderr ? '(STDERR) ' : '';\n\n const metaPrefix = [\n level.charAt(0).toUpperCase(),\n dateStamp,\n '-',\n timeStamp,\n utcOffsetStr,\n timeInexact ? '? ' : ' ',\n appInfo,\n sourceInfo,\n stderrIndicator].join('');\n\n const prettify = function (line, color) {\n return (options.color && Meteor.isServer && color) ?\n require('cli-color')[color](line) : line;\n };\n\n return prettify(metaPrefix, platformColor(options.metaColor || META_COLOR)) +\n prettify(message, platformColor(LEVEL_COLORS[level]));\n};\n\n// Turn a line of text into a loggable object.\n// @param line {String}\n// @param override {Object}\nLog.objFromText = (line, override) => {\n return {\n message: line,\n level: 'info',\n time: new Date(),\n timeInexact: true,\n ...override\n };\n};\n\nexport { Log };\n"]}
\ No newline at end of file
(function () {
/* Exports */
Package._define("meteor-base");
})();
(function () {
/* Package-scope variables */
var global, meteorEnv, Meteor;
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/global.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Export a reliable global object for all Meteor code.
global = this;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/server_environment.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
meteorEnv = {
NODE_ENV: process.env.NODE_ENV || "production",
TEST_METADATA: process.env.TEST_METADATA || "{}"
};
const config = typeof __meteor_runtime_config__ === "object" &&
__meteor_runtime_config__;
if (config) {
config.meteorEnv = meteorEnv;
}
Meteor = {
isProduction: meteorEnv.NODE_ENV === "production",
isDevelopment: meteorEnv.NODE_ENV !== "production",
isClient: false,
isServer: true,
isCordova: false,
// Server code runs in Node 8+, which is decidedly "modern" by any
// reasonable definition.
isModern: true
};
Meteor.settings = {};
if (process.env.METEOR_SETTINGS) {
try {
Meteor.settings = JSON.parse(process.env.METEOR_SETTINGS);
} catch (e) {
throw new Error("METEOR_SETTINGS are not valid JSON.");
}
}
// Make sure that there is always a public attribute
// to enable Meteor.settings.public on client
if (! Meteor.settings.public) {
Meteor.settings.public = {};
}
// Push a subset of settings to the client. Note that the way this
// code is written, if the app mutates `Meteor.settings.public` on the
// server, it also mutates
// `__meteor_runtime_config__.PUBLIC_SETTINGS`, and the modified
// settings will be sent to the client.
if (config) {
config.PUBLIC_SETTINGS = Meteor.settings.public;
}
if (config && config.gitCommitHash) {
Meteor.gitCommitHash = config.gitCommitHash;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/define-package.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
function PackageRegistry() {
this._promiseInfoMap = Object.create(null);
}
var PRp = PackageRegistry.prototype;
// Set global.Package[name] = pkg || {}. If additional arguments are
// supplied, their keys will be copied into pkg if not already present.
// This method is defined on the prototype of global.Package so that it
// will not be included in Object.keys(Package).
PRp._define = function definePackage(name, pkg) {
pkg = pkg || {};
var argc = arguments.length;
for (var i = 2; i < argc; ++i) {
var arg = arguments[i];
for (var s in arg) {
if (! (s in pkg)) {
pkg[s] = arg[s];
}
}
}
this[name] = pkg;
var info = this._promiseInfoMap[name];
if (info) {
info.resolve(pkg);
}
return pkg;
};
PRp._has = function has(name) {
return Object.prototype.hasOwnProperty.call(this, name);
};
// Returns a Promise that will resolve to the exports of the named
// package, or be rejected if the package is not installed.
PRp._promise = function promise(name) {
var self = this;
var info = self._promiseInfoMap[name];
if (! info) {
info = self._promiseInfoMap[name] = {};
info.promise = new Promise(function (resolve, reject) {
info.resolve = resolve;
if (self._has(name)) {
resolve(self[name]);
} else {
Meteor.startup(function () {
if (! self._has(name)) {
reject(new Error("Package " + name + " not installed"));
}
});
}
});
}
return info.promise;
};
// Initialize the Package namespace used by all Meteor packages.
global.Package = new PackageRegistry();
if (typeof exports === "object") {
// This code is also used by meteor/tools/isobuild/bundler.js.
exports.PackageRegistry = PackageRegistry;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/helpers.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
if (Meteor.isServer)
var Future = Npm.require('fibers/future');
if (typeof __meteor_runtime_config__ === 'object' &&
__meteor_runtime_config__.meteorRelease) {
/**
* @summary `Meteor.release` is a string containing the name of the [release](#meteorupdate) with which the project was built (for example, `"1.2.3"`). It is `undefined` if the project was built using a git checkout of Meteor.
* @locus Anywhere
* @type {String}
*/
Meteor.release = __meteor_runtime_config__.meteorRelease;
}
// XXX find a better home for these? Ideally they would be _.get,
// _.ensure, _.delete..
// _get(a,b,c,d) returns a[b][c][d], or else undefined if a[b] or
// a[b][c] doesn't exist.
//
Meteor._get = function (obj /*, arguments */) {
for (var i = 1; i < arguments.length; i++) {
if (!(arguments[i] in obj))
return undefined;
obj = obj[arguments[i]];
}
return obj;
};
// _ensure(a,b,c,d) ensures that a[b][c][d] exists. If it does not,
// it is created and set to {}. Either way, it is returned.
//
Meteor._ensure = function (obj /*, arguments */) {
for (var i = 1; i < arguments.length; i++) {
var key = arguments[i];
if (!(key in obj))
obj[key] = {};
obj = obj[key];
}
return obj;
};
// _delete(a, b, c, d) deletes a[b][c][d], then a[b][c] unless it
// isn't empty, then a[b] unless it isn't empty.
//
Meteor._delete = function (obj /*, arguments */) {
var stack = [obj];
var leaf = true;
for (var i = 1; i < arguments.length - 1; i++) {
var key = arguments[i];
if (!(key in obj)) {
leaf = false;
break;
}
obj = obj[key];
if (typeof obj !== "object")
break;
stack.push(obj);
}
for (var i = stack.length - 1; i >= 0; i--) {
var key = arguments[i+1];
if (leaf)
leaf = false;
else
for (var other in stack[i][key])
return; // not empty -- we're done
delete stack[i][key];
}
};
// wrapAsync can wrap any function that takes some number of arguments that
// can't be undefined, followed by some optional arguments, where the callback
// is the last optional argument.
// e.g. fs.readFile(pathname, [callback]),
// fs.open(pathname, flags, [mode], [callback])
// For maximum effectiveness and least confusion, wrapAsync should be used on
// functions where the callback is the only argument of type Function.
/**
* @memberOf Meteor
* @summary Wrap a function that takes a callback function as its final parameter. The signature of the callback of the wrapped function should be `function(error, result){}`. On the server, the wrapped function can be used either synchronously (without passing a callback) or asynchronously (when a callback is passed). On the client, a callback is always required; errors will be logged if there is no callback. If a callback is provided, the environment captured when the original function was called will be restored in the callback.
* @locus Anywhere
* @param {Function} func A function that takes a callback as its final parameter
* @param {Object} [context] Optional `this` object against which the original function will be invoked
*/
Meteor.wrapAsync = function (fn, context) {
return function (/* arguments */) {
var self = context || this;
var newArgs = Array.prototype.slice.call(arguments);
var callback;
for (var i = newArgs.length - 1; i >= 0; --i) {
var arg = newArgs[i];
var type = typeof arg;
if (type !== "undefined") {
if (type === "function") {
callback = arg;
}
break;
}
}
if (! callback) {
if (Meteor.isClient) {
callback = logErr;
} else {
var fut = new Future();
callback = fut.resolver();
}
++i; // Insert the callback just after arg.
}
newArgs[i] = Meteor.bindEnvironment(callback);
var result = fn.apply(self, newArgs);
return fut ? fut.wait() : result;
};
};
// Sets child's prototype to a new object whose prototype is parent's
// prototype. Used as:
// Meteor._inherits(ClassB, ClassA).
// _.extend(ClassB.prototype, { ... })
// Inspired by CoffeeScript's `extend` and Google Closure's `goog.inherits`.
var hasOwn = Object.prototype.hasOwnProperty;
Meteor._inherits = function (Child, Parent) {
// copy Parent static properties
for (var key in Parent) {
// make sure we only copy hasOwnProperty properties vs. prototype
// properties
if (hasOwn.call(Parent, key)) {
Child[key] = Parent[key];
}
}
// a middle member of prototype chain: takes the prototype from the Parent
var Middle = function () {
this.constructor = Child;
};
Middle.prototype = Parent.prototype;
Child.prototype = new Middle();
Child.__super__ = Parent.prototype;
return Child;
};
var warnedAboutWrapAsync = false;
/**
* @deprecated in 0.9.3
*/
Meteor._wrapAsync = function(fn, context) {
if (! warnedAboutWrapAsync) {
Meteor._debug("Meteor._wrapAsync has been renamed to Meteor.wrapAsync");
warnedAboutWrapAsync = true;
}
return Meteor.wrapAsync.apply(Meteor, arguments);
};
function logErr(err) {
if (err) {
return Meteor._debug(
"Exception in callback of async function",
err
);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/setimmediate.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Chooses one of three setImmediate implementations:
//
// * Native setImmediate (IE 10, Node 0.9+)
//
// * postMessage (many browsers)
//
// * setTimeout (fallback)
//
// The postMessage implementation is based on
// https://github.com/NobleJS/setImmediate/tree/1.0.1
//
// Don't use `nextTick` for Node since it runs its callbacks before
// I/O, which is stricter than we're looking for.
//
// Not installed as a polyfill, as our public API is `Meteor.defer`.
// Since we're not trying to be a polyfill, we have some
// simplifications:
//
// If one invocation of a setImmediate callback pauses itself by a
// call to alert/prompt/showModelDialog, the NobleJS polyfill
// implementation ensured that no setImmedate callback would run until
// the first invocation completed. While correct per the spec, what it
// would mean for us in practice is that any reactive updates relying
// on Meteor.defer would be hung in the main window until the modal
// dialog was dismissed. Thus we only ensure that a setImmediate
// function is called in a later event loop.
//
// We don't need to support using a string to be eval'ed for the
// callback, arguments to the function, or clearImmediate.
"use strict";
var global = this;
// IE 10, Node >= 9.1
function useSetImmediate() {
if (! global.setImmediate)
return null;
else {
var setImmediate = function (fn) {
global.setImmediate(fn);
};
setImmediate.implementation = 'setImmediate';
return setImmediate;
}
}
// Android 2.3.6, Chrome 26, Firefox 20, IE 8-9, iOS 5.1.1 Safari
function usePostMessage() {
// The test against `importScripts` prevents this implementation
// from being installed inside a web worker, where
// `global.postMessage` means something completely different and
// can't be used for this purpose.
if (!global.postMessage || global.importScripts) {
return null;
}
// Avoid synchronous post message implementations.
var postMessageIsAsynchronous = true;
var oldOnMessage = global.onmessage;
global.onmessage = function () {
postMessageIsAsynchronous = false;
};
global.postMessage("", "*");
global.onmessage = oldOnMessage;
if (! postMessageIsAsynchronous)
return null;
var funcIndex = 0;
var funcs = {};
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
// XXX use Random.id() here?
var MESSAGE_PREFIX = "Meteor._setImmediate." + Math.random() + '.';
function isStringAndStartsWith(string, putativeStart) {
return (typeof string === "string" &&
string.substring(0, putativeStart.length) === putativeStart);
}
function onGlobalMessage(event) {
// This will catch all incoming messages (even from other
// windows!), so we need to try reasonably hard to avoid letting
// anyone else trick us into firing off. We test the origin is
// still this window, and that a (randomly generated)
// unpredictable identifying prefix is present.
if (event.source === global &&
isStringAndStartsWith(event.data, MESSAGE_PREFIX)) {
var index = event.data.substring(MESSAGE_PREFIX.length);
try {
if (funcs[index])
funcs[index]();
}
finally {
delete funcs[index];
}
}
}
if (global.addEventListener) {
global.addEventListener("message", onGlobalMessage, false);
} else {
global.attachEvent("onmessage", onGlobalMessage);
}
var setImmediate = function (fn) {
// Make `global` post a message to itself with the handle and
// identifying prefix, thus asynchronously invoking our
// onGlobalMessage listener above.
++funcIndex;
funcs[funcIndex] = fn;
global.postMessage(MESSAGE_PREFIX + funcIndex, "*");
};
setImmediate.implementation = 'postMessage';
return setImmediate;
}
function useTimeout() {
var setImmediate = function (fn) {
global.setTimeout(fn, 0);
};
setImmediate.implementation = 'setTimeout';
return setImmediate;
}
Meteor._setImmediate =
useSetImmediate() ||
usePostMessage() ||
useTimeout();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/timers.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
function withoutInvocation(f) {
if (Package.ddp) {
var DDP = Package.ddp.DDP;
var CurrentInvocation =
DDP._CurrentMethodInvocation ||
// For backwards compatibility, as explained in this issue:
// https://github.com/meteor/meteor/issues/8947
DDP._CurrentInvocation;
var invocation = CurrentInvocation.get();
if (invocation && invocation.isSimulation) {
throw new Error("Can't set timers inside simulations");
}
return function () {
CurrentInvocation.withValue(null, f);
};
} else {
return f;
}
}
function bindAndCatch(context, f) {
return Meteor.bindEnvironment(withoutInvocation(f), context);
}
// Meteor.setTimeout and Meteor.setInterval callbacks scheduled
// inside a server method are not part of the method invocation and
// should clear out the CurrentMethodInvocation environment variable.
/**
* @memberOf Meteor
* @summary Call a function in the future after waiting for a specified delay.
* @locus Anywhere
* @param {Function} func The function to run
* @param {Number} delay Number of milliseconds to wait before calling function
*/
Meteor.setTimeout = function (f, duration) {
return setTimeout(bindAndCatch("setTimeout callback", f), duration);
};
/**
* @memberOf Meteor
* @summary Call a function repeatedly, with a time delay between calls.
* @locus Anywhere
* @param {Function} func The function to run
* @param {Number} delay Number of milliseconds to wait between each function call.
*/
Meteor.setInterval = function (f, duration) {
return setInterval(bindAndCatch("setInterval callback", f), duration);
};
/**
* @memberOf Meteor
* @summary Cancel a repeating function call scheduled by `Meteor.setInterval`.
* @locus Anywhere
* @param {Object} id The handle returned by `Meteor.setInterval`
*/
Meteor.clearInterval = function(x) {
return clearInterval(x);
};
/**
* @memberOf Meteor
* @summary Cancel a function call scheduled by `Meteor.setTimeout`.
* @locus Anywhere
* @param {Object} id The handle returned by `Meteor.setTimeout`
*/
Meteor.clearTimeout = function(x) {
return clearTimeout(x);
};
// XXX consider making this guarantee ordering of defer'd callbacks, like
// Tracker.afterFlush or Node's nextTick (in practice). Then tests can do:
// callSomethingThatDefersSomeWork();
// Meteor.defer(expect(somethingThatValidatesThatTheWorkHappened));
/**
* @memberOf Meteor
* @summary Defer execution of a function to run asynchronously in the background (similar to `Meteor.setTimeout(func, 0)`.
* @locus Anywhere
* @param {Function} func The function to run
*/
Meteor.defer = function (f) {
Meteor._setImmediate(bindAndCatch("defer callback", f));
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/errors.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Makes an error subclass which properly contains a stack trace in most
// environments. constructor can set fields on `this` (and should probably set
// `message`, which is what gets displayed at the top of a stack trace).
//
Meteor.makeErrorType = function (name, constructor) {
var errorClass = function (/*arguments*/) {
// Ensure we get a proper stack trace in most Javascript environments
if (Error.captureStackTrace) {
// V8 environments (Chrome and Node.js)
Error.captureStackTrace(this, errorClass);
} else {
// Borrow the .stack property of a native Error object.
this.stack = new Error().stack;
}
// Safari magically works.
constructor.apply(this, arguments);
this.errorType = name;
};
Meteor._inherits(errorClass, Error);
return errorClass;
};
// This should probably be in the livedata package, but we don't want
// to require you to use the livedata package to get it. Eventually we
// should probably rename it to DDP.Error and put it back in the
// 'livedata' package (which we should rename to 'ddp' also.)
//
// Note: The DDP server assumes that Meteor.Error EJSON-serializes as an object
// containing 'error' and optionally 'reason' and 'details'.
// The DDP client manually puts these into Meteor.Error objects. (We don't use
// EJSON.addType here because the type is determined by location in the
// protocol, not text on the wire.)
/**
* @summary This class represents a symbolic error thrown by a method.
* @locus Anywhere
* @class
* @param {String} error A string code uniquely identifying this kind of error.
* This string should be used by callers of the method to determine the
* appropriate action to take, instead of attempting to parse the reason
* or details fields. For example:
*
* ```
* // on the server, pick a code unique to this error
* // the reason field should be a useful debug message
* throw new Meteor.Error("logged-out",
* "The user must be logged in to post a comment.");
*
* // on the client
* Meteor.call("methodName", function (error) {
* // identify the error
* if (error && error.error === "logged-out") {
* // show a nice error message
* Session.set("errorMessage", "Please log in to post a comment.");
* }
* });
* ```
*
* For legacy reasons, some built-in Meteor functions such as `check` throw
* errors with a number in this field.
*
* @param {String} [reason] Optional. A short human-readable summary of the
* error, like 'Not Found'.
* @param {String} [details] Optional. Additional information about the error,
* like a textual stack trace.
*/
Meteor.Error = Meteor.makeErrorType(
"Meteor.Error",
function (error, reason, details) {
var self = this;
// Newer versions of DDP use this property to signify that an error
// can be sent back and reconstructed on the calling client.
self.isClientSafe = true;
// String code uniquely identifying this kind of error.
self.error = error;
// Optional: A short human-readable summary of the error. Not
// intended to be shown to end users, just developers. ("Not Found",
// "Internal Server Error")
self.reason = reason;
// Optional: Additional information about the error, say for
// debugging. It might be a (textual) stack trace if the server is
// willing to provide one. The corresponding thing in HTTP would be
// the body of a 404 or 500 response. (The difference is that we
// never expect this to be shown to end users, only developers, so
// it doesn't need to be pretty.)
self.details = details;
// This is what gets displayed at the top of a stack trace. Current
// format is "[404]" (if no reason is set) or "File not found [404]"
if (self.reason)
self.message = self.reason + ' [' + self.error + ']';
else
self.message = '[' + self.error + ']';
});
// Meteor.Error is basically data and is sent over DDP, so you should be able to
// properly EJSON-clone it. This is especially important because if a
// Meteor.Error is thrown through a Future, the error, reason, and details
// properties become non-enumerable so a standard Object clone won't preserve
// them and they will be lost from DDP.
Meteor.Error.prototype.clone = function () {
var self = this;
return new Meteor.Error(self.error, self.reason, self.details);
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/fiber_helpers.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var Fiber = Npm.require('fibers');
var Future = Npm.require('fibers/future');
Meteor._noYieldsAllowed = function (f) {
var savedYield = Fiber.yield;
Fiber.yield = function () {
throw new Error("Can't call yield in a noYieldsAllowed block!");
};
try {
return f();
} finally {
Fiber.yield = savedYield;
}
};
Meteor._DoubleEndedQueue = Npm.require('meteor-deque');
// Meteor._SynchronousQueue is a queue which runs task functions serially.
// Tasks are assumed to be synchronous: ie, it's assumed that they are
// done when they return.
//
// It has two methods:
// - queueTask queues a task to be run, and returns immediately.
// - runTask queues a task to be run, and then yields. It returns
// when the task finishes running.
//
// It's safe to call queueTask from within a task, but not runTask (unless
// you're calling runTask from a nested Fiber).
//
// Somewhat inspired by async.queue, but specific to blocking tasks.
// XXX break this out into an NPM module?
// XXX could maybe use the npm 'schlock' module instead, which would
// also support multiple concurrent "read" tasks
//
Meteor._SynchronousQueue = function () {
var self = this;
// List of tasks to run (not including a currently-running task if any). Each
// is an object with field 'task' (the task function to run) and 'future' (the
// Future associated with the blocking runTask call that queued it, or null if
// called from queueTask).
self._taskHandles = new Meteor._DoubleEndedQueue();
// This is true if self._run() is either currently executing or scheduled to
// do so soon.
self._runningOrRunScheduled = false;
// During the execution of a task, this is set to the fiber used to execute
// that task. We use this to throw an error rather than deadlocking if the
// user calls runTask from within a task on the same fiber.
self._currentTaskFiber = undefined;
// This is true if we're currently draining. While we're draining, a further
// drain is a noop, to prevent infinite loops. "drain" is a heuristic type
// operation, that has a meaning like unto "what a naive person would expect
// when modifying a table from an observe"
self._draining = false;
};
var SQp = Meteor._SynchronousQueue.prototype;
SQp.runTask = function (task) {
var self = this;
if (!self.safeToRunTask()) {
if (Fiber.current)
throw new Error("Can't runTask from another task in the same fiber");
else
throw new Error("Can only call runTask in a Fiber");
}
var fut = new Future;
var handle = {
task: Meteor.bindEnvironment(task, function (e) {
Meteor._debug("Exception from task", e);
throw e;
}),
future: fut,
name: task.name
};
self._taskHandles.push(handle);
self._scheduleRun();
// Yield. We'll get back here after the task is run (and will throw if the
// task throws).
fut.wait();
};
SQp.queueTask = function (task) {
var self = this;
self._taskHandles.push({
task: task,
name: task.name
});
self._scheduleRun();
// No need to block.
};
SQp.flush = function () {
var self = this;
self.runTask(function () {});
};
SQp.safeToRunTask = function () {
var self = this;
return Fiber.current && self._currentTaskFiber !== Fiber.current;
};
SQp.drain = function () {
var self = this;
if (self._draining)
return;
if (!self.safeToRunTask())
return;
self._draining = true;
while (! self._taskHandles.isEmpty()) {
self.flush();
}
self._draining = false;
};
SQp._scheduleRun = function () {
var self = this;
// Already running or scheduled? Do nothing.
if (self._runningOrRunScheduled)
return;
self._runningOrRunScheduled = true;
setImmediate(function () {
Fiber(function () {
self._run();
}).run();
});
};
SQp._run = function () {
var self = this;
if (!self._runningOrRunScheduled)
throw new Error("expected to be _runningOrRunScheduled");
if (self._taskHandles.isEmpty()) {
// Done running tasks! Don't immediately schedule another run, but
// allow future tasks to do so.
self._runningOrRunScheduled = false;
return;
}
var taskHandle = self._taskHandles.shift();
// Run the task.
self._currentTaskFiber = Fiber.current;
var exception = undefined;
try {
taskHandle.task();
} catch (err) {
if (taskHandle.future) {
// We'll throw this exception through runTask.
exception = err;
} else {
Meteor._debug("Exception in queued task", err);
}
}
self._currentTaskFiber = undefined;
// Soon, run the next task, if there is any.
self._runningOrRunScheduled = false;
self._scheduleRun();
// If this was queued with runTask, let the runTask call return (throwing if
// the task threw).
if (taskHandle.future) {
if (exception)
taskHandle.future['throw'](exception);
else
taskHandle.future['return']();
}
};
// Sleep. Mostly used for debugging (eg, inserting latency into server
// methods).
//
Meteor._sleepForMs = function (ms) {
var fiber = Fiber.current;
setTimeout(function() {
fiber.run();
}, ms);
Fiber.yield();
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/startup_server.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Meteor.startup = function startup(callback) {
if (process.env.METEOR_PROFILE) {
// Create a temporary error to capture the current stack trace.
var error = new Error("Meteor.startup");
// Capture the stack trace of the Meteor.startup call, excluding the
// startup stack frame itself.
Error.captureStackTrace(error, startup);
callback.stack = error.stack
.split(/\n\s*/) // Split lines and remove leading whitespace.
.slice(0, 2) // Only include the call site.
.join(" ") // Collapse to one line.
.replace(/^Error: /, ""); // Not really an Error per se.
}
var bootstrap = global.__meteor_bootstrap__;
if (bootstrap &&
bootstrap.startupHooks) {
bootstrap.startupHooks.push(callback);
} else {
// We already started up. Just call it now.
callback();
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/debug.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var suppress = 0;
// replacement for console.log. This is a temporary API. We should
// provide a real logging API soon (possibly just a polyfill for
// console?)
//
// NOTE: this is used on the server to print the warning about
// having autopublish enabled when you probably meant to turn it
// off. it's not really the proper use of something called
// _debug. the intent is for this message to go to the terminal and
// be very visible. if you change _debug to go someplace else, etc,
// please fix the autopublish code to do something reasonable.
//
Meteor._debug = function (/* arguments */) {
if (suppress) {
suppress--;
return;
}
if (typeof console !== 'undefined' &&
typeof console.log !== 'undefined') {
if (arguments.length == 0) { // IE Companion breaks otherwise
// IE10 PP4 requires at least one argument
console.log('');
} else {
// IE doesn't have console.log.apply, it's not a real Object.
// http://stackoverflow.com/questions/5538972/console-log-apply-not-working-in-ie9
// http://patik.com/blog/complete-cross-browser-console-log/
if (typeof console.log.apply === "function") {
// Most browsers
// Chrome and Safari only hyperlink URLs to source files in first argument of
// console.log, so try to call it with one argument if possible.
// Approach taken here: If all arguments are strings, join them on space.
// See https://github.com/meteor/meteor/pull/732#issuecomment-13975991
var allArgumentsOfTypeString = true;
for (var i = 0; i < arguments.length; i++)
if (typeof arguments[i] !== "string")
allArgumentsOfTypeString = false;
if (allArgumentsOfTypeString)
console.log.apply(console, [Array.prototype.join.call(arguments, " ")]);
else
console.log.apply(console, arguments);
} else if (typeof Function.prototype.bind === "function") {
// IE9
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, arguments);
} else {
// IE8
Function.prototype.call.call(console.log, console, Array.prototype.slice.call(arguments));
}
}
}
};
// Suppress the next 'count' Meteor._debug messsages. Use this to
// stop tests from spamming the console.
//
Meteor._suppress_log = function (count) {
suppress += count;
};
Meteor._suppressed_log_expected = function () {
return suppress !== 0;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/string_utils.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Like Perl's quotemeta: quotes all regexp metacharacters.
// Code taken from
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
Meteor._escapeRegExp = function (string) {
return String(string).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/test_environment.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var TEST_METADATA_STR;
if (Meteor.isClient) {
TEST_METADATA_STR = meteorEnv.TEST_METADATA;
} else {
TEST_METADATA_STR = process.env.TEST_METADATA;
}
var TEST_METADATA = JSON.parse(TEST_METADATA_STR || "{}");
var testDriverPackageName = TEST_METADATA.driverPackage;
// Note that if we are in test-packages mode neither of these will be set,
// but we will have a test driver package
Meteor.isTest = !!TEST_METADATA.isTest;
Meteor.isAppTest = !!TEST_METADATA.isAppTest;
Meteor.isPackageTest = !!testDriverPackageName && !Meteor.isTest && !Meteor.isAppTest;
if (typeof testDriverPackageName === "string") {
Meteor.startup(function() {
var testDriverPackage = Package[testDriverPackageName];
if (! testDriverPackage) {
throw new Error("Can't find test driver package: " + testDriverPackageName);
}
// On the client, the test driver *must* define `runTests`
if (Meteor.isClient) {
if (typeof testDriverPackage.runTests !== "function") {
throw new Error("Test driver package " + testDriverPackageName
+ " missing `runTests` export");
}
testDriverPackage.runTests();
} else {
// The server can optionally define `start`
if (typeof testDriverPackage.start === "function") {
testDriverPackage.start();
}
}
});
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/dynamics_nodejs.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Fiber-aware implementation of dynamic scoping, for use on the server
var Fiber = Npm.require('fibers');
var nextSlot = 0;
Meteor._nodeCodeMustBeInFiber = function () {
if (!Fiber.current) {
throw new Error("Meteor code must always run within a Fiber. " +
"Try wrapping callbacks that you pass to non-Meteor " +
"libraries with Meteor.bindEnvironment.");
}
};
Meteor.EnvironmentVariable = function () {
this.slot = nextSlot++;
};
var EVp = Meteor.EnvironmentVariable.prototype;
EVp.get = function () {
Meteor._nodeCodeMustBeInFiber();
return Fiber.current._meteor_dynamics &&
Fiber.current._meteor_dynamics[this.slot];
};
// Most Meteor code ought to run inside a fiber, and the
// _nodeCodeMustBeInFiber assertion helps you remember to include appropriate
// bindEnvironment calls (which will get you the *right value* for your
// environment variables, on the server).
//
// In some very special cases, it's more important to run Meteor code on the
// server in non-Fiber contexts rather than to strongly enforce the safeguard
// against forgetting to use bindEnvironment. For example, using `check` in
// some top-level constructs like connect handlers without needing unnecessary
// Fibers on every request is more important that possibly failing to find the
// correct argumentChecker. So this function is just like get(), but it
// returns null rather than throwing when called from outside a Fiber. (On the
// client, it is identical to get().)
EVp.getOrNullIfOutsideFiber = function () {
if (!Fiber.current)
return null;
return this.get();
};
EVp.withValue = function (value, func) {
Meteor._nodeCodeMustBeInFiber();
if (!Fiber.current._meteor_dynamics)
Fiber.current._meteor_dynamics = [];
var currentValues = Fiber.current._meteor_dynamics;
var saved = currentValues[this.slot];
try {
currentValues[this.slot] = value;
return func();
} finally {
currentValues[this.slot] = saved;
}
};
// Meteor application code is always supposed to be run inside a
// fiber. bindEnvironment ensures that the function it wraps is run from
// inside a fiber and ensures it sees the values of Meteor environment
// variables that are set at the time bindEnvironment is called.
//
// If an environment-bound function is called from outside a fiber (eg, from
// an asynchronous callback from a non-Meteor library such as MongoDB), it'll
// kick off a new fiber to execute the function, and returns undefined as soon
// as that fiber returns or yields (and func's return value is ignored).
//
// If it's called inside a fiber, it works normally (the
// return value of the function will be passed through, and no new
// fiber will be created.)
//
// `onException` should be a function or a string. When it is a
// function, it is called as a callback when the bound function raises
// an exception. If it is a string, it should be a description of the
// callback, and when an exception is raised a debug message will be
// printed with the description.
Meteor.bindEnvironment = function (func, onException, _this) {
Meteor._nodeCodeMustBeInFiber();
var dynamics = Fiber.current._meteor_dynamics;
var boundValues = dynamics ? dynamics.slice() : [];
if (!onException || typeof(onException) === 'string') {
var description = onException || "callback of async function";
onException = function (error) {
Meteor._debug(
"Exception in " + description + ":",
error
);
};
} else if (typeof(onException) !== 'function') {
throw new Error('onException argument must be a function, string or undefined for Meteor.bindEnvironment().');
}
return function (/* arguments */) {
var args = Array.prototype.slice.call(arguments);
var runWithEnvironment = function () {
var savedValues = Fiber.current._meteor_dynamics;
try {
// Need to clone boundValues in case two fibers invoke this
// function at the same time
Fiber.current._meteor_dynamics = boundValues.slice();
var ret = func.apply(_this, args);
} catch (e) {
// note: callback-hook currently relies on the fact that if onException
// throws and you were originally calling the wrapped callback from
// within a Fiber, the wrapped call throws.
onException(e);
} finally {
Fiber.current._meteor_dynamics = savedValues;
}
return ret;
};
if (Fiber.current)
return runWithEnvironment();
Fiber(runWithEnvironment).run();
};
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/url_server.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
if (process.env.ROOT_URL &&
typeof __meteor_runtime_config__ === "object") {
__meteor_runtime_config__.ROOT_URL = process.env.ROOT_URL;
if (__meteor_runtime_config__.ROOT_URL) {
var parsedUrl = Npm.require('url').parse(__meteor_runtime_config__.ROOT_URL);
// Sometimes users try to pass, eg, ROOT_URL=mydomain.com.
if (!parsedUrl.host || ['http:', 'https:'].indexOf(parsedUrl.protocol) === -1) {
throw Error("$ROOT_URL, if specified, must be an URL");
}
var pathPrefix = parsedUrl.pathname;
if (pathPrefix.slice(-1) === '/') {
// remove trailing slash (or turn "/" into "")
pathPrefix = pathPrefix.slice(0, -1);
}
__meteor_runtime_config__.ROOT_URL_PATH_PREFIX = pathPrefix;
} else {
__meteor_runtime_config__.ROOT_URL_PATH_PREFIX = "";
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/url_common.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/**
* @summary Generate an absolute URL pointing to the application. The server reads from the `ROOT_URL` environment variable to determine where it is running. This is taken care of automatically for apps deployed to Galaxy, but must be provided when using `meteor build`.
* @locus Anywhere
* @param {String} [path] A path to append to the root URL. Do not include a leading "`/`".
* @param {Object} [options]
* @param {Boolean} options.secure Create an HTTPS URL.
* @param {Boolean} options.replaceLocalhost Replace localhost with 127.0.0.1. Useful for services that don't recognize localhost as a domain name.
* @param {String} options.rootUrl Override the default ROOT_URL from the server environment. For example: "`http://foo.example.com`"
*/
Meteor.absoluteUrl = function (path, options) {
// path is optional
if (!options && typeof path === 'object') {
options = path;
path = undefined;
}
// merge options with defaults
options = Object.assign({}, Meteor.absoluteUrl.defaultOptions, options || {});
var url = options.rootUrl;
if (!url)
throw new Error("Must pass options.rootUrl or set ROOT_URL in the server environment");
if (!/^http[s]?:\/\//i.test(url)) // url starts with 'http://' or 'https://'
url = 'http://' + url; // we will later fix to https if options.secure is set
if (! url.endsWith("/")) {
url += "/";
}
if (path) {
// join url and path with a / separator
while (path.startsWith("/")) {
path = path.slice(1);
}
url += path;
}
// turn http to https if secure option is set, and we're not talking
// to localhost.
if (options.secure &&
/^http:/.test(url) && // url starts with 'http:'
!/http:\/\/localhost[:\/]/.test(url) && // doesn't match localhost
!/http:\/\/127\.0\.0\.1[:\/]/.test(url)) // or 127.0.0.1
url = url.replace(/^http:/, 'https:');
if (options.replaceLocalhost)
url = url.replace(/^http:\/\/localhost([:\/].*)/, 'http://127.0.0.1$1');
return url;
};
// allow later packages to override default options
var defaultOptions = Meteor.absoluteUrl.defaultOptions = {};
// available only in a browser environment
var location = typeof window === "object" && window.location;
if (typeof __meteor_runtime_config__ === "object" &&
__meteor_runtime_config__.ROOT_URL) {
defaultOptions.rootUrl = __meteor_runtime_config__.ROOT_URL;
} else if (location &&
location.protocol &&
location.host) {
defaultOptions.rootUrl = location.protocol + "//" + location.host;
}
// Make absolute URLs use HTTPS by default if the current window.location
// uses HTTPS. Since this is just a default, it can be overridden by
// passing { secure: false } if necessary.
if (location &&
location.protocol === "https:") {
defaultOptions.secure = true;
}
Meteor._relativeToSiteRootUrl = function (link) {
if (typeof __meteor_runtime_config__ === "object" &&
link.substr(0, 1) === "/")
link = (__meteor_runtime_config__.ROOT_URL_PATH_PREFIX || "") + link;
return link;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/meteor/flush-buffers-on-exit-in-windows.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
if (process.platform === "win32") {
/*
* Based on https://github.com/cowboy/node-exit
*
* Copyright (c) 2013 "Cowboy" Ben Alman
* Licensed under the MIT license.
*/
var origProcessExit = process.exit.bind(process);
process.exit = function (exitCode) {
var streams = [process.stdout, process.stderr];
var drainCount = 0;
// Actually exit if all streams are drained.
function tryToExit() {
if (drainCount === streams.length) {
origProcessExit(exitCode);
}
}
streams.forEach(function(stream) {
// Count drained streams now, but monitor non-drained streams.
if (stream.bufferSize === 0) {
drainCount++;
} else {
stream.write('', 'utf-8', function() {
drainCount++;
tryToExit();
});
}
// Prevent further writing.
stream.write = function() {};
});
// If all streams were already drained, exit now.
tryToExit();
// In Windows, when run as a Node.js child process, a script utilizing
// this library might just exit with a 0 exit code, regardless. This code,
// despite the fact that it looks a bit crazy, appears to fix that.
process.on('exit', function() {
origProcessExit(exitCode);
});
};
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("meteor", {
Meteor: Meteor,
global: global,
meteorEnv: meteorEnv
});
})();
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
(function () {
/* Exports */
Package._define("mobile-experience");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
var require = meteorInstall({"node_modules":{"meteor":{"modern-browsers":{"modern.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/modern-browsers/modern.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
const minimumVersions = Object.create(null);
const hasOwn = Object.prototype.hasOwnProperty;
// This map defines aliasing behavior in a generic way which still permits
// minimum versions to be specified for a specific browser family.
const browserAliases = {
chrome: [
// chromeMobile*, per https://github.com/meteor/meteor/pull/9793,
"chromeMobile",
"chromeMobileIOS",
// The major version number of Chromium and Headless Chrome track with the
// releases of Chrome Dev, Canary and Stable, so we should be okay to
// alias them to Chrome in a generic sense.
// https://www.chromium.org/developers/version-numbers
//
// Chromium is particularly important to list here since, unlike macOS
// builds, Linux builds list Chromium in the userAgent along with Chrome:
// e.g. Chromium/70.0.3538.77 Chrome/70.0.3538.77
"chromium",
"headlesschrome",
],
// If a call to setMinimumBrowserVersions specifies Edge 12 as a minimum
// version, that means no version of Internet Explorer pre-Edge should
// be classified as modern. This edge:["ie"] alias effectively enforces
// that logic, because there is no IE12. #9818 #9839
edge: ["ie"],
// The webapp package converts browser names to camel case, so
// mobile_safari and mobileSafari should be synonymous.
mobile_safari: ["mobileSafari"],
};
// Expand the given minimum versions by reusing chrome versions for
// chromeMobile (according to browserAliases above).
function applyAliases(versions) {
const lowerCaseVersions = Object.create(null);
Object.keys(versions).forEach(browser => {
lowerCaseVersions[browser.toLowerCase()] = versions[browser];
});
Object.keys(browserAliases).forEach(original => {
const aliases = browserAliases[original];
original = original.toLowerCase();
if (hasOwn.call(lowerCaseVersions, original)) {
aliases.forEach(alias => {
alias = alias.toLowerCase();
if (! hasOwn.call(lowerCaseVersions, alias)) {
lowerCaseVersions[alias] = lowerCaseVersions[original];
}
});
}
});
return lowerCaseVersions;
}
// TODO Should it be possible for callers to setMinimumBrowserVersions to
// forbid any version of a particular browser?
// Given a { name, major, minor, patch } object like the one provided by
// webapp via request.browser, return true if that browser qualifies as
// "modern" according to all requested version constraints.
function isModern(browser) {
const lowerCaseName = browser &&
typeof browser.name === "string" &&
browser.name.toLowerCase();
return !!lowerCaseName &&
hasOwn.call(minimumVersions, lowerCaseName) &&
greaterThanOrEqualTo([
~~browser.major,
~~browser.minor,
~~browser.patch,
], minimumVersions[lowerCaseName].version);
}
// Any package that depends on the modern-browsers package can call this
// function to communicate its expectations for the minimum browser
// versions that qualify as "modern." The final decision between
// web.browser.legacy and web.browser will be based on the maximum of all
// requested minimum versions for each browser.
function setMinimumBrowserVersions(versions, source) {
const lowerCaseVersions = applyAliases(versions);
Object.keys(lowerCaseVersions).forEach(lowerCaseName => {
const version = lowerCaseVersions[lowerCaseName];
if (hasOwn.call(minimumVersions, lowerCaseName) &&
! greaterThan(version, minimumVersions[lowerCaseName].version)) {
return;
}
minimumVersions[lowerCaseName] = {
version: copy(version),
source: source || getCaller("setMinimumBrowserVersions")
};
});
}
function getCaller(calleeName) {
const error = new Error;
Error.captureStackTrace(error);
const lines = error.stack.split("\n");
let caller;
lines.some((line, i) => {
if (line.indexOf(calleeName) >= 0) {
caller = lines[i + 1].trim();
return true;
}
});
return caller;
}
Object.assign(exports, {
isModern,
setMinimumBrowserVersions,
calculateHashOfMinimumVersions() {
const { createHash } = require("crypto");
return createHash("sha1").update(
JSON.stringify(minimumVersions)
).digest("hex");
}
});
// For making defensive copies of [major, minor, ...] version arrays, so
// they don't change unexpectedly.
function copy(version) {
if (typeof version === "number") {
return version;
}
if (Array.isArray(version)) {
return version.map(copy);
}
return version;
}
function greaterThanOrEqualTo(a, b) {
return ! greaterThan(b, a);
}
function greaterThan(a, b) {
const as = (typeof a === "number") ? [a] : a;
const bs = (typeof b === "number") ? [b] : b;
const maxLen = Math.max(as.length, bs.length);
for (let i = 0; i < maxLen; ++i) {
a = (i < as.length) ? as[i] : 0;
b = (i < bs.length) ? bs[i] : 0;
if (a > b) {
return true;
}
if (a < b) {
return false;
}
}
return false;
}
function makeSource(feature) {
return module.id + " (" + feature + ")"
}
setMinimumBrowserVersions({
chrome: 49,
edge: 12,
firefox: 45,
mobileSafari: [9, 2],
opera: 36,
safari: 9,
// Electron 1.0.0+ matches Chromium 49, per
// https://github.com/Kilian/electron-to-chromium/blob/master/full-versions.js
electron: 1,
}, makeSource("classes"));
setMinimumBrowserVersions({
chrome: 39,
edge: 13,
firefox: 26,
mobileSafari: 10,
opera: 26,
safari: 10,
// Disallow any version of PhantomJS.
phantomjs: Infinity,
electron: [0, 20],
}, makeSource("generator functions"));
setMinimumBrowserVersions({
chrome: 41,
edge: 13,
firefox: 34,
mobileSafari: [9, 2],
opera: 29,
safari: [9, 1],
electron: [0, 24],
}, makeSource("template literals"));
setMinimumBrowserVersions({
chrome: 38,
edge: 12,
firefox: 36,
mobileSafari: 9,
opera: 25,
safari: 9,
electron: [0, 20],
}, makeSource("symbols"));
///////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/modern-browsers/modern.js");
/* Exports */
Package._define("modern-browsers", exports);
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
/* Package-scope variables */
var makeInstaller, meteorInstall;
///////////////////////////////////////////////////////////////////////////////
// //
// packages/modules-runtime/.npm/package/node_modules/install/install.js //
// This file is in bare mode and is not in its own closure. //
// //
///////////////////////////////////////////////////////////////////////////////
//
makeInstaller = function (options) {
"use strict";
options = options || {};
// These file extensions will be appended to required module identifiers
// if they do not exactly match an installed module.
var defaultExtensions = options.extensions || [".js", ".json"];
// If defined, the options.fallback function will be called when no
// installed module is found for a required module identifier. Often
// options.fallback will be implemented in terms of the native Node
// require function, which has the ability to load binary modules.
var fallback = options.fallback;
// List of fields to look for in package.json files to determine the
// main entry module of the package. The first field listed here whose
// value is a string will be used to resolve the entry module.
var mainFields = options.mainFields ||
// If options.mainFields is absent and options.browser is truthy,
// package resolution will prefer the "browser" field of package.json
// files to the "main" field. Note that this only supports
// string-valued "browser" fields for now, though in the future it
// might make sense to support the object version, a la browserify.
(options.browser ? ["browser", "main"] : ["main"]);
var hasOwn = {}.hasOwnProperty;
function strictHasOwn(obj, key) {
return isObject(obj) && isString(key) && hasOwn.call(obj, key);
}
// Cache for looking up File objects given absolute module identifiers.
// Invariants:
// filesByModuleId[module.id] === fileAppendId(root, module.id)
// filesByModuleId[module.id].module === module
var filesByModuleId = {};
// The file object representing the root directory of the installed
// module tree.
var root = new File("/", new File("/.."));
var rootRequire = makeRequire(root);
// Merges the given tree of directories and module factory functions
// into the tree of installed modules and returns a require function
// that behaves as if called from a module in the root directory.
function install(tree, options) {
if (isObject(tree)) {
fileMergeContents(root, tree, options);
}
return rootRequire;
}
// Replace this function to enable Module.prototype.prefetch.
install.fetch = function (ids) {
throw new Error("fetch not implemented");
};
// This constructor will be used to instantiate the module objects
// passed to module factory functions (i.e. the third argument after
// require and exports), and is exposed as install.Module in case the
// caller of makeInstaller wishes to modify Module.prototype.
function Module(id) {
this.id = id;
// The Node implementation of module.children unfortunately includes
// only those child modules that were imported for the first time by
// this parent module (i.e., child.parent === this).
this.children = [];
// This object is an install.js extension that includes all child
// modules imported by this module, even if this module is not the
// first to import them.
this.childrenById = {};
}
// Used to keep module.prefetch promise resolutions well-ordered.
var lastPrefetchPromise;
// May be shared by multiple sequential calls to module.prefetch.
// Initialized to {} only when necessary.
var missing;
Module.prototype.prefetch = function (id) {
var module = this;
var parentFile = getOwn(filesByModuleId, module.id);
lastPrefetchPromise = lastPrefetchPromise || Promise.resolve();
var previousPromise = lastPrefetchPromise;
function walk(module) {
var file = getOwn(filesByModuleId, module.id);
if (fileIsDynamic(file) && ! file.pending) {
file.pending = true;
missing = missing || {};
// These are the data that will be exposed to the install.fetch
// callback, so it's worth documenting each item with a comment.
missing[module.id] = {
// The CommonJS module object that will be exposed to this
// dynamic module when it is evaluated. Note that install.fetch
// could decide to populate module.exports directly, instead of
// fetching anything. In that case, install.fetch should omit
// this module from the tree that it produces.
module: file.module,
// List of module identifier strings imported by this module.
// Note that the missing object already contains all available
// dependencies (including transitive dependencies), so
// install.fetch should not need to traverse these dependencies
// in most cases; however, they may be useful for other reasons.
// Though the strings are unique, note that two different
// strings could resolve to the same module.
deps: Object.keys(file.deps),
// The options (if any) that were passed as the second argument
// to the install(tree, options) function when this stub was
// first registered. Typically contains options.extensions, but
// could contain any information appropriate for the entire tree
// as originally installed. These options will be automatically
// inherited by the newly fetched modules, so install.fetch
// should not need to modify them.
options: file.options,
// Any stub data included in the array notation from the
// original entry for this dynamic module. Typically contains
// "main" and/or "browser" fields for package.json files, and is
// otherwise undefined.
stub: file.stub
};
each(file.deps, function (parentId, id) {
fileResolve(file, id);
});
each(module.childrenById, walk);
}
}
return lastPrefetchPromise = new Promise(function (resolve) {
var absChildId = module.resolve(id);
each(module.childrenById, walk);
resolve(absChildId);
}).then(function (absChildId) {
// Grab the current missing object and fetch its contents.
var toBeFetched = missing;
missing = null;
function clearPending() {
if (toBeFetched) {
Object.keys(toBeFetched).forEach(function (id) {
getOwn(filesByModuleId, id).pending = false;
});
}
}
return new Promise(function (resolve) {
// The install.fetch function takes an object mapping missing
// dynamic module identifiers to options objects, and should
// return a Promise that resolves to a module tree that can be
// installed. As an optimization, if there were no missing dynamic
// modules, then we can skip calling install.fetch entirely.
resolve(toBeFetched && install.fetch(toBeFetched));
}).then(function (tree) {
function both() {
install(tree);
clearPending();
return absChildId;
}
// Although we want multiple install.fetch calls to run in
// parallel, it is important that the promises returned by
// module.prefetch are resolved in the same order as the original
// calls to module.prefetch, because previous fetches may include
// modules assumed to exist by more recent module.prefetch calls.
// Whether previousPromise was resolved or rejected, carry on with
// the installation regardless.
return previousPromise.then(both, both);
}, function (error) {
// Fixes https://github.com/meteor/meteor/issues/10182.
clearPending();
throw error;
});
});
};
install.Module = Module;
function getOwn(obj, key) {
return strictHasOwn(obj, key) && obj[key];
}
function isObject(value) {
return value !== null && typeof value === "object";
}
function isFunction(value) {
return typeof value === "function";
}
function isString(value) {
return typeof value === "string";
}
function makeMissingError(id) {
return new Error("Cannot find module '" + id + "'");
}
Module.prototype.resolve = function (id) {
var file = fileResolve(filesByModuleId[this.id], id);
if (file) return file.module.id;
var error = makeMissingError(id);
if (fallback && isFunction(fallback.resolve)) {
return fallback.resolve(id, this.id, error);
}
throw error;
};
Module.prototype.require = function require(id) {
var result = fileResolve(filesByModuleId[this.id], id);
if (result) {
return fileEvaluate(result, this);
}
var error = makeMissingError(id);
if (isFunction(fallback)) {
return fallback(
id, // The missing module identifier.
this.id, // ID of the parent module.
error // The error we would have thrown.
);
}
throw error;
};
function makeRequire(file) {
var module = file.module;
function require(id) {
return module.require(id);
}
require.extensions = fileGetExtensions(file).slice(0);
require.resolve = function resolve(id) {
return module.resolve(id);
};
return require;
}
// File objects represent either directories or modules that have been
// installed. When a `File` respresents a directory, its `.contents`
// property is an object containing the names of the files (or
// directories) that it contains. When a `File` represents a module, its
// `.contents` property is a function that can be invoked with the
// appropriate `(require, exports, module)` arguments to evaluate the
// module. If the `.contents` property is a string, that string will be
// resolved as a module identifier, and the exports of the resulting
// module will provide the exports of the original file. The `.parent`
// property of a File is either a directory `File` or `null`. Note that
// a child may claim another `File` as its parent even if the parent
// does not have an entry for that child in its `.contents` object.
// This is important for implementing anonymous files, and preventing
// child modules from using `../relative/identifier` syntax to examine
// unrelated modules.
function File(moduleId, parent) {
var file = this;
// Link to the parent file.
file.parent = parent = parent || null;
// The module object for this File, which will eventually boast an
// .exports property when/if the file is evaluated.
file.module = new Module(moduleId);
filesByModuleId[moduleId] = file;
// The .contents of the file can be either (1) an object, if the file
// represents a directory containing other files; (2) a factory
// function, if the file represents a module that can be imported; (3)
// a string, if the file is an alias for another file; or (4) null, if
// the file's contents are not (yet) available.
file.contents = null;
// Set of module identifiers imported by this module. Note that this
// set is not necessarily complete, so don't rely on it unless you
// know what you're doing.
file.deps = {};
}
function fileEvaluate(file, parentModule) {
var module = file.module;
if (! strictHasOwn(module, "exports")) {
var contents = file.contents;
if (! contents) {
// If this file was installed with array notation, and the array
// contained one or more objects but no functions, then the combined
// properties of the objects are treated as a temporary stub for
// file.module.exports. This is particularly important for partial
// package.json modules, so that the resolution logic can know the
// value of the "main" and/or "browser" fields, at least, even if
// the rest of the package.json file is not (yet) available.
if (file.stub) {
return file.stub;
}
throw makeMissingError(module.id);
}
if (parentModule) {
module.parent = parentModule;
var children = parentModule.children;
if (Array.isArray(children)) {
children.push(module);
}
}
contents(
makeRequire(file),
// If the file had a .stub, reuse the same object for exports.
module.exports = file.stub || {},
module,
file.module.id,
file.parent.module.id
);
module.loaded = true;
}
// The module.runModuleSetters method will be deprecated in favor of
// just module.runSetters: https://github.com/benjamn/reify/pull/160
var runSetters = module.runSetters || module.runModuleSetters;
if (isFunction(runSetters)) {
runSetters.call(module);
}
return module.exports;
}
function fileIsDirectory(file) {
return file && isObject(file.contents);
}
function fileIsDynamic(file) {
return file && file.contents === null;
}
function fileMergeContents(file, contents, options) {
if (Array.isArray(contents)) {
contents.forEach(function (item) {
if (isString(item)) {
file.deps[item] = file.module.id;
} else if (isFunction(item)) {
contents = item;
} else if (isObject(item)) {
file.stub = file.stub || {};
each(item, function (value, key) {
file.stub[key] = value;
});
}
});
if (! isFunction(contents)) {
// If the array did not contain a function, merge nothing.
contents = null;
}
} else if (! isFunction(contents) &&
! isString(contents) &&
! isObject(contents)) {
// If contents is neither an array nor a function nor a string nor
// an object, just give up and merge nothing.
contents = null;
}
if (contents) {
file.contents = file.contents || (isObject(contents) ? {} : contents);
if (isObject(contents) && fileIsDirectory(file)) {
each(contents, function (value, key) {
if (key === "..") {
child = file.parent;
} else {
var child = getOwn(file.contents, key);
if (! child) {
child = file.contents[key] = new File(
file.module.id.replace(/\/*$/, "/") + key,
file
);
child.options = options;
}
}
fileMergeContents(child, value, options);
});
}
}
}
function each(obj, callback, context) {
Object.keys(obj).forEach(function (key) {
callback.call(this, obj[key], key);
}, context);
}
function fileGetExtensions(file) {
return file.options
&& file.options.extensions
|| defaultExtensions;
}
function fileAppendIdPart(file, part, extensions) {
// Always append relative to a directory.
while (file && ! fileIsDirectory(file)) {
file = file.parent;
}
if (! file || ! part || part === ".") {
return file;
}
if (part === "..") {
return file.parent;
}
var exactChild = getOwn(file.contents, part);
// Only consider multiple file extensions if this part is the last
// part of a module identifier and not equal to `.` or `..`, and there
// was no exact match or the exact match was a directory.
if (extensions && (! exactChild || fileIsDirectory(exactChild))) {
for (var e = 0; e < extensions.length; ++e) {
var child = getOwn(file.contents, part + extensions[e]);
if (child && ! fileIsDirectory(child)) {
return child;
}
}
}
return exactChild;
}
function fileAppendId(file, id, extensions) {
var parts = id.split("/");
// Use `Array.prototype.every` to terminate iteration early if
// `fileAppendIdPart` returns a falsy value.
parts.every(function (part, i) {
return file = i < parts.length - 1
? fileAppendIdPart(file, part)
: fileAppendIdPart(file, part, extensions);
});
return file;
}
function recordChild(parentModule, childFile) {
var childModule = childFile && childFile.module;
if (parentModule && childModule) {
parentModule.childrenById[childModule.id] = childModule;
}
}
function fileResolve(file, id, parentModule, seenDirFiles) {
var parentModule = parentModule || file.module;
var extensions = fileGetExtensions(file);
file =
// Absolute module identifiers (i.e. those that begin with a `/`
// character) are interpreted relative to the root directory, which
// is a slight deviation from Node, which has access to the entire
// file system.
id.charAt(0) === "/" ? fileAppendId(root, id, extensions) :
// Relative module identifiers are interpreted relative to the
// current file, naturally.
id.charAt(0) === "." ? fileAppendId(file, id, extensions) :
// Top-level module identifiers are interpreted as referring to
// packages in `node_modules` directories.
nodeModulesLookup(file, id, extensions);
// If the identifier resolves to a directory, we use the same logic as
// Node to find an `index.js` or `package.json` file to evaluate.
while (fileIsDirectory(file)) {
seenDirFiles = seenDirFiles || [];
// If the "main" field of a `package.json` file resolves to a
// directory we've already considered, then we should not attempt to
// read the same `package.json` file again. Using an array as a set
// is acceptable here because the number of directories to consider
// is rarely greater than 1 or 2. Also, using indexOf allows us to
// store File objects instead of strings.
if (seenDirFiles.indexOf(file) < 0) {
seenDirFiles.push(file);
var pkgJsonFile = fileAppendIdPart(file, "package.json"), main;
var pkg = pkgJsonFile && fileEvaluate(pkgJsonFile, parentModule);
if (pkg &&
mainFields.some(function (name) {
return isString(main = pkg[name]);
})) {
// The "main" field of package.json does not have to begin with
// ./ to be considered relative, so first we try simply
// appending it to the directory path before falling back to a
// full fileResolve, which might return a package from a
// node_modules directory.
var mainFile = fileAppendId(file, main, extensions) ||
fileResolve(file, main, parentModule, seenDirFiles);
if (mainFile) {
file = mainFile;
recordChild(parentModule, pkgJsonFile);
// The fileAppendId call above may have returned a directory,
// so continue the loop to make sure we resolve it to a
// non-directory file.
continue;
}
}
}
// If we didn't find a `package.json` file, or it didn't have a
// resolvable `.main` property, the only possibility left to
// consider is that this directory contains an `index.js` module.
// This assignment almost always terminates the while loop, because
// there's very little chance `fileIsDirectory(file)` will be true
// for `fileAppendIdPart(file, "index", extensions)`. However, in
// principle it is remotely possible that a file called `index.js`
// could be a directory instead of a file.
file = fileAppendIdPart(file, "index", extensions);
}
if (file && isString(file.contents)) {
file = fileResolve(file, file.contents, parentModule, seenDirFiles);
}
recordChild(parentModule, file);
return file;
};
function nodeModulesLookup(file, id, extensions) {
for (var resolved; file && ! resolved; file = file.parent) {
resolved = fileIsDirectory(file) &&
fileAppendId(file, "node_modules/" + id, extensions);
}
return resolved;
}
return install;
};
if (typeof exports === "object") {
exports.makeInstaller = makeInstaller;
}
///////////////////////////////////////////////////////////////////////////////
(function(){
///////////////////////////////////////////////////////////////////////////////
// //
// packages/modules-runtime/server.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
// Options that will be populated below and then passed to makeInstaller.
var makeInstallerOptions = {};
// RegExp matching strings that don't start with a `.` or a `/`.
var topLevelIdPattern = /^[^./]/;
// This function will be called whenever a module identifier that hasn't
// been installed is required. For backwards compatibility, and so that we
// can require binary dependencies on the server, we implement the
// fallback in terms of Npm.require.
makeInstallerOptions.fallback = function (id, parentId, error) {
// For simplicity, we honor only top-level module identifiers here.
// We could try to honor relative and absolute module identifiers by
// somehow combining `id` with `dir`, but we'd have to be really careful
// that the resulting modules were located in a known directory (not
// some arbitrary location on the file system), and we only really need
// the fallback for dependencies installed in node_modules directories.
if (topLevelIdPattern.test(id)) {
if (id && id.startsWith('meteor/')) {
const [meteorPrefix, packageName] = id.split('/', 2);
throw new Error(
`Cannot find package "${packageName}". ` +
`Try "meteor add ${packageName}".`
);
}
if (typeof Npm === "object" &&
typeof Npm.require === "function") {
return Npm.require(id, error);
}
}
throw error;
};
makeInstallerOptions.fallback.resolve = function (id, parentId, error) {
if (topLevelIdPattern.test(id)) {
// Allow any top-level identifier to resolve to itself on the server,
// so that makeInstallerOptions.fallback has a chance to handle it.
return id;
}
throw error;
};
meteorInstall = makeInstaller(makeInstallerOptions);
var Module = meteorInstall.Module;
Module.prototype.useNode = function () {
if (typeof npmRequire !== "function") {
// Can't use Node if npmRequire is not defined.
return false;
}
var parts = this.id.split("/");
var start = 0;
if (parts[start] === "") ++start;
if (parts[start] === "node_modules" &&
parts[start + 1] === "meteor") {
start += 2;
}
if (parts.indexOf("node_modules", start) < 0) {
// Don't try to use Node for modules that aren't in node_modules
// directories.
return false;
}
try {
npmRequire.resolve(this.id);
} catch (e) {
return false;
}
this.exports = npmRequire(this.id);
return true;
};
///////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
///////////////////////////////////////////////////////////////////////////////
// //
// packages/modules-runtime/profile.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
if (typeof Profile === "function" &&
process.env.METEOR_PROFILE) {
var Mp = meteorInstall.Module.prototype;
Mp.require = Profile(function (id) {
return "require(" + JSON.stringify(id) + ")";
}, Mp.require);
}
///////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("modules-runtime", {
meteorInstall: meteorInstall
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package['modules-runtime'].meteorInstall;
var require = meteorInstall({"node_modules":{"meteor":{"modules":{"server.js":function(require){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/modules/server.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
require("./install-packages.js");
require("./process.js");
require("./reify.js");
///////////////////////////////////////////////////////////////////////////////////////////////////
},"install-packages.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/modules/install-packages.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
function install(name, mainModule) {
var meteorDir = {};
// Given a package name <name>, install a stub module in the
// /node_modules/meteor directory called <name>.js, so that
// require.resolve("meteor/<name>") will always return
// /node_modules/meteor/<name>.js instead of something like
// /node_modules/meteor/<name>/index.js, in the rare but possible event
// that the package contains a file called index.js (#6590).
if (typeof mainModule === "string") {
// Set up an alias from /node_modules/meteor/<package>.js to the main
// module, e.g. meteor/<package>/index.js.
meteorDir[name + ".js"] = mainModule;
} else {
// back compat with old Meteor packages
meteorDir[name + ".js"] = function (r, e, module) {
module.exports = Package[name];
};
}
meteorInstall({
node_modules: {
meteor: meteorDir
}
});
}
// This file will be modified during computeJsOutputFilesMap to include
// install(<name>) calls for every Meteor package.
install("meteor");
install("meteor-base");
install("mobile-experience");
install("npm-mongo");
install("ecmascript-runtime");
install("modules-runtime");
install("modules", "meteor/modules/server.js");
install("modern-browsers", "meteor/modern-browsers/modern.js");
install("es5-shim");
install("promise", "meteor/promise/server.js");
install("ecmascript-runtime-client", "meteor/ecmascript-runtime-client/versions.js");
install("ecmascript-runtime-server", "meteor/ecmascript-runtime-server/runtime.js");
install("babel-compiler");
install("ecmascript");
install("babel-runtime", "meteor/babel-runtime/babel-runtime.js");
install("fetch", "meteor/fetch/server.js");
install("inter-process-messaging", "meteor/inter-process-messaging/inter-process-messaging.js");
install("dynamic-import", "meteor/dynamic-import/server.js");
install("base64", "meteor/base64/base64.js");
install("ejson", "meteor/ejson/ejson.js");
install("diff-sequence", "meteor/diff-sequence/diff.js");
install("geojson-utils", "meteor/geojson-utils/main.js");
install("id-map", "meteor/id-map/id-map.js");
install("random");
install("mongo-id", "meteor/mongo-id/id.js");
install("ordered-dict", "meteor/ordered-dict/ordered_dict.js");
install("tracker");
install("minimongo", "meteor/minimongo/minimongo_server.js");
install("check", "meteor/check/match.js");
install("retry", "meteor/retry/retry.js");
install("callback-hook", "meteor/callback-hook/hook.js");
install("ddp-common");
install("reload");
install("socket-stream-client", "meteor/socket-stream-client/node.js");
install("ddp-client", "meteor/ddp-client/server/server.js");
install("underscore");
install("logging", "meteor/logging/logging.js");
install("routepolicy", "meteor/routepolicy/main.js");
install("boilerplate-generator", "meteor/boilerplate-generator/generator.js");
install("webapp-hashing");
install("webapp", "meteor/webapp/webapp_server.js");
install("autopublish");
install("ddp-server");
install("ddp");
install("allow-deny");
install("mongo-decimal", "meteor/mongo-decimal/decimal.js");
install("binary-heap", "meteor/binary-heap/binary-heap.js");
install("insecure");
install("mongo");
install("blaze-html-templates");
install("reactive-var");
install("standard-minifier-css");
install("standard-minifier-js");
install("shell-server", "meteor/shell-server/main.js");
install("livedata");
install("hot-code-push");
install("launch-screen");
install("jquery");
install("observe-sequence");
install("deps");
install("htmljs");
install("blaze");
install("ui");
install("spacebars");
install("templating-compiler");
install("templating-runtime");
install("templating");
install("autoupdate", "meteor/autoupdate/autoupdate_server.js");
///////////////////////////////////////////////////////////////////////////////////////////////////
},"process.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/modules/process.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
if (! global.process) {
try {
// The application can run `npm install process` to provide its own
// process stub; otherwise this module will provide a partial stub.
global.process = require("process");
} catch (missing) {
global.process = {};
}
}
var proc = global.process;
if (Meteor.isServer) {
// Make require("process") work on the server in all versions of Node.
meteorInstall({
node_modules: {
"process.js": function (r, e, module) {
module.exports = proc;
}
}
});
} else {
proc.platform = "browser";
proc.nextTick = proc.nextTick || Meteor._setImmediate;
}
if (typeof proc.env !== "object") {
proc.env = {};
}
var hasOwn = Object.prototype.hasOwnProperty;
for (var key in meteorEnv) {
if (hasOwn.call(meteorEnv, key)) {
proc.env[key] = meteorEnv[key];
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
},"reify.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/modules/reify.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
require("reify/lib/runtime").enable(
module.constructor.prototype
);
///////////////////////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"reify":{"lib":{"runtime":{"index.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/modules/node_modules/reify/lib/runtime/index.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////////////////////
}}}}}}}}},{
"extensions": [
".js",
".json"
]
});
meteorInstall({"node_modules":{"@babel":{"runtime":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/@babel/runtime/package.json //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////////////////////
},"helpers":{"interopRequireDefault.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/@babel/runtime/helpers/interopRequireDefault.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////////////////////
},"objectSpread.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/@babel/runtime/helpers/objectSpread.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////////////////////
}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/modules/server.js");
/* Exports */
Package._define("modules", exports, {
meteorInstall: meteorInstall
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var EJSON = Package.ejson.EJSON;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Decimal;
var require = meteorInstall({"node_modules":{"meteor":{"mongo-decimal":{"decimal.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////
// //
// packages/mongo-decimal/decimal.js //
// //
///////////////////////////////////////////////////////////////////////
//
module.export({
Decimal: () => Decimal
});
let EJSON;
module.link("meteor/ejson", {
EJSON(v) {
EJSON = v;
}
}, 0);
let Decimal;
module.link("decimal.js", {
Decimal(v) {
Decimal = v;
}
}, 1);
Decimal.prototype.typeName = function () {
return 'Decimal';
};
Decimal.prototype.toJSONValue = function () {
return this.toJSON();
};
Decimal.prototype.clone = function () {
return Decimal(this.toString());
};
EJSON.addType('Decimal', function (str) {
return Decimal(str);
});
///////////////////////////////////////////////////////////////////////
},"node_modules":{"decimal.js":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/mongo-decimal/node_modules/decimal.js/package //
// //
///////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "decimal.js",
"version": "10.0.2",
"main": "decimal"
};
///////////////////////////////////////////////////////////////////////
},"decimal.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/mongo-decimal/node_modules/decimal.js/decimal //
// //
///////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////
}}}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/mongo-decimal/decimal.js");
/* Exports */
Package._define("mongo-decimal", exports, {
Decimal: Decimal
});
})();
//# sourceURL=meteor://💻app/packages/mongo-decimal.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvbW9uZ28tZGVjaW1hbC9kZWNpbWFsLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydCIsIkRlY2ltYWwiLCJFSlNPTiIsImxpbmsiLCJ2IiwicHJvdG90eXBlIiwidHlwZU5hbWUiLCJ0b0pTT05WYWx1ZSIsInRvSlNPTiIsImNsb25lIiwidG9TdHJpbmciLCJhZGRUeXBlIiwic3RyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDQyxTQUFPLEVBQUMsTUFBSUE7QUFBYixDQUFkO0FBQXFDLElBQUlDLEtBQUo7QUFBVUgsTUFBTSxDQUFDSSxJQUFQLENBQVksY0FBWixFQUEyQjtBQUFDRCxPQUFLLENBQUNFLENBQUQsRUFBRztBQUFDRixTQUFLLEdBQUNFLENBQU47QUFBUTs7QUFBbEIsQ0FBM0IsRUFBK0MsQ0FBL0M7QUFBa0QsSUFBSUgsT0FBSjtBQUFZRixNQUFNLENBQUNJLElBQVAsQ0FBWSxZQUFaLEVBQXlCO0FBQUNGLFNBQU8sQ0FBQ0csQ0FBRCxFQUFHO0FBQUNILFdBQU8sR0FBQ0csQ0FBUjtBQUFVOztBQUF0QixDQUF6QixFQUFpRCxDQUFqRDs7QUFHN0dILE9BQU8sQ0FBQ0ksU0FBUixDQUFrQkMsUUFBbEIsR0FBNkIsWUFBVztBQUN0QyxTQUFPLFNBQVA7QUFDRCxDQUZEOztBQUlBTCxPQUFPLENBQUNJLFNBQVIsQ0FBa0JFLFdBQWxCLEdBQWdDLFlBQVk7QUFDMUMsU0FBTyxLQUFLQyxNQUFMLEVBQVA7QUFDRCxDQUZEOztBQUlBUCxPQUFPLENBQUNJLFNBQVIsQ0FBa0JJLEtBQWxCLEdBQTBCLFlBQVk7QUFDcEMsU0FBT1IsT0FBTyxDQUFDLEtBQUtTLFFBQUwsRUFBRCxDQUFkO0FBQ0QsQ0FGRDs7QUFJQVIsS0FBSyxDQUFDUyxPQUFOLENBQWMsU0FBZCxFQUF5QixVQUFVQyxHQUFWLEVBQWU7QUFDdEMsU0FBT1gsT0FBTyxDQUFDVyxHQUFELENBQWQ7QUFDRCxDQUZELEUiLCJmaWxlIjoiL3BhY2thZ2VzL21vbmdvLWRlY2ltYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFSlNPTiB9IGZyb20gJ21ldGVvci9lanNvbic7XG5pbXBvcnQgeyBEZWNpbWFsIH0gZnJvbSAnZGVjaW1hbC5qcyc7XG5cbkRlY2ltYWwucHJvdG90eXBlLnR5cGVOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnRGVjaW1hbCc7XG59O1xuXG5EZWNpbWFsLnByb3RvdHlwZS50b0pTT05WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9KU09OKCk7XG59O1xuXG5EZWNpbWFsLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIERlY2ltYWwodGhpcy50b1N0cmluZygpKTtcbn07XG5cbkVKU09OLmFkZFR5cGUoJ0RlY2ltYWwnLCBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBEZWNpbWFsKHN0cik7XG59KTtcblxuZXhwb3J0IHsgRGVjaW1hbCB9O1xuIl19
{"version":3,"sources":["meteor://💻app/packages/mongo-decimal/decimal.js"],"names":["module","export","Decimal","EJSON","link","v","prototype","typeName","toJSONValue","toJSON","clone","toString","addType","str"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAAA,MAAM,CAACC,MAAP,CAAc;AAACC,SAAO,EAAC,MAAIA;AAAb,CAAd;AAAqC,IAAIC,KAAJ;AAAUH,MAAM,CAACI,IAAP,CAAY,cAAZ,EAA2B;AAACD,OAAK,CAACE,CAAD,EAAG;AAACF,SAAK,GAACE,CAAN;AAAQ;;AAAlB,CAA3B,EAA+C,CAA/C;AAAkD,IAAIH,OAAJ;AAAYF,MAAM,CAACI,IAAP,CAAY,YAAZ,EAAyB;AAACF,SAAO,CAACG,CAAD,EAAG;AAACH,WAAO,GAACG,CAAR;AAAU;;AAAtB,CAAzB,EAAiD,CAAjD;;AAG7GH,OAAO,CAACI,SAAR,CAAkBC,QAAlB,GAA6B,YAAW;AACtC,SAAO,SAAP;AACD,CAFD;;AAIAL,OAAO,CAACI,SAAR,CAAkBE,WAAlB,GAAgC,YAAY;AAC1C,SAAO,KAAKC,MAAL,EAAP;AACD,CAFD;;AAIAP,OAAO,CAACI,SAAR,CAAkBI,KAAlB,GAA0B,YAAY;AACpC,SAAOR,OAAO,CAAC,KAAKS,QAAL,EAAD,CAAd;AACD,CAFD;;AAIAR,KAAK,CAACS,OAAN,CAAc,SAAd,EAAyB,UAAUC,GAAV,EAAe;AACtC,SAAOX,OAAO,CAACW,GAAD,CAAd;AACD,CAFD,E","file":"/packages/mongo-decimal.js","sourcesContent":["import { EJSON } from 'meteor/ejson';\nimport { Decimal } from 'decimal.js';\n\nDecimal.prototype.typeName = function() {\n return 'Decimal';\n};\n\nDecimal.prototype.toJSONValue = function () {\n return this.toJSON();\n};\n\nDecimal.prototype.clone = function () {\n return Decimal(this.toString());\n};\n\nEJSON.addType('Decimal', function (str) {\n return Decimal(str);\n});\n\nexport { Decimal };\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var EJSON = Package.ejson.EJSON;
var IdMap = Package['id-map'].IdMap;
var Random = Package.random.Random;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var hexString, MongoID;
var require = meteorInstall({"node_modules":{"meteor":{"mongo-id":{"id.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/mongo-id/id.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
MongoID: () => MongoID
});
let EJSON;
module.link("meteor/ejson", {
EJSON(v) {
EJSON = v;
}
}, 0);
let Random;
module.link("meteor/random", {
Random(v) {
Random = v;
}
}, 1);
const MongoID = {};
MongoID._looksLikeObjectID = str => str.length === 24 && str.match(/^[0-9a-f]*$/);
MongoID.ObjectID = class ObjectID {
constructor(hexString) {
//random-based impl of Mongo ObjectID
if (hexString) {
hexString = hexString.toLowerCase();
if (!MongoID._looksLikeObjectID(hexString)) {
throw new Error('Invalid hexadecimal string for creating an ObjectID');
} // meant to work with _.isEqual(), which relies on structural equality
this._str = hexString;
} else {
this._str = Random.hexString(24);
}
}
equals(other) {
return other instanceof MongoID.ObjectID && this.valueOf() === other.valueOf();
}
toString() {
return `ObjectID("${this._str}")`;
}
clone() {
return new MongoID.ObjectID(this._str);
}
typeName() {
return 'oid';
}
getTimestamp() {
return Number.parseInt(this._str.substr(0, 8), 16);
}
valueOf() {
return this._str;
}
toJSONValue() {
return this.valueOf();
}
toHexString() {
return this.valueOf();
}
};
EJSON.addType('oid', str => new MongoID.ObjectID(str));
MongoID.idStringify = id => {
if (id instanceof MongoID.ObjectID) {
return id.valueOf();
} else if (typeof id === 'string') {
if (id === '') {
return id;
} else if (id.startsWith('-') || // escape previously dashed strings
id.startsWith('~') || // escape escaped numbers, true, false
MongoID._looksLikeObjectID(id) || // escape object-id-form strings
id.startsWith('{')) {
// escape object-form strings, for maybe implementing later
return `-${id}`;
} else {
return id; // other strings go through unchanged.
}
} else if (id === undefined) {
return '-';
} else if (typeof id === 'object' && id !== null) {
throw new Error('Meteor does not currently support objects other than ObjectID as ids');
} else {
// Numbers, true, false, null
return `~${JSON.stringify(id)}`;
}
};
MongoID.idParse = id => {
if (id === '') {
return id;
} else if (id === '-') {
return undefined;
} else if (id.startsWith('-')) {
return id.substr(1);
} else if (id.startsWith('~')) {
return JSON.parse(id.substr(1));
} else if (MongoID._looksLikeObjectID(id)) {
return new MongoID.ObjectID(id);
} else {
return id;
}
};
///////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/mongo-id/id.js");
/* Exports */
Package._define("mongo-id", exports, {
MongoID: MongoID
});
})();
//# sourceURL=meteor://💻app/packages/mongo-id.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvbW9uZ28taWQvaWQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0IiwiTW9uZ29JRCIsIkVKU09OIiwibGluayIsInYiLCJSYW5kb20iLCJfbG9va3NMaWtlT2JqZWN0SUQiLCJzdHIiLCJsZW5ndGgiLCJtYXRjaCIsIk9iamVjdElEIiwiY29uc3RydWN0b3IiLCJoZXhTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsIkVycm9yIiwiX3N0ciIsImVxdWFscyIsIm90aGVyIiwidmFsdWVPZiIsInRvU3RyaW5nIiwiY2xvbmUiLCJ0eXBlTmFtZSIsImdldFRpbWVzdGFtcCIsIk51bWJlciIsInBhcnNlSW50Iiwic3Vic3RyIiwidG9KU09OVmFsdWUiLCJ0b0hleFN0cmluZyIsImFkZFR5cGUiLCJpZFN0cmluZ2lmeSIsImlkIiwic3RhcnRzV2l0aCIsInVuZGVmaW5lZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJpZFBhcnNlIiwicGFyc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ0MsU0FBTyxFQUFDLE1BQUlBO0FBQWIsQ0FBZDtBQUFxQyxJQUFJQyxLQUFKO0FBQVVILE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLGNBQVosRUFBMkI7QUFBQ0QsT0FBSyxDQUFDRSxDQUFELEVBQUc7QUFBQ0YsU0FBSyxHQUFDRSxDQUFOO0FBQVE7O0FBQWxCLENBQTNCLEVBQStDLENBQS9DO0FBQWtELElBQUlDLE1BQUo7QUFBV04sTUFBTSxDQUFDSSxJQUFQLENBQVksZUFBWixFQUE0QjtBQUFDRSxRQUFNLENBQUNELENBQUQsRUFBRztBQUFDQyxVQUFNLEdBQUNELENBQVA7QUFBUzs7QUFBcEIsQ0FBNUIsRUFBa0QsQ0FBbEQ7QUFHNUcsTUFBTUgsT0FBTyxHQUFHLEVBQWhCOztBQUVBQSxPQUFPLENBQUNLLGtCQUFSLEdBQTZCQyxHQUFHLElBQUlBLEdB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QW1CLEVBQTlCO0FBQ0Q7QUFDRixDQXJCRDs7QUF1QkE3QixPQUFPLENBQUNrQyxPQUFSLEdBQW1CTCxFQUFELElBQVE7QUFDeEIsTUFBSUEsRUFBRSxLQUFLLEVBQVgsRUFBZTtBQUNiLFdBQU9BLEVBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUEsRUFBRSxLQUFLLEdBQVgsRUFBZ0I7QUFDckIsV0FBT0UsU0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJRixFQUFFLENBQUNDLFVBQUgsQ0FBYyxHQUFkLENBQUosRUFBd0I7QUFDN0IsV0FBT0QsRUFBRSxDQUFDTCxNQUFILENBQVUsQ0FBVixDQUFQO0FBQ0QsR0FGTSxNQUVBLElBQUlLLEVBQUUsQ0FBQ0MsVUFBSCxDQUFjLEdBQWQsQ0FBSixFQUF3QjtBQUM3QixXQUFPRSxJQUFJLENBQUNHLEtBQUwsQ0FBV04sRUFBRSxDQUFDTCxNQUFILENBQVUsQ0FBVixDQUFYLENBQVA7QUFDRCxHQUZNLE1BRUEsSUFBSXhCLE9BQU8sQ0FBQ0ssa0JBQVIsQ0FBMkJ3QixFQUEzQixDQUFKLEVBQW9DO0FBQ3pDLFdBQU8sSUFBSTdCLE9BQU8sQ0FBQ1MsUUFBWixDQUFxQm9CLEVBQXJCLENBQVA7QUFDRCxHQUZNLE1BRUE7QUFDTCxXQUFPQSxFQUFQO0FBQ0Q7QUFDRixDQWRELEMiLCJmaWxlIjoiL3BhY2thZ2VzL21vbmdvLWlkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRUpTT04gfSBmcm9tICdtZXRlb3IvZWpzb24nO1xuaW1wb3J0IHsgUmFuZG9tIH0gZnJvbSAnbWV0ZW9yL3JhbmRvbSc7XG5cbmNvbnN0IE1vbmdvSUQgPSB7fTtcblxuTW9uZ29JRC5fbG9va3NMaWtlT2JqZWN0SUQgPSBzdHIgPT4gc3RyLmxlbmd0aCA9PT0gMjQgJiYgc3RyLm1hdGNoKC9eWzAtOWEtZl0qJC8pO1xuXG5Nb25nb0lELk9iamVjdElEID0gY2xhc3MgT2JqZWN0SUQge1xuICBjb25zdHJ1Y3RvciAoaGV4U3RyaW5nKSB7XG4gICAgLy9yYW5kb20tYmFzZWQgaW1wbCBvZiBNb25nbyBPYmplY3RJRFxuICAgIGlmIChoZXhTdHJpbmcpIHtcbiAgICAgIGhleFN0cmluZyA9IGhleFN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFNb25nb0lELl9sb29rc0xpa2VPYmplY3RJRChoZXhTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXhhZGVjaW1hbCBzdHJpbmcgZm9yIGNyZWF0aW5nIGFuIE9iamVjdElEJyk7XG4gICAgICB9XG4gICAgICAvLyBtZWFudCB0byB3b3JrIHdpdGggXy5pc0VxdWFsKCksIHdoaWNoIHJlbGllcyBvbiBzdHJ1Y3R1cmFsIGVxdWFsaXR5XG4gICAgICB0aGlzLl9zdHIgPSBoZXhTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0ciA9IFJhbmRvbS5oZXhTdHJpbmcoMjQpO1xuICAgIH1cbiAgfVxuXG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE1vbmdvSUQuT2JqZWN0SUQgJiZcbiAgICB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPYmplY3RJRChcIiR7dGhpcy5fc3RyfVwiKWA7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IE1vbmdvSUQuT2JqZWN0SUQodGhpcy5fc3RyKTtcbiAgfVxuXG4gIHR5cGVOYW1lKCkge1xuICAgIHJldHVybiAnb2lkJztcbiAgfVxuICBcbiAgZ2V0VGltZXN0YW1wKCkge1xuICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQodGhpcy5fc3RyLnN1YnN0cigwLCA4KSwgMTYpO1xuICB9XG5cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyO1xuICB9XG5cbiAgdG9KU09OVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVPZigpO1xuICB9XG5cbiAgdG9IZXhTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVPZigpO1xuICB9XG5cbn1cblxuRUpTT04uYWRkVHlwZSgnb2lkJywgc3RyID0+IG5ldyBNb25nb0lELk9iamVjdElEKHN0cikpO1xuXG5Nb25nb0lELmlkU3RyaW5naWZ5ID0gKGlkKSA9PiB7XG4gIGlmIChpZCBpbnN0YW5jZW9mIE1vbmdvSUQuT2JqZWN0SUQpIHtcbiAgICByZXR1cm4gaWQudmFsdWVPZigpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoaWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSBlbHNlIGlmIChpZC5zdGFydHNXaXRoKCctJykgfHwgLy8gZXNjYXBlIHByZXZpb3VzbHkgZGFzaGVkIHN0cmluZ3NcbiAgICAgICAgICAgICAgIGlkLnN0YXJ0c1dpdGgoJ34nKSB8fCAvLyBlc2NhcGUgZXNjYXBlZCBudW1iZXJzLCB0cnVlLCBmYWxzZVxuICAgICAgICAgICAgICAgTW9uZ29JRC5fbG9va3NMaWtlT2JqZWN0SUQoaWQpIHx8IC8vIGVzY2FwZSBvYmplY3QtaWQtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgICAgICBpZC5zdGFydHNXaXRoKCd7JykpIHsgLy8gZXNjYXBlIG9iamVjdC1mb3JtIHN0cmluZ3MsIGZvciBtYXliZSBpbXBsZW1lbnRpbmcgbGF0ZXJcbiAgICAgIHJldHVybiBgLSR7aWR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlkOyAvLyBvdGhlciBzdHJpbmdzIGdvIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgIH1cbiAgfSBlbHNlIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICctJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnICYmIGlkICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRlb3IgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgb2JqZWN0cyBvdGhlciB0aGFuIE9iamVjdElEIGFzIGlkcycpO1xuICB9IGVsc2UgeyAvLyBOdW1iZXJzLCB0cnVlLCBmYWxzZSwgbnVsbFxuICAgIHJldHVybiBgfiR7SlNPTi5zdHJpbmdpZnkoaWQpfWA7XG4gIH1cbn07XG5cbk1vbmdvSUQuaWRQYXJzZSA9IChpZCkgPT4ge1xuICBpZiAoaWQgPT09ICcnKSB7XG4gICAgcmV0dXJuIGlkO1xuICB9IGVsc2UgaWYgKGlkID09PSAnLScpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKGlkLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIHJldHVybiBpZC5zdWJzdHIoMSk7XG4gIH0gZWxzZSBpZiAoaWQuc3RhcnRzV2l0aCgnficpKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoaWQuc3Vic3RyKDEpKTtcbiAgfSBlbHNlIGlmIChNb25nb0lELl9sb29rc0xpa2VPYmplY3RJRChpZCkpIHtcbiAgICByZXR1cm4gbmV3IE1vbmdvSUQuT2JqZWN0SUQoaWQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpZDtcbiAgfVxufTtcblxuZXhwb3J0IHsgTW9uZ29JRCB9O1xuIl19
{"version":3,"sources":["meteor://💻app/packages/mongo-id/id.js"],"names":["module","export","MongoID","EJSON","link","v","Random","_looksLikeObjectID","str","length","match","ObjectID","constructor","hexString","toLowerCase","Error","_str","equals","other","valueOf","toString","clone","typeName","getTimestamp","Number","parseInt","substr","toJSONValue","toHexString","addType","idStringify","id","startsWith","undefined","JSON","stringify","idParse","parse"],"mappings":"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","file":"/packages/mongo-id.js","sourcesContent":["import { EJSON } from 'meteor/ejson';\nimport { Random } from 'meteor/random';\n\nconst MongoID = {};\n\nMongoID._looksLikeObjectID = str => str.length === 24 && str.match(/^[0-9a-f]*$/);\n\nMongoID.ObjectID = class ObjectID {\n constructor (hexString) {\n //random-based impl of Mongo ObjectID\n if (hexString) {\n hexString = hexString.toLowerCase();\n if (!MongoID._looksLikeObjectID(hexString)) {\n throw new Error('Invalid hexadecimal string for creating an ObjectID');\n }\n // meant to work with _.isEqual(), which relies on structural equality\n this._str = hexString;\n } else {\n this._str = Random.hexString(24);\n }\n }\n\n equals(other) {\n return other instanceof MongoID.ObjectID &&\n this.valueOf() === other.valueOf();\n }\n\n toString() {\n return `ObjectID(\"${this._str}\")`;\n }\n\n clone() {\n return new MongoID.ObjectID(this._str);\n }\n\n typeName() {\n return 'oid';\n }\n \n getTimestamp() {\n return Number.parseInt(this._str.substr(0, 8), 16);\n }\n\n valueOf() {\n return this._str;\n }\n\n toJSONValue() {\n return this.valueOf();\n }\n\n toHexString() {\n return this.valueOf();\n }\n\n}\n\nEJSON.addType('oid', str => new MongoID.ObjectID(str));\n\nMongoID.idStringify = (id) => {\n if (id instanceof MongoID.ObjectID) {\n return id.valueOf();\n } else if (typeof id === 'string') {\n if (id === '') {\n return id;\n } else if (id.startsWith('-') || // escape previously dashed strings\n id.startsWith('~') || // escape escaped numbers, true, false\n MongoID._looksLikeObjectID(id) || // escape object-id-form strings\n id.startsWith('{')) { // escape object-form strings, for maybe implementing later\n return `-${id}`;\n } else {\n return id; // other strings go through unchanged.\n }\n } else if (id === undefined) {\n return '-';\n } else if (typeof id === 'object' && id !== null) {\n throw new Error('Meteor does not currently support objects other than ObjectID as ids');\n } else { // Numbers, true, false, null\n return `~${JSON.stringify(id)}`;\n }\n};\n\nMongoID.idParse = (id) => {\n if (id === '') {\n return id;\n } else if (id === '-') {\n return undefined;\n } else if (id.startsWith('-')) {\n return id.substr(1);\n } else if (id.startsWith('~')) {\n return JSON.parse(id.substr(1));\n } else if (MongoID._looksLikeObjectID(id)) {\n return new MongoID.ObjectID(id);\n } else {\n return id;\n }\n};\n\nexport { MongoID };\n"]}
\ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
/* Package-scope variables */
var NpmModuleMongodb, NpmModuleMongodbVersion;
(function(){
/////////////////////////////////////////////////////////////////////////////
// //
// packages/npm-mongo/wrapper.js //
// //
/////////////////////////////////////////////////////////////////////////////
//
const oldNoDeprecationValue = process.noDeprecation;
try {
// Silence deprecation warnings introduced in a patch update to mongodb:
// https://github.com/meteor/meteor/pull/9942#discussion_r218564879
process.noDeprecation = true;
NpmModuleMongodb = Npm.require('mongodb');
} finally {
process.noDeprecation = oldNoDeprecationValue;
}
NpmModuleMongodbVersion = Npm.require('mongodb/package.json').version;
/////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("npm-mongo", {
NpmModuleMongodb: NpmModuleMongodb,
NpmModuleMongodbVersion: NpmModuleMongodbVersion
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
var MongoID = Package['mongo-id'].MongoID;
var DiffSequence = Package['diff-sequence'].DiffSequence;
var _ = Package.underscore._;
var Random = Package.random.Random;
/* Package-scope variables */
var ObserveSequence, seqChangedToEmpty, seqChangedToArray, seqChangedToCursor;
(function(){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/observe-sequence/observe_sequence.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
var warn = function () {
if (ObserveSequence._suppressWarnings) {
ObserveSequence._suppressWarnings--;
} else {
if (typeof console !== 'undefined' && console.warn)
console.warn.apply(console, arguments);
ObserveSequence._loggedWarnings++;
}
};
// isArray returns true for arrays of these types:
// standard arrays: instanceof Array === true, _.isArray(arr) === true
// vm generated arrays: instanceOf Array === false, _.isArray(arr) === true
// subclassed arrays: instanceof Array === true, _.isArray(arr) === false
// see specific tests
function isArray(arr) {
return arr instanceof Array || _.isArray(arr);
}
var idStringify = MongoID.idStringify;
var idParse = MongoID.idParse;
ObserveSequence = {
_suppressWarnings: 0,
_loggedWarnings: 0,
// A mechanism similar to cursor.observe which receives a reactive
// function returning a sequence type and firing appropriate callbacks
// when the value changes.
//
// @param sequenceFunc {Function} a reactive function returning a
// sequence type. The currently supported sequence types are:
// Array, Cursor, and null.
//
// @param callbacks {Object} similar to a specific subset of
// callbacks passed to `cursor.observe`
// (http://docs.meteor.com/#observe), with minor variations to
// support the fact that not all sequences contain objects with
// _id fields. Specifically:
//
// * addedAt(id, item, atIndex, beforeId)
// * changedAt(id, newItem, oldItem, atIndex)
// * removedAt(id, oldItem, atIndex)
// * movedTo(id, item, fromIndex, toIndex, beforeId)
//
// @returns {Object(stop: Function)} call 'stop' on the return value
// to stop observing this sequence function.
//
// We don't make any assumptions about our ability to compare sequence
// elements (ie, we don't assume EJSON.equals works; maybe there is extra
// state/random methods on the objects) so unlike cursor.observe, we may
// sometimes call changedAt() when nothing actually changed.
// XXX consider if we *can* make the stronger assumption and avoid
// no-op changedAt calls (in some cases?)
//
// XXX currently only supports the callbacks used by our
// implementation of {{#each}}, but this can be expanded.
//
// XXX #each doesn't use the indices (though we'll eventually need
// a way to get them when we support `@index`), but calling
// `cursor.observe` causes the index to be calculated on every
// callback using a linear scan (unless you turn it off by passing
// `_no_indices`). Any way to avoid calculating indices on a pure
// cursor observe like we used to?
observe: function (sequenceFunc, callbacks) {
var lastSeq = null;
var activeObserveHandle = null;
// 'lastSeqArray' contains the previous value of the sequence
// we're observing. It is an array of objects with '_id' and
// 'item' fields. 'item' is the element in the array, or the
// document in the cursor.
//
// '_id' is whichever of the following is relevant, unless it has
// already appeared -- in which case it's randomly generated.
//
// * if 'item' is an object:
// * an '_id' field, if present
// * otherwise, the index in the array
//
// * if 'item' is a number or string, use that value
//
// XXX this can be generalized by allowing {{#each}} to accept a
// general 'key' argument which could be a function, a dotted
// field name, or the special @index value.
var lastSeqArray = []; // elements are objects of form {_id, item}
var computation = Tracker.autorun(function () {
var seq = sequenceFunc();
Tracker.nonreactive(function () {
var seqArray; // same structure as `lastSeqArray` above.
if (activeObserveHandle) {
// If we were previously observing a cursor, replace lastSeqArray with
// more up-to-date information. Then stop the old observe.
lastSeqArray = _.map(lastSeq.fetch(), function (doc) {
return {_id: doc._id, item: doc};
});
activeObserveHandle.stop();
activeObserveHandle = null;
}
if (!seq) {
seqArray = seqChangedToEmpty(lastSeqArray, callbacks);
} else if (isArray(seq)) {
seqArray = seqChangedToArray(lastSeqArray, seq, callbacks);
} else if (isStoreCursor(seq)) {
var result /* [seqArray, activeObserveHandle] */ =
seqChangedToCursor(lastSeqArray, seq, callbacks);
seqArray = result[0];
activeObserveHandle = result[1];
} else {
throw badSequenceError();
}
diffArray(lastSeqArray, seqArray, callbacks);
lastSeq = seq;
lastSeqArray = seqArray;
});
});
return {
stop: function () {
computation.stop();
if (activeObserveHandle)
activeObserveHandle.stop();
}
};
},
// Fetch the items of `seq` into an array, where `seq` is of one of the
// sequence types accepted by `observe`. If `seq` is a cursor, a
// dependency is established.
fetch: function (seq) {
if (!seq) {
return [];
} else if (isArray(seq)) {
return seq;
} else if (isStoreCursor(seq)) {
return seq.fetch();
} else {
throw badSequenceError();
}
}
};
var badSequenceError = function () {
return new Error("{{#each}} currently only accepts " +
"arrays, cursors or falsey values.");
};
var isStoreCursor = function (cursor) {
return cursor && _.isObject(cursor) &&
_.isFunction(cursor.observe) && _.isFunction(cursor.fetch);
};
// Calculates the differences between `lastSeqArray` and
// `seqArray` and calls appropriate functions from `callbacks`.
// Reuses Minimongo's diff algorithm implementation.
var diffArray = function (lastSeqArray, seqArray, callbacks) {
var diffFn = Package['diff-sequence'].DiffSequence.diffQueryOrderedChanges;
var oldIdObjects = [];
var newIdObjects = [];
var posOld = {}; // maps from idStringify'd ids
var posNew = {}; // ditto
var posCur = {};
var lengthCur = lastSeqArray.length;
_.each(seqArray, function (doc, i) {
newIdObjects.push({_id: doc._id});
posNew[idStringify(doc._id)] = i;
});
_.each(lastSeqArray, function (doc, i) {
oldIdObjects.push({_id: doc._id});
posOld[idStringify(doc._id)] = i;
posCur[idStringify(doc._id)] = i;
});
// Arrays can contain arbitrary objects. We don't diff the
// objects. Instead we always fire 'changedAt' callback on every
// object. The consumer of `observe-sequence` should deal with
// it appropriately.
diffFn(oldIdObjects, newIdObjects, {
addedBefore: function (id, doc, before) {
var position = before ? posCur[idStringify(before)] : lengthCur;
if (before) {
// If not adding at the end, we need to update indexes.
// XXX this can still be improved greatly!
_.each(posCur, function (pos, id) {
if (pos >= position)
posCur[id]++;
});
}
lengthCur++;
posCur[idStringify(id)] = position;
callbacks.addedAt(
id,
seqArray[posNew[idStringify(id)]].item,
position,
before);
},
movedBefore: function (id, before) {
if (id === before)
return;
var oldPosition = posCur[idStringify(id)];
var newPosition = before ? posCur[idStringify(before)] : lengthCur;
// Moving the item forward. The new element is losing one position as it
// was removed from the old position before being inserted at the new
// position.
// Ex.: 0 *1* 2 3 4
// 0 2 3 *1* 4
// The original issued callback is "1" before "4".
// The position of "1" is 1, the position of "4" is 4.
// The generated move is (1) -> (3)
if (newPosition > oldPosition) {
newPosition--;
}
// Fix up the positions of elements between the old and the new positions
// of the moved element.
//
// There are two cases:
// 1. The element is moved forward. Then all the positions in between
// are moved back.
// 2. The element is moved back. Then the positions in between *and* the
// element that is currently standing on the moved element's future
// position are moved forward.
_.each(posCur, function (elCurPosition, id) {
if (oldPosition < elCurPosition && elCurPosition < newPosition)
posCur[id]--;
else if (newPosition <= elCurPosition && elCurPosition < oldPosition)
posCur[id]++;
});
// Finally, update the position of the moved element.
posCur[idStringify(id)] = newPosition;
callbacks.movedTo(
id,
seqArray[posNew[idStringify(id)]].item,
oldPosition,
newPosition,
before);
},
removed: function (id) {
var prevPosition = posCur[idStringify(id)];
_.each(posCur, function (pos, id) {
if (pos >= prevPosition)
posCur[id]--;
});
delete posCur[idStringify(id)];
lengthCur--;
callbacks.removedAt(
id,
lastSeqArray[posOld[idStringify(id)]].item,
prevPosition);
}
});
_.each(posNew, function (pos, idString) {
var id = idParse(idString);
if (_.has(posOld, idString)) {
// specifically for primitive types, compare equality before
// firing the 'changedAt' callback. otherwise, always fire it
// because doing a deep EJSON comparison is not guaranteed to
// work (an array can contain arbitrary objects, and 'transform'
// can be used on cursors). also, deep diffing is not
// necessarily the most efficient (if only a specific subfield
// of the object is later accessed).
var newItem = seqArray[pos].item;
var oldItem = lastSeqArray[posOld[idString]].item;
if (typeof newItem === 'object' || newItem !== oldItem)
callbacks.changedAt(id, newItem, oldItem, pos);
}
});
};
seqChangedToEmpty = function (lastSeqArray, callbacks) {
return [];
};
seqChangedToArray = function (lastSeqArray, array, callbacks) {
var idsUsed = {};
var seqArray = _.map(array, function (item, index) {
var id;
if (typeof item === 'string') {
// ensure not empty, since other layers (eg DomRange) assume this as well
id = "-" + item;
} else if (typeof item === 'number' ||
typeof item === 'boolean' ||
item === undefined ||
item === null) {
id = item;
} else if (typeof item === 'object') {
id = (item && ('_id' in item)) ? item._id : index;
} else {
throw new Error("{{#each}} doesn't support arrays with " +
"elements of type " + typeof item);
}
var idString = idStringify(id);
if (idsUsed[idString]) {
if (item && typeof item === 'object' && '_id' in item)
warn("duplicate id " + id + " in", array);
id = Random.id();
} else {
idsUsed[idString] = true;
}
return { _id: id, item: item };
});
return seqArray;
};
seqChangedToCursor = function (lastSeqArray, cursor, callbacks) {
var initial = true; // are we observing initial data from cursor?
var seqArray = [];
var observeHandle = cursor.observe({
addedAt: function (document, atIndex, before) {
if (initial) {
// keep track of initial data so that we can diff once
// we exit `observe`.
if (before !== null)
throw new Error("Expected initial data from observe in order");
seqArray.push({ _id: document._id, item: document });
} else {
callbacks.addedAt(document._id, document, atIndex, before);
}
},
changedAt: function (newDocument, oldDocument, atIndex) {
callbacks.changedAt(newDocument._id, newDocument, oldDocument,
atIndex);
},
removedAt: function (oldDocument, atIndex) {
callbacks.removedAt(oldDocument._id, oldDocument, atIndex);
},
movedTo: function (document, fromIndex, toIndex, before) {
callbacks.movedTo(
document._id, document, fromIndex, toIndex, before);
}
});
initial = false;
return [seqArray, observeHandle];
};
///////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("observe-sequence", {
ObserveSequence: ObserveSequence
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var OrderedDict;
var require = meteorInstall({"node_modules":{"meteor":{"ordered-dict":{"ordered_dict.js":function(require,exports,module){
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/ordered-dict/ordered_dict.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
OrderedDict: () => OrderedDict
});
// This file defines an ordered dictionary abstraction that is useful for
// maintaining a dataset backed by observeChanges. It supports ordering items
// by specifying the item they now come before.
// The implementation is a dictionary that contains nodes of a doubly-linked
// list as its values.
// constructs a new element struct
// next and prev are whole elements, not keys.
function element(key, value, next, prev) {
return {
key: key,
value: value,
next: next,
prev: prev
};
}
class OrderedDict {
constructor(...args) {
this._dict = Object.create(null);
this._first = null;
this._last = null;
this._size = 0;
if (typeof args[0] === 'function') {
this._stringify = args.shift();
} else {
this._stringify = function (x) {
return x;
};
}
args.forEach(kv => this.putBefore(kv[0], kv[1], null));
} // the "prefix keys with a space" thing comes from here
// https://github.com/documentcloud/underscore/issues/376#issuecomment-2815649
_k(key) {
return " " + this._stringify(key);
}
empty() {
return !this._first;
}
size() {
return this._size;
}
_linkEltIn(elt) {
if (!elt.next) {
elt.prev = this._last;
if (this._last) this._last.next = elt;
this._last = elt;
} else {
elt.prev = elt.next.prev;
elt.next.prev = elt;
if (elt.prev) elt.prev.next = elt;
}
if (this._first === null || this._first === elt.next) this._first = elt;
}
_linkEltOut(elt) {
if (elt.next) elt.next.prev = elt.prev;
if (elt.prev) elt.prev.next = elt.next;
if (elt === this._last) this._last = elt.prev;
if (elt === this._first) this._first = elt.next;
}
putBefore(key, item, before) {
if (this._dict[this._k(key)]) throw new Error("Item " + key + " already present in OrderedDict");
var elt = before ? element(key, item, this._dict[this._k(before)]) : element(key, item, null);
if (typeof elt.next === "undefined") throw new Error("could not find item to put this one before");
this._linkEltIn(elt);
this._dict[this._k(key)] = elt;
this._size++;
}
append(key, item) {
this.putBefore(key, item, null);
}
remove(key) {
var elt = this._dict[this._k(key)];
if (typeof elt === "undefined") throw new Error("Item " + key + " not present in OrderedDict");
this._linkEltOut(elt);
this._size--;
delete this._dict[this._k(key)];
return elt.value;
}
get(key) {
if (this.has(key)) {
return this._dict[this._k(key)].value;
}
}
has(key) {
return Object.prototype.hasOwnProperty.call(this._dict, this._k(key));
} // Iterate through the items in this dictionary in order, calling
// iter(value, key, index) on each one.
// Stops whenever iter returns OrderedDict.BREAK, or after the last element.
forEach(iter, context = null) {
var i = 0;
var elt = this._first;
while (elt !== null) {
var b = iter.call(context, elt.value, elt.key, i);
if (b === OrderedDict.BREAK) return;
elt = elt.next;
i++;
}
}
first() {
if (this.empty()) {
return;
}
return this._first.key;
}
firstValue() {
if (this.empty()) {
return;
}
return this._first.value;
}
last() {
if (this.empty()) {
return;
}
return this._last.key;
}
lastValue() {
if (this.empty()) {
return;
}
return this._last.value;
}
prev(key) {
if (this.has(key)) {
var elt = this._dict[this._k(key)];
if (elt.prev) return elt.prev.key;
}
return null;
}
next(key) {
if (this.has(key)) {
var elt = this._dict[this._k(key)];
if (elt.next) return elt.next.key;
}
return null;
}
moveBefore(key, before) {
var elt = this._dict[this._k(key)];
var eltBefore = before ? this._dict[this._k(before)] : null;
if (typeof elt === "undefined") {
throw new Error("Item to move is not present");
}
if (typeof eltBefore === "undefined") {
throw new Error("Could not find element to move this one before");
}
if (eltBefore === elt.next) // no moving necessary
return; // remove from its old place
this._linkEltOut(elt); // patch into its new place
elt.next = eltBefore;
this._linkEltIn(elt);
} // Linear, sadly.
indexOf(key) {
var ret = null;
this.forEach((v, k, i) => {
if (this._k(k) === this._k(key)) {
ret = i;
return OrderedDict.BREAK;
}
return;
});
return ret;
}
_checkRep() {
Object.keys(this._dict).forEach(k => {
const v = this._dict[k];
if (v.next === v) {
throw new Error("Next is a loop");
}
if (v.prev === v) {
throw new Error("Prev is a loop");
}
});
}
}
OrderedDict.BREAK = {
"break": true
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/ordered-dict/ordered_dict.js");
/* Exports */
Package._define("ordered-dict", exports, {
OrderedDict: OrderedDict
});
})();
//# sourceURL=meteor://💻app/packages/ordered-dict.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvb3JkZXJlZC1kaWN0L29yZGVyZWRfZGljdC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnQiLCJPcmRlcmVkRGljdCIsImVsZW1lbnQiLCJrZXkiLCJ2YWx1ZSIsIm5leHQiLCJwcmV2IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RpY3QiLCJPYmplY3QiLCJjcmVhdGUiLCJfZmlyc3QiLCJfbGFzdCIsIl9zaXplIiwiX3N0cmluZ2lmeSIsInNoaWZ0IiwieCIsImZvckVhY2giLCJrdiIsInB1dEJlZm9yZSIsIl9rIiwiZW1wdHkiLCJzaXplIiwiX2xpbmtFbHRJbiIsImVsdCIsIl9saW5rRWx0T3V0IiwiaXRlbSIsImJlZm9yZSIsIkVycm9yIiwiYXBwZW5kIiwicmVtb3ZlIiwiZ2V0IiwiaGFzIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlciIsImNvbnRleHQiLCJpIiwiYiIsIkJSRUFLIiwiZmlyc3QiLCJmaXJzdFZhbHVlIiwibGFzdCIsImxhc3RWYWx1ZSIsIm1vdmVCZWZvcmUiLCJlbHRCZWZvcmUiLCJpbmRleE9mIiwicmV0IiwidiIsImsiLCJfY2hlY2tSZXAiLCJrZXlzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUNDLGFBQVcsRUFBQyxNQUFJQTtBQUFqQixDQUFkOztBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EsU0FBU0MsT0FBVCxDQUFpQkMsR0FBakIsRUFBc0JDLEtBQXRCLEVBQTZCQyxJQUE3QixFQUFtQ0MsSUFBbkMsRUFBeUM7QUFDdkMsU0FBTztBQUNMSCxPQUFHLEVBQUVBLEdBREE7QUFFTEMsU0FBSyxFQUFFQSxLQUZGO0FBR0xDLFFBQUksRUFBRUEsSUFIRDtBQUlMQyxRQUFJLEVBQUVBO0FBSkQsR0FBUDtBQU1EOztBQUVNLE1BQU1MLFdBQU4s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cyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIG9yZGVyZWQgZGljdGlvbmFyeSBhYnN0cmFjdGlvbiB0aGF0IGlzIHVzZWZ1bCBmb3Jcbi8vIG1haW50YWluaW5nIGEgZGF0YXNldCBiYWNrZWQgYnkgb2JzZXJ2ZUNoYW5nZXMuICBJdCBzdXBwb3J0cyBvcmRlcmluZyBpdGVtc1xuLy8gYnkgc3BlY2lmeWluZyB0aGUgaXRlbSB0aGV5IG5vdyBjb21lIGJlZm9yZS5cblxuLy8gVGhlIGltcGxlbWVudGF0aW9uIGlzIGEgZGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIG5vZGVzIG9mIGEgZG91Ymx5LWxpbmtlZFxuLy8gbGlzdCBhcyBpdHMgdmFsdWVzLlxuXG4vLyBjb25zdHJ1Y3RzIGEgbmV3IGVsZW1lbnQgc3RydWN0XG4vLyBuZXh0IGFuZCBwcmV2IGFyZSB3aG9sZSBlbGVtZW50cywgbm90IGtleXMuXG5mdW5jdGlvbiBlbGVtZW50KGtleSwgdmFsdWUsIG5leHQsIHByZXYpIHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbmV4dDogbmV4dCxcbiAgICBwcmV2OiBwcmV2XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBPcmRlcmVkRGljdCB7XG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9kaWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9maXJzdCA9IG51bGw7XG4gICAgdGhpcy5fbGFzdCA9IG51bGw7XG4gICAgdGhpcy5fc2l6ZSA9IDA7XG5cbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3N0cmluZ2lmeSA9IGFyZ3Muc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RyaW5naWZ5ID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH07XG4gICAgfVxuXG4gICAgYXJncy5mb3JFYWNoKGt2ID0+IHRoaXMucHV0QmVmb3JlKGt2WzBdLCBrdlsxXSwgbnVsbCkpO1xuICB9XG5cbiAgLy8gdGhlIFwicHJlZml4IGtleXMgd2l0aCBhIHNwYWNlXCIgdGhpbmcgY29tZXMgZnJvbSBoZXJlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2N1bWVudGNsb3VkL3VuZGVyc2NvcmUvaXNzdWVzLzM3NiNpc3N1ZWNvbW1lbnQtMjgxNTY0OVxuICBfayhrZXkpIHtcbiAgICByZXR1cm4gXCIgXCIgKyB0aGlzLl9zdHJpbmdpZnkoa2V5KTtcbiAgfVxuXG4gIGVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5fZmlyc3Q7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgX2xpbmtFbHRJbihlbHQpIHtcbiAgICBpZiAoIWVsdC5uZXh0KSB7XG4gICAgICBlbHQucHJldiA9IHRoaXMuX2xhc3Q7XG4gICAgICBpZiAodGhpcy5fbGFzdClcbiAgICAgICAgdGhpcy5fbGFzdC5uZXh0ID0gZWx0O1xuICAgICAgdGhpcy5fbGFzdCA9IGVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LnByZXYgPSBlbHQubmV4dC5wcmV2O1xuICAgICAgZWx0Lm5leHQucHJldiA9IGVsdDtcbiAgICAgIGlmIChlbHQucHJldilcbiAgICAgICAgZWx0LnByZXYubmV4dCA9IGVsdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpcnN0ID09PSBudWxsIHx8IHRoaXMuX2ZpcnN0ID09PSBlbHQubmV4dClcbiAgICAgIHRoaXMuX2ZpcnN0ID0gZWx0O1xuICB9XG5cbiAgX2xpbmtFbHRPdXQoZWx0KSB7XG4gICAgaWYgKGVsdC5uZXh0KVxuICAgICAgZWx0Lm5leHQucHJldiA9IGVsdC5wcmV2O1xuICAgIGlmIChlbHQucHJldilcbiAgICAgIGVsdC5wcmV2Lm5leHQgPSBlbHQubmV4dDtcbiAgICBpZiAoZWx0ID09PSB0aGlzLl9sYXN0KVxuICAgICAgdGhpcy5fbGFzdCA9IGVsdC5wcmV2O1xuICAgIGlmIChlbHQgPT09IHRoaXMuX2ZpcnN0KVxuICAgICAgdGhpcy5fZmlyc3QgPSBlbHQubmV4dDtcbiAgfVxuXG4gIHB1dEJlZm9yZShrZXksIGl0ZW0sIGJlZm9yZSkge1xuICAgIGlmICh0aGlzLl9kaWN0W3RoaXMuX2soa2V5KV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJdGVtIFwiICsga2V5ICsgXCIgYWxyZWFkeSBwcmVzZW50IGluIE9yZGVyZWREaWN0XCIpO1xuICAgIHZhciBlbHQgPSBiZWZvcmUgP1xuICAgICAgZWxlbWVudChrZXksIGl0ZW0sIHRoaXMuX2RpY3RbdGhpcy5fayhiZWZvcmUpXSkgOlxuICAgICAgZWxlbWVudChrZXksIGl0ZW0sIG51bGwpO1xuICAgIGlmICh0eXBlb2YgZWx0Lm5leHQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCBpdGVtIHRvIHB1dCB0aGlzIG9uZSBiZWZvcmVcIik7XG4gICAgdGhpcy5fbGlua0VsdEluKGVsdCk7XG4gICAgdGhpcy5fZGljdFt0aGlzLl9rKGtleSldID0gZWx0O1xuICAgIHRoaXMuX3NpemUrKztcbiAgfVxuXG4gIGFwcGVuZChrZXksIGl0ZW0pIHtcbiAgICB0aGlzLnB1dEJlZm9yZShrZXksIGl0ZW0sIG51bGwpO1xuICB9XG5cbiAgcmVtb3ZlKGtleSkge1xuICAgIHZhciBlbHQgPSB0aGlzLl9kaWN0W3RoaXMuX2soa2V5KV07XG4gICAgaWYgKHR5cGVvZiBlbHQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJdGVtIFwiICsga2V5ICsgXCIgbm90IHByZXNlbnQgaW4gT3JkZXJlZERpY3RcIik7XG4gICAgdGhpcy5fbGlua0VsdE91dChlbHQpO1xuICAgIHRoaXMuX3NpemUtLTtcbiAgICBkZWxldGUgdGhpcy5fZGljdFt0aGlzLl9rKGtleSldO1xuICAgIHJldHVybiBlbHQudmFsdWU7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaWN0W3RoaXMuX2soa2V5KV0udmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICB0aGlzLl9kaWN0LFxuICAgICAgdGhpcy5fayhrZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgaXRlbXMgaW4gdGhpcyBkaWN0aW9uYXJ5IGluIG9yZGVyLCBjYWxsaW5nXG4gIC8vIGl0ZXIodmFsdWUsIGtleSwgaW5kZXgpIG9uIGVhY2ggb25lLlxuXG4gIC8vIFN0b3BzIHdoZW5ldmVyIGl0ZXIgcmV0dXJucyBPcmRlcmVkRGljdC5CUkVBSywgb3IgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudC5cbiAgZm9yRWFjaChpdGVyLCBjb250ZXh0ID0gbnVsbCkge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgZWx0ID0gdGhpcy5fZmlyc3Q7XG4gICAgd2hpbGUgKGVsdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGIgPSBpdGVyLmNhbGwoY29udGV4dCwgZWx0LnZhbHVlLCBlbHQua2V5LCBpKTtcbiAgICAgIGlmIChiID09PSBPcmRlcmVkRGljdC5CUkVBSykgcmV0dXJuO1xuICAgICAgZWx0ID0gZWx0Lm5leHQ7XG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgZmlyc3QoKSB7XG4gICAgaWYgKHRoaXMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmlyc3Qua2V5O1xuICB9XG5cbiAgZmlyc3RWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5lbXB0eSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9maXJzdC52YWx1ZTtcbiAgfVxuXG4gIGxhc3QoKSB7XG4gICAgaWYgKHRoaXMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbGFzdC5rZXk7XG4gIH1cblxuICBsYXN0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbGFzdC52YWx1ZTtcbiAgfVxuXG4gIHByZXYoa2V5KSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHZhciBlbHQgPSB0aGlzLl9kaWN0W3RoaXMuX2soa2V5KV07XG4gICAgICBpZiAoZWx0LnByZXYpXG4gICAgICAgIHJldHVybiBlbHQucHJldi5rZXk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbmV4dChrZXkpIHtcbiAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgdmFyIGVsdCA9IHRoaXMuX2RpY3RbdGhpcy5fayhrZXkpXTtcbiAgICAgIGlmIChlbHQubmV4dClcbiAgICAgICAgcmV0dXJuIGVsdC5uZXh0LmtleTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBtb3ZlQmVmb3JlKGtleSwgYmVmb3JlKSB7XG4gICAgdmFyIGVsdCA9IHRoaXMuX2RpY3RbdGhpcy5fayhrZXkpXTtcbiAgICB2YXIgZWx0QmVmb3JlID0gYmVmb3JlID8gdGhpcy5fZGljdFt0aGlzLl9rKGJlZm9yZSldIDogbnVsbDtcbiAgICBpZiAodHlwZW9mIGVsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSXRlbSB0byBtb3ZlIGlzIG5vdCBwcmVzZW50XCIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVsdEJlZm9yZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgZWxlbWVudCB0byBtb3ZlIHRoaXMgb25lIGJlZm9yZVwiKTtcbiAgICB9XG4gICAgaWYgKGVsdEJlZm9yZSA9PT0gZWx0Lm5leHQpIC8vIG5vIG1vdmluZyBuZWNlc3NhcnlcbiAgICAgIHJldHVybjtcbiAgICAvLyByZW1vdmUgZnJvbSBpdHMgb2xkIHBsYWNlXG4gICAgdGhpcy5fbGlua0VsdE91dChlbHQpO1xuICAgIC8vIHBhdGNoIGludG8gaXRzIG5ldyBwbGFjZVxuICAgIGVsdC5uZXh0ID0gZWx0QmVmb3JlO1xuICAgIHRoaXMuX2xpbmtFbHRJbihlbHQpO1xuICB9XG5cbiAgLy8gTGluZWFyLCBzYWRseS5cbiAgaW5kZXhPZihrZXkpIHtcbiAgICB2YXIgcmV0ID0gbnVsbDtcbiAgICB0aGlzLmZvckVhY2goKHYsIGssIGkpID0+IHtcbiAgICAgIGlmICh0aGlzLl9rKGspID09PSB0aGlzLl9rKGtleSkpIHtcbiAgICAgICAgcmV0ID0gaTtcbiAgICAgICAgcmV0dXJuIE9yZGVyZWREaWN0LkJSRUFLO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBfY2hlY2tSZXAoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5fZGljdCkuZm9yRWFjaChrID0+IHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLl9kaWN0W2tdO1xuICAgICAgaWYgKHYubmV4dCA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZXh0IGlzIGEgbG9vcFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh2LnByZXYgPT09IHYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldiBpcyBhIGxvb3BcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuT3JkZXJlZERpY3QuQlJFQUsgPSB7XCJicmVha1wiOiB0cnVlfTtcbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/ordered-dict/ordered_dict.js"],"names":["module","export","OrderedDict","element","key","value","next","prev","constructor","args","_dict","Object","create","_first","_last","_size","_stringify","shift","x","forEach","kv","putBefore","_k","empty","size","_linkEltIn","elt","_linkEltOut","item","before","Error","append","remove","get","has","prototype","hasOwnProperty","call","iter","context","i","b","BREAK","first","firstValue","last","lastValue","moveBefore","eltBefore","indexOf","ret","v","k","_checkRep","keys"],"mappings":"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","file":"/packages/ordered-dict.js","sourcesContent":["// This file defines an ordered dictionary abstraction that is useful for\n// maintaining a dataset backed by observeChanges. It supports ordering items\n// by specifying the item they now come before.\n\n// The implementation is a dictionary that contains nodes of a doubly-linked\n// list as its values.\n\n// constructs a new element struct\n// next and prev are whole elements, not keys.\nfunction element(key, value, next, prev) {\n return {\n key: key,\n value: value,\n next: next,\n prev: prev\n };\n}\n\nexport class OrderedDict {\n constructor(...args) {\n this._dict = Object.create(null);\n this._first = null;\n this._last = null;\n this._size = 0;\n\n if (typeof args[0] === 'function') {\n this._stringify = args.shift();\n } else {\n this._stringify = function (x) { return x; };\n }\n\n args.forEach(kv => this.putBefore(kv[0], kv[1], null));\n }\n\n // the \"prefix keys with a space\" thing comes from here\n // https://github.com/documentcloud/underscore/issues/376#issuecomment-2815649\n _k(key) {\n return \" \" + this._stringify(key);\n }\n\n empty() {\n return !this._first;\n }\n\n size() {\n return this._size;\n }\n\n _linkEltIn(elt) {\n if (!elt.next) {\n elt.prev = this._last;\n if (this._last)\n this._last.next = elt;\n this._last = elt;\n } else {\n elt.prev = elt.next.prev;\n elt.next.prev = elt;\n if (elt.prev)\n elt.prev.next = elt;\n }\n if (this._first === null || this._first === elt.next)\n this._first = elt;\n }\n\n _linkEltOut(elt) {\n if (elt.next)\n elt.next.prev = elt.prev;\n if (elt.prev)\n elt.prev.next = elt.next;\n if (elt === this._last)\n this._last = elt.prev;\n if (elt === this._first)\n this._first = elt.next;\n }\n\n putBefore(key, item, before) {\n if (this._dict[this._k(key)])\n throw new Error(\"Item \" + key + \" already present in OrderedDict\");\n var elt = before ?\n element(key, item, this._dict[this._k(before)]) :\n element(key, item, null);\n if (typeof elt.next === \"undefined\")\n throw new Error(\"could not find item to put this one before\");\n this._linkEltIn(elt);\n this._dict[this._k(key)] = elt;\n this._size++;\n }\n\n append(key, item) {\n this.putBefore(key, item, null);\n }\n\n remove(key) {\n var elt = this._dict[this._k(key)];\n if (typeof elt === \"undefined\")\n throw new Error(\"Item \" + key + \" not present in OrderedDict\");\n this._linkEltOut(elt);\n this._size--;\n delete this._dict[this._k(key)];\n return elt.value;\n }\n\n get(key) {\n if (this.has(key)) {\n return this._dict[this._k(key)].value;\n }\n }\n\n has(key) {\n return Object.prototype.hasOwnProperty.call(\n this._dict,\n this._k(key)\n );\n }\n\n // Iterate through the items in this dictionary in order, calling\n // iter(value, key, index) on each one.\n\n // Stops whenever iter returns OrderedDict.BREAK, or after the last element.\n forEach(iter, context = null) {\n var i = 0;\n var elt = this._first;\n while (elt !== null) {\n var b = iter.call(context, elt.value, elt.key, i);\n if (b === OrderedDict.BREAK) return;\n elt = elt.next;\n i++;\n }\n }\n\n first() {\n if (this.empty()) {\n return;\n }\n return this._first.key;\n }\n\n firstValue() {\n if (this.empty()) {\n return;\n }\n return this._first.value;\n }\n\n last() {\n if (this.empty()) {\n return;\n }\n return this._last.key;\n }\n\n lastValue() {\n if (this.empty()) {\n return;\n }\n return this._last.value;\n }\n\n prev(key) {\n if (this.has(key)) {\n var elt = this._dict[this._k(key)];\n if (elt.prev)\n return elt.prev.key;\n }\n return null;\n }\n\n next(key) {\n if (this.has(key)) {\n var elt = this._dict[this._k(key)];\n if (elt.next)\n return elt.next.key;\n }\n return null;\n }\n\n moveBefore(key, before) {\n var elt = this._dict[this._k(key)];\n var eltBefore = before ? this._dict[this._k(before)] : null;\n if (typeof elt === \"undefined\") {\n throw new Error(\"Item to move is not present\");\n }\n if (typeof eltBefore === \"undefined\") {\n throw new Error(\"Could not find element to move this one before\");\n }\n if (eltBefore === elt.next) // no moving necessary\n return;\n // remove from its old place\n this._linkEltOut(elt);\n // patch into its new place\n elt.next = eltBefore;\n this._linkEltIn(elt);\n }\n\n // Linear, sadly.\n indexOf(key) {\n var ret = null;\n this.forEach((v, k, i) => {\n if (this._k(k) === this._k(key)) {\n ret = i;\n return OrderedDict.BREAK;\n }\n return;\n });\n return ret;\n }\n\n _checkRep() {\n Object.keys(this._dict).forEach(k => {\n const v = this._dict[k];\n if (v.next === v) {\n throw new Error(\"Next is a loop\");\n }\n if (v.prev === v) {\n throw new Error(\"Prev is a loop\");\n }\n });\n }\n}\n\nOrderedDict.BREAK = {\"break\": true};\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var meteorInstall = Package.modules.meteorInstall;
/* Package-scope variables */
var Promise;
var require = meteorInstall({"node_modules":{"meteor":{"promise":{"modern.js":function(){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/promise/modern.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
// Initialize the package-scoped Promise variable with global.Promise in
// all environments, even if it's not defined.
Promise = global.Promise;
///////////////////////////////////////////////////////////////////////////////////
},"server.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/promise/server.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
require("./extensions.js");
require("meteor-promise").makeCompatible(
Promise,
// Allow every Promise callback to run in a Fiber drawn from a pool of
// reusable Fibers.
require("fibers")
);
// Reference: https://caniuse.com/#feat=promises
require("meteor/modern-browsers").setMinimumBrowserVersions({
chrome: 32,
edge: 12,
// Since there is no IE11, this effectively excludes Internet Explorer
// (pre-Edge) from the modern classification. #9818 #9839
ie: 12,
firefox: 29,
mobileSafari: 8,
opera: 20,
safari: [7, 1],
// https://github.com/Kilian/electron-to-chromium/blob/master/full-versions.js
electron: [0, 20],
}, module.id);
///////////////////////////////////////////////////////////////////////////////////
},"extensions.js":function(){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/promise/extensions.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
var proto = Promise.prototype;
var hasOwn = Object.prototype.hasOwnProperty;
proto.done = function (onFulfilled, onRejected) {
var self = this;
if (arguments.length > 0) {
self = this.then.apply(this, arguments);
}
self.then(null, function (err) {
Meteor._setImmediate(function () {
throw err;
});
});
};
if (! hasOwn.call(proto, "finally")) {
proto["finally"] = function (onFinally) {
var threw = false, result;
return this.then(function (value) {
result = value;
// Most implementations of Promise.prototype.finally call
// Promise.resolve(onFinally()) (or this.constructor.resolve or even
// this.constructor[Symbol.species].resolve, depending on how spec
// compliant they're trying to be), but this implementation simply
// relies on the standard Promise behavior of resolving any value
// returned from a .then callback function.
return onFinally();
}, function (error) {
// Make the final .then callback (below) re-throw the error instead
// of returning it.
threw = true;
result = error;
return onFinally();
}).then(function () {
if (threw) throw result;
return result;
});
};
}
///////////////////////////////////////////////////////////////////////////////////
},"node_modules":{"meteor-promise":{"package.json":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/promise/node_modules/meteor-promise/package.json //
// //
///////////////////////////////////////////////////////////////////////////////////
//
module.exports = {
"name": "meteor-promise",
"version": "0.8.7",
"main": "promise_server.js"
};
///////////////////////////////////////////////////////////////////////////////////
},"promise_server.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////
// //
// node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
module.useNode();
///////////////////////////////////////////////////////////////////////////////////
}}}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/promise/modern.js");
var exports = require("/node_modules/meteor/promise/server.js");
/* Exports */
Package._define("promise", exports, {
Promise: Promise
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Random;
var require = meteorInstall({"node_modules":{"meteor":{"random":{"random.js":function(require){
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/random/random.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// We use cryptographically strong PRNGs (crypto.getRandomBytes() on the server,
// window.crypto.getRandomValues() in the browser) when available. If these
// PRNGs fail, we fall back to the Alea PRNG, which is not cryptographically
// strong, and we seed it with various sources such as the date, Math.random,
// and window size on the client. When using crypto.getRandomValues(), our
// primitive is hexString(), from which we construct fraction(). When using
// window.crypto.getRandomValues() or alea, the primitive is fraction and we use
// that to construct hex string.
if (Meteor.isServer) var nodeCrypto = Npm.require('crypto'); // see http://baagoe.org/en/wiki/Better_random_numbers_for_javascript
// for a full discussion and Alea implementation.
var Alea = function () {
function Mash() {
var n = 0xefc8249d;
var mash = function (data) {
data = data.toString();
for (var i = 0; i < data.length; i++) {
n += data.charCodeAt(i);
var h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000; // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
};
mash.version = 'Mash 0.9';
return mash;
}
return function (args) {
var s0 = 0;
var s1 = 0;
var s2 = 0;
var c = 1;
if (args.length == 0) {
args = [+new Date()];
}
var mash = Mash();
s0 = mash(' ');
s1 = mash(' ');
s2 = mash(' ');
for (var i = 0; i < args.length; i++) {
s0 -= mash(args[i]);
if (s0 < 0) {
s0 += 1;
}
s1 -= mash(args[i]);
if (s1 < 0) {
s1 += 1;
}
s2 -= mash(args[i]);
if (s2 < 0) {
s2 += 1;
}
}
mash = null;
var random = function () {
var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
s0 = s1;
s1 = s2;
return s2 = t - (c = t | 0);
};
random.uint32 = function () {
return random() * 0x100000000; // 2^32
};
random.fract53 = function () {
return random() + (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
};
random.version = 'Alea 0.9';
random.args = args;
return random;
}(Array.prototype.slice.call(arguments));
};
var UNMISTAKABLE_CHARS = "23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz";
var BASE64_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789-_"; // `type` is one of `RandomGenerator.Type` as defined below.
//
// options:
// - seeds: (required, only for RandomGenerator.Type.ALEA) an array
// whose items will be `toString`ed and used as the seed to the Alea
// algorithm
var RandomGenerator = function (type, options) {
var self = this;
self.type = type;
if (!RandomGenerator.Type[type]) {
throw new Error("Unknown random generator type: " + type);
}
if (type === RandomGenerator.Type.ALEA) {
if (!options.seeds) {
throw new Error("No seeds were provided for Alea PRNG");
}
self.alea = Alea.apply(null, options.seeds);
}
}; // Types of PRNGs supported by the `RandomGenerator` class
RandomGenerator.Type = {
// Use Node's built-in `crypto.getRandomBytes` (cryptographically
// secure but not seedable, runs only on the server). Reverts to
// `crypto.getPseudoRandomBytes` in the extremely uncommon case that
// there isn't enough entropy yet
NODE_CRYPTO: "NODE_CRYPTO",
// Use non-IE browser's built-in `window.crypto.getRandomValues`
// (cryptographically secure but not seedable, runs only in the
// browser).
BROWSER_CRYPTO: "BROWSER_CRYPTO",
// Use the *fast*, seedaable and not cryptographically secure
// Alea algorithm
ALEA: "ALEA"
};
/**
* @name Random.fraction
* @summary Return a number between 0 and 1, like `Math.random`.
* @locus Anywhere
*/
RandomGenerator.prototype.fraction = function () {
var self = this;
if (self.type === RandomGenerator.Type.ALEA) {
return self.alea();
} else if (self.type === RandomGenerator.Type.NODE_CRYPTO) {
var numerator = parseInt(self.hexString(8), 16);
return numerator * 2.3283064365386963e-10; // 2^-32
} else if (self.type === RandomGenerator.Type.BROWSER_CRYPTO) {
var array = new Uint32Array(1);
window.crypto.getRandomValues(array);
return array[0] * 2.3283064365386963e-10; // 2^-32
} else {
throw new Error('Unknown random generator type: ' + self.type);
}
};
/**
* @name Random.hexString
* @summary Return a random string of `n` hexadecimal digits.
* @locus Anywhere
* @param {Number} n Length of the string
*/
RandomGenerator.prototype.hexString = function (digits) {
var self = this;
if (self.type === RandomGenerator.Type.NODE_CRYPTO) {
var numBytes = Math.ceil(digits / 2);
var bytes; // Try to get cryptographically strong randomness. Fall back to
// non-cryptographically strong if not available.
try {
bytes = nodeCrypto.randomBytes(numBytes);
} catch (e) {
// XXX should re-throw any error except insufficient entropy
bytes = nodeCrypto.pseudoRandomBytes(numBytes);
}
var result = bytes.toString("hex"); // If the number of digits is odd, we'll have generated an extra 4 bits
// of randomness, so we need to trim the last digit.
return result.substring(0, digits);
} else {
return this._randomString(digits, "0123456789abcdef");
}
};
RandomGenerator.prototype._randomString = function (charsCount, alphabet) {
var self = this;
var digits = [];
for (var i = 0; i < charsCount; i++) {
digits[i] = self.choice(alphabet);
}
return digits.join("");
};
/**
* @name Random.id
* @summary Return a unique identifier, such as `"Jjwjg6gouWLXhMGKW"`, that is
* likely to be unique in the whole world.
* @locus Anywhere
* @param {Number} [n] Optional length of the identifier in characters
* (defaults to 17)
*/
RandomGenerator.prototype.id = function (charsCount) {
var self = this; // 17 characters is around 96 bits of entropy, which is the amount of
// state in the Alea PRNG.
if (charsCount === undefined) charsCount = 17;
return self._randomString(charsCount, UNMISTAKABLE_CHARS);
};
/**
* @name Random.secret
* @summary Return a random string of printable characters with 6 bits of
* entropy per character. Use `Random.secret` for security-critical secrets
* that are intended for machine, rather than human, consumption.
* @locus Anywhere
* @param {Number} [n] Optional length of the secret string (defaults to 43
* characters, or 256 bits of entropy)
*/
RandomGenerator.prototype.secret = function (charsCount) {
var self = this; // Default to 256 bits of entropy, or 43 characters at 6 bits per
// character.
if (charsCount === undefined) charsCount = 43;
return self._randomString(charsCount, BASE64_CHARS);
};
/**
* @name Random.choice
* @summary Return a random element of the given array or string.
* @locus Anywhere
* @param {Array|String} arrayOrString Array or string to choose from
*/
RandomGenerator.prototype.choice = function (arrayOrString) {
var index = Math.floor(this.fraction() * arrayOrString.length);
if (typeof arrayOrString === "string") return arrayOrString.substr(index, 1);else return arrayOrString[index];
}; // instantiate RNG. Heuristically collect entropy from various sources when a
// cryptographic PRNG isn't available.
// client sources
var height = typeof window !== 'undefined' && window.innerHeight || typeof document !== 'undefined' && document.documentElement && document.documentElement.clientHeight || typeof document !== 'undefined' && document.body && document.body.clientHeight || 1;
var width = typeof window !== 'undefined' && window.innerWidth || typeof document !== 'undefined' && document.documentElement && document.documentElement.clientWidth || typeof document !== 'undefined' && document.body && document.body.clientWidth || 1;
var agent = typeof navigator !== 'undefined' && navigator.userAgent || "";
function createAleaGeneratorWithGeneratedSeed() {
return new RandomGenerator(RandomGenerator.Type.ALEA, {
seeds: [new Date(), height, width, agent, Math.random()]
});
}
;
if (Meteor.isServer) {
Random = new RandomGenerator(RandomGenerator.Type.NODE_CRYPTO);
} else {
if (typeof window !== "undefined" && window.crypto && window.crypto.getRandomValues) {
Random = new RandomGenerator(RandomGenerator.Type.BROWSER_CRYPTO);
} else {
// On IE 10 and below, there's no browser crypto API
// available. Fall back to Alea
//
// XXX looks like at the moment, we use Alea in IE 11 as well,
// which has `window.msCrypto` instead of `window.crypto`.
Random = createAleaGeneratorWithGeneratedSeed();
}
} // Create a non-cryptographically secure PRNG with a given seed (using
// the Alea algorithm)
Random.createWithSeeds = function (...seeds) {
if (seeds.length === 0) {
throw new Error("No seeds were provided");
}
return new RandomGenerator(RandomGenerator.Type.ALEA, {
seeds: seeds
});
}; // Used like `Random`, but much faster and not cryptographically
// secure
Random.insecure = createAleaGeneratorWithGeneratedSeed();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/random/random.js");
/* Exports */
Package._define("random", {
Random: Random
});
})();
//# sourceURL=meteor://💻app/packages/random.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvcmFuZG9tL3JhbmRvbS5qcyJdLCJuYW1lcyI6WyJNZXRlb3IiLCJpc1NlcnZlciIsIm5vZGVDcnlwdG8iLCJOcG0iLCJyZXF1aXJlIiwiQWxlYSIsIk1hc2giLCJuIiwibWFzaCIsImRhdGEiLCJ0b1N0cmluZyIsImkiLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwiaCIsInZlcnNpb24iLCJhcmdzIiwiczAiLCJzMSIsInMyIiwiYyIsIkRhdGUiLCJyYW5kb20iLCJ0IiwidWludDMyIiwiZnJhY3Q1MyIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiVU5NSVNUQUtBQkxFX0NIQVJTIiwiQkFTRTY0X0NIQVJTIiwiUmFuZG9tR2VuZXJhdG9yIiwidHlwZSIsIm9wdGlvbnMiLCJzZWxmIiwiVHlwZSIsIkVycm9yIiwiQUxFQSIsInNlZWRzIiwiYWxlYSIsImFwcGx5IiwiTk9ERV9DUllQVE8iLCJCUk9XU0VSX0NSWVBUTyIsImZyYWN0aW9uIiwibnVtZXJhdG9yIiwicGFyc2VJbnQiLCJoZXhTdHJpbmciLCJhcnJheSIsIlVpbnQzMkFycmF5Iiwid2luZG93IiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiZGlnaXRzIiwibnVtQnl0ZXMiLCJNYXRoIiwiY2VpbCIsImJ5dGVzIiwicmFuZG9tQnl0ZXMiLCJlIiwicHNldWRvUmFuZG9tQnl0ZXMiLCJyZXN1bHQiLCJzdWJzdHJpbmciLCJfcmFuZG9tU3RyaW5nIiwiY2hhcnNDb3VudCIsImFscGhhYmV0IiwiY2hvaWNlIiwiam9pbiIsImlkIiwidW5kZWZpbmVkIiwic2VjcmV0IiwiYXJyYXlPclN0cmluZyIsImluZGV4IiwiZmxvb3IiLCJzdWJzdHIiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50SGVpZ2h0IiwiYm9keSIsIndpZHRoIiwiaW5uZXJXaWR0aCIsImNsaWVudFdpZHRoIiwiYWdlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJjcmVhdGVBbGVhR2VuZXJhdG9yV2l0aEdlbmVyYXRlZFNlZWQiLCJSYW5kb20iLCJjcmVhdGVXaXRoU2VlZHMiLCJpbnNlY3VyZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxNQUFNLENBQUNDLFFBQVgsRUFDRSxJQUFJQyxVQUFVLEdBQUdDLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLFFBQVosQ0FBakIsQyxDQUVGO0FBQ0E7O0FBQ0EsSUFBSUMsSUFBSSxHQUFHLFlBQVk7QUFDckIsV0FBU0MsSUFBVCxHQUFnQjtBQUNkLFFBQUlDLENBQUMsR0FBRyxVQUFSOztBQUVBLFFBQUlDLElBQUksR0FBRyxVQUFTQyxJQUFULEVBQWU7QUFDeEJBLFVBQUksR0FBR0EsSUFBSSxDQUFDQyxRQUFMLEVBQVA7O0FBQ0EsV0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixJQUFJLENBQUNHLE1BQXpCLEVBQWlDRCxDQUFDLEVBQWxDLEVBQXNDO0FBQ3BDSixTQUFDLElBQUlFLElBQUksQ0FBQ0ksVUFBTCxDQUFnQkYsQ0FBaEIsQ0FBTDtBQUNBLFlBQUlHLENBQUMsR0FBRyxzQkFBc0JQLENBQTlCO0FBQ0FBLFNBQUMsR0FBR08sQ0FBQyxLQUFLLENBQVY7QUFDQUEsU0FBQyxJQUFJUCxDQUFMO0FBQ0FPLFNBQUMsSUFBSVAsQ0FBTDtBQUNBQSxTQUFDLEdBQUdPLENBQUMsS0FBSyxDQUFWO0FBQ0FBLFNBQUMsSUFBSVAsQ0FBTDtBQUNBQSxTQUFDLElBQUlPLENBQUMsR0FBRyxXQUFULENBUm9DLENBUWQ7QUFDdkI7O0FBQ0QsYUFBTyxDQUFDUCxDQUFDLEtBQUssQ0FBUCxJQUFZLHNCQUFuQixDQVp3QixDQVltQjtBQUM1QyxLQWJEOztBQWVBQyxRQUFJLENBQUNPLE9BQUwsR0FBZSxVQUFm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QTBCRyxLQUExQixFQUFpQzdCLElBQUksQ0FBQ2xDLE1BQUwsRUFBakM7QUFBUixHQUZLLENBQVA7QUFHRDs7QUFBQTs7QUFFRCxJQUFJdEIsTUFBTSxDQUFDQyxRQUFYLEVBQXFCO0FBQ25Cd0YsUUFBTSxHQUFHLElBQUl4RCxlQUFKLENBQW9CQSxlQUFlLENBQUNJLElBQWhCLENBQXFCTSxXQUF6QyxDQUFUO0FBQ0QsQ0FGRCxNQUVPO0FBQ0wsTUFBSSxPQUFPUSxNQUFQLEtBQWtCLFdBQWxCLElBQWlDQSxNQUFNLENBQUNDLE1BQXhDLElBQ0FELE1BQU0sQ0FBQ0MsTUFBUCxDQUFjQyxlQURsQixFQUNtQztBQUNqQ29DLFVBQU0sR0FBRyxJQUFJeEQsZUFBSixDQUFvQkEsZUFBZSxDQUFDSSxJQUFoQixDQUFxQk8sY0FBekMsQ0FBVDtBQUNELEdBSEQsTUFHTztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTZDLFVBQU0sR0FBR0Qsb0NBQW9DLEVBQTdDO0FBQ0Q7QUFDRixDLENBRUQ7QUFDQTs7O0FBQ0FDLE1BQU0sQ0FBQ0MsZUFBUCxHQUF5QixVQUFVLEdBQUdsRCxLQUFiLEVBQW9CO0FBQzNDLE1BQUlBLEtBQUssQ0FBQzVCLE1BQU4sS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsVUFBTSxJQUFJMEIsS0FBSixDQUFVLHdCQUFWLENBQU47QUFDRDs7QUFDRCxTQUFPLElBQUlMLGVBQUosQ0FBb0JBLGVBQWUsQ0FBQ0ksSUFBaEIsQ0FBcUJFLElBQXpDLEVBQStDO0FBQUNDLFNBQUssRUFBRUE7QUFBUixHQUEvQyxDQUFQO0FBQ0QsQ0FMRCxDLENBT0E7QUFDQTs7O0FBQ0FpRCxNQUFNLENBQUNFLFFBQVAsR0FBa0JILG9DQUFvQyxFQUF0RCxDIiwiZmlsZSI6Ii9wYWNrYWdlcy9yYW5kb20uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXZSB1c2UgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIFBSTkdzIChjcnlwdG8uZ2V0UmFuZG9tQnl0ZXMoKSBvbiB0aGUgc2VydmVyLFxuLy8gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBpbiB0aGUgYnJvd3Nlcikgd2hlbiBhdmFpbGFibGUuIElmIHRoZXNlXG4vLyBQUk5HcyBmYWlsLCB3ZSBmYWxsIGJhY2sgdG8gdGhlIEFsZWEgUFJORywgd2hpY2ggaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5XG4vLyBzdHJvbmcsIGFuZCB3ZSBzZWVkIGl0IHdpdGggdmFyaW91cyBzb3VyY2VzIHN1Y2ggYXMgdGhlIGRhdGUsIE1hdGgucmFuZG9tLFxuLy8gYW5kIHdpbmRvdyBzaXplIG9uIHRoZSBjbGllbnQuICBXaGVuIHVzaW5nIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSwgb3VyXG4vLyBwcmltaXRpdmUgaXMgaGV4U3RyaW5nKCksIGZyb20gd2hpY2ggd2UgY29uc3RydWN0IGZyYWN0aW9uKCkuIFdoZW4gdXNpbmdcbi8vIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgb3IgYWxlYSwgdGhlIHByaW1pdGl2ZSBpcyBmcmFjdGlvbiBhbmQgd2UgdXNlXG4vLyB0aGF0IHRvIGNvbnN0cnVjdCBoZXggc3RyaW5nLlxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKVxuICB2YXIgbm9kZUNyeXB0byA9IE5wbS5yZXF1aXJlKCdjcnlwdG8nKTtcblxuLy8gc2VlIGh0dHA6Ly9iYWFnb2Uub3JnL2VuL3dpa2kvQmV0dGVyX3JhbmRvbV9udW1iZXJzX2Zvcl9qYXZhc2NyaXB0XG4vLyBmb3IgYSBmdWxsIGRpc2N1c3Npb24gYW5kIEFsZWEgaW1wbGVtZW50YXRpb24uXG52YXIgQWxlYSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFzaCgpIHtcbiAgICB2YXIgbiA9IDB4ZWZjODI0OWQ7XG5cbiAgICB2YXIgbWFzaCA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbiArPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgICBoIC09IG47XG4gICAgICAgIGggKj0gbjtcbiAgICAgICAgbiA9IGggPj4+IDA7XG4gICAgICAgIGggLT0gbjtcbiAgICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICAgIH1cbiAgICAgIHJldHVybiAobiA+Pj4gMCkgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIH07XG5cbiAgICBtYXNoLnZlcnNpb24gPSAnTWFzaCAwLjknO1xuICAgIHJldHVybiBtYXNoO1xuICB9XG5cbiAgcmV0dXJuIChmdW5jdGlvbiAoYXJncykge1xuICAgIHZhciBzMCA9IDA7XG4gICAgdmFyIHMxID0gMDtcbiAgICB2YXIgczIgPSAwO1xuICAgIHZhciBjID0gMTtcblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBhcmdzID0gWytuZXcgRGF0ZV07XG4gICAgfVxuICAgIHZhciBtYXNoID0gTWFzaCgpO1xuICAgIHMwID0gbWFzaCgnICcpO1xuICAgIHMxID0gbWFzaCgnICcpO1xuICAgIHMyID0gbWFzaCgnICcpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzMCAtPSBtYXNoKGFyZ3NbaV0pO1xuICAgICAgaWYgKHMwIDwgMCkge1xuICAgICAgICBzMCArPSAxO1xuICAgICAgfVxuICAgICAgczEgLT0gbWFzaChhcmdzW2ldKTtcbiAgICAgIGlmIChzMSA8IDApIHtcbiAgICAgICAgczEgKz0gMTtcbiAgICAgIH1cbiAgICAgIHMyIC09IG1hc2goYXJnc1tpXSk7XG4gICAgICBpZiAoczIgPCAwKSB7XG4gICAgICAgIHMyICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIG1hc2ggPSBudWxsO1xuXG4gICAgdmFyIHJhbmRvbSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHQgPSAyMDkxNjM5ICogczAgKyBjICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICAgIHMwID0gczE7XG4gICAgICBzMSA9IHMyO1xuICAgICAgcmV0dXJuIHMyID0gdCAtIChjID0gdCB8IDApO1xuICAgIH07XG4gICAgcmFuZG9tLnVpbnQzMiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJhbmRvbSgpICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9O1xuICAgIHJhbmRvbS5mcmFjdDUzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmFuZG9tKCkgK1xuICAgICAgICAocmFuZG9tKCkgKiAweDIwMDAwMCB8IDApICogMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNjsgLy8gMl4tNTNcbiAgICB9O1xuICAgIHJhbmRvbS52ZXJzaW9uID0gJ0FsZWEgMC45JztcbiAgICByYW5kb20uYXJncyA9IGFyZ3M7XG4gICAgcmV0dXJuIHJhbmRvbTtcblxuICB9IChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG59O1xuXG52YXIgVU5NSVNUQUtBQkxFX0NIQVJTID0gXCIyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFdYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCI7XG52YXIgQkFTRTY0X0NIQVJTID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCIgK1xuICBcIjAxMjM0NTY3ODktX1wiO1xuXG4vLyBgdHlwZWAgaXMgb25lIG9mIGBSYW5kb21HZW5lcmF0b3IuVHlwZWAgYXMgZGVmaW5lZCBiZWxvdy5cbi8vXG4vLyBvcHRpb25zOlxuLy8gLSBzZWVkczogKHJlcXVpcmVkLCBvbmx5IGZvciBSYW5kb21HZW5lcmF0b3IuVHlwZS5BTEVBKSBhbiBhcnJheVxuLy8gICB3aG9zZSBpdGVtcyB3aWxsIGJlIGB0b1N0cmluZ2BlZCBhbmQgdXNlZCBhcyB0aGUgc2VlZCB0byB0aGUgQWxlYVxuLy8gICBhbGdvcml0aG1cbnZhciBSYW5kb21HZW5lcmF0b3IgPSBmdW5jdGlvbiAodHlwZSwgb3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYudHlwZSA9IHR5cGU7XG5cbiAgaWYgKCFSYW5kb21HZW5lcmF0b3IuVHlwZVt0eXBlXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gcmFuZG9tIGdlbmVyYXRvciB0eXBlOiBcIiArIHR5cGUpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFJhbmRvbUdlbmVyYXRvci5UeXBlLkFMRUEpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2VlZHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlZWRzIHdlcmUgcHJvdmlkZWQgZm9yIEFsZWEgUFJOR1wiKTtcbiAgICB9XG4gICAgc2VsZi5hbGVhID0gQWxlYS5hcHBseShudWxsLCBvcHRpb25zLnNlZWRzKTtcbiAgfVxufTtcblxuLy8gVHlwZXMgb2YgUFJOR3Mgc3VwcG9ydGVkIGJ5IHRoZSBgUmFuZG9tR2VuZXJhdG9yYCBjbGFzc1xuUmFuZG9tR2VuZXJhdG9yLlR5cGUgPSB7XG4gIC8vIFVzZSBOb2RlJ3MgYnVpbHQtaW4gYGNyeXB0by5nZXRSYW5kb21CeXRlc2AgKGNyeXB0b2dyYXBoaWNhbGx5XG4gIC8vIHNlY3VyZSBidXQgbm90IHNlZWRhYmxlLCBydW5zIG9ubHkgb24gdGhlIHNlcnZlcikuIFJldmVydHMgdG9cbiAgLy8gYGNyeXB0by5nZXRQc2V1ZG9SYW5kb21CeXRlc2AgaW4gdGhlIGV4dHJlbWVseSB1bmNvbW1vbiBjYXNlIHRoYXRcbiAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIGVudHJvcHkgeWV0XG4gIE5PREVfQ1JZUFRPOiBcIk5PREVfQ1JZUFRPXCIsXG5cbiAgLy8gVXNlIG5vbi1JRSBicm93c2VyJ3MgYnVpbHQtaW4gYHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzYFxuICAvLyAoY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGJ1dCBub3Qgc2VlZGFibGUsIHJ1bnMgb25seSBpbiB0aGVcbiAgLy8gYnJvd3NlcikuXG4gIEJST1dTRVJfQ1JZUFRPOiBcIkJST1dTRVJfQ1JZUFRPXCIsXG5cbiAgLy8gVXNlIHRoZSAqZmFzdCosIHNlZWRhYWJsZSBhbmQgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZVxuICAvLyBBbGVhIGFsZ29yaXRobVxuICBBTEVBOiBcIkFMRUFcIixcbn07XG5cbi8qKlxuICogQG5hbWUgUmFuZG9tLmZyYWN0aW9uXG4gKiBAc3VtbWFyeSBSZXR1cm4gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLCBsaWtlIGBNYXRoLnJhbmRvbWAuXG4gKiBAbG9jdXMgQW55d2hlcmVcbiAqL1xuUmFuZG9tR2VuZXJhdG9yLnByb3RvdHlwZS5mcmFjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi50eXBlID09PSBSYW5kb21HZW5lcmF0b3IuVHlwZS5BTEVBKSB7XG4gICAgcmV0dXJuIHNlbGYuYWxlYSgpO1xuICB9IGVsc2UgaWYgKHNlbGYudHlwZSA9PT0gUmFuZG9tR2VuZXJhdG9yLlR5cGUuTk9ERV9DUllQVE8pIHtcbiAgICB2YXIgbnVtZXJhdG9yID0gcGFyc2VJbnQoc2VsZi5oZXhTdHJpbmcoOCksIDE2KTtcbiAgICByZXR1cm4gbnVtZXJhdG9yICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgfSBlbHNlIGlmIChzZWxmLnR5cGUgPT09IFJhbmRvbUdlbmVyYXRvci5UeXBlLkJST1dTRVJfQ1JZUFRPKSB7XG4gICAgdmFyIGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICByZXR1cm4gYXJyYXlbMF0gKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByYW5kb20gZ2VuZXJhdG9yIHR5cGU6ICcgKyBzZWxmLnR5cGUpO1xuICB9XG59O1xuXG4vKipcbiAqIEBuYW1lIFJhbmRvbS5oZXhTdHJpbmdcbiAqIEBzdW1tYXJ5IFJldHVybiBhIHJhbmRvbSBzdHJpbmcgb2YgYG5gIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQHBhcmFtIHtOdW1iZXJ9IG4gTGVuZ3RoIG9mIHRoZSBzdHJpbmdcbiAqL1xuUmFuZG9tR2VuZXJhdG9yLnByb3RvdHlwZS5oZXhTdHJpbmcgPSBmdW5jdGlvbiAoZGlnaXRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHNlbGYudHlwZSA9PT0gUmFuZG9tR2VuZXJhdG9yLlR5cGUuTk9ERV9DUllQVE8pIHtcbiAgICB2YXIgbnVtQnl0ZXMgPSBNYXRoLmNlaWwoZGlnaXRzIC8gMik7XG4gICAgdmFyIGJ5dGVzO1xuICAgIC8vIFRyeSB0byBnZXQgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHJhbmRvbW5lc3MuIEZhbGwgYmFjayB0b1xuICAgIC8vIG5vbi1jcnlwdG9ncmFwaGljYWxseSBzdHJvbmcgaWYgbm90IGF2YWlsYWJsZS5cbiAgICB0cnkge1xuICAgICAgYnl0ZXMgPSBub2RlQ3J5cHRvLnJhbmRvbUJ5dGVzKG51bUJ5dGVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBYWFggc2hvdWxkIHJlLXRocm93IGFueSBlcnJvciBleGNlcHQgaW5zdWZmaWNpZW50IGVudHJvcHlcbiAgICAgIGJ5dGVzID0gbm9kZUNyeXB0by5wc2V1ZG9SYW5kb21CeXRlcyhudW1CeXRlcyk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBieXRlcy50b1N0cmluZyhcImhleFwiKTtcbiAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpcyBvZGQsIHdlJ2xsIGhhdmUgZ2VuZXJhdGVkIGFuIGV4dHJhIDQgYml0c1xuICAgIC8vIG9mIHJhbmRvbW5lc3MsIHNvIHdlIG5lZWQgdG8gdHJpbSB0aGUgbGFzdCBkaWdpdC5cbiAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCBkaWdpdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLl9yYW5kb21TdHJpbmcoZGlnaXRzLCBcIjAxMjM0NTY3ODlhYmNkZWZcIik7XG4gIH1cbn07XG5cblJhbmRvbUdlbmVyYXRvci5wcm90b3R5cGUuX3JhbmRvbVN0cmluZyA9IGZ1bmN0aW9uIChjaGFyc0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhYmV0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGRpZ2l0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzQ291bnQ7IGkrKykge1xuICAgIGRpZ2l0c1tpXSA9IHNlbGYuY2hvaWNlKGFscGhhYmV0KTtcbiAgfVxuICByZXR1cm4gZGlnaXRzLmpvaW4oXCJcIik7XG59O1xuXG4vKipcbiAqIEBuYW1lIFJhbmRvbS5pZFxuICogQHN1bW1hcnkgUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIsIHN1Y2ggYXMgYFwiSmp3amc2Z291V0xYaE1HS1dcImAsIHRoYXQgaXNcbiAqIGxpa2VseSB0byBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHdvcmxkLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAcGFyYW0ge051bWJlcn0gW25dIE9wdGlvbmFsIGxlbmd0aCBvZiB0aGUgaWRlbnRpZmllciBpbiBjaGFyYWN0ZXJzXG4gKiAgIChkZWZhdWx0cyB0byAxNylcbiAqL1xuUmFuZG9tR2VuZXJhdG9yLnByb3RvdHlwZS5pZCA9IGZ1bmN0aW9uIChjaGFyc0NvdW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgLy8gMTcgY2hhcmFjdGVycyBpcyBhcm91bmQgOTYgYml0cyBvZiBlbnRyb3B5LCB3aGljaCBpcyB0aGUgYW1vdW50IG9mXG4gIC8vIHN0YXRlIGluIHRoZSBBbGVhIFBSTkcuXG4gIGlmIChjaGFyc0NvdW50ID09PSB1bmRlZmluZWQpXG4gICAgY2hhcnNDb3VudCA9IDE3O1xuXG4gIHJldHVybiBzZWxmLl9yYW5kb21TdHJpbmcoY2hhcnNDb3VudCwgVU5NSVNUQUtBQkxFX0NIQVJTKTtcbn07XG5cbi8qKlxuICogQG5hbWUgUmFuZG9tLnNlY3JldFxuICogQHN1bW1hcnkgUmV0dXJuIGEgcmFuZG9tIHN0cmluZyBvZiBwcmludGFibGUgY2hhcmFjdGVycyB3aXRoIDYgYml0cyBvZlxuICogZW50cm9weSBwZXIgY2hhcmFjdGVyLiBVc2UgYFJhbmRvbS5zZWNyZXRgIGZvciBzZWN1cml0eS1jcml0aWNhbCBzZWNyZXRzXG4gKiB0aGF0IGFyZSBpbnRlbmRlZCBmb3IgbWFjaGluZSwgcmF0aGVyIHRoYW4gaHVtYW4sIGNvbnN1bXB0aW9uLlxuICogQGxvY3VzIEFueXdoZXJlXG4gKiBAcGFyYW0ge051bWJlcn0gW25dIE9wdGlvbmFsIGxlbmd0aCBvZiB0aGUgc2VjcmV0IHN0cmluZyAoZGVmYXVsdHMgdG8gNDNcbiAqICAgY2hhcmFjdGVycywgb3IgMjU2IGJpdHMgb2YgZW50cm9weSlcbiAqL1xuUmFuZG9tR2VuZXJhdG9yLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiAoY2hhcnNDb3VudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIERlZmF1bHQgdG8gMjU2IGJpdHMgb2YgZW50cm9weSwgb3IgNDMgY2hhcmFjdGVycyBhdCA2IGJpdHMgcGVyXG4gIC8vIGNoYXJhY3Rlci5cbiAgaWYgKGNoYXJzQ291bnQgPT09IHVuZGVmaW5lZClcbiAgICBjaGFyc0NvdW50ID0gNDM7XG4gIHJldHVybiBzZWxmLl9yYW5kb21TdHJpbmcoY2hhcnNDb3VudCwgQkFTRTY0X0NIQVJTKTtcbn07XG5cbi8qKlxuICogQG5hbWUgUmFuZG9tLmNob2ljZVxuICogQHN1bW1hcnkgUmV0dXJuIGEgcmFuZG9tIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGFycmF5IG9yIHN0cmluZy5cbiAqIEBsb2N1cyBBbnl3aGVyZVxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGFycmF5T3JTdHJpbmcgQXJyYXkgb3Igc3RyaW5nIHRvIGNob29zZSBmcm9tXG4gKi9cblJhbmRvbUdlbmVyYXRvci5wcm90b3R5cGUuY2hvaWNlID0gZnVuY3Rpb24gKGFycmF5T3JTdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gTWF0aC5mbG9vcih0aGlzLmZyYWN0aW9uKCkgKiBhcnJheU9yU3RyaW5nLmxlbmd0aCk7XG4gIGlmICh0eXBlb2YgYXJyYXlPclN0cmluZyA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gYXJyYXlPclN0cmluZy5zdWJzdHIoaW5kZXgsIDEpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycmF5T3JTdHJpbmdbaW5kZXhdO1xufTtcblxuLy8gaW5zdGFudGlhdGUgUk5HLiAgSGV1cmlzdGljYWxseSBjb2xsZWN0IGVudHJvcHkgZnJvbSB2YXJpb3VzIHNvdXJjZXMgd2hlbiBhXG4vLyBjcnlwdG9ncmFwaGljIFBSTkcgaXNuJ3QgYXZhaWxhYmxlLlxuXG4vLyBjbGllbnQgc291cmNlc1xudmFyIGhlaWdodCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJIZWlnaHQpIHx8XG4gICAgICAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHx8XG4gICAgICAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIGRvY3VtZW50LmJvZHlcbiAgICAgICAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkgfHxcbiAgICAgIDE7XG5cbnZhciB3aWR0aCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJXaWR0aCkgfHxcbiAgICAgICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB8fFxuICAgICAgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiBkb2N1bWVudC5ib2R5XG4gICAgICAgJiYgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCkgfHxcbiAgICAgIDE7XG5cbnZhciBhZ2VudCA9ICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBcIlwiO1xuXG5mdW5jdGlvbiBjcmVhdGVBbGVhR2VuZXJhdG9yV2l0aEdlbmVyYXRlZFNlZWQoKSB7XG4gIHJldHVybiBuZXcgUmFuZG9tR2VuZXJhdG9yKFxuICAgIFJhbmRvbUdlbmVyYXRvci5UeXBlLkFMRUEsXG4gICAge3NlZWRzOiBbbmV3IERhdGUsIGhlaWdodCwgd2lkdGgsIGFnZW50LCBNYXRoLnJhbmRvbSgpXX0pO1xufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBSYW5kb20gPSBuZXcgUmFuZG9tR2VuZXJhdG9yKFJhbmRvbUdlbmVyYXRvci5UeXBlLk5PREVfQ1JZUFRPKTtcbn0gZWxzZSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5jcnlwdG8gJiZcbiAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgUmFuZG9tID0gbmV3IFJhbmRvbUdlbmVyYXRvcihSYW5kb21HZW5lcmF0b3IuVHlwZS5CUk9XU0VSX0NSWVBUTyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT24gSUUgMTAgYW5kIGJlbG93LCB0aGVyZSdzIG5vIGJyb3dzZXIgY3J5cHRvIEFQSVxuICAgIC8vIGF2YWlsYWJsZS4gRmFsbCBiYWNrIHRvIEFsZWFcbiAgICAvL1xuICAgIC8vIFhYWCBsb29rcyBsaWtlIGF0IHRoZSBtb21lbnQsIHdlIHVzZSBBbGVhIGluIElFIDExIGFzIHdlbGwsXG4gICAgLy8gd2hpY2ggaGFzIGB3aW5kb3cubXNDcnlwdG9gIGluc3RlYWQgb2YgYHdpbmRvdy5jcnlwdG9gLlxuICAgIFJhbmRvbSA9IGNyZWF0ZUFsZWFHZW5lcmF0b3JXaXRoR2VuZXJhdGVkU2VlZCgpO1xuICB9XG59XG5cbi8vIENyZWF0ZSBhIG5vbi1jcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgUFJORyB3aXRoIGEgZ2l2ZW4gc2VlZCAodXNpbmdcbi8vIHRoZSBBbGVhIGFsZ29yaXRobSlcblJhbmRvbS5jcmVhdGVXaXRoU2VlZHMgPSBmdW5jdGlvbiAoLi4uc2VlZHMpIHtcbiAgaWYgKHNlZWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlZWRzIHdlcmUgcHJvdmlkZWRcIik7XG4gIH1cbiAgcmV0dXJuIG5ldyBSYW5kb21HZW5lcmF0b3IoUmFuZG9tR2VuZXJhdG9yLlR5cGUuQUxFQSwge3NlZWRzOiBzZWVkc30pO1xufTtcblxuLy8gVXNlZCBsaWtlIGBSYW5kb21gLCBidXQgbXVjaCBmYXN0ZXIgYW5kIG5vdCBjcnlwdG9ncmFwaGljYWxseVxuLy8gc2VjdXJlXG5SYW5kb20uaW5zZWN1cmUgPSBjcmVhdGVBbGVhR2VuZXJhdG9yV2l0aEdlbmVyYXRlZFNlZWQoKTtcbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/random/random.js"],"names":["Meteor","isServer","nodeCrypto","Npm","require","Alea","Mash","n","mash","data","toString","i","length","charCodeAt","h","version","args","s0","s1","s2","c","Date","random","t","uint32","fract53","Array","prototype","slice","call","arguments","UNMISTAKABLE_CHARS","BASE64_CHARS","RandomGenerator","type","options","self","Type","Error","ALEA","seeds","alea","apply","NODE_CRYPTO","BROWSER_CRYPTO","fraction","numerator","parseInt","hexString","array","Uint32Array","window","crypto","getRandomValues","digits","numBytes","Math","ceil","bytes","randomBytes","e","pseudoRandomBytes","result","substring","_randomString","charsCount","alphabet","choice","join","id","undefined","secret","arrayOrString","index","floor","substr","height","innerHeight","document","documentElement","clientHeight","body","width","innerWidth","clientWidth","agent","navigator","userAgent","createAleaGeneratorWithGeneratedSeed","Random","createWithSeeds","insecure"],"mappings":"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","file":"/packages/random.js","sourcesContent":["// We use cryptographically strong PRNGs (crypto.getRandomBytes() on the server,\n// window.crypto.getRandomValues() in the browser) when available. If these\n// PRNGs fail, we fall back to the Alea PRNG, which is not cryptographically\n// strong, and we seed it with various sources such as the date, Math.random,\n// and window size on the client. When using crypto.getRandomValues(), our\n// primitive is hexString(), from which we construct fraction(). When using\n// window.crypto.getRandomValues() or alea, the primitive is fraction and we use\n// that to construct hex string.\n\nif (Meteor.isServer)\n var nodeCrypto = Npm.require('crypto');\n\n// see http://baagoe.org/en/wiki/Better_random_numbers_for_javascript\n// for a full discussion and Alea implementation.\nvar Alea = function () {\n function Mash() {\n var n = 0xefc8249d;\n\n var mash = function(data) {\n data = data.toString();\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n\n mash.version = 'Mash 0.9';\n return mash;\n }\n\n return (function (args) {\n var s0 = 0;\n var s1 = 0;\n var s2 = 0;\n var c = 1;\n\n if (args.length == 0) {\n args = [+new Date];\n }\n var mash = Mash();\n s0 = mash(' ');\n s1 = mash(' ');\n s2 = mash(' ');\n\n for (var i = 0; i < args.length; i++) {\n s0 -= mash(args[i]);\n if (s0 < 0) {\n s0 += 1;\n }\n s1 -= mash(args[i]);\n if (s1 < 0) {\n s1 += 1;\n }\n s2 -= mash(args[i]);\n if (s2 < 0) {\n s2 += 1;\n }\n }\n mash = null;\n\n var random = function() {\n var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32\n s0 = s1;\n s1 = s2;\n return s2 = t - (c = t | 0);\n };\n random.uint32 = function() {\n return random() * 0x100000000; // 2^32\n };\n random.fract53 = function() {\n return random() +\n (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n };\n random.version = 'Alea 0.9';\n random.args = args;\n return random;\n\n } (Array.prototype.slice.call(arguments)));\n};\n\nvar UNMISTAKABLE_CHARS = \"23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz\";\nvar BASE64_CHARS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n \"0123456789-_\";\n\n// `type` is one of `RandomGenerator.Type` as defined below.\n//\n// options:\n// - seeds: (required, only for RandomGenerator.Type.ALEA) an array\n// whose items will be `toString`ed and used as the seed to the Alea\n// algorithm\nvar RandomGenerator = function (type, options) {\n var self = this;\n self.type = type;\n\n if (!RandomGenerator.Type[type]) {\n throw new Error(\"Unknown random generator type: \" + type);\n }\n\n if (type === RandomGenerator.Type.ALEA) {\n if (!options.seeds) {\n throw new Error(\"No seeds were provided for Alea PRNG\");\n }\n self.alea = Alea.apply(null, options.seeds);\n }\n};\n\n// Types of PRNGs supported by the `RandomGenerator` class\nRandomGenerator.Type = {\n // Use Node's built-in `crypto.getRandomBytes` (cryptographically\n // secure but not seedable, runs only on the server). Reverts to\n // `crypto.getPseudoRandomBytes` in the extremely uncommon case that\n // there isn't enough entropy yet\n NODE_CRYPTO: \"NODE_CRYPTO\",\n\n // Use non-IE browser's built-in `window.crypto.getRandomValues`\n // (cryptographically secure but not seedable, runs only in the\n // browser).\n BROWSER_CRYPTO: \"BROWSER_CRYPTO\",\n\n // Use the *fast*, seedaable and not cryptographically secure\n // Alea algorithm\n ALEA: \"ALEA\",\n};\n\n/**\n * @name Random.fraction\n * @summary Return a number between 0 and 1, like `Math.random`.\n * @locus Anywhere\n */\nRandomGenerator.prototype.fraction = function () {\n var self = this;\n if (self.type === RandomGenerator.Type.ALEA) {\n return self.alea();\n } else if (self.type === RandomGenerator.Type.NODE_CRYPTO) {\n var numerator = parseInt(self.hexString(8), 16);\n return numerator * 2.3283064365386963e-10; // 2^-32\n } else if (self.type === RandomGenerator.Type.BROWSER_CRYPTO) {\n var array = new Uint32Array(1);\n window.crypto.getRandomValues(array);\n return array[0] * 2.3283064365386963e-10; // 2^-32\n } else {\n throw new Error('Unknown random generator type: ' + self.type);\n }\n};\n\n/**\n * @name Random.hexString\n * @summary Return a random string of `n` hexadecimal digits.\n * @locus Anywhere\n * @param {Number} n Length of the string\n */\nRandomGenerator.prototype.hexString = function (digits) {\n var self = this;\n if (self.type === RandomGenerator.Type.NODE_CRYPTO) {\n var numBytes = Math.ceil(digits / 2);\n var bytes;\n // Try to get cryptographically strong randomness. Fall back to\n // non-cryptographically strong if not available.\n try {\n bytes = nodeCrypto.randomBytes(numBytes);\n } catch (e) {\n // XXX should re-throw any error except insufficient entropy\n bytes = nodeCrypto.pseudoRandomBytes(numBytes);\n }\n var result = bytes.toString(\"hex\");\n // If the number of digits is odd, we'll have generated an extra 4 bits\n // of randomness, so we need to trim the last digit.\n return result.substring(0, digits);\n } else {\n return this._randomString(digits, \"0123456789abcdef\");\n }\n};\n\nRandomGenerator.prototype._randomString = function (charsCount,\n alphabet) {\n var self = this;\n var digits = [];\n for (var i = 0; i < charsCount; i++) {\n digits[i] = self.choice(alphabet);\n }\n return digits.join(\"\");\n};\n\n/**\n * @name Random.id\n * @summary Return a unique identifier, such as `\"Jjwjg6gouWLXhMGKW\"`, that is\n * likely to be unique in the whole world.\n * @locus Anywhere\n * @param {Number} [n] Optional length of the identifier in characters\n * (defaults to 17)\n */\nRandomGenerator.prototype.id = function (charsCount) {\n var self = this;\n // 17 characters is around 96 bits of entropy, which is the amount of\n // state in the Alea PRNG.\n if (charsCount === undefined)\n charsCount = 17;\n\n return self._randomString(charsCount, UNMISTAKABLE_CHARS);\n};\n\n/**\n * @name Random.secret\n * @summary Return a random string of printable characters with 6 bits of\n * entropy per character. Use `Random.secret` for security-critical secrets\n * that are intended for machine, rather than human, consumption.\n * @locus Anywhere\n * @param {Number} [n] Optional length of the secret string (defaults to 43\n * characters, or 256 bits of entropy)\n */\nRandomGenerator.prototype.secret = function (charsCount) {\n var self = this;\n // Default to 256 bits of entropy, or 43 characters at 6 bits per\n // character.\n if (charsCount === undefined)\n charsCount = 43;\n return self._randomString(charsCount, BASE64_CHARS);\n};\n\n/**\n * @name Random.choice\n * @summary Return a random element of the given array or string.\n * @locus Anywhere\n * @param {Array|String} arrayOrString Array or string to choose from\n */\nRandomGenerator.prototype.choice = function (arrayOrString) {\n var index = Math.floor(this.fraction() * arrayOrString.length);\n if (typeof arrayOrString === \"string\")\n return arrayOrString.substr(index, 1);\n else\n return arrayOrString[index];\n};\n\n// instantiate RNG. Heuristically collect entropy from various sources when a\n// cryptographic PRNG isn't available.\n\n// client sources\nvar height = (typeof window !== 'undefined' && window.innerHeight) ||\n (typeof document !== 'undefined'\n && document.documentElement\n && document.documentElement.clientHeight) ||\n (typeof document !== 'undefined'\n && document.body\n && document.body.clientHeight) ||\n 1;\n\nvar width = (typeof window !== 'undefined' && window.innerWidth) ||\n (typeof document !== 'undefined'\n && document.documentElement\n && document.documentElement.clientWidth) ||\n (typeof document !== 'undefined'\n && document.body\n && document.body.clientWidth) ||\n 1;\n\nvar agent = (typeof navigator !== 'undefined' && navigator.userAgent) || \"\";\n\nfunction createAleaGeneratorWithGeneratedSeed() {\n return new RandomGenerator(\n RandomGenerator.Type.ALEA,\n {seeds: [new Date, height, width, agent, Math.random()]});\n};\n\nif (Meteor.isServer) {\n Random = new RandomGenerator(RandomGenerator.Type.NODE_CRYPTO);\n} else {\n if (typeof window !== \"undefined\" && window.crypto &&\n window.crypto.getRandomValues) {\n Random = new RandomGenerator(RandomGenerator.Type.BROWSER_CRYPTO);\n } else {\n // On IE 10 and below, there's no browser crypto API\n // available. Fall back to Alea\n //\n // XXX looks like at the moment, we use Alea in IE 11 as well,\n // which has `window.msCrypto` instead of `window.crypto`.\n Random = createAleaGeneratorWithGeneratedSeed();\n }\n}\n\n// Create a non-cryptographically secure PRNG with a given seed (using\n// the Alea algorithm)\nRandom.createWithSeeds = function (...seeds) {\n if (seeds.length === 0) {\n throw new Error(\"No seeds were provided\");\n }\n return new RandomGenerator(RandomGenerator.Type.ALEA, {seeds: seeds});\n};\n\n// Used like `Random`, but much faster and not cryptographically\n// secure\nRandom.insecure = createAleaGeneratorWithGeneratedSeed();\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
/* Package-scope variables */
var ReactiveVar;
(function(){
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/reactive-var/reactive-var.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/*
* ## [new] ReactiveVar(initialValue, [equalsFunc])
*
* A ReactiveVar holds a single value that can be get and set,
* such that calling `set` will invalidate any Computations that
* called `get`, according to the usual contract for reactive
* data sources.
*
* A ReactiveVar is much like a Session variable -- compare `foo.get()`
* to `Session.get("foo")` -- but it doesn't have a global name and isn't
* automatically migrated across hot code pushes. Also, while Session
* variables can only hold JSON or EJSON, ReactiveVars can hold any value.
*
* An important property of ReactiveVars, which is sometimes the reason
* to use one, is that setting the value to the same value as before has
* no effect, meaning ReactiveVars can be used to absorb extra
* invalidations that wouldn't serve a purpose. However, by default,
* ReactiveVars are extremely conservative about what changes they
* absorb. Calling `set` with an object argument will *always* trigger
* invalidations, because even if the new value is `===` the old value,
* the object may have been mutated. You can change the default behavior
* by passing a function of two arguments, `oldValue` and `newValue`,
* to the constructor as `equalsFunc`.
*
* This class is extremely basic right now, but the idea is to evolve
* it into the ReactiveVar of Geoff's Lickable Forms proposal.
*/
/**
* @class
* @instanceName reactiveVar
* @summary Constructor for a ReactiveVar, which represents a single reactive variable.
* @locus Client
* @param {Any} initialValue The initial value to set. `equalsFunc` is ignored when setting the initial value.
* @param {Function} [equalsFunc] Optional. A function of two arguments, called on the old value and the new value whenever the ReactiveVar is set. If it returns true, no set is performed. If omitted, the default `equalsFunc` returns true if its arguments are `===` and are of type number, boolean, string, undefined, or null.
*/
ReactiveVar = function (initialValue, equalsFunc) {
if (! (this instanceof ReactiveVar))
// called without `new`
return new ReactiveVar(initialValue, equalsFunc);
this.curValue = initialValue;
this.equalsFunc = equalsFunc;
this.dep = new Tracker.Dependency;
};
ReactiveVar._isEqual = function (oldValue, newValue) {
var a = oldValue, b = newValue;
// Two values are "equal" here if they are `===` and are
// number, boolean, string, undefined, or null.
if (a !== b)
return false;
else
return ((!a) || (typeof a === 'number') || (typeof a === 'boolean') ||
(typeof a === 'string'));
};
/**
* @summary Returns the current value of the ReactiveVar, establishing a reactive dependency.
* @locus Client
*/
ReactiveVar.prototype.get = function () {
if (Tracker.active)
this.dep.depend();
return this.curValue;
};
/**
* @summary Sets the current value of the ReactiveVar, invalidating the Computations that called `get` if `newValue` is different from the old value.
* @locus Client
* @param {Any} newValue
*/
ReactiveVar.prototype.set = function (newValue) {
var oldValue = this.curValue;
if ((this.equalsFunc || ReactiveVar._isEqual)(oldValue, newValue))
// value is same as last time
return;
this.curValue = newValue;
this.dep.changed();
};
ReactiveVar.prototype.toString = function () {
return 'ReactiveVar{' + this.get() + '}';
};
ReactiveVar.prototype._numListeners = function() {
// Tests want to know.
// Accesses a private field of Tracker.Dependency.
var count = 0;
for (var id in this.dep._dependentsById)
count++;
return count;
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("reactive-var", {
ReactiveVar: ReactiveVar
});
})();
(function () {
/* Exports */
Package._define("reload");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var Random = Package.random.Random;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Retry;
var require = meteorInstall({"node_modules":{"meteor":{"retry":{"retry.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////
// //
// packages/retry/retry.js //
// //
///////////////////////////////////////////////////////////////////////////////
//
module.export({
Retry: () => Retry
});
class Retry {
constructor({
baseTimeout = 1000,
exponent = 2.2,
// The default is high-ish to ensure a server can recover from a
// failure caused by load.
maxTimeout = 5 * 60 * 1000,
minTimeout = 10,
minCount = 2,
fuzz = 0.5
} = {}) {
this.baseTimeout = baseTimeout;
this.exponent = exponent;
this.maxTimeout = maxTimeout;
this.minTimeout = minTimeout;
this.minCount = minCount;
this.fuzz = fuzz;
this.retryTimer = null;
} // Reset a pending retry, if any.
clear() {
if (this.retryTimer) {
clearTimeout(this.retryTimer);
}
this.retryTimer = null;
} // Calculate how long to wait in milliseconds to retry, based on the
// `count` of which retry this is.
_timeout(count) {
if (count < this.minCount) {
return this.minTimeout;
} // fuzz the timeout randomly, to avoid reconnect storms when a
// server goes down.
var timeout = Math.min(this.maxTimeout, this.baseTimeout * Math.pow(this.exponent, count)) * (Random.fraction() * this.fuzz + (1 - this.fuzz / 2));
return timeout;
} // Call `fn` after a delay, based on the `count` of which retry this is.
retryLater(count, fn) {
var timeout = this._timeout(count);
if (this.retryTimer) clearTimeout(this.retryTimer);
this.retryTimer = Meteor.setTimeout(fn, timeout);
return timeout;
}
}
///////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/retry/retry.js");
/* Exports */
Package._define("retry", exports, {
Retry: Retry
});
})();
//# sourceURL=meteor://💻app/packages/retry.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvcmV0cnkvcmV0cnkuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0IiwiUmV0cnkiLCJjb25zdHJ1Y3RvciIsImJhc2VUaW1lb3V0IiwiZXhwb25lbnQiLCJtYXhUaW1lb3V0IiwibWluVGltZW91dCIsIm1pbkNvdW50IiwiZnV6eiIsInJldHJ5VGltZXIiLCJjbGVhciIsImNsZWFyVGltZW91dCIsIl90aW1lb3V0IiwiY291bnQiLCJ0aW1lb3V0IiwiTWF0aCIsIm1pbiIsInBvdyIsIlJhbmRvbSIsImZyYWN0aW9uIiwicmV0cnlMYXRlciIsImZuIiwiTWV0ZW9yIiwic2V0VGltZW91dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQ0MsT0FBSyxFQUFDLE1BQUlBO0FBQVgsQ0FBZDs7QUFVTyxNQUFNQSxLQUFOLENBQVk7QUFDakJDLGFBQVcsQ0FBQztBQUNWQyxlQUFXLEdBQUcsSUFESjtBQUVWQyxZQUFRLEdBQUcsR0FGRDtBQUdWO0FBQ0E7QUFDQUMsY0FBVSxHQUFHLElBQUksRUFBSixHQUFTLElBTFo7QUFNVkMsY0FBVSxHQUFHLEVBTkg7QUFPVkMsWUFBUSxHQUFHLENBUEQ7QUFRVkMsUUFBSSxHQUFHO0FBUkcsTUFTUixFQVRPLEVBU0g7QUFDTixTQUFLTCxXQUFMLEdBQW1CQSxXQUFuQjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixJQUFsQjtBQUNELEdBbEJnQixDQW9CakI7OztBQUNBQyxPQUFLLEdBQUc7QUFDTixRQUFJLEtBQUtELFVBQVQsRUFBcUI7QUFDbkJFLGtCQUFZLENBQUMsS0FBS0YsVUFBTixDQUFaO0FBQ0Q7O0FBQ0QsU0FBS0EsVUFBTCxHQUFrQixJQUFsQjtBQUNELEdBMUJnQixDQTRCakI7QUFDQTs7O0FBQ0FHLFVBQVEsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2QsUUFBSUEsS0FBSyxHQUFHLEtBQUtOLFFBQWpCLEVBQTJCO0FBQ3pCLGFBQU8sS0FBS0QsVUFBWjtBQUNELEtBSGEsQ0FLZDtBQUNBOzs7QUFDQSxRQUFJUSxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsR0FBTCxDQUNaLEtBQUtYLFVBRE8sRUFFWixLQUFLRixXQUFMLEdBQW1CWSxJQUFJLENBQUNFLEdBQUwsQ0FBUyxLQUFLYixRQUFkLEVBQXdCUyxLQUF4QixDQUZQLEtBSVpLLE1BQU0sQ0FBQ0MsUUFBUCxLQUFvQixLQUFLWCxJQUF6QixJQUFpQyxJQUFJLEtBQUtBLElBQUwsR0FBWSxDQUFqRCxDQUpZLENBQWQ7QUFPQSxXQUFPTSxPQUFQO0FBQ0QsR0E3Q2dCLENBK0NqQjs7O0FBQ0FNLFlBQVUsQ0FBQ1AsS0FBRCxFQUFRUSxFQUFSLEVBQVk7QUFDcEIsUUFBSVAsT0FBTyxHQUFHLEtBQUtGLFFBQUwsQ0FBY0MsS0FBZCxDQUFkOztBQUNBLFFBQUksS0FBS0osVUFBVCxFQUNFRSxZQUFZLENBQUMsS0FBS0YsVUFBTixDQUFaO0FBQ0YsU0FBS0EsVUFBTCxHQUFrQmEsTUFBTSxDQUFDQyxVQUFQLENBQWtCRixFQUFsQixFQUFzQlAsT0FBdEIsQ0FBbEI7QUFDQSxXQUFPQSxPQUFQO0FBQ0Q7O0FBdERnQixDIiwiZmlsZSI6Ii9wYWNrYWdlcy9yZXRyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFJldHJ5IGxvZ2ljIHdpdGggYW4gZXhwb25lbnRpYWwgYmFja29mZi5cbi8vXG4vLyBvcHRpb25zOlxuLy8gIGJhc2VUaW1lb3V0OiB0aW1lIGZvciBpbml0aWFsIHJlY29ubmVjdCBhdHRlbXB0IChtcykuXG4vLyAgZXhwb25lbnQ6IGV4cG9uZW50aWFsIGZhY3RvciB0byBpbmNyZWFzZSB0aW1lb3V0IGVhY2ggYXR0ZW1wdC5cbi8vICBtYXhUaW1lb3V0OiBtYXhpbXVtIHRpbWUgYmV0d2VlbiByZXRyaWVzIChtcykuXG4vLyAgbWluQ291bnQ6IGhvdyBtYW55IHRpbWVzIHRvIHJlY29ubmVjdCBcImluc3RhbnRseVwiLlxuLy8gIG1pblRpbWVvdXQ6IHRpbWUgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IGBtaW5Db3VudGAgcmV0cmllcyAobXMpLlxuLy8gIGZ1eno6IGZhY3RvciB0byByYW5kb21pemUgcmV0cnkgdGltZXMgYnkgKHRvIGF2b2lkIHJldHJ5IHN0b3JtcykuXG5cbmV4cG9ydCBjbGFzcyBSZXRyeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVGltZW91dCA9IDEwMDAsXG4gICAgZXhwb25lbnQgPSAyLjIsXG4gICAgLy8gVGhlIGRlZmF1bHQgaXMgaGlnaC1pc2ggdG8gZW5zdXJlIGEgc2VydmVyIGNhbiByZWNvdmVyIGZyb20gYVxuICAgIC8vIGZhaWx1cmUgY2F1c2VkIGJ5IGxvYWQuXG4gICAgbWF4VGltZW91dCA9IDUgKiA2MCAqIDEwMDAsXG4gICAgbWluVGltZW91dCA9IDEwLFxuICAgIG1pbkNvdW50ID0gMixcbiAgICBmdXp6ID0gMC41LFxuICB9ID0ge30pIHtcbiAgICB0aGlzLmJhc2VUaW1lb3V0ID0gYmFzZVRpbWVvdXQ7XG4gICAgdGhpcy5leHBvbmVudCA9IGV4cG9uZW50O1xuICAgIHRoaXMubWF4VGltZW91dCA9IG1heFRpbWVvdXQ7XG4gICAgdGhpcy5taW5UaW1lb3V0ID0gbWluVGltZW91dDtcbiAgICB0aGlzLm1pbkNvdW50ID0gbWluQ291bnQ7XG4gICAgdGhpcy5mdXp6ID0gZnV6ejtcbiAgICB0aGlzLnJldHJ5VGltZXIgPSBudWxsO1xuICB9XG5cbiAgLy8gUmVzZXQgYSBwZW5kaW5nIHJldHJ5LCBpZiBhbnkuXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLnJldHJ5VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXIpO1xuICAgIH1cbiAgICB0aGlzLnJldHJ5VGltZXIgPSBudWxsO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGhvdyBsb25nIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIHRvIHJldHJ5LCBiYXNlZCBvbiB0aGVcbiAgLy8gYGNvdW50YCBvZiB3aGljaCByZXRyeSB0aGlzIGlzLlxuICBfdGltZW91dChjb3VudCkge1xuICAgIGlmIChjb3VudCA8IHRoaXMubWluQ291bnQpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pblRpbWVvdXQ7XG4gICAgfVxuXG4gICAgLy8gZnV6eiB0aGUgdGltZW91dCByYW5kb21seSwgdG8gYXZvaWQgcmVjb25uZWN0IHN0b3JtcyB3aGVuIGFcbiAgICAvLyBzZXJ2ZXIgZ29lcyBkb3duLlxuICAgIHZhciB0aW1lb3V0ID0gTWF0aC5taW4oXG4gICAgICB0aGlzLm1heFRpbWVvdXQsXG4gICAgICB0aGlzLmJhc2VUaW1lb3V0ICogTWF0aC5wb3codGhpcy5leHBvbmVudCwgY291bnQpXG4gICAgKSAqIChcbiAgICAgIFJhbmRvbS5mcmFjdGlvbigpICogdGhpcy5mdXp6ICsgKDEgLSB0aGlzLmZ1enogLyAyKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGltZW91dDtcbiAgfVxuXG4gIC8vIENhbGwgYGZuYCBhZnRlciBhIGRlbGF5LCBiYXNlZCBvbiB0aGUgYGNvdW50YCBvZiB3aGljaCByZXRyeSB0aGlzIGlzLlxuICByZXRyeUxhdGVyKGNvdW50LCBmbikge1xuICAgIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dChjb3VudCk7XG4gICAgaWYgKHRoaXMucmV0cnlUaW1lcilcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXIpO1xuICAgIHRoaXMucmV0cnlUaW1lciA9IE1ldGVvci5zZXRUaW1lb3V0KGZuLCB0aW1lb3V0KTtcbiAgICByZXR1cm4gdGltZW91dDtcbiAgfVxufVxuIl19
{"version":3,"sources":["meteor://💻app/packages/retry/retry.js"],"names":["module","export","Retry","constructor","baseTimeout","exponent","maxTimeout","minTimeout","minCount","fuzz","retryTimer","clear","clearTimeout","_timeout","count","timeout","Math","min","pow","Random","fraction","retryLater","fn","Meteor","setTimeout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAAA,MAAM,CAACC,MAAP,CAAc;AAACC,OAAK,EAAC,MAAIA;AAAX,CAAd;;AAUO,MAAMA,KAAN,CAAY;AACjBC,aAAW,CAAC;AACVC,eAAW,GAAG,IADJ;AAEVC,YAAQ,GAAG,GAFD;AAGV;AACA;AACAC,cAAU,GAAG,IAAI,EAAJ,GAAS,IALZ;AAMVC,cAAU,GAAG,EANH;AAOVC,YAAQ,GAAG,CAPD;AAQVC,QAAI,GAAG;AARG,MASR,EATO,EASH;AACN,SAAKL,WAAL,GAAmBA,WAAnB;AACA,SAAKC,QAAL,GAAgBA,QAAhB;AACA,SAAKC,UAAL,GAAkBA,UAAlB;AACA,SAAKC,UAAL,GAAkBA,UAAlB;AACA,SAAKC,QAAL,GAAgBA,QAAhB;AACA,SAAKC,IAAL,GAAYA,IAAZ;AACA,SAAKC,UAAL,GAAkB,IAAlB;AACD,GAlBgB,CAoBjB;;;AACAC,OAAK,GAAG;AACN,QAAI,KAAKD,UAAT,EAAqB;AACnBE,kBAAY,CAAC,KAAKF,UAAN,CAAZ;AACD;;AACD,SAAKA,UAAL,GAAkB,IAAlB;AACD,GA1BgB,CA4BjB;AACA;;;AACAG,UAAQ,CAACC,KAAD,EAAQ;AACd,QAAIA,KAAK,GAAG,KAAKN,QAAjB,EAA2B;AACzB,aAAO,KAAKD,UAAZ;AACD,KAHa,CAKd;AACA;;;AACA,QAAIQ,OAAO,GAAGC,IAAI,CAACC,GAAL,CACZ,KAAKX,UADO,EAEZ,KAAKF,WAAL,GAAmBY,IAAI,CAACE,GAAL,CAAS,KAAKb,QAAd,EAAwBS,KAAxB,CAFP,KAIZK,MAAM,CAACC,QAAP,KAAoB,KAAKX,IAAzB,IAAiC,IAAI,KAAKA,IAAL,GAAY,CAAjD,CAJY,CAAd;AAOA,WAAOM,OAAP;AACD,GA7CgB,CA+CjB;;;AACAM,YAAU,CAACP,KAAD,EAAQQ,EAAR,EAAY;AACpB,QAAIP,OAAO,GAAG,KAAKF,QAAL,CAAcC,KAAd,CAAd;;AACA,QAAI,KAAKJ,UAAT,EACEE,YAAY,CAAC,KAAKF,UAAN,CAAZ;AACF,SAAKA,UAAL,GAAkBa,MAAM,CAACC,UAAP,CAAkBF,EAAlB,EAAsBP,OAAtB,CAAlB;AACA,WAAOA,OAAP;AACD;;AAtDgB,C","file":"/packages/retry.js","sourcesContent":["// Retry logic with an exponential backoff.\n//\n// options:\n// baseTimeout: time for initial reconnect attempt (ms).\n// exponent: exponential factor to increase timeout each attempt.\n// maxTimeout: maximum time between retries (ms).\n// minCount: how many times to reconnect \"instantly\".\n// minTimeout: time to wait for the first `minCount` retries (ms).\n// fuzz: factor to randomize retry times by (to avoid retry storms).\n\nexport class Retry {\n constructor({\n baseTimeout = 1000,\n exponent = 2.2,\n // The default is high-ish to ensure a server can recover from a\n // failure caused by load.\n maxTimeout = 5 * 60 * 1000,\n minTimeout = 10,\n minCount = 2,\n fuzz = 0.5,\n } = {}) {\n this.baseTimeout = baseTimeout;\n this.exponent = exponent;\n this.maxTimeout = maxTimeout;\n this.minTimeout = minTimeout;\n this.minCount = minCount;\n this.fuzz = fuzz;\n this.retryTimer = null;\n }\n\n // Reset a pending retry, if any.\n clear() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = null;\n }\n\n // Calculate how long to wait in milliseconds to retry, based on the\n // `count` of which retry this is.\n _timeout(count) {\n if (count < this.minCount) {\n return this.minTimeout;\n }\n\n // fuzz the timeout randomly, to avoid reconnect storms when a\n // server goes down.\n var timeout = Math.min(\n this.maxTimeout,\n this.baseTimeout * Math.pow(this.exponent, count)\n ) * (\n Random.fraction() * this.fuzz + (1 - this.fuzz / 2)\n );\n\n return timeout;\n }\n\n // Call `fn` after a delay, based on the `count` of which retry this is.\n retryLater(count, fn) {\n var timeout = this._timeout(count);\n if (this.retryTimer)\n clearTimeout(this.retryTimer);\n this.retryTimer = Meteor.setTimeout(fn, timeout);\n return timeout;\n }\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var _ = Package.underscore._;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var RoutePolicy;
var require = meteorInstall({"node_modules":{"meteor":{"routepolicy":{"main.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/routepolicy/main.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
RoutePolicy: () => RoutePolicy
});
let RoutePolicyConstructor;
module.link("./routepolicy", {
default(v) {
RoutePolicyConstructor = v;
}
}, 0);
const RoutePolicy = new RoutePolicyConstructor();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"routepolicy.js":function(require,exports,module){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/routepolicy/routepolicy.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
default: () => RoutePolicy
});
class RoutePolicy {
constructor() {
// maps prefix to a type
this.urlPrefixTypes = {};
}
urlPrefixMatches(urlPrefix, url) {
return url.startsWith(urlPrefix);
}
checkType(type) {
if (!['network', 'static-online'].includes(type)) {
return 'the route type must be "network" or "static-online"';
}
return null;
}
checkUrlPrefix(urlPrefix, type) {
if (!urlPrefix.startsWith('/')) {
return 'a route URL prefix must begin with a slash';
}
if (urlPrefix === '/') {
return 'a route URL prefix cannot be /';
}
const existingType = this.urlPrefixTypes[urlPrefix];
if (existingType && existingType !== type) {
return `the route URL prefix ${urlPrefix} has already been declared ` + `to be of type ${existingType}`;
}
return null;
}
checkForConflictWithStatic(urlPrefix, type, _testManifest) {
if (type === 'static-online') {
return null;
}
const policy = this;
function check(manifest) {
const conflict = manifest.find(resource => resource.type === 'static' && resource.where === 'client' && policy.urlPrefixMatches(urlPrefix, resource.url));
if (conflict) {
return `static resource ${conflict.url} conflicts with ${type} ` + `route ${urlPrefix}`;
}
return null;
}
;
if (_testManifest) {
return check(_testManifest);
}
const {
WebApp
} = require("meteor/webapp");
let errorMessage = null;
Object.keys(WebApp.clientPrograms).some(arch => {
const {
manifest
} = WebApp.clientPrograms[arch];
return errorMessage = check(manifest);
});
return errorMessage;
}
declare(urlPrefix, type) {
const problem = this.checkType(type) || this.checkUrlPrefix(urlPrefix, type) || this.checkForConflictWithStatic(urlPrefix, type);
if (problem) {
throw new Error(problem);
} // TODO overlapping prefixes, e.g. /foo/ and /foo/bar/
this.urlPrefixTypes[urlPrefix] = type;
}
isValidUrl(url) {
return url.startsWith('/');
}
classify(url) {
if (!this.isValidUrl(url)) {
throw new Error(`url must be a relative URL: ${url}`);
}
const prefix = Object.keys(this.urlPrefixTypes).find(prefix => this.urlPrefixMatches(prefix, url));
return prefix ? this.urlPrefixTypes[prefix] : null;
}
urlPrefixesFor(type) {
return Object.entries(this.urlPrefixTypes).filter(([_prefix, _type]) => _type === type).map(([_prefix]) => _prefix).sort();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/routepolicy/main.js");
/* Exports */
Package._define("routepolicy", exports, {
RoutePolicy: RoutePolicy
});
})();
//# sourceURL=meteor://💻app/packages/routepolicy.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvcm91dGVwb2xpY3kvbWFpbi5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvcm91dGVwb2xpY3kvcm91dGVwb2xpY3kuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0IiwiUm91dGVQb2xpY3kiLCJSb3V0ZVBvbGljeUNvbnN0cnVjdG9yIiwibGluayIsImRlZmF1bHQiLCJ2IiwiY29uc3RydWN0b3IiLCJ1cmxQcmVmaXhUeXBlcyIsInVybFByZWZpeE1hdGNoZXMiLCJ1cmxQcmVmaXgiLCJ1cmwiLCJzdGFydHNXaXRoIiwiY2hlY2tUeXBlIiwidHlwZSIsImluY2x1ZGVzIiwiY2hlY2tVcmxQcmVmaXgiLCJleGlzdGluZ1R5cGUiLCJjaGVja0ZvckNvbmZsaWN0V2l0aFN0YXRpYyIsIl90ZXN0TWFuaWZlc3QiLCJwb2xpY3kiLCJjaGVjayIsIm1hbmlmZXN0IiwiY29uZmxpY3QiLCJmaW5kIiwicmVzb3VyY2UiLCJ3aGVyZSIsIldlYkFwcCIsInJlcXVpcmUiLCJlcnJvck1lc3NhZ2UiLCJPYmplY3QiLCJrZXlzIiwiY2xpZW50UHJvZ3JhbXMiLCJzb21lIiwiYXJjaCIsImRlY2xhcmUiLCJwcm9ibGVtIiwiRXJyb3IiLCJpc1ZhbGlkVXJsIiwiY2xhc3NpZnkiLCJwcmVmaXgiLCJ1cmxQcmVmaXhlc0ZvciIsImVudHJpZXMiLCJmaWx0ZXIiLCJfcHJlZml4IiwiX3R5cGUiLCJtYXAiLCJzb3J0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDQyxhQUFXLEVBQUMsTUFBSUE7QUFBakIsQ0FBZDtBQUE2QyxJQUFJQyxzQkFBSjtBQUEyQkgsTUFBTSxDQUFDSSxJQUFQLENBQVksZUFBWixFQUE0QjtBQUFDQyxTQUFPLENBQUNDLENBQUQsRUFBRztBQUFDSCwwQkFBc0IsR0FBQ0csQ0FBdkI7QUFBeUI7O0FBQXJDLENBQTVC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SSxJQUEzQyxDQUhGOztBQUlBLFFBQUlzQixPQUFKLEVBQWE7QUFDWCxZQUFNLElBQUlDLEtBQUosQ0FBVUQsT0FBVixDQUFOO0FBQ0QsS0FQc0IsQ0FRdkI7OztBQUNBLFNBQUs1QixjQUFMLENBQW9CRSxTQUFwQixJQUFpQ0ksSUFBakM7QUFDRDs7QUFFRHdCLFlBQVUsQ0FBQzNCLEdBQUQsRUFBTTtBQUNkLFdBQU9BLEdBQUcsQ0FBQ0MsVUFBSixDQUFlLEdBQWYsQ0FBUDtBQUNEOztBQUVEMkIsVUFBUSxDQUFDNUIsR0FBRCxFQUFNO0FBQ1osUUFBSSxDQUFDLEtBQUsyQixVQUFMLENBQWdCM0IsR0FBaEIsQ0FBTCxFQUEyQjtBQUN6QixZQUFNLElBQUkwQixLQUFKLENBQVcsK0JBQThCMUIsR0FBSSxFQUE3QyxDQUFOO0FBQ0Q7O0FBRUQsVUFBTTZCLE1BQU0sR0FBR1YsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS3ZCLGNBQWpCLEVBQWlDZ0IsSUFBakMsQ0FBc0NnQixNQUFNLElBQ3pELEtBQUsvQixnQkFBTCxDQUFzQitCLE1BQXRCLEVBQThCN0IsR0FBOUIsQ0FEYSxDQUFmO0FBSUEsV0FBTzZCLE1BQU0sR0FBRyxLQUFLaEMsY0FBTCxDQUFvQmdDLE1BQXBCLENBQUgsR0FBaUMsSUFBOUM7QUFDRDs7QUFFREMsZ0JBQWMsQ0FBQzNCLElBQUQsRUFBTztBQUNuQixXQUFPZ0IsTUFBTSxDQUFDWSxPQUFQLENBQWUsS0FBS2xDLGNBQXBCLEVBQ0ptQyxNQURJLENBQ0csQ0FBQyxDQUFDQyxPQUFELEVBQVVDLEtBQVYsQ0FBRCxLQUFzQkEsS0FBSyxLQUFLL0IsSUFEbkMsRUFFSmdDLEdBRkksQ0FFQSxDQUFDLENBQUNGLE9BQUQsQ0FBRCxLQUFlQSxPQUZmLEVBR0pHLElBSEksRUFBUDtBQUlEOztBQXpHOEIsQyIsImZpbGUiOiIvcGFja2FnZXMvcm91dGVwb2xpY3kuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0IGFzIFJvdXRlUG9saWN5Q29uc3RydWN0b3IgfSBmcm9tICcuL3JvdXRlcG9saWN5JztcbmV4cG9ydCBjb25zdCBSb3V0ZVBvbGljeSA9IG5ldyBSb3V0ZVBvbGljeUNvbnN0cnVjdG9yKCk7XG4iLCIvLyBJbiBhZGRpdGlvbiB0byBsaXN0aW5nIHNwZWNpZmljIGZpbGVzIHRvIGJlIGNhY2hlZCwgdGhlIGJyb3dzZXJcbi8vIGFwcGxpY2F0aW9uIGNhY2hlIG1hbmlmZXN0IGFsbG93cyBVUkxzIHRvIGJlIGRlc2lnbmF0ZWQgYXMgTkVUV09SS1xuLy8gKGFsd2F5cyBmZXRjaGVkIGZyb20gdGhlIEludGVybmV0KSBhbmQgRkFMTEJBQ0sgKHdoaWNoIHdlIHVzZSB0b1xuLy8gc2VydmUgYXBwIEhUTUwgb24gYXJiaXRyYXJ5IFVSTHMpLlxuLy9cbi8vIFRoZSBsaW1pdGF0aW9uIG9mIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBpcyB0aGF0IHRoZSBkZXNpZ25hdGlvbnNcbi8vIGFyZSBieSBwcmVmaXggb25seTogaWYgXCIvZm9vXCIgaXMgZGVjbGFyZWQgTkVUV09SSyB0aGVuIFwiL2Zvb2JhclwiXG4vLyB3aWxsIGFsc28gYmUgdHJlYXRlZCBhcyBhIG5ldHdvcmsgcm91dGUuXG4vL1xuLy8gUm91dGVQb2xpY3kgaXMgYSBsb3ctbGV2ZWwgQVBJIGZvciBkZWNsYXJpbmcgdGhlIHJvdXRlIHR5cGUgb2YgVVJMIHByZWZpeGVzOlxuLy9cbi8vIFwibmV0d29ya1wiOiBmb3IgbmV0d29yayByb3V0ZXMgdGhhdCBzaG91bGQgbm90IGNvbmZsaWN0IHdpdGggc3RhdGljXG4vLyByZXNvdXJjZXMuICAoRm9yIGV4YW1wbGUsIGlmIFwiL3NvY2tqcy9cIiBpcyBhIG5ldHdvcmsgcm91dGUsIHdlXG4vLyBzaG91bGRuJ3QgaGF2ZSBcIi9zb2NranMvcmVkLXNvY2suanBnXCIgYXMgYSBzdGF0aWMgcmVzb3VyY2UpLlxuLy9cbi8vIFwic3RhdGljLW9ubGluZVwiOiBmb3Igc3RhdGljIHJlc291cmNlcyB3aGljaCBzaG91bGQgbm90IGJlIGNhY2hlZCBpblxuLy8gdGhlIGFwcCBjYWNoZS4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgYWxzbyBhZGRpbmcgdGhlbSB0byB0aGVcbi8vIE5FVFdPUksgc2VjdGlvbiAoYXMgb3RoZXJ3aXNlIHRoZSBicm93c2VyIHdvdWxkIHJlY2VpdmUgYXBwIEhUTUxcbi8vIGZvciB0aGVtIGJlY2F1c2Ugb2YgdGhlIEZBTExCQUNLIHNlY3Rpb24pLCBidXQgc3RhdGljLW9ubGluZSByb3V0ZXNcbi8vIGRvbid0IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IgY29uZmxpY3Qgd2l0aCBzdGF0aWMgcmVzb3VyY2VzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlUG9saWN5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gbWFwcyBwcmVmaXggdG8gYSB0eXBlXG4gICAgdGhpcy51cmxQcmVmaXhUeXBlcyA9IHt9O1xuICB9XG5cbiAgdXJsUHJlZml4TWF0Y2hlcyh1cmxQcmVmaXgsIHVybCkge1xuICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCh1cmxQcmVmaXgpO1xuICB9XG5cbiAgY2hlY2tUeXBlKHR5cGUpIHtcbiAgICBpZiAoIVsnbmV0d29yaycsICdzdGF0aWMtb25saW5lJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiAndGhlIHJvdXRlIHR5cGUgbXVzdCBiZSBcIm5ldHdvcmtcIiBvciBcInN0YXRpYy1vbmxpbmVcIic7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2hlY2tVcmxQcmVmaXgodXJsUHJlZml4LCB0eXBlKSB7XG4gICAgaWYgKCF1cmxQcmVmaXguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICByZXR1cm4gJ2Egcm91dGUgVVJMIHByZWZpeCBtdXN0IGJlZ2luIHdpdGggYSBzbGFzaCc7XG4gICAgfVxuXG4gICAgaWYgKHVybFByZWZpeCA9PT0gJy8nKSB7XG4gICAgICByZXR1cm4gJ2Egcm91dGUgVVJMIHByZWZpeCBjYW5ub3QgYmUgLyc7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdUeXBlID0gdGhpcy51cmxQcmVmaXhUeXBlc1t1cmxQcmVmaXhdO1xuICAgIGlmIChleGlzdGluZ1R5cGUgJiYgZXhpc3RpbmdUeXBlICE9PSB0eXBlKSB7XG4gICAgICByZXR1cm4gYHRoZSByb3V0ZSBVUkwgcHJlZml4ICR7dXJsUHJlZml4fSBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkIGAgK1xuICAgICAgICBgdG8gYmUgb2YgdHlwZSAke2V4aXN0aW5nVHlwZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2hlY2tGb3JDb25mbGljdFdpdGhTdGF0aWModXJsUHJlZml4LCB0eXBlLCBfdGVzdE1hbmlmZXN0KSB7XG4gICAgaWYgKHR5cGUgPT09ICdzdGF0aWMtb25saW5lJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcG9saWN5ID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGNoZWNrKG1hbmlmZXN0KSB7XG4gICAgICBjb25zdCBjb25mbGljdCA9IG1hbmlmZXN0LmZpbmQocmVzb3VyY2UgPT4gKFxuICAgICAgICByZXNvdXJjZS50eXBlID09PSAnc3RhdGljJyAmJlxuICAgICAgICByZXNvdXJjZS53aGVyZSA9PT0gJ2NsaWVudCcgJiZcbiAgICAgICAgcG9saWN5LnVybFByZWZpeE1hdGNoZXModXJsUHJlZml4LCByZXNvdXJjZS51cmwpXG4gICAgICApKTtcblxuICAgICAgaWYgKGNvbmZsaWN0KSB7XG4gICAgICAgIHJldHVybiBgc3RhdGljIHJlc291cmNlICR7Y29uZmxpY3QudXJsfSBjb25mbGljdHMgd2l0aCAke3R5cGV9IGAgK1xuICAgICAgICAgIGByb3V0ZSAke3VybFByZWZpeH1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgaWYgKF90ZXN0TWFuaWZlc3QpIHtcbiAgICAgIHJldHVybiBjaGVjayhfdGVzdE1hbmlmZXN0KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IFdlYkFwcCB9ID0gcmVxdWlyZShcIm1ldGVvci93ZWJhcHBcIik7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IG51bGw7XG5cbiAgICBPYmplY3Qua2V5cyhXZWJBcHAuY2xpZW50UHJvZ3JhbXMpLnNvbWUoYXJjaCA9PiB7XG4gICAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSBXZWJBcHAuY2xpZW50UHJvZ3JhbXNbYXJjaF07XG4gICAgICByZXR1cm4gZXJyb3JNZXNzYWdlID0gY2hlY2sobWFuaWZlc3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVycm9yTWVzc2FnZTtcbiAgfVxuXG4gIGRlY2xhcmUodXJsUHJlZml4LCB0eXBlKSB7XG4gICAgY29uc3QgcHJvYmxlbSA9XG4gICAgICB0aGlzLmNoZWNrVHlwZSh0eXBlKSB8fFxuICAgICAgdGhpcy5jaGVja1VybFByZWZpeCh1cmxQcmVmaXgsIHR5cGUpIHx8XG4gICAgICB0aGlzLmNoZWNrRm9yQ29uZmxpY3RXaXRoU3RhdGljKHVybFByZWZpeCwgdHlwZSk7XG4gICAgaWYgKHByb2JsZW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9ibGVtKTtcbiAgICB9XG4gICAgLy8gVE9ETyBvdmVybGFwcGluZyBwcmVmaXhlcywgZS5nLiAvZm9vLyBhbmQgL2Zvby9iYXIvXG4gICAgdGhpcy51cmxQcmVmaXhUeXBlc1t1cmxQcmVmaXhdID0gdHlwZTtcbiAgfVxuXG4gIGlzVmFsaWRVcmwodXJsKSB7XG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCcvJyk7XG4gIH1cblxuICBjbGFzc2lmeSh1cmwpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFVybCh1cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBtdXN0IGJlIGEgcmVsYXRpdmUgVVJMOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXggPSBPYmplY3Qua2V5cyh0aGlzLnVybFByZWZpeFR5cGVzKS5maW5kKHByZWZpeCA9PlxuICAgICAgdGhpcy51cmxQcmVmaXhNYXRjaGVzKHByZWZpeCwgdXJsKVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJlZml4ID8gdGhpcy51cmxQcmVmaXhUeXBlc1twcmVmaXhdIDogbnVsbDtcbiAgfVxuXG4gIHVybFByZWZpeGVzRm9yKHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy51cmxQcmVmaXhUeXBlcylcbiAgICAgIC5maWx0ZXIoKFtfcHJlZml4LCBfdHlwZV0pID0+IF90eXBlID09PSB0eXBlKVxuICAgICAgLm1hcCgoW19wcmVmaXhdKSA9PiBfcHJlZml4KVxuICAgICAgLnNvcnQoKTtcbiAgfVxufVxuIl19
{"version":3,"sources":["meteor://💻app/packages/routepolicy/main.js","meteor://💻app/packages/routepolicy/routepolicy.js"],"names":["module","export","RoutePolicy","RoutePolicyConstructor","link","default","v","constructor","urlPrefixTypes","urlPrefixMatches","urlPrefix","url","startsWith","checkType","type","includes","checkUrlPrefix","existingType","checkForConflictWithStatic","_testManifest","policy","check","manifest","conflict","find","resource","where","WebApp","require","errorMessage","Object","keys","clientPrograms","some","arch","declare","problem","Error","isValidUrl","classify","prefix","urlPrefixesFor","entries","filter","_prefix","_type","map","sort"],"mappings":"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","file":"/packages/routepolicy.js","sourcesContent":["import { default as RoutePolicyConstructor } from './routepolicy';\nexport const RoutePolicy = new RoutePolicyConstructor();\n","// In addition to listing specific files to be cached, the browser\n// application cache manifest allows URLs to be designated as NETWORK\n// (always fetched from the Internet) and FALLBACK (which we use to\n// serve app HTML on arbitrary URLs).\n//\n// The limitation of the manifest file format is that the designations\n// are by prefix only: if \"/foo\" is declared NETWORK then \"/foobar\"\n// will also be treated as a network route.\n//\n// RoutePolicy is a low-level API for declaring the route type of URL prefixes:\n//\n// \"network\": for network routes that should not conflict with static\n// resources. (For example, if \"/sockjs/\" is a network route, we\n// shouldn't have \"/sockjs/red-sock.jpg\" as a static resource).\n//\n// \"static-online\": for static resources which should not be cached in\n// the app cache. This is implemented by also adding them to the\n// NETWORK section (as otherwise the browser would receive app HTML\n// for them because of the FALLBACK section), but static-online routes\n// don't need to be checked for conflict with static resources.\n\n\nexport default class RoutePolicy {\n constructor() {\n // maps prefix to a type\n this.urlPrefixTypes = {};\n }\n\n urlPrefixMatches(urlPrefix, url) {\n return url.startsWith(urlPrefix);\n }\n\n checkType(type) {\n if (!['network', 'static-online'].includes(type)) {\n return 'the route type must be \"network\" or \"static-online\"';\n }\n return null;\n }\n\n checkUrlPrefix(urlPrefix, type) {\n if (!urlPrefix.startsWith('/')) {\n return 'a route URL prefix must begin with a slash';\n }\n\n if (urlPrefix === '/') {\n return 'a route URL prefix cannot be /';\n }\n\n const existingType = this.urlPrefixTypes[urlPrefix];\n if (existingType && existingType !== type) {\n return `the route URL prefix ${urlPrefix} has already been declared ` +\n `to be of type ${existingType}`;\n }\n\n return null;\n }\n\n checkForConflictWithStatic(urlPrefix, type, _testManifest) {\n if (type === 'static-online') {\n return null;\n }\n\n const policy = this;\n\n function check(manifest) {\n const conflict = manifest.find(resource => (\n resource.type === 'static' &&\n resource.where === 'client' &&\n policy.urlPrefixMatches(urlPrefix, resource.url)\n ));\n\n if (conflict) {\n return `static resource ${conflict.url} conflicts with ${type} ` +\n `route ${urlPrefix}`;\n }\n\n return null;\n };\n\n if (_testManifest) {\n return check(_testManifest);\n }\n\n const { WebApp } = require(\"meteor/webapp\");\n let errorMessage = null;\n\n Object.keys(WebApp.clientPrograms).some(arch => {\n const { manifest } = WebApp.clientPrograms[arch];\n return errorMessage = check(manifest);\n });\n\n return errorMessage;\n }\n\n declare(urlPrefix, type) {\n const problem =\n this.checkType(type) ||\n this.checkUrlPrefix(urlPrefix, type) ||\n this.checkForConflictWithStatic(urlPrefix, type);\n if (problem) {\n throw new Error(problem);\n }\n // TODO overlapping prefixes, e.g. /foo/ and /foo/bar/\n this.urlPrefixTypes[urlPrefix] = type;\n }\n\n isValidUrl(url) {\n return url.startsWith('/');\n }\n\n classify(url) {\n if (!this.isValidUrl(url)) {\n throw new Error(`url must be a relative URL: ${url}`);\n }\n\n const prefix = Object.keys(this.urlPrefixTypes).find(prefix =>\n this.urlPrefixMatches(prefix, url)\n );\n\n return prefix ? this.urlPrefixTypes[prefix] : null;\n }\n\n urlPrefixesFor(type) {\n return Object.entries(this.urlPrefixTypes)\n .filter(([_prefix, _type]) => _type === type)\n .map(([_prefix]) => _prefix)\n .sort();\n }\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var socket;
var require = meteorInstall({"node_modules":{"meteor":{"shell-server":{"main.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/shell-server/main.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.link("./shell-server.js", {
"*": "*"
}, 0);
let listen;
module.link("./shell-server.js", {
listen(v) {
listen = v;
}
}, 1);
const shellDir = process.env.METEOR_SHELL_DIR;
if (shellDir) {
listen(shellDir);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"shell-server.js":function(require,exports,module){
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/shell-server/shell-server.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
const module1 = module;
module1.export({
listen: () => listen,
disable: () => disable
});
let assert;
module1.link("assert", {
default(v) {
assert = v;
}
}, 0);
let pathJoin;
module1.link("path", {
join(v) {
pathJoin = v;
}
}, 1);
let PassThrough;
module1.link("stream", {
PassThrough(v) {
PassThrough = v;
}
}, 2);
let closeSync, openSync, readFileSync, unlink, writeFileSync, writeSync;
module1.link("fs", {
closeSync(v) {
closeSync = v;
},
openSync(v) {
openSync = v;
},
readFileSync(v) {
readFileSync = v;
},
unlink(v) {
unlink = v;
},
writeFileSync(v) {
writeFileSync = v;
},
writeSync(v) {
writeSync = v;
}
}, 3);
let createServer;
module1.link("net", {
createServer(v) {
createServer = v;
}
}, 4);
let replStart;
module1.link("repl", {
start(v) {
replStart = v;
}
}, 5);
const INFO_FILE_MODE = parseInt("600", 8); // Only the owner can read or write.
const EXITING_MESSAGE = "Shell exiting..."; // Invoked by the server process to listen for incoming connections from
// shell clients. Each connection gets its own REPL instance.
function listen(shellDir) {
function callback() {
new Server(shellDir).listen();
} // If the server is still in the very early stages of starting up,
// Meteor.startup may not available yet.
if (typeof Meteor === "object") {
Meteor.startup(callback);
} else if (typeof __meteor_bootstrap__ === "object") {
const hooks = __meteor_bootstrap__.startupHooks;
if (hooks) {
hooks.push(callback);
} else {
// As a fallback, just call the callback asynchronously.
setImmediate(callback);
}
}
}
function disable(shellDir) {
try {
// Replace info.json with a file that says the shell server is
// disabled, so that any connected shell clients will fail to
// reconnect after the server process closes their sockets.
writeFileSync(getInfoFile(shellDir), JSON.stringify({
status: "disabled",
reason: "Shell server has shut down."
}) + "\n", {
mode: INFO_FILE_MODE
});
} catch (ignored) {}
}
// Shell commands need to be executed in a Fiber in case they call into
// code that yields. Using a Promise is an even better idea, since it runs
// its callbacks in Fibers drawn from a pool, so the Fibers are recycled.
const evalCommandPromise = Promise.resolve();
class Server {
constructor(shellDir) {
assert.ok(this instanceof Server);
this.shellDir = shellDir;
this.key = Math.random().toString(36).slice(2);
this.server = createServer(socket => {
this.onConnection(socket);
}).on("error", err => {
console.error(err.stack);
});
}
listen() {
const infoFile = getInfoFile(this.shellDir);
unlink(infoFile, () => {
this.server.listen(0, "127.0.0.1", () => {
writeFileSync(infoFile, JSON.stringify({
status: "enabled",
port: this.server.address().port,
key: this.key
}) + "\n", {
mode: INFO_FILE_MODE
});
});
});
}
onConnection(socket) {
// Make sure this function doesn't try to write anything to the socket
// after it has been closed.
socket.on("close", function () {
socket = null;
}); // If communication is not established within 1000ms of the first
// connection, forcibly close the socket.
const timeout = setTimeout(function () {
if (socket) {
socket.removeAllListeners("data");
socket.end(EXITING_MESSAGE + "\n");
}
}, 1000); // Let connecting clients configure certain REPL options by sending a
// JSON object over the socket. For example, only the client knows
// whether it's running a TTY or an Emacs subshell or some other kind of
// terminal, so the client must decide the value of options.terminal.
readJSONFromStream(socket, (error, options, replInputSocket) => {
clearTimeout(timeout);
if (error) {
socket = null;
console.error(error.stack);
return;
}
if (options.key !== this.key) {
if (socket) {
socket.end(EXITING_MESSAGE + "\n");
}
return;
}
delete options.key; // Set the columns to what is being requested by the client.
if (options.columns && socket) {
socket.columns = options.columns;
}
delete options.columns;
options = Object.assign(Object.create(null), // Defaults for configurable options.
{
prompt: "> ",
terminal: true,
useColors: true,
ignoreUndefined: true
}, // Configurable options
options, // Immutable options.
{
input: replInputSocket,
useGlobal: false,
output: socket
}); // The prompt during an evaluateAndExit must be blank to ensure
// that the prompt doesn't inadvertently get parsed as part of
// the JSON communication channel.
if (options.evaluateAndExit) {
options.prompt = "";
} // Start the REPL.
this.startREPL(options);
if (options.evaluateAndExit) {
this._wrappedDefaultEval.call(Object.create(null), options.evaluateAndExit.command, global, options.evaluateAndExit.filename || "<meteor shell>", function (error, result) {
if (socket) {
function sendResultToSocket(message) {
// Sending back a JSON payload allows the client to
// distinguish between errors and successful results.
socket.end(JSON.stringify(message) + "\n");
}
if (error) {
sendResultToSocket({
error: error.toString(),
code: 1
});
} else {
sendResultToSocket({
result
});
}
}
});
return;
}
delete options.evaluateAndExit;
this.enableInteractiveMode(options);
});
}
startREPL(options) {
// Make sure this function doesn't try to write anything to the output
// stream after it has been closed.
options.output.on("close", function () {
options.output = null;
});
const repl = this.repl = replStart(options);
const {
shellDir
} = this; // This is technique of setting `repl.context` is similar to how the
// `useGlobal` option would work during a normal `repl.start()` and
// allows shell access (and tab completion!) to Meteor globals (i.e.
// Underscore _, Meteor, etc.). By using this technique, which changes
// the context after startup, we avoid stomping on the special `_`
// variable (in `repl` this equals the value of the last command) from
// being overridden in the client/server socket-handshaking. Furthermore,
// by setting `useGlobal` back to true, we allow the default eval function
// to use the desired `runInThisContext` method (https://git.io/vbvAB).
repl.context = global;
repl.useGlobal = true;
setRequireAndModule(repl.context); // In order to avoid duplicating code here, specifically the complexities
// of catching so-called "Recoverable Errors" (https://git.io/vbvbl),
// we will wrap the default eval, run it in a Fiber (via a Promise), and
// give it the opportunity to decide if the user is mid-code-block.
const defaultEval = repl.eval;
function wrappedDefaultEval(code, context, file, callback) {
if (Package.ecmascript) {
try {
code = Package.ecmascript.ECMAScript.compileForShell(code, {
cacheDirectory: getCacheDirectory(shellDir)
});
} catch (err) {// Any Babel error here might be just fine since it's
// possible the code was incomplete (multi-line code on the REPL).
// The defaultEval below will use its own functionality to determine
// if this error is "recoverable".
}
}
evalCommandPromise.then(() => defaultEval(code, context, file, callback)).catch(callback);
} // Have the REPL use the newly wrapped function instead and store the
// _wrappedDefaultEval so that evalulateAndExit calls can use it directly.
repl.eval = this._wrappedDefaultEval = wrappedDefaultEval;
}
enableInteractiveMode(options) {
// History persists across shell sessions!
this.initializeHistory();
const repl = this.repl; // Implement an alternate means of fetching the return value,
// via `__` (double underscore) as originally implemented in:
// https://github.com/meteor/meteor/commit/2443d832265c7d1c
Object.defineProperty(repl.context, "__", {
get: () => repl.last,
set: val => {
repl.last = val;
},
// Allow this property to be (re)defined more than once (e.g. each
// time the server restarts).
configurable: true
}); // Some improvements to the existing help messages.
function addHelp(cmd, helpText) {
const info = repl.commands[cmd] || repl.commands["." + cmd];
if (info) {
info.help = helpText;
}
}
addHelp("break", "Terminate current command input and display new prompt");
addHelp("exit", "Disconnect from server and leave shell");
addHelp("help", "Show this help information"); // When the REPL exits, signal the attached client to exit by sending it
// the special EXITING_MESSAGE.
repl.on("exit", function () {
if (options.output) {
options.output.write(EXITING_MESSAGE + "\n");
options.output.end();
}
}); // When the server process exits, end the output stream but do not
// signal the attached client to exit.
process.on("exit", function () {
if (options.output) {
options.output.end();
}
}); // This Meteor-specific shell command rebuilds the application as if a
// change was made to server code.
repl.defineCommand("reload", {
help: "Restart the server and the shell",
action: function () {
process.exit(0);
}
});
} // This function allows a persistent history of shell commands to be saved
// to and loaded from .meteor/local/shell-history.
initializeHistory() {
const rli = this.repl.rli;
const historyFile = getHistoryFile(this.shellDir);
let historyFd = openSync(historyFile, "a+");
const historyLines = readFileSync(historyFile, "utf8").split("\n");
const seenLines = Object.create(null);
if (!rli.history) {
rli.history = [];
rli.historyIndex = -1;
}
while (rli.history && historyLines.length > 0) {
const line = historyLines.pop();
if (line && /\S/.test(line) && !seenLines[line]) {
rli.history.push(line);
seenLines[line] = true;
}
}
rli.addListener("line", function (line) {
if (historyFd >= 0 && /\S/.test(line)) {
writeSync(historyFd, line + "\n");
}
});
this.repl.on("exit", function () {
closeSync(historyFd);
historyFd = -1;
});
}
}
function readJSONFromStream(inputStream, callback) {
const outputStream = new PassThrough();
let dataSoFar = "";
function onData(buffer) {
const lines = buffer.toString("utf8").split("\n");
while (lines.length > 0) {
dataSoFar += lines.shift();
let json;
try {
json = JSON.parse(dataSoFar);
} catch (error) {
if (error instanceof SyntaxError) {
continue;
}
return finish(error);
}
if (lines.length > 0) {
outputStream.write(lines.join("\n"));
}
inputStream.pipe(outputStream);
return finish(null, json);
}
}
function onClose() {
finish(new Error("stream unexpectedly closed"));
}
let finished = false;
function finish(error, json) {
if (!finished) {
finished = true;
inputStream.removeListener("data", onData);
inputStream.removeListener("error", finish);
inputStream.removeListener("close", onClose);
callback(error, json, outputStream);
}
}
inputStream.on("data", onData);
inputStream.on("error", finish);
inputStream.on("close", onClose);
}
function getInfoFile(shellDir) {
return pathJoin(shellDir, "info.json");
}
function getHistoryFile(shellDir) {
return pathJoin(shellDir, "history");
}
function getCacheDirectory(shellDir) {
return pathJoin(shellDir, "cache");
}
function setRequireAndModule(context) {
if (Package.modules) {
// Use the same `require` function and `module` object visible to the
// application.
const toBeInstalled = {};
const shellModuleName = "meteor-shell-" + Math.random().toString(36).slice(2) + ".js";
toBeInstalled[shellModuleName] = function (require, exports, module) {
context.module = module;
context.require = require; // Tab completion sometimes uses require.extensions, but only for
// the keys.
require.extensions = {
".js": true,
".json": true,
".node": true
};
}; // This populates repl.context.{module,require} by evaluating the
// module defined above.
Package.modules.meteorInstall(toBeInstalled)("./" + shellModuleName);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
var exports = require("/node_modules/meteor/shell-server/main.js");
/* Exports */
Package._define("shell-server", exports);
})();
//# sourceURL=meteor://💻app/packages/shell-server.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc2hlbGwtc2VydmVyL21haW4uanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3NoZWxsLXNlcnZlci9zaGVsbC1zZXJ2ZXIuanMiXSwibmFtZXMiOlsibW9kdWxlIiwibGluayIsImxpc3RlbiIsInYiLCJzaGVsbERpciIsInByb2Nlc3MiLCJlbnYiLCJNRVRFT1JfU0hFTExfRElSIiwibW9kdWxlMSIsImV4cG9ydCIsImRpc2FibGUiLCJhc3NlcnQiLCJkZWZhdWx0IiwicGF0aEpvaW4iLCJqb2luIiwiUGFzc1Rocm91Z2giLCJjbG9zZVN5bmMiLCJvcGVuU3luYyIsInJlYWRGaWxlU3luYyIsInVubGluayIsIndyaXRlRmlsZVN5bmMiLCJ3cml0ZVN5bmMiLCJjcmVhdGVTZXJ2ZXIiLCJyZXBsU3RhcnQiLCJzdGFydCIsIklORk9fRklMRV9NT0RFIiwicGFyc2VJbnQiLCJFWElUSU5HX01FU1NBR0UiLCJjYWxsYmFjayIsIlNlcnZlciIsIk1ldGVvciIsInN0YXJ0dXAiLCJfX21ldGVvcl9ib290c3RyYXBfXyIsImhvb2tzIiwic3RhcnR1cEhvb2tzIiwicHVzaCIsInNldEltbWVkaWF0ZSIsImdldEluZm9GaWxlIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXR1cyIsInJlYXNvbiIsIm1vZGUiLCJpZ25vcmVkIiwiZXZhbENvbW1hbmRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb25zdHJ1Y3RvciIsIm9rIiwia2V5IiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic2xpY2UiLCJzZXJ2ZXIiLCJzb2NrZXQiLCJvbkNvbm5lY3Rpb24iLCJvbiIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsInN0YWNrIiwiaW5mb0ZpbGUiLCJwb3J0IiwiYWRkcmVzcyIsInRpbWVvdXQiLCJzZXRUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW5kIiwicmVhZEpTT05Gcm9tU3RyZWFtIiwib3B0aW9ucyIsInJlcGxJbnB1dFNvY2tldCIsImNsZWFyVGltZW91dCIsImNvbHVtbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJjcmVhdGUiLCJwcm9tcHQiLCJ0ZXJtaW5hbCIsInVzZUNvbG9ycyIsImlnbm9yZVVuZGVmaW5lZCIsImlucHV0IiwidXNlR2xvYmFsIiwib3V0cHV0IiwiZXZhbHVhdGVBbmRFeGl0Iiwic3RhcnRSRVBMIiwiX3dyYXBwZWREZWZhdWx0RXZhbCIsImNhbGwiLCJjb21tYW5kIiwiZ2xvYmFsIiwiZmlsZW5hbWUiLCJyZXN1bHQiLCJzZW5kUmVzdWx0VG9Tb2NrZXQiLCJtZXNzYWdlIiwiY29kZSIsImVuYWJsZUludGVyYWN0aXZlTW9kZSIsInJlcGwiLCJjb250ZXh0Iiwic2V0UmVxdWlyZUFuZE1vZHVsZSIsImRlZmF1bHRFdmFsIiwiZXZhbCIsIndyYXBwZWREZWZhdWx0RXZhbCIsImZpbGUiLCJQYWNrYWdlIiwiZWNtYXNjcmlwdCIsIkVDTUFTY3JpcHQiLCJjb21waWxlRm9yU2hlbGwiLCJjYWNoZURpcmVjdG9yeSIsImdldENhY2hlRGlyZWN0b3J5IiwidGhlbiIsImNhdGNoIiwiaW5pdGlhbGl6ZUhpc3RvcnkiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsImxhc3QiLCJzZXQiLCJ2YWwiLCJjb25maWd1cmFibGUiLCJhZGRIZWxwIiwiY21kIiwiaGVscFRleHQiLCJpbmZvIiwiY29tbWFuZHMiLCJoZWxwIiwid3JpdGUiLCJkZWZpbmVDb21tYW5kIiwiYWN0aW9uIiwiZXhpdCIsInJsaSIsImhpc3RvcnlGaWxlIiwiZ2V0SGlzdG9yeUZpbGUiLCJoaXN0b3J5RmQiLCJoaXN0b3J5TGluZXMiLCJzcGxpdCIsInNlZW5MaW5lcyIsImhpc3RvcnkiLCJoaXN0b3J5SW5kZXgiLCJsZW5ndGgiLCJsaW5lIiwicG9wIiwidGVzdCIsImFkZExpc3RlbmVyIiwiaW5wdXRTdHJlYW0iLCJvdXRwdXRTdHJlYW0iLCJkYXRhU29GYXIiLCJvbkRhdGEiLCJidWZmZXIiLCJsaW5lcyIsInNoaWZ0IiwianNvbiIsInBhcnNlIiwiU3ludGF4RXJyb3IiLCJmaW5pc2giLCJwaXBlIiwib25DbG9zZSIsIkVycm9yIiwiZmluaXNoZWQiLCJyZW1vdmVMaXN0ZW5lciIsIm1vZHVsZXMiLCJ0b0JlSW5zdGFsbGVkIiwic2hlbGxNb2R1bGVOYW1lIiwicmVxdWlyZSIsImV4cG9ydHMiLCJleHRlbnNpb25zIiwibWV0ZW9ySW5zdGFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWSxtQkFBWixFQUFnQztBQUFDLE9BQUk7QUFBTCxDQUFoQyxFQUEwQyxDQUExQztBQUE2QyxJQUFJQyxNQUFKO0FBQVdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG1CQUFaLEVBQWdDO0FBQUNDLFFBQU0sQ0FBQ0MsQ0FBRCxFQUFHO0FBQUNELFVBQU0sR0FBQ0MsQ0FBUDtBQUFTOztBQUFwQixDQUFoQyxFQUFzRCxDQUF0RDtBQUd4RCxNQUFNQyxRQUFRLEdBQUdDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxnQkFBN0I7O0FBQ0EsSUFBSUgsUUFBSixFQUFjO0FBQ1pGLFFBQU0sQ0FBQ0UsUUFBRCxDQUFOO0FBQ0QsQzs7Ozs7Ozs7Ozs7QUNORCxNQUFNSSxPQUFPLEdBQUNSLE1BQWQ7QUFBcUJRLE9BQU8sQ0FBQ0MsTUFBUixDQUFlO0FBQUNQLFFBQU0sRUFBQyxNQUFJQSxNQUFaO0FBQW1CUSxTQUFPLEVBQUMsTUFBSUE7QUFBL0IsQ0FBZjtBQUF3RCxJQUFJQyxNQUFKO0FBQVdILE9BQU8sQ0FBQ1AsSUFBUixDQUFhLFFBQWIsRUFBc0I7QUFBQ1csU0FBTyxDQUFDVCxDQUFELEVBQUc7QUFBQ1EsVUFBTSxHQUFDUixDQUFQO0FBQVM7O0FBQXJCLENBQXRCLEVBQTZDLENBQTdDO0FBQWdELElBQUlVLFFBQUo7QUFBYUwsT0FBTyxDQUFDUCxJQUFSLENBQWEsTUFBYixFQUFvQjtBQUFDYSxNQUFJLENBQUNYLENBQUQsRUFBRztBQUFDVSxZQUFRLEdBQUNWLENB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LENBQUN1RCxPQUFSLENBQWdCTSxhQUFoQixDQUE4QkwsYUFBOUIsRUFBNkMsT0FBT0MsZUFBcEQ7QUFDRDtBQUNGLEMiLCJmaWxlIjoiL3BhY2thZ2VzL3NoZWxsLXNlcnZlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3NoZWxsLXNlcnZlci5qc1wiO1xuaW1wb3J0IHsgbGlzdGVuIH0gZnJvbSBcIi4vc2hlbGwtc2VydmVyLmpzXCI7XG5cbmNvbnN0IHNoZWxsRGlyID0gcHJvY2Vzcy5lbnYuTUVURU9SX1NIRUxMX0RJUjtcbmlmIChzaGVsbERpcikge1xuICBsaXN0ZW4oc2hlbGxEaXIpO1xufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBqb2luIGFzIHBhdGhKb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHtcbiAgY2xvc2VTeW5jLFxuICBvcGVuU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVN5bmMsXG4gIHdyaXRlU3luYyxcbn0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBzdGFydCBhcyByZXBsU3RhcnQgfSBmcm9tIFwicmVwbFwiO1xuXG5jb25zdCBJTkZPX0ZJTEVfTU9ERSA9IHBhcnNlSW50KFwiNjAwXCIsIDgpOyAvLyBPbmx5IHRoZSBvd25lciBjYW4gcmVhZCBvciB3cml0ZS5cbmNvbnN0IEVYSVRJTkdfTUVTU0FHRSA9IFwiU2hlbGwgZXhpdGluZy4uLlwiO1xuXG4vLyBJbnZva2VkIGJ5IHRoZSBzZXJ2ZXIgcHJvY2VzcyB0byBsaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb21cbi8vIHNoZWxsIGNsaWVudHMuIEVhY2ggY29ubmVjdGlvbiBnZXRzIGl0cyBvd24gUkVQTCBpbnN0YW5jZS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4oc2hlbGxEaXIpIHtcbiAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgbmV3IFNlcnZlcihzaGVsbERpcikubGlzdGVuKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgc2VydmVyIGlzIHN0aWxsIGluIHRoZSB2ZXJ5IGVhcmx5IHN0YWdlcyBvZiBzdGFydGluZyB1cCxcbiAgLy8gTWV0ZW9yLnN0YXJ0dXAgbWF5IG5vdCBhdmFpbGFibGUgeWV0LlxuICBpZiAodHlwZW9mIE1ldGVvciA9PT0gXCJvYmplY3RcIikge1xuICAgIE1ldGVvci5zdGFydHVwKGNhbGxiYWNrKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgX19tZXRlb3JfYm9vdHN0cmFwX18gPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBob29rcyA9IF9fbWV0ZW9yX2Jvb3RzdHJhcF9fLnN0YXJ0dXBIb29rcztcbiAgICBpZiAoaG9va3MpIHtcbiAgICAgIGhvb2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcyBhIGZhbGxiYWNrLCBqdXN0IGNhbGwgdGhlIGNhbGxiYWNrIGFzeW5jaHJvbm91c2x5LlxuICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRGlzYWJsaW5nIHRoZSBzaGVsbCBjYXVzZXMgYWxsIGF0dGFjaGVkIGNsaWVudHMgdG8gZGlzY29ubmVjdCBhbmQgZXhpdC5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlKHNoZWxsRGlyKSB7XG4gIHRyeSB7XG4gICAgLy8gUmVwbGFjZSBpbmZvLmpzb24gd2l0aCBhIGZpbGUgdGhhdCBzYXlzIHRoZSBzaGVsbCBzZXJ2ZXIgaXNcbiAgICAvLyBkaXNhYmxlZCwgc28gdGhhdCBhbnkgY29ubmVjdGVkIHNoZWxsIGNsaWVudHMgd2lsbCBmYWlsIHRvXG4gICAgLy8gcmVjb25uZWN0IGFmdGVyIHRoZSBzZXJ2ZXIgcHJvY2VzcyBjbG9zZXMgdGhlaXIgc29ja2V0cy5cbiAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgZ2V0SW5mb0ZpbGUoc2hlbGxEaXIpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBzdGF0dXM6IFwiZGlzYWJsZWRcIixcbiAgICAgICAgcmVhc29uOiBcIlNoZWxsIHNlcnZlciBoYXMgc2h1dCBkb3duLlwiXG4gICAgICB9KSArIFwiXFxuXCIsXG4gICAgICB7IG1vZGU6IElORk9fRklMRV9NT0RFIH1cbiAgICApO1xuICB9IGNhdGNoIChpZ25vcmVkKSB7fVxufVxuXG4vLyBTaGVsbCBjb21tYW5kcyBuZWVkIHRvIGJlIGV4ZWN1dGVkIGluIGEgRmliZXIgaW4gY2FzZSB0aGV5IGNhbGwgaW50b1xuLy8gY29kZSB0aGF0IHlpZWxkcy4gVXNpbmcgYSBQcm9taXNlIGlzIGFuIGV2ZW4gYmV0dGVyIGlkZWEsIHNpbmNlIGl0IHJ1bnNcbi8vIGl0cyBjYWxsYmFja3MgaW4gRmliZXJzIGRyYXduIGZyb20gYSBwb29sLCBzbyB0aGUgRmliZXJzIGFyZSByZWN5Y2xlZC5cbmNvbnN0IGV2YWxDb21tYW5kUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5jbGFzcyBTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvcihzaGVsbERpcikge1xuICAgIGFzc2VydC5vayh0aGlzIGluc3RhbmNlb2YgU2VydmVyKTtcblxuICAgIHRoaXMuc2hlbGxEaXIgPSBzaGVsbERpcjtcbiAgICB0aGlzLmtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuXG4gICAgdGhpcy5zZXJ2ZXIgPVxuICAgICAgY3JlYXRlU2VydmVyKChzb2NrZXQpID0+IHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgIH0pXG4gICAgICAub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbGlzdGVuKCkge1xuICAgIGNvbnN0IGluZm9GaWxlID0gZ2V0SW5mb0ZpbGUodGhpcy5zaGVsbERpcik7XG5cbiAgICB1bmxpbmsoaW5mb0ZpbGUsICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyLmxpc3RlbigwLCBcIjEyNy4wLjAuMVwiLCAoKSA9PiB7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoaW5mb0ZpbGUsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBzdGF0dXM6IFwiZW5hYmxlZFwiLFxuICAgICAgICAgIHBvcnQ6IHRoaXMuc2VydmVyLmFkZHJlc3MoKS5wb3J0LFxuICAgICAgICAgIGtleTogdGhpcy5rZXlcbiAgICAgICAgfSkgKyBcIlxcblwiLCB7XG4gICAgICAgICAgbW9kZTogSU5GT19GSUxFX01PREVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbihzb2NrZXQpIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRyeSB0byB3cml0ZSBhbnl0aGluZyB0byB0aGUgc29ja2V0XG4gICAgLy8gYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkLlxuICAgIHNvY2tldC5vbihcImNsb3NlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc29ja2V0ID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIElmIGNvbW11bmljYXRpb24gaXMgbm90IGVzdGFibGlzaGVkIHdpdGhpbiAxMDAwbXMgb2YgdGhlIGZpcnN0XG4gICAgLy8gY29ubmVjdGlvbiwgZm9yY2libHkgY2xvc2UgdGhlIHNvY2tldC5cbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImRhdGFcIik7XG4gICAgICAgIHNvY2tldC5lbmQoRVhJVElOR19NRVNTQUdFICsgXCJcXG5cIik7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG5cbiAgICAvLyBMZXQgY29ubmVjdGluZyBjbGllbnRzIGNvbmZpZ3VyZSBjZXJ0YWluIFJFUEwgb3B0aW9ucyBieSBzZW5kaW5nIGFcbiAgICAvLyBKU09OIG9iamVjdCBvdmVyIHRoZSBzb2NrZXQuIEZvciBleGFtcGxlLCBvbmx5IHRoZSBjbGllbnQga25vd3NcbiAgICAvLyB3aGV0aGVyIGl0J3MgcnVubmluZyBhIFRUWSBvciBhbiBFbWFjcyBzdWJzaGVsbCBvciBzb21lIG90aGVyIGtpbmQgb2ZcbiAgICAvLyB0ZXJtaW5hbCwgc28gdGhlIGNsaWVudCBtdXN0IGRlY2lkZSB0aGUgdmFsdWUgb2Ygb3B0aW9ucy50ZXJtaW5hbC5cbiAgICByZWFkSlNPTkZyb21TdHJlYW0oc29ja2V0LCAoZXJyb3IsIG9wdGlvbnMsIHJlcGxJbnB1dFNvY2tldCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgc29ja2V0ID0gbnVsbDtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMua2V5ICE9PSB0aGlzLmtleSkge1xuICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgc29ja2V0LmVuZChFWElUSU5HX01FU1NBR0UgKyBcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZWxldGUgb3B0aW9ucy5rZXk7XG5cbiAgICAgIC8vIFNldCB0aGUgY29sdW1ucyB0byB3aGF0IGlzIGJlaW5nIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LlxuICAgICAgaWYgKG9wdGlvbnMuY29sdW1ucyAmJiBzb2NrZXQpIHtcbiAgICAgICAgc29ja2V0LmNvbHVtbnMgPSBvcHRpb25zLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBkZWxldGUgb3B0aW9ucy5jb2x1bW5zO1xuXG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcblxuICAgICAgICAvLyBEZWZhdWx0cyBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMuXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9tcHQ6IFwiPiBcIixcbiAgICAgICAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICAgICAgICB1c2VDb2xvcnM6IHRydWUsXG4gICAgICAgICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIENvbmZpZ3VyYWJsZSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMsXG5cbiAgICAgICAgLy8gSW1tdXRhYmxlIG9wdGlvbnMuXG4gICAgICAgIHtcbiAgICAgICAgICBpbnB1dDogcmVwbElucHV0U29ja2V0LFxuICAgICAgICAgIHVzZUdsb2JhbDogZmFsc2UsXG4gICAgICAgICAgb3V0cHV0OiBzb2NrZXRcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIHByb21wdCBkdXJpbmcgYW4gZXZhbHVhdGVBbmRFeGl0IG11c3QgYmUgYmxhbmsgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBwcm9tcHQgZG9lc24ndCBpbmFkdmVydGVudGx5IGdldCBwYXJzZWQgYXMgcGFydCBvZlxuICAgICAgLy8gdGhlIEpTT04gY29tbXVuaWNhdGlvbiBjaGFubmVsLlxuICAgICAgaWYgKG9wdGlvbnMuZXZhbHVhdGVBbmRFeGl0KSB7XG4gICAgICAgIG9wdGlvbnMucHJvbXB0ID0gXCJcIjtcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIFJFUEwuXG4gICAgICB0aGlzLnN0YXJ0UkVQTChvcHRpb25zKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZXZhbHVhdGVBbmRFeGl0KSB7XG4gICAgICAgIHRoaXMuX3dyYXBwZWREZWZhdWx0RXZhbC5jYWxsKFxuICAgICAgICAgIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgb3B0aW9ucy5ldmFsdWF0ZUFuZEV4aXQuY29tbWFuZCxcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3B0aW9ucy5ldmFsdWF0ZUFuZEV4aXQuZmlsZW5hbWUgfHwgXCI8bWV0ZW9yIHNoZWxsPlwiLFxuICAgICAgICAgIGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIHNlbmRSZXN1bHRUb1NvY2tldChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VuZGluZyBiYWNrIGEgSlNPTiBwYXlsb2FkIGFsbG93cyB0aGUgY2xpZW50IHRvXG4gICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlcnJvcnMgYW5kIHN1Y2Nlc3NmdWwgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICBzb2NrZXQuZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpICsgXCJcXG5cIik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzZW5kUmVzdWx0VG9Tb2NrZXQoe1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBjb2RlOiAxXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VuZFJlc3VsdFRvU29ja2V0KHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVsZXRlIG9wdGlvbnMuZXZhbHVhdGVBbmRFeGl0O1xuXG4gICAgICB0aGlzLmVuYWJsZUludGVyYWN0aXZlTW9kZShvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0UkVQTChvcHRpb25zKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0cnkgdG8gd3JpdGUgYW55dGhpbmcgdG8gdGhlIG91dHB1dFxuICAgIC8vIHN0cmVhbSBhZnRlciBpdCBoYXMgYmVlbiBjbG9zZWQuXG4gICAgb3B0aW9ucy5vdXRwdXQub24oXCJjbG9zZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIG9wdGlvbnMub3V0cHV0ID0gbnVsbDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcGwgPSB0aGlzLnJlcGwgPSByZXBsU3RhcnQob3B0aW9ucyk7XG4gICAgY29uc3QgeyBzaGVsbERpciB9ID0gdGhpcztcblxuICAgIC8vIFRoaXMgaXMgdGVjaG5pcXVlIG9mIHNldHRpbmcgYHJlcGwuY29udGV4dGAgaXMgc2ltaWxhciB0byBob3cgdGhlXG4gICAgLy8gYHVzZUdsb2JhbGAgb3B0aW9uIHdvdWxkIHdvcmsgZHVyaW5nIGEgbm9ybWFsIGByZXBsLnN0YXJ0KClgIGFuZFxuICAgIC8vIGFsbG93cyBzaGVsbCBhY2Nlc3MgKGFuZCB0YWIgY29tcGxldGlvbiEpIHRvIE1ldGVvciBnbG9iYWxzIChpLmUuXG4gICAgLy8gVW5kZXJzY29yZSBfLCBNZXRlb3IsIGV0Yy4pLiBCeSB1c2luZyB0aGlzIHRlY2huaXF1ZSwgd2hpY2ggY2hhbmdlc1xuICAgIC8vIHRoZSBjb250ZXh0IGFmdGVyIHN0YXJ0dXAsIHdlIGF2b2lkIHN0b21waW5nIG9uIHRoZSBzcGVjaWFsIGBfYFxuICAgIC8vIHZhcmlhYmxlIChpbiBgcmVwbGAgdGhpcyBlcXVhbHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IGNvbW1hbmQpIGZyb21cbiAgICAvLyBiZWluZyBvdmVycmlkZGVuIGluIHRoZSBjbGllbnQvc2VydmVyIHNvY2tldC1oYW5kc2hha2luZy4gIEZ1cnRoZXJtb3JlLFxuICAgIC8vIGJ5IHNldHRpbmcgYHVzZUdsb2JhbGAgYmFjayB0byB0cnVlLCB3ZSBhbGxvdyB0aGUgZGVmYXVsdCBldmFsIGZ1bmN0aW9uXG4gICAgLy8gdG8gdXNlIHRoZSBkZXNpcmVkIGBydW5JblRoaXNDb250ZXh0YCBtZXRob2QgKGh0dHBzOi8vZ2l0LmlvL3ZidkFCKS5cbiAgICByZXBsLmNvbnRleHQgPSBnbG9iYWw7XG4gICAgcmVwbC51c2VHbG9iYWwgPSB0cnVlO1xuXG4gICAgc2V0UmVxdWlyZUFuZE1vZHVsZShyZXBsLmNvbnRleHQpO1xuXG4gICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgZHVwbGljYXRpbmcgY29kZSBoZXJlLCBzcGVjaWZpY2FsbHkgdGhlIGNvbXBsZXhpdGllc1xuICAgIC8vIG9mIGNhdGNoaW5nIHNvLWNhbGxlZCBcIlJlY292ZXJhYmxlIEVycm9yc1wiIChodHRwczovL2dpdC5pby92YnZibCksXG4gICAgLy8gd2Ugd2lsbCB3cmFwIHRoZSBkZWZhdWx0IGV2YWwsIHJ1biBpdCBpbiBhIEZpYmVyICh2aWEgYSBQcm9taXNlKSwgYW5kXG4gICAgLy8gZ2l2ZSBpdCB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVjaWRlIGlmIHRoZSB1c2VyIGlzIG1pZC1jb2RlLWJsb2NrLlxuICAgIGNvbnN0IGRlZmF1bHRFdmFsID0gcmVwbC5ldmFsO1xuXG4gICAgZnVuY3Rpb24gd3JhcHBlZERlZmF1bHRFdmFsKGNvZGUsIGNvbnRleHQsIGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoUGFja2FnZS5lY21hc2NyaXB0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29kZSA9IFBhY2thZ2UuZWNtYXNjcmlwdC5FQ01BU2NyaXB0LmNvbXBpbGVGb3JTaGVsbChjb2RlLCB7XG4gICAgICAgICAgICBjYWNoZURpcmVjdG9yeTogZ2V0Q2FjaGVEaXJlY3Rvcnkoc2hlbGxEaXIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEFueSBCYWJlbCBlcnJvciBoZXJlIG1pZ2h0IGJlIGp1c3QgZmluZSBzaW5jZSBpdCdzXG4gICAgICAgICAgLy8gcG9zc2libGUgdGhlIGNvZGUgd2FzIGluY29tcGxldGUgKG11bHRpLWxpbmUgY29kZSBvbiB0aGUgUkVQTCkuXG4gICAgICAgICAgLy8gVGhlIGRlZmF1bHRFdmFsIGJlbG93IHdpbGwgdXNlIGl0cyBvd24gZnVuY3Rpb25hbGl0eSB0byBkZXRlcm1pbmVcbiAgICAgICAgICAvLyBpZiB0aGlzIGVycm9yIGlzIFwicmVjb3ZlcmFibGVcIi5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBldmFsQ29tbWFuZFByb21pc2VcbiAgICAgICAgLnRoZW4oKCkgPT4gZGVmYXVsdEV2YWwoY29kZSwgY29udGV4dCwgZmlsZSwgY2FsbGJhY2spKVxuICAgICAgICAuY2F0Y2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8vIEhhdmUgdGhlIFJFUEwgdXNlIHRoZSBuZXdseSB3cmFwcGVkIGZ1bmN0aW9uIGluc3RlYWQgYW5kIHN0b3JlIHRoZVxuICAgIC8vIF93cmFwcGVkRGVmYXVsdEV2YWwgc28gdGhhdCBldmFsdWxhdGVBbmRFeGl0IGNhbGxzIGNhbiB1c2UgaXQgZGlyZWN0bHkuXG4gICAgcmVwbC5ldmFsID0gdGhpcy5fd3JhcHBlZERlZmF1bHRFdmFsID0gd3JhcHBlZERlZmF1bHRFdmFsO1xuICB9XG5cbiAgZW5hYmxlSW50ZXJhY3RpdmVNb2RlKG9wdGlvbnMpIHtcbiAgICAvLyBIaXN0b3J5IHBlcnNpc3RzIGFjcm9zcyBzaGVsbCBzZXNzaW9ucyFcbiAgICB0aGlzLmluaXRpYWxpemVIaXN0b3J5KCk7XG5cbiAgICBjb25zdCByZXBsID0gdGhpcy5yZXBsO1xuXG4gICAgLy8gSW1wbGVtZW50IGFuIGFsdGVybmF0ZSBtZWFucyBvZiBmZXRjaGluZyB0aGUgcmV0dXJuIHZhbHVlLFxuICAgIC8vIHZpYSBgX19gIChkb3VibGUgdW5kZXJzY29yZSkgYXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBpbjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWV0ZW9yL21ldGVvci9jb21taXQvMjQ0M2Q4MzIyNjVjN2QxY1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXBsLmNvbnRleHQsIFwiX19cIiwge1xuICAgICAgZ2V0OiAoKSA9PiByZXBsLmxhc3QsXG4gICAgICBzZXQ6ICh2YWwpID0+IHtcbiAgICAgICAgcmVwbC5sYXN0ID0gdmFsO1xuICAgICAgfSxcblxuICAgICAgLy8gQWxsb3cgdGhpcyBwcm9wZXJ0eSB0byBiZSAocmUpZGVmaW5lZCBtb3JlIHRoYW4gb25jZSAoZS5nLiBlYWNoXG4gICAgICAvLyB0aW1lIHRoZSBzZXJ2ZXIgcmVzdGFydHMpLlxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBTb21lIGltcHJvdmVtZW50cyB0byB0aGUgZXhpc3RpbmcgaGVscCBtZXNzYWdlcy5cbiAgICBmdW5jdGlvbiBhZGRIZWxwKGNtZCwgaGVscFRleHQpIHtcbiAgICAgIGNvbnN0IGluZm8gPSByZXBsLmNvbW1hbmRzW2NtZF0gfHwgcmVwbC5jb21tYW5kc1tcIi5cIiArIGNtZF07XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLmhlbHAgPSBoZWxwVGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkSGVscChcImJyZWFrXCIsIFwiVGVybWluYXRlIGN1cnJlbnQgY29tbWFuZCBpbnB1dCBhbmQgZGlzcGxheSBuZXcgcHJvbXB0XCIpO1xuICAgIGFkZEhlbHAoXCJleGl0XCIsIFwiRGlzY29ubmVjdCBmcm9tIHNlcnZlciBhbmQgbGVhdmUgc2hlbGxcIik7XG4gICAgYWRkSGVscChcImhlbHBcIiwgXCJTaG93IHRoaXMgaGVscCBpbmZvcm1hdGlvblwiKTtcblxuICAgIC8vIFdoZW4gdGhlIFJFUEwgZXhpdHMsIHNpZ25hbCB0aGUgYXR0YWNoZWQgY2xpZW50IHRvIGV4aXQgYnkgc2VuZGluZyBpdFxuICAgIC8vIHRoZSBzcGVjaWFsIEVYSVRJTkdfTUVTU0FHRS5cbiAgICByZXBsLm9uKFwiZXhpdFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvcHRpb25zLm91dHB1dCkge1xuICAgICAgICBvcHRpb25zLm91dHB1dC53cml0ZShFWElUSU5HX01FU1NBR0UgKyBcIlxcblwiKTtcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQuZW5kKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIHRoZSBzZXJ2ZXIgcHJvY2VzcyBleGl0cywgZW5kIHRoZSBvdXRwdXQgc3RyZWFtIGJ1dCBkbyBub3RcbiAgICAvLyBzaWduYWwgdGhlIGF0dGFjaGVkIGNsaWVudCB0byBleGl0LlxuICAgIHByb2Nlc3Mub24oXCJleGl0XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgICAgIG9wdGlvbnMub3V0cHV0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBNZXRlb3Itc3BlY2lmaWMgc2hlbGwgY29tbWFuZCByZWJ1aWxkcyB0aGUgYXBwbGljYXRpb24gYXMgaWYgYVxuICAgIC8vIGNoYW5nZSB3YXMgbWFkZSB0byBzZXJ2ZXIgY29kZS5cbiAgICByZXBsLmRlZmluZUNvbW1hbmQoXCJyZWxvYWRcIiwge1xuICAgICAgaGVscDogXCJSZXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIHRoZSBzaGVsbFwiLFxuICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBwZXJzaXN0ZW50IGhpc3Rvcnkgb2Ygc2hlbGwgY29tbWFuZHMgdG8gYmUgc2F2ZWRcbiAgLy8gdG8gYW5kIGxvYWRlZCBmcm9tIC5tZXRlb3IvbG9jYWwvc2hlbGwtaGlzdG9yeS5cbiAgaW5pdGlhbGl6ZUhpc3RvcnkoKSB7XG4gICAgY29uc3QgcmxpID0gdGhpcy5yZXBsLnJsaTtcbiAgICBjb25zdCBoaXN0b3J5RmlsZSA9IGdldEhpc3RvcnlGaWxlKHRoaXMuc2hlbGxEaXIpO1xuICAgIGxldCBoaXN0b3J5RmQgPSBvcGVuU3luYyhoaXN0b3J5RmlsZSwgXCJhK1wiKTtcbiAgICBjb25zdCBoaXN0b3J5TGluZXMgPSByZWFkRmlsZVN5bmMoaGlzdG9yeUZpbGUsIFwidXRmOFwiKS5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBzZWVuTGluZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgaWYgKCEgcmxpLmhpc3RvcnkpIHtcbiAgICAgIHJsaS5oaXN0b3J5ID0gW107XG4gICAgICBybGkuaGlzdG9yeUluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgd2hpbGUgKHJsaS5oaXN0b3J5ICYmIGhpc3RvcnlMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsaW5lID0gaGlzdG9yeUxpbmVzLnBvcCgpO1xuICAgICAgaWYgKGxpbmUgJiYgL1xcUy8udGVzdChsaW5lKSAmJiAhIHNlZW5MaW5lc1tsaW5lXSkge1xuICAgICAgICBybGkuaGlzdG9yeS5wdXNoKGxpbmUpO1xuICAgICAgICBzZWVuTGluZXNbbGluZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJsaS5hZGRMaXN0ZW5lcihcImxpbmVcIiwgZnVuY3Rpb24obGluZSkge1xuICAgICAgaWYgKGhpc3RvcnlGZCA+PSAwICYmIC9cXFMvLnRlc3QobGluZSkpIHtcbiAgICAgICAgd3JpdGVTeW5jKGhpc3RvcnlGZCwgbGluZSArIFwiXFxuXCIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXBsLm9uKFwiZXhpdFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGNsb3NlU3luYyhoaXN0b3J5RmQpO1xuICAgICAgaGlzdG9yeUZkID0gLTE7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZEpTT05Gcm9tU3RyZWFtKGlucHV0U3RyZWFtLCBjYWxsYmFjaykge1xuICBjb25zdCBvdXRwdXRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGRhdGFTb0ZhciA9IFwiXCI7XG5cbiAgZnVuY3Rpb24gb25EYXRhKGJ1ZmZlcikge1xuICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnRvU3RyaW5nKFwidXRmOFwiKS5zcGxpdChcIlxcblwiKTtcblxuICAgIHdoaWxlIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhU29GYXIgKz0gbGluZXMuc2hpZnQoKTtcblxuICAgICAgbGV0IGpzb247XG4gICAgICB0cnkge1xuICAgICAgICBqc29uID0gSlNPTi5wYXJzZShkYXRhU29GYXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaW5pc2goZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUobGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgICB9XG5cbiAgICAgIGlucHV0U3RyZWFtLnBpcGUob3V0cHV0U3RyZWFtKTtcblxuICAgICAgcmV0dXJuIGZpbmlzaChudWxsLCBqc29uKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsb3NlKCkge1xuICAgIGZpbmlzaChuZXcgRXJyb3IoXCJzdHJlYW0gdW5leHBlY3RlZGx5IGNsb3NlZFwiKSk7XG4gIH1cblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZmluaXNoKGVycm9yLCBqc29uKSB7XG4gICAgaWYgKCEgZmluaXNoZWQpIHtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIGlucHV0U3RyZWFtLnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLCBvbkRhdGEpO1xuICAgICAgaW5wdXRTdHJlYW0ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBmaW5pc2gpO1xuICAgICAgaW5wdXRTdHJlYW0ucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBvbkNsb3NlKTtcbiAgICAgIGNhbGxiYWNrKGVycm9yLCBqc29uLCBvdXRwdXRTdHJlYW0pO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0U3RyZWFtLm9uKFwiZGF0YVwiLCBvbkRhdGEpO1xuICBpbnB1dFN0cmVhbS5vbihcImVycm9yXCIsIGZpbmlzaCk7XG4gIGlucHV0U3RyZWFtLm9uKFwiY2xvc2VcIiwgb25DbG9zZSk7XG59XG5cbmZ1bmN0aW9uIGdldEluZm9GaWxlKHNoZWxsRGlyKSB7XG4gIHJldHVybiBwYXRoSm9pbihzaGVsbERpciwgXCJpbmZvLmpzb25cIik7XG59XG5cbmZ1bmN0aW9uIGdldEhpc3RvcnlGaWxlKHNoZWxsRGlyKSB7XG4gIHJldHVybiBwYXRoSm9pbihzaGVsbERpciwgXCJoaXN0b3J5XCIpO1xufVxuXG5mdW5jdGlvbiBnZXRDYWNoZURpcmVjdG9yeShzaGVsbERpcikge1xuICByZXR1cm4gcGF0aEpvaW4oc2hlbGxEaXIsIFwiY2FjaGVcIik7XG59XG5cbmZ1bmN0aW9uIHNldFJlcXVpcmVBbmRNb2R1bGUoY29udGV4dCkge1xuICBpZiAoUGFja2FnZS5tb2R1bGVzKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIGByZXF1aXJlYCBmdW5jdGlvbiBhbmQgYG1vZHVsZWAgb2JqZWN0IHZpc2libGUgdG8gdGhlXG4gICAgLy8gYXBwbGljYXRpb24uXG4gICAgY29uc3QgdG9CZUluc3RhbGxlZCA9IHt9O1xuICAgIGNvbnN0IHNoZWxsTW9kdWxlTmFtZSA9IFwibWV0ZW9yLXNoZWxsLVwiICtcbiAgICAgIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpICsgXCIuanNcIjtcblxuICAgIHRvQmVJbnN0YWxsZWRbc2hlbGxNb2R1bGVOYW1lXSA9IGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcbiAgICAgIGNvbnRleHQubW9kdWxlID0gbW9kdWxlO1xuICAgICAgY29udGV4dC5yZXF1aXJlID0gcmVxdWlyZTtcblxuICAgICAgLy8gVGFiIGNvbXBsZXRpb24gc29tZXRpbWVzIHVzZXMgcmVxdWlyZS5leHRlbnNpb25zLCBidXQgb25seSBmb3JcbiAgICAgIC8vIHRoZSBrZXlzLlxuICAgICAgcmVxdWlyZS5leHRlbnNpb25zID0ge1xuICAgICAgICBcIi5qc1wiOiB0cnVlLFxuICAgICAgICBcIi5qc29uXCI6IHRydWUsXG4gICAgICAgIFwiLm5vZGVcIjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIC8vIFRoaXMgcG9wdWxhdGVzIHJlcGwuY29udGV4dC57bW9kdWxlLHJlcXVpcmV9IGJ5IGV2YWx1YXRpbmcgdGhlXG4gICAgLy8gbW9kdWxlIGRlZmluZWQgYWJvdmUuXG4gICAgUGFja2FnZS5tb2R1bGVzLm1ldGVvckluc3RhbGwodG9CZUluc3RhbGxlZCkoXCIuL1wiICsgc2hlbGxNb2R1bGVOYW1lKTtcbiAgfVxufVxuIl19
{"version":3,"sources":["meteor://💻app/packages/shell-server/main.js","meteor://💻app/packages/shell-server/shell-server.js"],"names":["module","link","listen","v","shellDir","process","env","METEOR_SHELL_DIR","module1","export","disable","assert","default","pathJoin","join","PassThrough","closeSync","openSync","readFileSync","unlink","writeFileSync","writeSync","createServer","replStart","start","INFO_FILE_MODE","parseInt","EXITING_MESSAGE","callback","Server","Meteor","startup","__meteor_bootstrap__","hooks","startupHooks","push","setImmediate","getInfoFile","JSON","stringify","status","reason","mode","ignored","evalCommandPromise","Promise","resolve","constructor","ok","key","Math","random","toString","slice","server","socket","onConnection","on","err","console","error","stack","infoFile","port","address","timeout","setTimeout","removeAllListeners","end","readJSONFromStream","options","replInputSocket","clearTimeout","columns","Object","assign","create","prompt","terminal","useColors","ignoreUndefined","input","useGlobal","output","evaluateAndExit","startREPL","_wrappedDefaultEval","call","command","global","filename","result","sendResultToSocket","message","code","enableInteractiveMode","repl","context","setRequireAndModule","defaultEval","eval","wrappedDefaultEval","file","Package","ecmascript","ECMAScript","compileForShell","cacheDirectory","getCacheDirectory","then","catch","initializeHistory","defineProperty","get","last","set","val","configurable","addHelp","cmd","helpText","info","commands","help","write","defineCommand","action","exit","rli","historyFile","getHistoryFile","historyFd","historyLines","split","seenLines","history","historyIndex","length","line","pop","test","addListener","inputStream","outputStream","dataSoFar","onData","buffer","lines","shift","json","parse","SyntaxError","finish","pipe","onClose","Error","finished","removeListener","modules","toBeInstalled","shellModuleName","require","exports","extensions","meteorInstall"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAAA,MAAM,CAACC,IAAP,CAAY,mBAAZ,EAAgC;AAAC,OAAI;AAAL,CAAhC,EAA0C,CAA1C;AAA6C,IAAIC,MAAJ;AAAWF,MAAM,CAACC,IAAP,CAAY,mBAAZ,EAAgC;AAACC,QAAM,CAACC,CAAD,EAAG;AAACD,UAAM,GAACC,CAAP;AAAS;;AAApB,CAAhC,EAAsD,CAAtD;AAGxD,MAAMC,QAAQ,GAAGC,OAAO,CAACC,GAAR,CAAYC,gBAA7B;;AACA,IAAIH,QAAJ,EAAc;AACZF,QAAM,CAACE,QAAD,CAAN;AACD,C;;;;;;;;;;;ACND,MAAMI,OAAO,GAACR,MAAd;AAAqBQ,OAAO,CAACC,MAAR,CAAe;AAACP,QAAM,EAAC,MAAIA,MAAZ;AAAmBQ,SAAO,EAAC,MAAIA;AAA/B,CAAf;AAAwD,IAAIC,MAAJ;AAAWH,OAAO,CAACP,IAAR,CAAa,QAAb,EAAsB;AAACW,SAAO,CAACT,CAAD,EAAG;AAACQ,UAAM,GAACR,CAAP;AAAS;;AAArB,CAAtB,EAA6C,CAA7C;AAAgD,IAAIU,QAAJ;AAAaL,OAAO,CAACP,IAAR,CAAa,MAAb,EAAoB;AAACa,MAAI,CAACX,CAAD,EAAG;AAACU,YAAQ,GAACV,CAAT;AAAW;;AAApB,CAApB,EAA0C,CAA1C;AAA6C,IAAIY,WAAJ;AAAgBP,OAAO,CAACP,IAAR,CAAa,QAAb,EAAsB;AAACc,aAAW,CAACZ,CAAD,EAAG;AAACY,eAAW,GAACZ,CAAZ;AAAc;;AAA9B,CAAtB,EAAsD,CAAtD;AAAyD,IAAIa,SAAJ,EAAcC,QAAd,EAAuBC,YAAvB,EAAoCC,MAApC,EAA2CC,aAA3C,EAAyDC,SAAzD;AAAmEb,OAAO,CAACP,IAAR,CAAa,IAAb,EAAkB;AAACe,WAAS,CAACb,CAAD,EAAG;AAACa,aAAS,GAACb,CAAV;AAAY,GAA1B;;AAA2Bc,UAAQ,CAACd,CAAD,EAAG;AAACc,YAAQ,GAACd,CAAT;AAAW,GAAlD;;AAAmDe,cAAY,CAACf,CAAD,EAAG;AAACe,gBAAY,GAACf,CAAb;AAAe,GAAlF;;AAAmFgB,QAAM,CAAChB,CAAD,EAAG;AAACgB,UAAM,GAAChB,CAAP;AAAS,GAAtG;;AAAuGiB,eAAa,CAACjB,CAAD,EAAG;AAACiB,iBAAa,GAACjB,CAAd;AAAgB,GAAxI;;AAAyIkB,WAAS,CAAClB,CAAD,EAAG;AAACkB,aAAS,GAAClB,CAAV;AAAY;;AAAlK,CAAlB,EAAsL,CAAtL;AAAyL,IAAImB,YAAJ;AAAiBd,OAAO,CAACP,IAAR,CAAa,KAAb,EAAmB;AAACqB,cAAY,CAACnB,CAAD,EAAG;AAACmB,gBAAY,GAACnB,CAAb;AAAe;;AAAhC,CAAnB,EAAqD,CAArD;AAAwD,IAAIoB,SAAJ;AAAcf,OAAO,CAACP,IAAR,CAAa,MAAb,EAAoB;AAACuB,OAAK,CAACrB,CAAD,EAAG;AAACoB,aAAS,GAACpB,CAAV;AAAY;;AAAtB,CAApB,EAA4C,CAA5C;AAc9lB,MAAMsB,cAAc,GAAGC,QAAQ,CAAC,KAAD,EAAQ,CAAR,CAA/B,C,CAA2C;;AAC3C,MAAMC,eAAe,GAAG,kBAAxB,C,CAEA;AACA;;AACO,SAASzB,MAAT,CAAgBE,QAAhB,EAA0B;AAC/B,WAASwB,QAAT,GAAoB;AAClB,QAAIC,MAAJ,CAAWzB,QAAX,EAAqBF,MAArB;AACD,GAH8B,CAK/B;AACA;;;AACA,MAAI,OAAO4B,MAAP,KAAkB,QAAtB,EAAgC;AAC9BA,UAAM,CAACC,OAAP,CAAeH,QAAf;AACD,GAFD,MAEO,IAAI,OAAOI,oBAAP,KAAgC,QAApC,EAA8C;AACnD,UAAMC,KAAK,GAAGD,oBAAoB,CAACE,YAAnC;;AACA,QAAID,KAAJ,EAAW;AACTA,WAAK,CAACE,IAAN,CAAWP,QAAX;AACD,KAFD,MAEO;AACL;AACAQ,kBAAY,CAACR,QAAD,CAAZ;AACD;AACF;AACF;;AAGM,SAASlB,OAAT,CAAiBN,QAAjB,EAA2B;AAChC,MAAI;AACF;AACA;AACA;AACAgB,iBAAa,CACXiB,WAAW,CAACjC,QAAD,CADA,EAEXkC,IAAI,CAACC,SAAL,CAAe;AACbC,YAAM,EAAE,UADK;AAEbC,YAAM,EAAE;AAFK,KAAf,IAGK,IALM,EAMX;AAAEC,UAAI,EAAEjB;AAAR,KANW,CAAb;AAQD,GAZD,CAYE,OAAOkB,OAAP,EAAgB,CAAE;AACrB;;AAED;AACA;AACA;AACA,MAAMC,kBAAkB,GAAGC,OAAO,CAACC,OAAR,EAA3B;;AAEA,MAAMjB,MAAN,CAAa;AACXkB,aAAW,CAAC3C,QAAD,EAAW;AACpBO,UAAM,CAACqC,EAAP,CAAU,gBAAgBnB,MAA1B;AAEA,SAAKzB,QAAL,GAAgBA,QAAhB;AACA,SAAK6C,GAAL,GAAWC,IAAI,CAACC,MAAL,GAAcC,QAAd,CAAuB,EAAvB,EAA2BC,KAA3B,CAAiC,CAAjC,CAAX;AAEA,SAAKC,MAAL,GACEhC,YAAY,CAAEiC,MAAD,IAAY;AACvB,WAAKC,YAAL,CAAkBD,MAAlB;AACD,KAFW,CAAZ,CAGCE,EAHD,CAGI,OAHJ,EAGcC,GAAD,IAAS;AACpBC,aAAO,CAACC,KAAR,CAAcF,GAAG,CAACG,KAAlB;AACD,KALD,CADF;AAOD;;AAED3D,QAAM,GAAG;AACP,UAAM4D,QAAQ,GAAGzB,WAAW,CAAC,KAAKjC,QAAN,CAA5B;AAEAe,UAAM,CAAC2C,QAAD,EAAW,MAAM;AACrB,WAAKR,MAAL,CAAYpD,MAAZ,CAAmB,CAAnB,EAAsB,WAAtB,EAAmC,MAAM;AACvCkB,qBAAa,CAAC0C,QAAD,EAAWxB,IAAI,CAACC,SAAL,CAAe;AACrCC,gBAAM,EAAE,SAD6B;AAErCuB,cAAI,EAAE,KAAKT,MAAL,CAAYU,OAAZ,GAAsBD,IAFS;AAGrCd,aAAG,EAAE,KAAKA;AAH2B,SAAf,IAInB,IAJQ,EAIF;AACTP,cAAI,EAAEjB;AADG,SAJE,CAAb;AAOD,OARD;AASD,KAVK,CAAN;AAWD;;AAED+B,cAAY,CAACD,MAAD,EAAS;AACnB;AACA;AACAA,UAAM,CAACE,EAAP,CAAU,OAAV,EAAmB,YAAW;AAC5BF,YAAM,GAAG,IAAT;AACD,KAFD,EAHmB,CAOnB;AACA;;AACA,UAAMU,OAAO,GAAGC,UAAU,CAAC,YAAW;AACpC,UAAIX,MAAJ,EAAY;AACVA,cAAM,CAACY,kBAAP,CAA0B,MAA1B;AACAZ,cAAM,CAACa,GAAP,CAAWzC,eAAe,GAAG,IAA7B;AACD;AACF,KALyB,EAKvB,IALuB,CAA1B,CATmB,CAgBnB;AACA;AACA;AACA;;AACA0C,sBAAkB,CAACd,MAAD,EAAS,CAACK,KAAD,EAAQU,OAAR,EAAiBC,eAAjB,KAAqC;AAC9DC,kBAAY,CAACP,OAAD,CAAZ;;AAEA,UAAIL,KAAJ,EAAW;AACTL,cAAM,GAAG,IAAT;AACAI,eAAO,CAACC,KAAR,CAAcA,KAAK,CAACC,KAApB;AACA;AACD;;AAED,UAAIS,OAAO,CAACrB,GAAR,KAAgB,KAAKA,GAAzB,EAA8B;AAC5B,YAAIM,MAAJ,EAAY;AACVA,gBAAM,CAACa,GAAP,CAAWzC,eAAe,GAAG,IAA7B;AACD;;AACD;AACD;;AACD,aAAO2C,OAAO,CAACrB,GAAf,CAf8D,CAiB9D;;AACA,UAAIqB,OAAO,CAACG,OAAR,IAAmBlB,MAAvB,EAA+B;AAC7BA,cAAM,CAACkB,OAAP,GAAiBH,OAAO,CAACG,OAAzB;AACD;;AACD,aAAOH,OAAO,CAACG,OAAf;AAEAH,aAAO,GAAGI,MAAM,CAACC,MAAP,CACRD,MAAM,CAACE,MAAP,CAAc,IAAd,CADQ,EAGR;AACA;AACEC,cAAM,EAAE,IADV;AAEEC,gBAAQ,EAAE,IAFZ;AAGEC,iBAAS,EAAE,IAHb;AAIEC,uBAAe,EAAE;AAJnB,OAJQ,EAWR;AACAV,aAZQ,EAcR;AACA;AACEW,aAAK,EAAEV,eADT;AAEEW,iBAAS,EAAE,KAFb;AAGEC,cAAM,EAAE5B;AAHV,OAfQ,CAAV,CAvB8D,CA6C9D;AACA;AACA;;AACA,UAAIe,OAAO,CAACc,eAAZ,EAA6B;AAC3Bd,eAAO,CAACO,MAAR,GAAiB,EAAjB;AACD,OAlD6D,CAoD9D;;;AACA,WAAKQ,SAAL,CAAef,OAAf;;AAEA,UAAIA,OAAO,CAACc,eAAZ,EAA6B;AAC3B,aAAKE,mBAAL,CAAyBC,IAAzB,CACEb,MAAM,CAACE,MAAP,CAAc,IAAd,CADF,EAEEN,OAAO,CAACc,eAAR,CAAwBI,OAF1B,EAGEC,MAHF,EAIEnB,OAAO,CAACc,eAAR,CAAwBM,QAAxB,IAAoC,gBAJtC,EAKE,UAAU9B,KAAV,EAAiB+B,MAAjB,EAAyB;AACvB,cAAIpC,MAAJ,EAAY;AACV,qBAASqC,kBAAT,CAA4BC,OAA5B,EAAqC;AACnC;AACA;AACAtC,oBAAM,CAACa,GAAP,CAAW9B,IAAI,CAACC,SAAL,CAAesD,OAAf,IAA0B,IAArC;AACD;;AAED,gBAAIjC,KAAJ,EAAW;AACTgC,gCAAkB,CAAC;AACjBhC,qBAAK,EAAEA,KAAK,CAACR,QAAN,EADU;AAEjB0C,oBAAI,EAAE;AAFW,eAAD,CAAlB;AAID,aALD,MAKO;AACLF,gCAAkB,CAAC;AACjBD;AADiB,eAAD,CAAlB;AAGD;AACF;AACF,SAxBH;;AA0BA;AACD;;AACD,aAAOrB,OAAO,CAACc,eAAf;AAEA,WAAKW,qBAAL,CAA2BzB,OAA3B;AACD,KAvFiB,CAAlB;AAwFD;;AAEDe,WAAS,CAACf,OAAD,EAAU;AACjB;AACA;AACAA,WAAO,CAACa,MAAR,CAAe1B,EAAf,CAAkB,OAAlB,EAA2B,YAAW;AACpCa,aAAO,CAACa,MAAR,GAAiB,IAAjB;AACD,KAFD;AAIA,UAAMa,IAAI,GAAG,KAAKA,IAAL,GAAYzE,SAAS,CAAC+C,OAAD,CAAlC;AACA,UAAM;AAAElE;AAAF,QAAe,IAArB,CARiB,CAUjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA4F,QAAI,CAACC,OAAL,GAAeR,MAAf;AACAO,QAAI,CAACd,SAAL,GAAiB,IAAjB;AAEAgB,uBAAmB,CAACF,IAAI,CAACC,OAAN,CAAnB,CAtBiB,CAwBjB;AACA;AACA;AACA;;AACA,UAAME,WAAW,GAAGH,IAAI,CAACI,IAAzB;;AAEA,aAASC,kBAAT,CAA4BP,IAA5B,EAAkCG,OAAlC,EAA2CK,IAA3C,EAAiD1E,QAAjD,EAA2D;AACzD,UAAI2E,OAAO,CAACC,UAAZ,EAAwB;AACtB,YAAI;AACFV,cAAI,GAAGS,OAAO,CAACC,UAAR,CAAmBC,UAAnB,CAA8BC,eAA9B,CAA8CZ,IAA9C,EAAoD;AACzDa,0BAAc,EAAEC,iBAAiB,CAACxG,QAAD;AADwB,WAApD,CAAP;AAGD,SAJD,CAIE,OAAOsD,GAAP,EAAY,CACZ;AACA;AACA;AACA;AACD;AACF;;AAEDd,wBAAkB,CACfiE,IADH,CACQ,MAAMV,WAAW,CAACL,IAAD,EAAOG,OAAP,EAAgBK,IAAhB,EAAsB1E,QAAtB,CADzB,EAEGkF,KAFH,CAESlF,QAFT;AAGD,KA/CgB,CAiDjB;AACA;;;AACAoE,QAAI,CAACI,IAAL,GAAY,KAAKd,mBAAL,GAA2Be,kBAAvC;AACD;;AAEDN,uBAAqB,CAACzB,OAAD,EAAU;AAC7B;AACA,SAAKyC,iBAAL;AAEA,UAAMf,IAAI,GAAG,KAAKA,IAAlB,CAJ6B,CAM7B;AACA;AACA;;AACAtB,UAAM,CAACsC,cAAP,CAAsBhB,IAAI,CAACC,OAA3B,EAAoC,IAApC,EAA0C;AACxCgB,SAAG,EAAE,MAAMjB,IAAI,CAACkB,IADwB;AAExCC,SAAG,EAAGC,GAAD,IAAS;AACZpB,YAAI,CAACkB,IAAL,GAAYE,GAAZ;AACD,OAJuC;AAMxC;AACA;AACAC,kBAAY,EAAE;AAR0B,KAA1C,EAT6B,CAoB7B;;AACA,aAASC,OAAT,CAAiBC,GAAjB,EAAsBC,QAAtB,EAAgC;AAC9B,YAAMC,IAAI,GAAGzB,IAAI,CAAC0B,QAAL,CAAcH,GAAd,KAAsBvB,IAAI,CAAC0B,QAAL,CAAc,MAAMH,GAApB,CAAnC;;AACA,UAAIE,IAAJ,EAAU;AACRA,YAAI,CAACE,IAAL,GAAYH,QAAZ;AACD;AACF;;AACDF,WAAO,CAAC,OAAD,EAAU,wDAAV,CAAP;AACAA,WAAO,CAAC,MAAD,EAAS,wCAAT,CAAP;AACAA,WAAO,CAAC,MAAD,EAAS,4BAAT,CAAP,CA7B6B,CA+B7B;AACA;;AACAtB,QAAI,CAACvC,EAAL,CAAQ,MAAR,EAAgB,YAAW;AACzB,UAAIa,OAAO,CAACa,MAAZ,EAAoB;AAClBb,eAAO,CAACa,MAAR,CAAeyC,KAAf,CAAqBjG,eAAe,GAAG,IAAvC;AACA2C,eAAO,CAACa,MAAR,CAAef,GAAf;AACD;AACF,KALD,EAjC6B,CAwC7B;AACA;;AACA/D,WAAO,CAACoD,EAAR,CAAW,MAAX,EAAmB,YAAW;AAC5B,UAAIa,OAAO,CAACa,MAAZ,EAAoB;AAClBb,eAAO,CAACa,MAAR,CAAef,GAAf;AACD;AACF,KAJD,EA1C6B,CAgD7B;AACA;;AACA4B,QAAI,CAAC6B,aAAL,CAAmB,QAAnB,EAA6B;AAC3BF,UAAI,EAAE,kCADqB;AAE3BG,YAAM,EAAE,YAAW;AACjBzH,eAAO,CAAC0H,IAAR,CAAa,CAAb;AACD;AAJ0B,KAA7B;AAMD,GA5PU,CA8PX;AACA;;;AACAhB,mBAAiB,GAAG;AAClB,UAAMiB,GAAG,GAAG,KAAKhC,IAAL,CAAUgC,GAAtB;AACA,UAAMC,WAAW,GAAGC,cAAc,CAAC,KAAK9H,QAAN,CAAlC;AACA,QAAI+H,SAAS,GAAGlH,QAAQ,CAACgH,WAAD,EAAc,IAAd,CAAxB;AACA,UAAMG,YAAY,GAAGlH,YAAY,CAAC+G,WAAD,EAAc,MAAd,CAAZ,CAAkCI,KAAlC,CAAwC,IAAxC,CAArB;AACA,UAAMC,SAAS,GAAG5D,MAAM,CAACE,MAAP,CAAc,IAAd,CAAlB;;AAEA,QAAI,CAAEoD,GAAG,CAACO,OAAV,EAAmB;AACjBP,SAAG,CAACO,OAAJ,GAAc,EAAd;AACAP,SAAG,CAACQ,YAAJ,GAAmB,CAAC,CAApB;AACD;;AAED,WAAOR,GAAG,CAACO,OAAJ,IAAeH,YAAY,CAACK,MAAb,GAAsB,CAA5C,EAA+C;AAC7C,YAAMC,IAAI,GAAGN,YAAY,CAACO,GAAb,EAAb;;AACA,UAAID,IAAI,IAAI,KAAKE,IAAL,CAAUF,IAAV,CAAR,IAA2B,CAAEJ,SAAS,CAACI,IAAD,CAA1C,EAAkD;AAChDV,WAAG,CAACO,OAAJ,CAAYpG,IAAZ,CAAiBuG,IAAjB;AACAJ,iBAAS,CAACI,IAAD,CAAT,GAAkB,IAAlB;AACD;AACF;;AAEDV,OAAG,CAACa,WAAJ,CAAgB,MAAhB,EAAwB,UAASH,IAAT,EAAe;AACrC,UAAIP,SAAS,IAAI,CAAb,IAAkB,KAAKS,IAAL,CAAUF,IAAV,CAAtB,EAAuC;AACrCrH,iBAAS,CAAC8G,SAAD,EAAYO,IAAI,GAAG,IAAnB,CAAT;AACD;AACF,KAJD;AAMA,SAAK1C,IAAL,CAAUvC,EAAV,CAAa,MAAb,EAAqB,YAAW;AAC9BzC,eAAS,CAACmH,SAAD,CAAT;AACAA,eAAS,GAAG,CAAC,CAAb;AACD,KAHD;AAID;;AA9RU;;AAiSb,SAAS9D,kBAAT,CAA4ByE,WAA5B,EAAyClH,QAAzC,EAAmD;AACjD,QAAMmH,YAAY,GAAG,IAAIhI,WAAJ,EAArB;AACA,MAAIiI,SAAS,GAAG,EAAhB;;AAEA,WAASC,MAAT,CAAgBC,MAAhB,EAAwB;AACtB,UAAMC,KAAK,GAAGD,MAAM,CAAC9F,QAAP,CAAgB,MAAhB,EAAwBiF,KAAxB,CAA8B,IAA9B,CAAd;;AAEA,WAAOc,KAAK,CAACV,MAAN,GAAe,CAAtB,EAAyB;AACvBO,eAAS,IAAIG,KAAK,CAACC,KAAN,EAAb;AAEA,UAAIC,IAAJ;;AACA,UAAI;AACFA,YAAI,GAAG/G,IAAI,CAACgH,KAAL,CAAWN,SAAX,CAAP;AACD,OAFD,CAEE,OAAOpF,KAAP,EAAc;AACd,YAAIA,KAAK,YAAY2F,WAArB,EAAkC;AAChC;AACD;;AAED,eAAOC,MAAM,CAAC5F,KAAD,CAAb;AACD;;AAED,UAAIuF,KAAK,CAACV,MAAN,GAAe,CAAnB,EAAsB;AACpBM,oBAAY,CAACnB,KAAb,CAAmBuB,KAAK,CAACrI,IAAN,CAAW,IAAX,CAAnB;AACD;;AAEDgI,iBAAW,CAACW,IAAZ,CAAiBV,YAAjB;AAEA,aAAOS,MAAM,CAAC,IAAD,EAAOH,IAAP,CAAb;AACD;AACF;;AAED,WAASK,OAAT,GAAmB;AACjBF,UAAM,CAAC,IAAIG,KAAJ,CAAU,4BAAV,CAAD,CAAN;AACD;;AAED,MAAIC,QAAQ,GAAG,KAAf;;AACA,WAASJ,MAAT,CAAgB5F,KAAhB,EAAuByF,IAAvB,EAA6B;AAC3B,QAAI,CAAEO,QAAN,EAAgB;AACdA,cAAQ,GAAG,IAAX;AACAd,iBAAW,CAACe,cAAZ,CAA2B,MAA3B,EAAmCZ,MAAnC;AACAH,iBAAW,CAACe,cAAZ,CAA2B,OAA3B,EAAoCL,MAApC;AACAV,iBAAW,CAACe,cAAZ,CAA2B,OAA3B,EAAoCH,OAApC;AACA9H,cAAQ,CAACgC,KAAD,EAAQyF,IAAR,EAAcN,YAAd,CAAR;AACD;AACF;;AAEDD,aAAW,CAACrF,EAAZ,CAAe,MAAf,EAAuBwF,MAAvB;AACAH,aAAW,CAACrF,EAAZ,CAAe,OAAf,EAAwB+F,MAAxB;AACAV,aAAW,CAACrF,EAAZ,CAAe,OAAf,EAAwBiG,OAAxB;AACD;;AAED,SAASrH,WAAT,CAAqBjC,QAArB,EAA+B;AAC7B,SAAOS,QAAQ,CAACT,QAAD,EAAW,WAAX,CAAf;AACD;;AAED,SAAS8H,cAAT,CAAwB9H,QAAxB,EAAkC;AAChC,SAAOS,QAAQ,CAACT,QAAD,EAAW,SAAX,CAAf;AACD;;AAED,SAASwG,iBAAT,CAA2BxG,QAA3B,EAAqC;AACnC,SAAOS,QAAQ,CAACT,QAAD,EAAW,OAAX,CAAf;AACD;;AAED,SAAS8F,mBAAT,CAA6BD,OAA7B,EAAsC;AACpC,MAAIM,OAAO,CAACuD,OAAZ,EAAqB;AACnB;AACA;AACA,UAAMC,aAAa,GAAG,EAAtB;AACA,UAAMC,eAAe,GAAG,kBACtB9G,IAAI,CAACC,MAAL,GAAcC,QAAd,CAAuB,EAAvB,EAA2BC,KAA3B,CAAiC,CAAjC,CADsB,GACgB,KADxC;;AAGA0G,iBAAa,CAACC,eAAD,CAAb,GAAiC,UAAUC,OAAV,EAAmBC,OAAnB,EAA4BlK,MAA5B,EAAoC;AACnEiG,aAAO,CAACjG,MAAR,GAAiBA,MAAjB;AACAiG,aAAO,CAACgE,OAAR,GAAkBA,OAAlB,CAFmE,CAInE;AACA;;AACAA,aAAO,CAACE,UAAR,GAAqB;AACnB,eAAO,IADY;AAEnB,iBAAS,IAFU;AAGnB,iBAAS;AAHU,OAArB;AAKD,KAXD,CAPmB,CAoBnB;AACA;;;AACA5D,WAAO,CAACuD,OAAR,CAAgBM,aAAhB,CAA8BL,aAA9B,EAA6C,OAAOC,eAApD;AACD;AACF,C","file":"/packages/shell-server.js","sourcesContent":["export * from \"./shell-server.js\";\nimport { listen } from \"./shell-server.js\";\n\nconst shellDir = process.env.METEOR_SHELL_DIR;\nif (shellDir) {\n listen(shellDir);\n}\n","import assert from \"assert\";\nimport { join as pathJoin } from \"path\";\nimport { PassThrough } from \"stream\";\nimport {\n closeSync,\n openSync,\n readFileSync,\n unlink,\n writeFileSync,\n writeSync,\n} from \"fs\";\nimport { createServer } from \"net\";\nimport { start as replStart } from \"repl\";\n\nconst INFO_FILE_MODE = parseInt(\"600\", 8); // Only the owner can read or write.\nconst EXITING_MESSAGE = \"Shell exiting...\";\n\n// Invoked by the server process to listen for incoming connections from\n// shell clients. Each connection gets its own REPL instance.\nexport function listen(shellDir) {\n function callback() {\n new Server(shellDir).listen();\n }\n\n // If the server is still in the very early stages of starting up,\n // Meteor.startup may not available yet.\n if (typeof Meteor === \"object\") {\n Meteor.startup(callback);\n } else if (typeof __meteor_bootstrap__ === \"object\") {\n const hooks = __meteor_bootstrap__.startupHooks;\n if (hooks) {\n hooks.push(callback);\n } else {\n // As a fallback, just call the callback asynchronously.\n setImmediate(callback);\n }\n }\n}\n\n// Disabling the shell causes all attached clients to disconnect and exit.\nexport function disable(shellDir) {\n try {\n // Replace info.json with a file that says the shell server is\n // disabled, so that any connected shell clients will fail to\n // reconnect after the server process closes their sockets.\n writeFileSync(\n getInfoFile(shellDir),\n JSON.stringify({\n status: \"disabled\",\n reason: \"Shell server has shut down.\"\n }) + \"\\n\",\n { mode: INFO_FILE_MODE }\n );\n } catch (ignored) {}\n}\n\n// Shell commands need to be executed in a Fiber in case they call into\n// code that yields. Using a Promise is an even better idea, since it runs\n// its callbacks in Fibers drawn from a pool, so the Fibers are recycled.\nconst evalCommandPromise = Promise.resolve();\n\nclass Server {\n constructor(shellDir) {\n assert.ok(this instanceof Server);\n\n this.shellDir = shellDir;\n this.key = Math.random().toString(36).slice(2);\n\n this.server =\n createServer((socket) => {\n this.onConnection(socket);\n })\n .on(\"error\", (err) => {\n console.error(err.stack);\n });\n }\n\n listen() {\n const infoFile = getInfoFile(this.shellDir);\n\n unlink(infoFile, () => {\n this.server.listen(0, \"127.0.0.1\", () => {\n writeFileSync(infoFile, JSON.stringify({\n status: \"enabled\",\n port: this.server.address().port,\n key: this.key\n }) + \"\\n\", {\n mode: INFO_FILE_MODE\n });\n });\n });\n }\n\n onConnection(socket) {\n // Make sure this function doesn't try to write anything to the socket\n // after it has been closed.\n socket.on(\"close\", function() {\n socket = null;\n });\n\n // If communication is not established within 1000ms of the first\n // connection, forcibly close the socket.\n const timeout = setTimeout(function() {\n if (socket) {\n socket.removeAllListeners(\"data\");\n socket.end(EXITING_MESSAGE + \"\\n\");\n }\n }, 1000);\n\n // Let connecting clients configure certain REPL options by sending a\n // JSON object over the socket. For example, only the client knows\n // whether it's running a TTY or an Emacs subshell or some other kind of\n // terminal, so the client must decide the value of options.terminal.\n readJSONFromStream(socket, (error, options, replInputSocket) => {\n clearTimeout(timeout);\n\n if (error) {\n socket = null;\n console.error(error.stack);\n return;\n }\n\n if (options.key !== this.key) {\n if (socket) {\n socket.end(EXITING_MESSAGE + \"\\n\");\n }\n return;\n }\n delete options.key;\n\n // Set the columns to what is being requested by the client.\n if (options.columns && socket) {\n socket.columns = options.columns;\n }\n delete options.columns;\n\n options = Object.assign(\n Object.create(null),\n\n // Defaults for configurable options.\n {\n prompt: \"> \",\n terminal: true,\n useColors: true,\n ignoreUndefined: true,\n },\n\n // Configurable options\n options,\n\n // Immutable options.\n {\n input: replInputSocket,\n useGlobal: false,\n output: socket\n }\n );\n\n // The prompt during an evaluateAndExit must be blank to ensure\n // that the prompt doesn't inadvertently get parsed as part of\n // the JSON communication channel.\n if (options.evaluateAndExit) {\n options.prompt = \"\";\n }\n\n // Start the REPL.\n this.startREPL(options);\n\n if (options.evaluateAndExit) {\n this._wrappedDefaultEval.call(\n Object.create(null),\n options.evaluateAndExit.command,\n global,\n options.evaluateAndExit.filename || \"<meteor shell>\",\n function (error, result) {\n if (socket) {\n function sendResultToSocket(message) {\n // Sending back a JSON payload allows the client to\n // distinguish between errors and successful results.\n socket.end(JSON.stringify(message) + \"\\n\");\n }\n\n if (error) {\n sendResultToSocket({\n error: error.toString(),\n code: 1\n });\n } else {\n sendResultToSocket({\n result,\n });\n }\n }\n }\n );\n return;\n }\n delete options.evaluateAndExit;\n\n this.enableInteractiveMode(options);\n });\n }\n\n startREPL(options) {\n // Make sure this function doesn't try to write anything to the output\n // stream after it has been closed.\n options.output.on(\"close\", function() {\n options.output = null;\n });\n\n const repl = this.repl = replStart(options);\n const { shellDir } = this;\n\n // This is technique of setting `repl.context` is similar to how the\n // `useGlobal` option would work during a normal `repl.start()` and\n // allows shell access (and tab completion!) to Meteor globals (i.e.\n // Underscore _, Meteor, etc.). By using this technique, which changes\n // the context after startup, we avoid stomping on the special `_`\n // variable (in `repl` this equals the value of the last command) from\n // being overridden in the client/server socket-handshaking. Furthermore,\n // by setting `useGlobal` back to true, we allow the default eval function\n // to use the desired `runInThisContext` method (https://git.io/vbvAB).\n repl.context = global;\n repl.useGlobal = true;\n\n setRequireAndModule(repl.context);\n\n // In order to avoid duplicating code here, specifically the complexities\n // of catching so-called \"Recoverable Errors\" (https://git.io/vbvbl),\n // we will wrap the default eval, run it in a Fiber (via a Promise), and\n // give it the opportunity to decide if the user is mid-code-block.\n const defaultEval = repl.eval;\n\n function wrappedDefaultEval(code, context, file, callback) {\n if (Package.ecmascript) {\n try {\n code = Package.ecmascript.ECMAScript.compileForShell(code, {\n cacheDirectory: getCacheDirectory(shellDir)\n });\n } catch (err) {\n // Any Babel error here might be just fine since it's\n // possible the code was incomplete (multi-line code on the REPL).\n // The defaultEval below will use its own functionality to determine\n // if this error is \"recoverable\".\n }\n }\n\n evalCommandPromise\n .then(() => defaultEval(code, context, file, callback))\n .catch(callback);\n }\n\n // Have the REPL use the newly wrapped function instead and store the\n // _wrappedDefaultEval so that evalulateAndExit calls can use it directly.\n repl.eval = this._wrappedDefaultEval = wrappedDefaultEval;\n }\n\n enableInteractiveMode(options) {\n // History persists across shell sessions!\n this.initializeHistory();\n\n const repl = this.repl;\n\n // Implement an alternate means of fetching the return value,\n // via `__` (double underscore) as originally implemented in:\n // https://github.com/meteor/meteor/commit/2443d832265c7d1c\n Object.defineProperty(repl.context, \"__\", {\n get: () => repl.last,\n set: (val) => {\n repl.last = val;\n },\n\n // Allow this property to be (re)defined more than once (e.g. each\n // time the server restarts).\n configurable: true\n });\n\n // Some improvements to the existing help messages.\n function addHelp(cmd, helpText) {\n const info = repl.commands[cmd] || repl.commands[\".\" + cmd];\n if (info) {\n info.help = helpText;\n }\n }\n addHelp(\"break\", \"Terminate current command input and display new prompt\");\n addHelp(\"exit\", \"Disconnect from server and leave shell\");\n addHelp(\"help\", \"Show this help information\");\n\n // When the REPL exits, signal the attached client to exit by sending it\n // the special EXITING_MESSAGE.\n repl.on(\"exit\", function() {\n if (options.output) {\n options.output.write(EXITING_MESSAGE + \"\\n\");\n options.output.end();\n }\n });\n\n // When the server process exits, end the output stream but do not\n // signal the attached client to exit.\n process.on(\"exit\", function() {\n if (options.output) {\n options.output.end();\n }\n });\n\n // This Meteor-specific shell command rebuilds the application as if a\n // change was made to server code.\n repl.defineCommand(\"reload\", {\n help: \"Restart the server and the shell\",\n action: function() {\n process.exit(0);\n }\n });\n }\n\n // This function allows a persistent history of shell commands to be saved\n // to and loaded from .meteor/local/shell-history.\n initializeHistory() {\n const rli = this.repl.rli;\n const historyFile = getHistoryFile(this.shellDir);\n let historyFd = openSync(historyFile, \"a+\");\n const historyLines = readFileSync(historyFile, \"utf8\").split(\"\\n\");\n const seenLines = Object.create(null);\n\n if (! rli.history) {\n rli.history = [];\n rli.historyIndex = -1;\n }\n\n while (rli.history && historyLines.length > 0) {\n const line = historyLines.pop();\n if (line && /\\S/.test(line) && ! seenLines[line]) {\n rli.history.push(line);\n seenLines[line] = true;\n }\n }\n\n rli.addListener(\"line\", function(line) {\n if (historyFd >= 0 && /\\S/.test(line)) {\n writeSync(historyFd, line + \"\\n\");\n }\n });\n\n this.repl.on(\"exit\", function() {\n closeSync(historyFd);\n historyFd = -1;\n });\n }\n}\n\nfunction readJSONFromStream(inputStream, callback) {\n const outputStream = new PassThrough();\n let dataSoFar = \"\";\n\n function onData(buffer) {\n const lines = buffer.toString(\"utf8\").split(\"\\n\");\n\n while (lines.length > 0) {\n dataSoFar += lines.shift();\n\n let json;\n try {\n json = JSON.parse(dataSoFar);\n } catch (error) {\n if (error instanceof SyntaxError) {\n continue;\n }\n\n return finish(error);\n }\n\n if (lines.length > 0) {\n outputStream.write(lines.join(\"\\n\"));\n }\n\n inputStream.pipe(outputStream);\n\n return finish(null, json);\n }\n }\n\n function onClose() {\n finish(new Error(\"stream unexpectedly closed\"));\n }\n\n let finished = false;\n function finish(error, json) {\n if (! finished) {\n finished = true;\n inputStream.removeListener(\"data\", onData);\n inputStream.removeListener(\"error\", finish);\n inputStream.removeListener(\"close\", onClose);\n callback(error, json, outputStream);\n }\n }\n\n inputStream.on(\"data\", onData);\n inputStream.on(\"error\", finish);\n inputStream.on(\"close\", onClose);\n}\n\nfunction getInfoFile(shellDir) {\n return pathJoin(shellDir, \"info.json\");\n}\n\nfunction getHistoryFile(shellDir) {\n return pathJoin(shellDir, \"history\");\n}\n\nfunction getCacheDirectory(shellDir) {\n return pathJoin(shellDir, \"cache\");\n}\n\nfunction setRequireAndModule(context) {\n if (Package.modules) {\n // Use the same `require` function and `module` object visible to the\n // application.\n const toBeInstalled = {};\n const shellModuleName = \"meteor-shell-\" +\n Math.random().toString(36).slice(2) + \".js\";\n\n toBeInstalled[shellModuleName] = function (require, exports, module) {\n context.module = module;\n context.require = require;\n\n // Tab completion sometimes uses require.extensions, but only for\n // the keys.\n require.extensions = {\n \".js\": true,\n \".json\": true,\n \".node\": true,\n };\n };\n\n // This populates repl.context.{module,require} by evaluating the\n // module defined above.\n Package.modules.meteorInstall(toBeInstalled)(\"./\" + shellModuleName);\n }\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var Retry = Package.retry.Retry;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var options;
var require = meteorInstall({"node_modules":{"meteor":{"socket-stream-client":{"server.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/socket-stream-client/server.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
const module1 = module;
let setMinimumBrowserVersions;
module1.link("meteor/modern-browsers", {
setMinimumBrowserVersions(v) {
setMinimumBrowserVersions = v;
}
}, 0);
setMinimumBrowserVersions({
chrome: 16,
edge: 12,
firefox: 11,
ie: 10,
mobileSafari: [6, 1],
phantomjs: 2,
safari: 7,
electron: [0, 20]
}, module.id);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"node.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/socket-stream-client/node.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
const module1 = module;
module1.export({
ClientStream: () => ClientStream
});
let Meteor;
module1.link("meteor/meteor", {
Meteor(v) {
Meteor = v;
}
}, 0);
let toWebsocketUrl;
module1.link("./urls.js", {
toWebsocketUrl(v) {
toWebsocketUrl = v;
}
}, 1);
let StreamClientCommon;
module1.link("./common.js", {
StreamClientCommon(v) {
StreamClientCommon = v;
}
}, 2);
class ClientStream extends StreamClientCommon {
constructor(endpoint, options) {
super(options);
this.client = null; // created in _launchConnection
this.endpoint = endpoint;
this.headers = this.options.headers || Object.create(null);
this.npmFayeOptions = this.options.npmFayeOptions || Object.create(null);
this._initCommon(this.options); //// Kickoff!
this._launchConnection();
} // data is a utf8 string. Data sent while not connected is dropped on
// the floor, and it is up the user of this API to retransmit lost
// messages on 'reset'
send(data) {
if (this.currentStatus.connected) {
this.client.send(data);
}
} // Changes where this connection points
_changeUrl(url) {
this.endpoint = url;
}
_onConnect(client) {
if (client !== this.client) {
// This connection is not from the last call to _launchConnection.
// But _launchConnection calls _cleanup which closes previous connections.
// It's our belief that this stifles future 'open' events, but maybe
// we are wrong?
throw new Error('Got open from inactive client ' + !!this.client);
}
if (this._forcedToDisconnect) {
// We were asked to disconnect between trying to open the connection and
// actually opening it. Let's just pretend this never happened.
this.client.close();
this.client = null;
return;
}
if (this.currentStatus.connected) {
// We already have a connection. It must have been the case that we
// started two parallel connection attempts (because we wanted to
// 'reconnect now' on a hanging connection and we had no way to cancel the
// connection attempt.) But this shouldn't happen (similarly to the client
// !== this.client check above).
throw new Error('Two parallel connections?');
}
this._clearConnectionTimer(); // update status
this.currentStatus.status = 'connected';
this.currentStatus.connected = true;
this.currentStatus.retryCount = 0;
this.statusChanged(); // fire resets. This must come after status change so that clients
// can call send from within a reset callback.
this.forEachCallback('reset', callback => {
callback();
});
}
_cleanup(maybeError) {
this._clearConnectionTimer();
if (this.client) {
var client = this.client;
this.client = null;
client.close();
this.forEachCallback('disconnect', callback => {
callback(maybeError);
});
}
}
_clearConnectionTimer() {
if (this.connectionTimer) {
clearTimeout(this.connectionTimer);
this.connectionTimer = null;
}
}
_getProxyUrl(targetUrl) {
// Similar to code in tools/http-helpers.js.
var proxy = process.env.HTTP_PROXY || process.env.http_proxy || null; // if we're going to a secure url, try the https_proxy env variable first.
if (targetUrl.match(/^wss:/)) {
proxy = process.env.HTTPS_PROXY || process.env.https_proxy || proxy;
}
return proxy;
}
_launchConnection() {
this._cleanup(); // cleanup the old socket, if there was one.
// Since server-to-server DDP is still an experimental feature, we only
// require the module if we actually create a server-to-server
// connection.
var FayeWebSocket = Npm.require('faye-websocket');
var deflate = Npm.require('permessage-deflate');
var targetUrl = toWebsocketUrl(this.endpoint);
var fayeOptions = {
headers: this.headers,
extensions: [deflate]
};
fayeOptions = Object.assign(fayeOptions, this.npmFayeOptions);
var proxyUrl = this._getProxyUrl(targetUrl);
if (proxyUrl) {
fayeOptions.proxy = {
origin: proxyUrl
};
} // We would like to specify 'ddp' as the subprotocol here. The npm module we
// used to use as a client would fail the handshake if we ask for a
// subprotocol and the server doesn't send one back (and sockjs doesn't).
// Faye doesn't have that behavior; it's unclear from reading RFC 6455 if
// Faye is erroneous or not. So for now, we don't specify protocols.
var subprotocols = [];
var client = this.client = new FayeWebSocket.Client(targetUrl, subprotocols, fayeOptions);
this._clearConnectionTimer();
this.connectionTimer = Meteor.setTimeout(() => {
this._lostConnection(new this.ConnectionError('DDP connection timed out'));
}, this.CONNECT_TIMEOUT);
this.client.on('open', Meteor.bindEnvironment(() => {
return this._onConnect(client);
}, 'stream connect callback'));
var clientOnIfCurrent = (event, description, callback) => {
this.client.on(event, Meteor.bindEnvironment((...args) => {
// Ignore events from any connection we've already cleaned up.
if (client !== this.client) return;
callback(...args);
}, description));
};
clientOnIfCurrent('error', 'stream error callback', error => {
if (!this.options._dontPrintErrors) Meteor._debug('stream error', error.message); // Faye's 'error' object is not a JS error (and among other things,
// doesn't stringify well). Convert it to one.
this._lostConnection(new this.ConnectionError(error.message));
});
clientOnIfCurrent('close', 'stream close callback', () => {
this._lostConnection();
});
clientOnIfCurrent('message', 'stream message callback', message => {
// Ignore binary frames, where message.data is a Buffer
if (typeof message.data !== 'string') return;
this.forEachCallback('message', callback => {
callback(message.data);
});
});
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"common.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/socket-stream-client/common.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
module.export({
StreamClientCommon: () => StreamClientCommon
});
let Retry;
module.link("meteor/retry", {
Retry(v) {
Retry = v;
}
}, 0);
const forcedReconnectError = new Error("forced reconnect");
class StreamClientCommon {
constructor(options) {
this.options = (0, _objectSpread2.default)({
retry: true
}, options || null);
this.ConnectionError = options && options.ConnectionError || Error;
} // Register for callbacks.
on(name, callback) {
if (name !== 'message' && name !== 'reset' && name !== 'disconnect') throw new Error('unknown event type: ' + name);
if (!this.eventCallbacks[name]) this.eventCallbacks[name] = [];
this.eventCallbacks[name].push(callback);
}
forEachCallback(name, cb) {
if (!this.eventCallbacks[name] || !this.eventCallbacks[name].length) {
return;
}
this.eventCallbacks[name].forEach(cb);
}
_initCommon(options) {
options = options || Object.create(null); //// Constants
// how long to wait until we declare the connection attempt
// failed.
this.CONNECT_TIMEOUT = options.connectTimeoutMs || 10000;
this.eventCallbacks = Object.create(null); // name -> [callback]
this._forcedToDisconnect = false; //// Reactive status
this.currentStatus = {
status: 'connecting',
connected: false,
retryCount: 0
};
if (Package.tracker) {
this.statusListeners = new Package.tracker.Tracker.Dependency();
}
this.statusChanged = () => {
if (this.statusListeners) {
this.statusListeners.changed();
}
}; //// Retry logic
this._retry = new Retry();
this.connectionTimer = null;
} // Trigger a reconnect.
reconnect(options) {
options = options || Object.create(null);
if (options.url) {
this._changeUrl(options.url);
}
if (options._sockjsOptions) {
this.options._sockjsOptions = options._sockjsOptions;
}
if (this.currentStatus.connected) {
if (options._force || options.url) {
this._lostConnection(forcedReconnectError);
}
return;
} // if we're mid-connection, stop it.
if (this.currentStatus.status === 'connecting') {
// Pretend it's a clean close.
this._lostConnection();
}
this._retry.clear();
this.currentStatus.retryCount -= 1; // don't count manual retries
this._retryNow();
}
disconnect(options) {
options = options || Object.create(null); // Failed is permanent. If we're failed, don't let people go back
// online by calling 'disconnect' then 'reconnect'.
if (this._forcedToDisconnect) return; // If _permanent is set, permanently disconnect a stream. Once a stream
// is forced to disconnect, it can never reconnect. This is for
// error cases such as ddp version mismatch, where trying again
// won't fix the problem.
if (options._permanent) {
this._forcedToDisconnect = true;
}
this._cleanup();
this._retry.clear();
this.currentStatus = {
status: options._permanent ? 'failed' : 'offline',
connected: false,
retryCount: 0
};
if (options._permanent && options._error) this.currentStatus.reason = options._error;
this.statusChanged();
} // maybeError is set unless it's a clean protocol-level close.
_lostConnection(maybeError) {
this._cleanup(maybeError);
this._retryLater(maybeError); // sets status. no need to do it here.
} // fired when we detect that we've gone online. try to reconnect
// immediately.
_online() {
// if we've requested to be offline by disconnecting, don't reconnect.
if (this.currentStatus.status != 'offline') this.reconnect();
}
_retryLater(maybeError) {
var timeout = 0;
if (this.options.retry || maybeError === forcedReconnectError) {
timeout = this._retry.retryLater(this.currentStatus.retryCount, this._retryNow.bind(this));
this.currentStatus.status = 'waiting';
this.currentStatus.retryTime = new Date().getTime() + timeout;
} else {
this.currentStatus.status = 'failed';
delete this.currentStatus.retryTime;
}
this.currentStatus.connected = false;
this.statusChanged();
}
_retryNow() {
if (this._forcedToDisconnect) return;
this.currentStatus.retryCount += 1;
this.currentStatus.status = 'connecting';
this.currentStatus.connected = false;
delete this.currentStatus.retryTime;
this.statusChanged();
this._launchConnection();
} // Get current status. Reactive.
status() {
if (this.statusListeners) {
this.statusListeners.depend();
}
return this.currentStatus;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
},"urls.js":function(require,exports,module){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/socket-stream-client/urls.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
module.export({
toSockjsUrl: () => toSockjsUrl,
toWebsocketUrl: () => toWebsocketUrl
});
// @param url {String} URL to Meteor app, eg:
// "/" or "madewith.meteor.com" or "https://foo.meteor.com"
// or "ddp+sockjs://ddp--****-foo.meteor.com/sockjs"
// @returns {String} URL to the endpoint with the specific scheme and subPath, e.g.
// for scheme "http" and subPath "sockjs"
// "http://subdomain.meteor.com/sockjs" or "/sockjs"
// or "https://ddp--1234-foo.meteor.com/sockjs"
function translateUrl(url, newSchemeBase, subPath) {
if (!newSchemeBase) {
newSchemeBase = 'http';
}
if (subPath !== "sockjs" && url.startsWith("/")) {
url = Meteor.absoluteUrl(url.substr(1));
}
var ddpUrlMatch = url.match(/^ddp(i?)\+sockjs:\/\//);
var httpUrlMatch = url.match(/^http(s?):\/\//);
var newScheme;
if (ddpUrlMatch) {
// Remove scheme and split off the host.
var urlAfterDDP = url.substr(ddpUrlMatch[0].length);
newScheme = ddpUrlMatch[1] === 'i' ? newSchemeBase : newSchemeBase + 's';
var slashPos = urlAfterDDP.indexOf('/');
var host = slashPos === -1 ? urlAfterDDP : urlAfterDDP.substr(0, slashPos);
var rest = slashPos === -1 ? '' : urlAfterDDP.substr(slashPos); // In the host (ONLY!), change '*' characters into random digits. This
// allows different stream connections to connect to different hostnames
// and avoid browser per-hostname connection limits.
host = host.replace(/\*/g, () => Math.floor(Math.random() * 10));
return newScheme + '://' + host + rest;
} else if (httpUrlMatch) {
newScheme = !httpUrlMatch[1] ? newSchemeBase : newSchemeBase + 's';
var urlAfterHttp = url.substr(httpUrlMatch[0].length);
url = newScheme + '://' + urlAfterHttp;
} // Prefix FQDNs but not relative URLs
if (url.indexOf('://') === -1 && !url.startsWith('/')) {
url = newSchemeBase + '://' + url;
} // XXX This is not what we should be doing: if I have a site
// deployed at "/foo", then DDP.connect("/") should actually connect
// to "/", not to "/foo". "/" is an absolute path. (Contrast: if
// deployed at "/foo", it would be reasonable for DDP.connect("bar")
// to connect to "/foo/bar").
//
// We should make this properly honor absolute paths rather than
// forcing the path to be relative to the site root. Simultaneously,
// we should set DDP_DEFAULT_CONNECTION_URL to include the site
// root. See also client_convenience.js #RationalizingRelativeDDPURLs
url = Meteor._relativeToSiteRootUrl(url);
if (url.endsWith('/')) return url + subPath;else return url + '/' + subPath;
}
function toSockjsUrl(url) {
return translateUrl(url, 'http', 'sockjs');
}
function toWebsocketUrl(url) {
return translateUrl(url, 'ws', 'websocket');
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/socket-stream-client/server.js");
/* Exports */
Package._define("socket-stream-client");
})();
//# sourceURL=meteor://💻app/packages/socket-stream-client.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc29ja2V0LXN0cmVhbS1jbGllbnQvc2VydmVyLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zb2NrZXQtc3RyZWFtLWNsaWVudC9ub2RlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zb2NrZXQtc3RyZWFtLWNsaWVudC9jb21tb24uanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3NvY2tldC1zdHJlYW0tY2xpZW50L3VybHMuanMiXSwibmFtZXMiOlsibW9kdWxlMSIsIm1vZHVsZSIsInNldE1pbmltdW1Ccm93c2VyVmVyc2lvbnMiLCJsaW5rIiwidiIsImNocm9tZSIsImVkZ2UiLCJmaXJlZm94IiwiaWUiLCJtb2JpbGVTYWZhcmkiLCJwaGFudG9tanMiLCJzYWZhcmkiLCJlbGVjdHJvbiIsImlkIiwiZXhwb3J0IiwiQ2xpZW50U3RyZWFtIiwiTWV0ZW9yIiwidG9XZWJzb2NrZXRVcmwiLCJTdHJlYW1DbGllbnRDb21tb24iLCJjb25zdHJ1Y3RvciIsImVuZHBvaW50Iiwib3B0aW9ucyIsImNsaWVudCIsImhlYWRlcnMiLCJPYmplY3QiLCJjcmVhdGUiLCJucG1GYXllT3B0aW9ucyIsIl9pbml0Q29tbW9uIiwiX2xhdW5jaENvbm5lY3Rpb24iLCJzZW5kIiwiZGF0YSIsImN1cnJlbnRTdGF0dXMiLCJjb25uZWN0ZWQiLCJfY2hhbmdlVXJsIiwidXJsIiwiX29uQ29ubmVjdCIsIkVycm9yIiwiX2ZvcmNlZFRvRGlzY29ubmVjdCIsImNsb3NlIiwiX2NsZWFyQ29ubmVjdGlvblRpbWVyIiwic3RhdHVzIiwicmV0cnlDb3VudCIsInN0YXR1c0NoYW5nZWQiLCJmb3JFYWNoQ2FsbGJhY2siLCJjYWxsYmFjayIsIl9jbGVhbnVwIiwibWF5YmVFcnJvciIsImNvbm5lY3Rpb25UaW1lciIsImNsZWFyVGltZW91dCIsIl9nZXRQcm94eVVybCIsInRhcmdldFVybCIsInByb3h5IiwicHJvY2VzcyIsImVudiIsIkhUVFBfUFJPWFkiLCJodHRwX3Byb3h5IiwibWF0Y2giLCJIVFRQU19QUk9YWSIsImh0dHBzX3Byb3h5IiwiRmF5ZVdlYlNvY2tldCIsIk5wbSIsInJlcXVpcmUiLCJkZWZsYXRlIiwiZmF5ZU9wdGlvbnMiLCJleHRlbnNpb25zIiwiYXNzaWduIiwicHJveHlVcmwiLCJvcmlnaW4iLCJzdWJwcm90b2NvbHMiLCJDbGllbnQiLCJzZXRUaW1lb3V0IiwiX2xvc3RDb25uZWN0aW9uIiwiQ29ubmVjdGlvbkVycm9yIiwiQ09OTkVDVF9USU1FT1VUIiwib24iLCJiaW5kRW52aXJvbm1lbnQiLCJjbGllbnRPbklmQ3VycmVudCIsImV2ZW50IiwiZGVzY3JpcHRpb24iLCJhcmdzIiwiZXJyb3IiLCJfZG9udFByaW50RXJyb3JzIiwiX2RlYnVnIiwibWVzc2FnZSIsIlJldHJ5IiwiZm9yY2VkUmVjb25uZWN0RXJyb3IiLCJyZXRyeSIsIm5hbWUiLCJldmVudENhbGxiYWNrcyIsInB1c2giLCJjYiIsImxlbmd0aCIsImZvckVhY2giLCJjb25uZWN0VGltZW91dE1zIiwiUGFja2FnZSIsInRyYWNrZXIiLCJzdGF0dXNMaXN0ZW5lcnMiLCJUcmFja2VyIiwiRGVwZW5kZW5jeSIsImNoYW5nZWQiLCJfcmV0cnkiLCJyZWNvbm5lY3QiLCJfc29ja2pzT3B0aW9ucyIsIl9mb3JjZSIsImNsZWFyIiwiX3JldHJ5Tm93IiwiZGlzY29ubmVjdCIsIl9wZXJtYW5lbnQiLCJfZXJyb3IiLCJyZWFzb24iLCJfcmV0cnlMYXRlciIsIl9vbmxpbmUiLCJ0aW1lb3V0IiwicmV0cnlMYXRlciIsImJpbmQiLCJyZXRyeVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImRlcGVuZCIsInRvU29ja2pzVXJsIiwidHJhbnNsYXRlVXJsIiwibmV3U2NoZW1lQmFzZSIsInN1YlBhdGgiLCJzdGFydHNXaXRoIiwiYWJzb2x1dGVVcmwiLCJzdWJzdHIiLCJkZHBVcmxNYXRjaCIsImh0dHBVcmxNYXRjaCIsIm5ld1NjaGVtZSIsInVybEFmdGVyRERQIiwic2xhc2hQb3MiLCJpbmRleE9mIiwiaG9zdCIsInJlc3QiLCJyZXBsYWNlIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidXJsQWZ0ZXJIdHRwIiwiX3JlbGF0aXZlVG9TaXRlUm9vdFVybCIsImVuZHNXaXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQU1BLE9BQU8sR0FBQ0MsTUFBZDtBQUFxQixJQUFJQyx5QkFBSjtBQUE4QkYsT0FBTyxDQUFDRyxJQUFSLENBQWEsd0JBQWIsRUFBc0M7QUFBQ0QsMkJBQXlCLENBQUNFLENBQUQsRUFBRztBQUFDRiw2QkFBeUIsR0FBQ0UsQ0FBMUI7QUFBNEI7O0FBQTFELENBQXRDLEVBQWtHLENBQWxHO0FBSW5ERix5QkFBeUIsQ0FBQztBQUN4QkcsUUFBTSxFQUFFLEVBRGdCO0FBRXhCQyxNQUFJLEVBQUUsRUFGa0I7QUFHeEJDLFNBQU8sRUFBRSxFQUhlO0FBSXhCQyxJQUFFLEVBQUUsRUFKb0I7QUFLeEJDLGNBQVksRUFBRSxDQUFDLENBQUQsRUFBSSxDQUFKLENBTFU7QUFNeEJDLFdBQVMsRUFBRSxDQU5hO0FBT3hCQyxRQUFNLEVBQUUsQ0FQZ0I7QUFReEJDLFVBQVEsRUFBRSxDQUFDLENBQUQsRUFBSSxFQUFKO0FBUmMsQ0FBRCxFQVN0QlgsTUFBTSxDQUFDWSxFQVRlLENBQXpCLEM7Ozs7Ozs7Ozs7O0FDSkEsTUFBTWIsT0FBTyxHQUFDQyxNQUFkO0FBQXFCRCxPQUFPLENBQUNjLE1BQVIsQ0FBZTtBQUFDQyxjQUFZLEVBQUMsTUFBSUE7QUFBbEIsQ0FBZjtBQUFnRCxJQUFJQyxNQUFKO0FBQVdoQixPQUFPLENBQUNHLElBQVIsQ0FBYSxlQUFiLEVBQTZCO0FBQUNhLFFBQU0sQ0FBQ1osQ0FBRCxFQUFHO0FBQUNZLFVBQU0sR0FBQ1osQ0FBUDtBQUFTOztBQUFwQixDQUE3QixFQUFtRCxDQUFuRDtBQUFzRCxJQUFJYSxjQUFKO0FBQW1CakIsT0FBTyxDQUFDRyxJQUFSLENBQWEsV0FBYixF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U0FBU0gsV0FBVCxDQUFxQnJGLEdBQXJCLEVBQTBCO0FBQy9CLFNBQU9zRixZQUFZLENBQUN0RixHQUFELEVBQU0sTUFBTixFQUFjLFFBQWQsQ0FBbkI7QUFDRDs7QUFFTSxTQUFTakIsY0FBVCxDQUF3QmlCLEdBQXhCLEVBQTZCO0FBQ2xDLFNBQU9zRixZQUFZLENBQUN0RixHQUFELEVBQU0sSUFBTixFQUFZLFdBQVosQ0FBbkI7QUFDRCxDIiwiZmlsZSI6Ii9wYWNrYWdlcy9zb2NrZXQtc3RyZWFtLWNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHNldE1pbmltdW1Ccm93c2VyVmVyc2lvbnMsXG59IGZyb20gXCJtZXRlb3IvbW9kZXJuLWJyb3dzZXJzXCI7XG5cbnNldE1pbmltdW1Ccm93c2VyVmVyc2lvbnMoe1xuICBjaHJvbWU6IDE2LFxuICBlZGdlOiAxMixcbiAgZmlyZWZveDogMTEsXG4gIGllOiAxMCxcbiAgbW9iaWxlU2FmYXJpOiBbNiwgMV0sXG4gIHBoYW50b21qczogMixcbiAgc2FmYXJpOiA3LFxuICBlbGVjdHJvbjogWzAsIDIwXSxcbn0sIG1vZHVsZS5pZCk7XG4iLCJpbXBvcnQgeyBNZXRlb3IgfSBmcm9tIFwibWV0ZW9yL21ldGVvclwiO1xuaW1wb3J0IHsgdG9XZWJzb2NrZXRVcmwgfSBmcm9tIFwiLi91cmxzLmpzXCI7XG5pbXBvcnQgeyBTdHJlYW1DbGllbnRDb21tb24gfSBmcm9tIFwiLi9jb21tb24uanNcIjtcblxuLy8gQHBhcmFtIGVuZHBvaW50IHtTdHJpbmd9IFVSTCB0byBNZXRlb3IgYXBwXG4vLyAgIFwiaHR0cDovL3N1YmRvbWFpbi5tZXRlb3IuY29tL1wiIG9yIFwiL1wiIG9yXG4vLyAgIFwiZGRwK3NvY2tqczovL2Zvby0qKi5tZXRlb3IuY29tL3NvY2tqc1wiXG4vL1xuLy8gV2UgZG8gc29tZSByZXdyaXRpbmcgb2YgdGhlIFVSTCB0byBldmVudHVhbGx5IG1ha2UgaXQgXCJ3czovL1wiIG9yIFwid3NzOi8vXCIsXG4vLyB3aGF0ZXZlciB3YXMgcGFzc2VkIGluLiAgQXQgdGhlIHZlcnkgbGVhc3QsIHdoYXQgTWV0ZW9yLmFic29sdXRlVXJsKCkgcmV0dXJuc1xuLy8gdXMgc2hvdWxkIHdvcmsuXG4vL1xuLy8gV2UgZG9uJ3QgZG8gYW55IGhlYXJ0YmVhdGluZy4gKFRoZSBsb2dpYyB0aGF0IGRpZCB0aGlzIGluIHNvY2tqcyB3YXMgcmVtb3ZlZCxcbi8vIGJlY2F1c2UgaXQgdXNlZCBhIGJ1aWx0LWluIHNvY2tqcyBtZWNoYW5pc20uIFdlIGNvdWxkIGRvIGl0IHdpdGggV2ViU29ja2V0XG4vLyBwaW5nIGZyYW1lcyBvciB3aXRoIEREUC1sZXZlbCBtZXNzYWdlcy4pXG5leHBvcnQgY2xhc3MgQ2xpZW50U3RyZWFtIGV4dGVuZHMgU3RyZWFtQ2xpZW50Q29tbW9uIHtcbiAgY29uc3RydWN0b3IoZW5kcG9pbnQsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuY2xpZW50ID0gbnVsbDsgLy8gY3JlYXRlZCBpbiBfbGF1bmNoQ29ubmVjdGlvblxuICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDtcblxuICAgIHRoaXMuaGVhZGVycyA9IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5ucG1GYXllT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5ucG1GYXllT3B0aW9ucyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5faW5pdENvbW1vbih0aGlzLm9wdGlvbnMpO1xuXG4gICAgLy8vLyBLaWNrb2ZmIVxuICAgIHRoaXMuX2xhdW5jaENvbm5lY3Rpb24oKTtcbiAgfVxuXG4gIC8vIGRhdGEgaXMgYSB1dGY4IHN0cmluZy4gRGF0YSBzZW50IHdoaWxlIG5vdCBjb25uZWN0ZWQgaXMgZHJvcHBlZCBvblxuICAvLyB0aGUgZmxvb3IsIGFuZCBpdCBpcyB1cCB0aGUgdXNlciBvZiB0aGlzIEFQSSB0byByZXRyYW5zbWl0IGxvc3RcbiAgLy8gbWVzc2FnZXMgb24gJ3Jlc2V0J1xuICBzZW5kKGRhdGEpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U3RhdHVzLmNvbm5lY3RlZCkge1xuICAgICAgdGhpcy5jbGllbnQuc2VuZChkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGFuZ2VzIHdoZXJlIHRoaXMgY29ubmVjdGlvbiBwb2ludHNcbiAgX2NoYW5nZVVybCh1cmwpIHtcbiAgICB0aGlzLmVuZHBvaW50ID0gdXJsO1xuICB9XG5cbiAgX29uQ29ubmVjdChjbGllbnQpIHtcbiAgICBpZiAoY2xpZW50ICE9PSB0aGlzLmNsaWVudCkge1xuICAgICAgLy8gVGhpcyBjb25uZWN0aW9uIGlzIG5vdCBmcm9tIHRoZSBsYXN0IGNhbGwgdG8gX2xhdW5jaENvbm5lY3Rpb24uXG4gICAgICAvLyBCdXQgX2xhdW5jaENvbm5lY3Rpb24gY2FsbHMgX2NsZWFudXAgd2hpY2ggY2xvc2VzIHByZXZpb3VzIGNvbm5lY3Rpb25zLlxuICAgICAgLy8gSXQncyBvdXIgYmVsaWVmIHRoYXQgdGhpcyBzdGlmbGVzIGZ1dHVyZSAnb3BlbicgZXZlbnRzLCBidXQgbWF5YmVcbiAgICAgIC8vIHdlIGFyZSB3cm9uZz9cbiAgICAgIHRocm93IG5ldyBFcnJvcignR290IG9wZW4gZnJvbSBpbmFjdGl2ZSBjbGllbnQgJyArICEhdGhpcy5jbGllbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb3JjZWRUb0Rpc2Nvbm5lY3QpIHtcbiAgICAgIC8vIFdlIHdlcmUgYXNrZWQgdG8gZGlzY29ubmVjdCBiZXR3ZWVuIHRyeWluZyB0byBvcGVuIHRoZSBjb25uZWN0aW9uIGFuZFxuICAgICAgLy8gYWN0dWFsbHkgb3BlbmluZyBpdC4gTGV0J3MganVzdCBwcmV0ZW5kIHRoaXMgbmV2ZXIgaGFwcGVuZWQuXG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0dXMuY29ubmVjdGVkKSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uLiBJdCBtdXN0IGhhdmUgYmVlbiB0aGUgY2FzZSB0aGF0IHdlXG4gICAgICAvLyBzdGFydGVkIHR3byBwYXJhbGxlbCBjb25uZWN0aW9uIGF0dGVtcHRzIChiZWNhdXNlIHdlIHdhbnRlZCB0b1xuICAgICAgLy8gJ3JlY29ubmVjdCBub3cnIG9uIGEgaGFuZ2luZyBjb25uZWN0aW9uIGFuZCB3ZSBoYWQgbm8gd2F5IHRvIGNhbmNlbCB0aGVcbiAgICAgIC8vIGNvbm5lY3Rpb24gYXR0ZW1wdC4pIEJ1dCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKHNpbWlsYXJseSB0byB0aGUgY2xpZW50XG4gICAgICAvLyAhPT0gdGhpcy5jbGllbnQgY2hlY2sgYWJvdmUpLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUd28gcGFyYWxsZWwgY29ubmVjdGlvbnM/Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJDb25uZWN0aW9uVGltZXIoKTtcblxuICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICB0aGlzLmN1cnJlbnRTdGF0dXMuc3RhdHVzID0gJ2Nvbm5lY3RlZCc7XG4gICAgdGhpcy5jdXJyZW50U3RhdHVzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5jdXJyZW50U3RhdHVzLnJldHJ5Q291bnQgPSAwO1xuICAgIHRoaXMuc3RhdHVzQ2hhbmdlZCgpO1xuXG4gICAgLy8gZmlyZSByZXNldHMuIFRoaXMgbXVzdCBjb21lIGFmdGVyIHN0YXR1cyBjaGFuZ2Ugc28gdGhhdCBjbGllbnRzXG4gICAgLy8gY2FuIGNhbGwgc2VuZCBmcm9tIHdpdGhpbiBhIHJlc2V0IGNhbGxiYWNrLlxuICAgIHRoaXMuZm9yRWFjaENhbGxiYWNrKCdyZXNldCcsIGNhbGxiYWNrID0+IHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBfY2xlYW51cChtYXliZUVycm9yKSB7XG4gICAgdGhpcy5fY2xlYXJDb25uZWN0aW9uVGltZXIoKTtcbiAgICBpZiAodGhpcy5jbGllbnQpIHtcbiAgICAgIHZhciBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICAgIHRoaXMuY2xpZW50ID0gbnVsbDtcbiAgICAgIGNsaWVudC5jbG9zZSgpO1xuXG4gICAgICB0aGlzLmZvckVhY2hDYWxsYmFjaygnZGlzY29ubmVjdCcsIGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2sobWF5YmVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY2xlYXJDb25uZWN0aW9uVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0aW9uVGltZXIpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRQcm94eVVybCh0YXJnZXRVcmwpIHtcbiAgICAvLyBTaW1pbGFyIHRvIGNvZGUgaW4gdG9vbHMvaHR0cC1oZWxwZXJzLmpzLlxuICAgIHZhciBwcm94eSA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuaHR0cF9wcm94eSB8fCBudWxsO1xuICAgIC8vIGlmIHdlJ3JlIGdvaW5nIHRvIGEgc2VjdXJlIHVybCwgdHJ5IHRoZSBodHRwc19wcm94eSBlbnYgdmFyaWFibGUgZmlyc3QuXG4gICAgaWYgKHRhcmdldFVybC5tYXRjaCgvXndzczovKSkge1xuICAgICAgcHJveHkgPSBwcm9jZXNzLmVudi5IVFRQU19QUk9YWSB8fCBwcm9jZXNzLmVudi5odHRwc19wcm94eSB8fCBwcm94eTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgX2xhdW5jaENvbm5lY3Rpb24oKSB7XG4gICAgdGhpcy5fY2xlYW51cCgpOyAvLyBjbGVhbnVwIHRoZSBvbGQgc29ja2V0LCBpZiB0aGVyZSB3YXMgb25lLlxuXG4gICAgLy8gU2luY2Ugc2VydmVyLXRvLXNlcnZlciBERFAgaXMgc3RpbGwgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUsIHdlIG9ubHlcbiAgICAvLyByZXF1aXJlIHRoZSBtb2R1bGUgaWYgd2UgYWN0dWFsbHkgY3JlYXRlIGEgc2VydmVyLXRvLXNlcnZlclxuICAgIC8vIGNvbm5lY3Rpb24uXG4gICAgdmFyIEZheWVXZWJTb2NrZXQgPSBOcG0ucmVxdWlyZSgnZmF5ZS13ZWJzb2NrZXQnKTtcbiAgICB2YXIgZGVmbGF0ZSA9IE5wbS5yZXF1aXJlKCdwZXJtZXNzYWdlLWRlZmxhdGUnKTtcblxuICAgIHZhciB0YXJnZXRVcmwgPSB0b1dlYnNvY2tldFVybCh0aGlzLmVuZHBvaW50KTtcbiAgICB2YXIgZmF5ZU9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICBleHRlbnNpb25zOiBbZGVmbGF0ZV1cbiAgICB9O1xuICAgIGZheWVPcHRpb25zID0gT2JqZWN0LmFzc2lnbihmYXllT3B0aW9ucywgdGhpcy5ucG1GYXllT3B0aW9ucyk7XG4gICAgdmFyIHByb3h5VXJsID0gdGhpcy5fZ2V0UHJveHlVcmwodGFyZ2V0VXJsKTtcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgIGZheWVPcHRpb25zLnByb3h5ID0geyBvcmlnaW46IHByb3h5VXJsIH07XG4gICAgfVxuXG4gICAgLy8gV2Ugd291bGQgbGlrZSB0byBzcGVjaWZ5ICdkZHAnIGFzIHRoZSBzdWJwcm90b2NvbCBoZXJlLiBUaGUgbnBtIG1vZHVsZSB3ZVxuICAgIC8vIHVzZWQgdG8gdXNlIGFzIGEgY2xpZW50IHdvdWxkIGZhaWwgdGhlIGhhbmRzaGFrZSBpZiB3ZSBhc2sgZm9yIGFcbiAgICAvLyBzdWJwcm90b2NvbCBhbmQgdGhlIHNlcnZlciBkb2Vzbid0IHNlbmQgb25lIGJhY2sgKGFuZCBzb2NranMgZG9lc24ndCkuXG4gICAgLy8gRmF5ZSBkb2Vzbid0IGhhdmUgdGhhdCBiZWhhdmlvcjsgaXQncyB1bmNsZWFyIGZyb20gcmVhZGluZyBSRkMgNjQ1NSBpZlxuICAgIC8vIEZheWUgaXMgZXJyb25lb3VzIG9yIG5vdC4gIFNvIGZvciBub3csIHdlIGRvbid0IHNwZWNpZnkgcHJvdG9jb2xzLlxuICAgIHZhciBzdWJwcm90b2NvbHMgPSBbXTtcblxuICAgIHZhciBjbGllbnQgPSAodGhpcy5jbGllbnQgPSBuZXcgRmF5ZVdlYlNvY2tldC5DbGllbnQoXG4gICAgICB0YXJnZXRVcmwsXG4gICAgICBzdWJwcm90b2NvbHMsXG4gICAgICBmYXllT3B0aW9uc1xuICAgICkpO1xuXG4gICAgdGhpcy5fY2xlYXJDb25uZWN0aW9uVGltZXIoKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25UaW1lciA9IE1ldGVvci5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xvc3RDb25uZWN0aW9uKG5ldyB0aGlzLkNvbm5lY3Rpb25FcnJvcignRERQIGNvbm5lY3Rpb24gdGltZWQgb3V0JykpO1xuICAgIH0sIHRoaXMuQ09OTkVDVF9USU1FT1VUKTtcblxuICAgIHRoaXMuY2xpZW50Lm9uKFxuICAgICAgJ29wZW4nLFxuICAgICAgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkNvbm5lY3QoY2xpZW50KTtcbiAgICAgIH0sICdzdHJlYW0gY29ubmVjdCBjYWxsYmFjaycpXG4gICAgKTtcblxuICAgIHZhciBjbGllbnRPbklmQ3VycmVudCA9IChldmVudCwgZGVzY3JpcHRpb24sIGNhbGxiYWNrKSA9PiB7XG4gICAgICB0aGlzLmNsaWVudC5vbihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXZlbnRzIGZyb20gYW55IGNvbm5lY3Rpb24gd2UndmUgYWxyZWFkeSBjbGVhbmVkIHVwLlxuICAgICAgICAgIGlmIChjbGllbnQgIT09IHRoaXMuY2xpZW50KSByZXR1cm47XG4gICAgICAgICAgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgIH0sIGRlc2NyaXB0aW9uKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY2xpZW50T25JZkN1cnJlbnQoJ2Vycm9yJywgJ3N0cmVhbSBlcnJvciBjYWxsYmFjaycsIGVycm9yID0+IHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLl9kb250UHJpbnRFcnJvcnMpXG4gICAgICAgIE1ldGVvci5fZGVidWcoJ3N0cmVhbSBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuXG4gICAgICAvLyBGYXllJ3MgJ2Vycm9yJyBvYmplY3QgaXMgbm90IGEgSlMgZXJyb3IgKGFuZCBhbW9uZyBvdGhlciB0aGluZ3MsXG4gICAgICAvLyBkb2Vzbid0IHN0cmluZ2lmeSB3ZWxsKS4gQ29udmVydCBpdCB0byBvbmUuXG4gICAgICB0aGlzLl9sb3N0Q29ubmVjdGlvbihuZXcgdGhpcy5Db25uZWN0aW9uRXJyb3IoZXJyb3IubWVzc2FnZSkpO1xuICAgIH0pO1xuXG4gICAgY2xpZW50T25JZkN1cnJlbnQoJ2Nsb3NlJywgJ3N0cmVhbSBjbG9zZSBjYWxsYmFjaycsICgpID0+IHtcbiAgICAgIHRoaXMuX2xvc3RDb25uZWN0aW9uKCk7XG4gICAgfSk7XG5cbiAgICBjbGllbnRPbklmQ3VycmVudCgnbWVzc2FnZScsICdzdHJlYW0gbWVzc2FnZSBjYWxsYmFjaycsIG1lc3NhZ2UgPT4ge1xuICAgICAgLy8gSWdub3JlIGJpbmFyeSBmcmFtZXMsIHdoZXJlIG1lc3NhZ2UuZGF0YSBpcyBhIEJ1ZmZlclxuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLmRhdGEgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICAgIHRoaXMuZm9yRWFjaENhbGxiYWNrKCdtZXNzYWdlJywgY2FsbGJhY2sgPT4ge1xuICAgICAgICBjYWxsYmFjayhtZXNzYWdlLmRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJldHJ5IH0gZnJvbSAnbWV0ZW9yL3JldHJ5JztcblxuY29uc3QgZm9yY2VkUmVjb25uZWN0RXJyb3IgPSBuZXcgRXJyb3IoXCJmb3JjZWQgcmVjb25uZWN0XCIpO1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtQ2xpZW50Q29tbW9uIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgLi4uKG9wdGlvbnMgfHwgbnVsbCksXG4gICAgfTtcblxuICAgIHRoaXMuQ29ubmVjdGlvbkVycm9yID1cbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5Db25uZWN0aW9uRXJyb3IgfHwgRXJyb3I7XG4gIH1cblxuICAvLyBSZWdpc3RlciBmb3IgY2FsbGJhY2tzLlxuICBvbihuYW1lLCBjYWxsYmFjaykge1xuICAgIGlmIChuYW1lICE9PSAnbWVzc2FnZScgJiYgbmFtZSAhPT0gJ3Jlc2V0JyAmJiBuYW1lICE9PSAnZGlzY29ubmVjdCcpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gZXZlbnQgdHlwZTogJyArIG5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLmV2ZW50Q2FsbGJhY2tzW25hbWVdKSB0aGlzLmV2ZW50Q2FsbGJhY2tzW25hbWVdID0gW107XG4gICAgdGhpcy5ldmVudENhbGxiYWNrc1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZvckVhY2hDYWxsYmFjayhuYW1lLCBjYikge1xuICAgIGlmICghdGhpcy5ldmVudENhbGxiYWNrc1tuYW1lXSB8fCAhdGhpcy5ldmVudENhbGxiYWNrc1tuYW1lXS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50Q2FsbGJhY2tzW25hbWVdLmZvckVhY2goY2IpO1xuICB9XG5cbiAgX2luaXRDb21tb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAvLy8vIENvbnN0YW50c1xuXG4gICAgLy8gaG93IGxvbmcgdG8gd2FpdCB1bnRpbCB3ZSBkZWNsYXJlIHRoZSBjb25uZWN0aW9uIGF0dGVtcHRcbiAgICAvLyBmYWlsZWQuXG4gICAgdGhpcy5DT05ORUNUX1RJTUVPVVQgPSBvcHRpb25zLmNvbm5lY3RUaW1lb3V0TXMgfHwgMTAwMDA7XG5cbiAgICB0aGlzLmV2ZW50Q2FsbGJhY2tzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsgLy8gbmFtZSAtPiBbY2FsbGJhY2tdXG5cbiAgICB0aGlzLl9mb3JjZWRUb0Rpc2Nvbm5lY3QgPSBmYWxzZTtcblxuICAgIC8vLy8gUmVhY3RpdmUgc3RhdHVzXG4gICAgdGhpcy5jdXJyZW50U3RhdHVzID0ge1xuICAgICAgc3RhdHVzOiAnY29ubmVjdGluZycsXG4gICAgICBjb25uZWN0ZWQ6IGZhbHNlLFxuICAgICAgcmV0cnlDb3VudDogMFxuICAgIH07XG5cbiAgICBpZiAoUGFja2FnZS50cmFja2VyKSB7XG4gICAgICB0aGlzLnN0YXR1c0xpc3RlbmVycyA9IG5ldyBQYWNrYWdlLnRyYWNrZXIuVHJhY2tlci5EZXBlbmRlbmN5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXNDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzTGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXJzLmNoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8vLyBSZXRyeSBsb2dpY1xuICAgIHRoaXMuX3JldHJ5ID0gbmV3IFJldHJ5KCk7XG4gICAgdGhpcy5jb25uZWN0aW9uVGltZXIgPSBudWxsO1xuICB9XG5cbiAgLy8gVHJpZ2dlciBhIHJlY29ubmVjdC5cbiAgcmVjb25uZWN0KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICB0aGlzLl9jaGFuZ2VVcmwob3B0aW9ucy51cmwpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLl9zb2NranNPcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuX3NvY2tqc09wdGlvbnMgPSBvcHRpb25zLl9zb2NranNPcHRpb25zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0dXMuY29ubmVjdGVkKSB7XG4gICAgICBpZiAob3B0aW9ucy5fZm9yY2UgfHwgb3B0aW9ucy51cmwpIHtcbiAgICAgICAgdGhpcy5fbG9zdENvbm5lY3Rpb24oZm9yY2VkUmVjb25uZWN0RXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIG1pZC1jb25uZWN0aW9uLCBzdG9wIGl0LlxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0dXMuc3RhdHVzID09PSAnY29ubmVjdGluZycpIHtcbiAgICAgIC8vIFByZXRlbmQgaXQncyBhIGNsZWFuIGNsb3NlLlxuICAgICAgdGhpcy5fbG9zdENvbm5lY3Rpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXRyeS5jbGVhcigpO1xuICAgIHRoaXMuY3VycmVudFN0YXR1cy5yZXRyeUNvdW50IC09IDE7IC8vIGRvbid0IGNvdW50IG1hbnVhbCByZXRyaWVzXG4gICAgdGhpcy5fcmV0cnlOb3coKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3Qob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAvLyBGYWlsZWQgaXMgcGVybWFuZW50LiBJZiB3ZSdyZSBmYWlsZWQsIGRvbid0IGxldCBwZW9wbGUgZ28gYmFja1xuICAgIC8vIG9ubGluZSBieSBjYWxsaW5nICdkaXNjb25uZWN0JyB0aGVuICdyZWNvbm5lY3QnLlxuICAgIGlmICh0aGlzLl9mb3JjZWRUb0Rpc2Nvbm5lY3QpIHJldHVybjtcblxuICAgIC8vIElmIF9wZXJtYW5lbnQgaXMgc2V0LCBwZXJtYW5lbnRseSBkaXNjb25uZWN0IGEgc3RyZWFtLiBPbmNlIGEgc3RyZWFtXG4gICAgLy8gaXMgZm9yY2VkIHRvIGRpc2Nvbm5lY3QsIGl0IGNhbiBuZXZlciByZWNvbm5lY3QuIFRoaXMgaXMgZm9yXG4gICAgLy8gZXJyb3IgY2FzZXMgc3VjaCBhcyBkZHAgdmVyc2lvbiBtaXNtYXRjaCwgd2hlcmUgdHJ5aW5nIGFnYWluXG4gICAgLy8gd29uJ3QgZml4IHRoZSBwcm9ibGVtLlxuICAgIGlmIChvcHRpb25zLl9wZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuX2ZvcmNlZFRvRGlzY29ubmVjdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYW51cCgpO1xuICAgIHRoaXMuX3JldHJ5LmNsZWFyKCk7XG5cbiAgICB0aGlzLmN1cnJlbnRTdGF0dXMgPSB7XG4gICAgICBzdGF0dXM6IG9wdGlvbnMuX3Blcm1hbmVudCA/ICdmYWlsZWQnIDogJ29mZmxpbmUnLFxuICAgICAgY29ubmVjdGVkOiBmYWxzZSxcbiAgICAgIHJldHJ5Q291bnQ6IDBcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMuX3Blcm1hbmVudCAmJiBvcHRpb25zLl9lcnJvcilcbiAgICAgIHRoaXMuY3VycmVudFN0YXR1cy5yZWFzb24gPSBvcHRpb25zLl9lcnJvcjtcblxuICAgIHRoaXMuc3RhdHVzQ2hhbmdlZCgpO1xuICB9XG5cbiAgLy8gbWF5YmVFcnJvciBpcyBzZXQgdW5sZXNzIGl0J3MgYSBjbGVhbiBwcm90b2NvbC1sZXZlbCBjbG9zZS5cbiAgX2xvc3RDb25uZWN0aW9uKG1heWJlRXJyb3IpIHtcbiAgICB0aGlzLl9jbGVhbnVwKG1heWJlRXJyb3IpO1xuICAgIHRoaXMuX3JldHJ5TGF0ZXIobWF5YmVFcnJvcik7IC8vIHNldHMgc3RhdHVzLiBubyBuZWVkIHRvIGRvIGl0IGhlcmUuXG4gIH1cblxuICAvLyBmaXJlZCB3aGVuIHdlIGRldGVjdCB0aGF0IHdlJ3ZlIGdvbmUgb25saW5lLiB0cnkgdG8gcmVjb25uZWN0XG4gIC8vIGltbWVkaWF0ZWx5LlxuICBfb25saW5lKCkge1xuICAgIC8vIGlmIHdlJ3ZlIHJlcXVlc3RlZCB0byBiZSBvZmZsaW5lIGJ5IGRpc2Nvbm5lY3RpbmcsIGRvbid0IHJlY29ubmVjdC5cbiAgICBpZiAodGhpcy5jdXJyZW50U3RhdHVzLnN0YXR1cyAhPSAnb2ZmbGluZScpIHRoaXMucmVjb25uZWN0KCk7XG4gIH1cblxuICBfcmV0cnlMYXRlcihtYXliZUVycm9yKSB7XG4gICAgdmFyIHRpbWVvdXQgPSAwO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmV0cnkgfHxcbiAgICAgICAgbWF5YmVFcnJvciA9PT0gZm9yY2VkUmVjb25uZWN0RXJyb3IpIHtcbiAgICAgIHRpbWVvdXQgPSB0aGlzLl9yZXRyeS5yZXRyeUxhdGVyKFxuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0dXMucmV0cnlDb3VudCxcbiAgICAgICAgdGhpcy5fcmV0cnlOb3cuYmluZCh0aGlzKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY3VycmVudFN0YXR1cy5zdGF0dXMgPSAnd2FpdGluZyc7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0dXMucmV0cnlUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyB0aW1lb3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0dXMuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdHVzLnJldHJ5VGltZTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRTdGF0dXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0dXNDaGFuZ2VkKCk7XG4gIH1cblxuICBfcmV0cnlOb3coKSB7XG4gICAgaWYgKHRoaXMuX2ZvcmNlZFRvRGlzY29ubmVjdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyZW50U3RhdHVzLnJldHJ5Q291bnQgKz0gMTtcbiAgICB0aGlzLmN1cnJlbnRTdGF0dXMuc3RhdHVzID0gJ2Nvbm5lY3RpbmcnO1xuICAgIHRoaXMuY3VycmVudFN0YXR1cy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdHVzLnJldHJ5VGltZTtcbiAgICB0aGlzLnN0YXR1c0NoYW5nZWQoKTtcblxuICAgIHRoaXMuX2xhdW5jaENvbm5lY3Rpb24oKTtcbiAgfVxuXG4gIC8vIEdldCBjdXJyZW50IHN0YXR1cy4gUmVhY3RpdmUuXG4gIHN0YXR1cygpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXJzLmRlcGVuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdHVzO1xuICB9XG59XG4iLCIvLyBAcGFyYW0gdXJsIHtTdHJpbmd9IFVSTCB0byBNZXRlb3IgYXBwLCBlZzpcbi8vICAgXCIvXCIgb3IgXCJtYWRld2l0aC5tZXRlb3IuY29tXCIgb3IgXCJodHRwczovL2Zvby5tZXRlb3IuY29tXCJcbi8vICAgb3IgXCJkZHArc29ja2pzOi8vZGRwLS0qKioqLWZvby5tZXRlb3IuY29tL3NvY2tqc1wiXG4vLyBAcmV0dXJucyB7U3RyaW5nfSBVUkwgdG8gdGhlIGVuZHBvaW50IHdpdGggdGhlIHNwZWNpZmljIHNjaGVtZSBhbmQgc3ViUGF0aCwgZS5nLlxuLy8gZm9yIHNjaGVtZSBcImh0dHBcIiBhbmQgc3ViUGF0aCBcInNvY2tqc1wiXG4vLyAgIFwiaHR0cDovL3N1YmRvbWFpbi5tZXRlb3IuY29tL3NvY2tqc1wiIG9yIFwiL3NvY2tqc1wiXG4vLyAgIG9yIFwiaHR0cHM6Ly9kZHAtLTEyMzQtZm9vLm1ldGVvci5jb20vc29ja2pzXCJcbmZ1bmN0aW9uIHRyYW5zbGF0ZVVybCh1cmwsIG5ld1NjaGVtZUJhc2UsIHN1YlBhdGgpIHtcbiAgaWYgKCFuZXdTY2hlbWVCYXNlKSB7XG4gICAgbmV3U2NoZW1lQmFzZSA9ICdodHRwJztcbiAgfVxuXG4gIGlmIChzdWJQYXRoICE9PSBcInNvY2tqc1wiICYmIHVybC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHVybCA9IE1ldGVvci5hYnNvbHV0ZVVybCh1cmwuc3Vic3RyKDEpKTtcbiAgfVxuXG4gIHZhciBkZHBVcmxNYXRjaCA9IHVybC5tYXRjaCgvXmRkcChpPylcXCtzb2NranM6XFwvXFwvLyk7XG4gIHZhciBodHRwVXJsTWF0Y2ggPSB1cmwubWF0Y2goL15odHRwKHM/KTpcXC9cXC8vKTtcbiAgdmFyIG5ld1NjaGVtZTtcbiAgaWYgKGRkcFVybE1hdGNoKSB7XG4gICAgLy8gUmVtb3ZlIHNjaGVtZSBhbmQgc3BsaXQgb2ZmIHRoZSBob3N0LlxuICAgIHZhciB1cmxBZnRlckREUCA9IHVybC5zdWJzdHIoZGRwVXJsTWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICBuZXdTY2hlbWUgPSBkZHBVcmxNYXRjaFsxXSA9PT0gJ2knID8gbmV3U2NoZW1lQmFzZSA6IG5ld1NjaGVtZUJhc2UgKyAncyc7XG4gICAgdmFyIHNsYXNoUG9zID0gdXJsQWZ0ZXJERFAuaW5kZXhPZignLycpO1xuICAgIHZhciBob3N0ID0gc2xhc2hQb3MgPT09IC0xID8gdXJsQWZ0ZXJERFAgOiB1cmxBZnRlckREUC5zdWJzdHIoMCwgc2xhc2hQb3MpO1xuICAgIHZhciByZXN0ID0gc2xhc2hQb3MgPT09IC0xID8gJycgOiB1cmxBZnRlckREUC5zdWJzdHIoc2xhc2hQb3MpO1xuXG4gICAgLy8gSW4gdGhlIGhvc3QgKE9OTFkhKSwgY2hhbmdlICcqJyBjaGFyYWN0ZXJzIGludG8gcmFuZG9tIGRpZ2l0cy4gVGhpc1xuICAgIC8vIGFsbG93cyBkaWZmZXJlbnQgc3RyZWFtIGNvbm5lY3Rpb25zIHRvIGNvbm5lY3QgdG8gZGlmZmVyZW50IGhvc3RuYW1lc1xuICAgIC8vIGFuZCBhdm9pZCBicm93c2VyIHBlci1ob3N0bmFtZSBjb25uZWN0aW9uIGxpbWl0cy5cbiAgICBob3N0ID0gaG9zdC5yZXBsYWNlKC9cXCovZywgKCkgPT4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApKTtcblxuICAgIHJldHVybiBuZXdTY2hlbWUgKyAnOi8vJyArIGhvc3QgKyByZXN0O1xuICB9IGVsc2UgaWYgKGh0dHBVcmxNYXRjaCkge1xuICAgIG5ld1NjaGVtZSA9ICFodHRwVXJsTWF0Y2hbMV0gPyBuZXdTY2hlbWVCYXNlIDogbmV3U2NoZW1lQmFzZSArICdzJztcbiAgICB2YXIgdXJsQWZ0ZXJIdHRwID0gdXJsLnN1YnN0cihodHRwVXJsTWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICB1cmwgPSBuZXdTY2hlbWUgKyAnOi8vJyArIHVybEFmdGVySHR0cDtcbiAgfVxuXG4gIC8vIFByZWZpeCBGUUROcyBidXQgbm90IHJlbGF0aXZlIFVSTHNcbiAgaWYgKHVybC5pbmRleE9mKCc6Ly8nKSA9PT0gLTEgJiYgIXVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICB1cmwgPSBuZXdTY2hlbWVCYXNlICsgJzovLycgKyB1cmw7XG4gIH1cblxuICAvLyBYWFggVGhpcyBpcyBub3Qgd2hhdCB3ZSBzaG91bGQgYmUgZG9pbmc6IGlmIEkgaGF2ZSBhIHNpdGVcbiAgLy8gZGVwbG95ZWQgYXQgXCIvZm9vXCIsIHRoZW4gRERQLmNvbm5lY3QoXCIvXCIpIHNob3VsZCBhY3R1YWxseSBjb25uZWN0XG4gIC8vIHRvIFwiL1wiLCBub3QgdG8gXCIvZm9vXCIuIFwiL1wiIGlzIGFuIGFic29sdXRlIHBhdGguIChDb250cmFzdDogaWZcbiAgLy8gZGVwbG95ZWQgYXQgXCIvZm9vXCIsIGl0IHdvdWxkIGJlIHJlYXNvbmFibGUgZm9yIEREUC5jb25uZWN0KFwiYmFyXCIpXG4gIC8vIHRvIGNvbm5lY3QgdG8gXCIvZm9vL2JhclwiKS5cbiAgLy9cbiAgLy8gV2Ugc2hvdWxkIG1ha2UgdGhpcyBwcm9wZXJseSBob25vciBhYnNvbHV0ZSBwYXRocyByYXRoZXIgdGhhblxuICAvLyBmb3JjaW5nIHRoZSBwYXRoIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzaXRlIHJvb3QuIFNpbXVsdGFuZW91c2x5LFxuICAvLyB3ZSBzaG91bGQgc2V0IEREUF9ERUZBVUxUX0NPTk5FQ1RJT05fVVJMIHRvIGluY2x1ZGUgdGhlIHNpdGVcbiAgLy8gcm9vdC4gU2VlIGFsc28gY2xpZW50X2NvbnZlbmllbmNlLmpzICNSYXRpb25hbGl6aW5nUmVsYXRpdmVERFBVUkxzXG4gIHVybCA9IE1ldGVvci5fcmVsYXRpdmVUb1NpdGVSb290VXJsKHVybCk7XG5cbiAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSByZXR1cm4gdXJsICsgc3ViUGF0aDtcbiAgZWxzZSByZXR1cm4gdXJsICsgJy8nICsgc3ViUGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2pzVXJsKHVybCkge1xuICByZXR1cm4gdHJhbnNsYXRlVXJsKHVybCwgJ2h0dHAnLCAnc29ja2pzJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1dlYnNvY2tldFVybCh1cmwpIHtcbiAgcmV0dXJuIHRyYW5zbGF0ZVVybCh1cmwsICd3cycsICd3ZWJzb2NrZXQnKTtcbn1cbiJdfQ==
{"version":3,"sources":["meteor://💻app/packages/socket-stream-client/server.js","meteor://💻app/packages/socket-stream-client/node.js","meteor://💻app/packages/socket-stream-client/common.js","meteor://💻app/packages/socket-stream-client/urls.js"],"names":["module1","module","setMinimumBrowserVersions","link","v","chrome","edge","firefox","ie","mobileSafari","phantomjs","safari","electron","id","export","ClientStream","Meteor","toWebsocketUrl","StreamClientCommon","constructor","endpoint","options","client","headers","Object","create","npmFayeOptions","_initCommon","_launchConnection","send","data","currentStatus","connected","_changeUrl","url","_onConnect","Error","_forcedToDisconnect","close","_clearConnectionTimer","status","retryCount","statusChanged","forEachCallback","callback","_cleanup","maybeError","connectionTimer","clearTimeout","_getProxyUrl","targetUrl","proxy","process","env","HTTP_PROXY","http_proxy","match","HTTPS_PROXY","https_proxy","FayeWebSocket","Npm","require","deflate","fayeOptions","extensions","assign","proxyUrl","origin","subprotocols","Client","setTimeout","_lostConnection","ConnectionError","CONNECT_TIMEOUT","on","bindEnvironment","clientOnIfCurrent","event","description","args","error","_dontPrintErrors","_debug","message","Retry","forcedReconnectError","retry","name","eventCallbacks","push","cb","length","forEach","connectTimeoutMs","Package","tracker","statusListeners","Tracker","Dependency","changed","_retry","reconnect","_sockjsOptions","_force","clear","_retryNow","disconnect","_permanent","_error","reason","_retryLater","_online","timeout","retryLater","bind","retryTime","Date","getTime","depend","toSockjsUrl","translateUrl","newSchemeBase","subPath","startsWith","absoluteUrl","substr","ddpUrlMatch","httpUrlMatch","newScheme","urlAfterDDP","slashPos","indexOf","host","rest","replace","Math","floor","random","urlAfterHttp","_relativeToSiteRootUrl","endsWith"],"mappings":"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","file":"/packages/socket-stream-client.js","sourcesContent":["import {\n setMinimumBrowserVersions,\n} from \"meteor/modern-browsers\";\n\nsetMinimumBrowserVersions({\n chrome: 16,\n edge: 12,\n firefox: 11,\n ie: 10,\n mobileSafari: [6, 1],\n phantomjs: 2,\n safari: 7,\n electron: [0, 20],\n}, module.id);\n","import { Meteor } from \"meteor/meteor\";\nimport { toWebsocketUrl } from \"./urls.js\";\nimport { StreamClientCommon } from \"./common.js\";\n\n// @param endpoint {String} URL to Meteor app\n// \"http://subdomain.meteor.com/\" or \"/\" or\n// \"ddp+sockjs://foo-**.meteor.com/sockjs\"\n//\n// We do some rewriting of the URL to eventually make it \"ws://\" or \"wss://\",\n// whatever was passed in. At the very least, what Meteor.absoluteUrl() returns\n// us should work.\n//\n// We don't do any heartbeating. (The logic that did this in sockjs was removed,\n// because it used a built-in sockjs mechanism. We could do it with WebSocket\n// ping frames or with DDP-level messages.)\nexport class ClientStream extends StreamClientCommon {\n constructor(endpoint, options) {\n super(options);\n\n this.client = null; // created in _launchConnection\n this.endpoint = endpoint;\n\n this.headers = this.options.headers || Object.create(null);\n this.npmFayeOptions = this.options.npmFayeOptions || Object.create(null);\n\n this._initCommon(this.options);\n\n //// Kickoff!\n this._launchConnection();\n }\n\n // data is a utf8 string. Data sent while not connected is dropped on\n // the floor, and it is up the user of this API to retransmit lost\n // messages on 'reset'\n send(data) {\n if (this.currentStatus.connected) {\n this.client.send(data);\n }\n }\n\n // Changes where this connection points\n _changeUrl(url) {\n this.endpoint = url;\n }\n\n _onConnect(client) {\n if (client !== this.client) {\n // This connection is not from the last call to _launchConnection.\n // But _launchConnection calls _cleanup which closes previous connections.\n // It's our belief that this stifles future 'open' events, but maybe\n // we are wrong?\n throw new Error('Got open from inactive client ' + !!this.client);\n }\n\n if (this._forcedToDisconnect) {\n // We were asked to disconnect between trying to open the connection and\n // actually opening it. Let's just pretend this never happened.\n this.client.close();\n this.client = null;\n return;\n }\n\n if (this.currentStatus.connected) {\n // We already have a connection. It must have been the case that we\n // started two parallel connection attempts (because we wanted to\n // 'reconnect now' on a hanging connection and we had no way to cancel the\n // connection attempt.) But this shouldn't happen (similarly to the client\n // !== this.client check above).\n throw new Error('Two parallel connections?');\n }\n\n this._clearConnectionTimer();\n\n // update status\n this.currentStatus.status = 'connected';\n this.currentStatus.connected = true;\n this.currentStatus.retryCount = 0;\n this.statusChanged();\n\n // fire resets. This must come after status change so that clients\n // can call send from within a reset callback.\n this.forEachCallback('reset', callback => {\n callback();\n });\n }\n\n _cleanup(maybeError) {\n this._clearConnectionTimer();\n if (this.client) {\n var client = this.client;\n this.client = null;\n client.close();\n\n this.forEachCallback('disconnect', callback => {\n callback(maybeError);\n });\n }\n }\n\n _clearConnectionTimer() {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = null;\n }\n }\n\n _getProxyUrl(targetUrl) {\n // Similar to code in tools/http-helpers.js.\n var proxy = process.env.HTTP_PROXY || process.env.http_proxy || null;\n // if we're going to a secure url, try the https_proxy env variable first.\n if (targetUrl.match(/^wss:/)) {\n proxy = process.env.HTTPS_PROXY || process.env.https_proxy || proxy;\n }\n return proxy;\n }\n\n _launchConnection() {\n this._cleanup(); // cleanup the old socket, if there was one.\n\n // Since server-to-server DDP is still an experimental feature, we only\n // require the module if we actually create a server-to-server\n // connection.\n var FayeWebSocket = Npm.require('faye-websocket');\n var deflate = Npm.require('permessage-deflate');\n\n var targetUrl = toWebsocketUrl(this.endpoint);\n var fayeOptions = {\n headers: this.headers,\n extensions: [deflate]\n };\n fayeOptions = Object.assign(fayeOptions, this.npmFayeOptions);\n var proxyUrl = this._getProxyUrl(targetUrl);\n if (proxyUrl) {\n fayeOptions.proxy = { origin: proxyUrl };\n }\n\n // We would like to specify 'ddp' as the subprotocol here. The npm module we\n // used to use as a client would fail the handshake if we ask for a\n // subprotocol and the server doesn't send one back (and sockjs doesn't).\n // Faye doesn't have that behavior; it's unclear from reading RFC 6455 if\n // Faye is erroneous or not. So for now, we don't specify protocols.\n var subprotocols = [];\n\n var client = (this.client = new FayeWebSocket.Client(\n targetUrl,\n subprotocols,\n fayeOptions\n ));\n\n this._clearConnectionTimer();\n this.connectionTimer = Meteor.setTimeout(() => {\n this._lostConnection(new this.ConnectionError('DDP connection timed out'));\n }, this.CONNECT_TIMEOUT);\n\n this.client.on(\n 'open',\n Meteor.bindEnvironment(() => {\n return this._onConnect(client);\n }, 'stream connect callback')\n );\n\n var clientOnIfCurrent = (event, description, callback) => {\n this.client.on(\n event,\n Meteor.bindEnvironment((...args) => {\n // Ignore events from any connection we've already cleaned up.\n if (client !== this.client) return;\n callback(...args);\n }, description)\n );\n };\n\n clientOnIfCurrent('error', 'stream error callback', error => {\n if (!this.options._dontPrintErrors)\n Meteor._debug('stream error', error.message);\n\n // Faye's 'error' object is not a JS error (and among other things,\n // doesn't stringify well). Convert it to one.\n this._lostConnection(new this.ConnectionError(error.message));\n });\n\n clientOnIfCurrent('close', 'stream close callback', () => {\n this._lostConnection();\n });\n\n clientOnIfCurrent('message', 'stream message callback', message => {\n // Ignore binary frames, where message.data is a Buffer\n if (typeof message.data !== 'string') return;\n\n this.forEachCallback('message', callback => {\n callback(message.data);\n });\n });\n }\n}\n","import { Retry } from 'meteor/retry';\n\nconst forcedReconnectError = new Error(\"forced reconnect\");\n\nexport class StreamClientCommon {\n constructor(options) {\n this.options = {\n retry: true,\n ...(options || null),\n };\n\n this.ConnectionError =\n options && options.ConnectionError || Error;\n }\n\n // Register for callbacks.\n on(name, callback) {\n if (name !== 'message' && name !== 'reset' && name !== 'disconnect')\n throw new Error('unknown event type: ' + name);\n\n if (!this.eventCallbacks[name]) this.eventCallbacks[name] = [];\n this.eventCallbacks[name].push(callback);\n }\n\n forEachCallback(name, cb) {\n if (!this.eventCallbacks[name] || !this.eventCallbacks[name].length) {\n return;\n }\n\n this.eventCallbacks[name].forEach(cb);\n }\n\n _initCommon(options) {\n options = options || Object.create(null);\n\n //// Constants\n\n // how long to wait until we declare the connection attempt\n // failed.\n this.CONNECT_TIMEOUT = options.connectTimeoutMs || 10000;\n\n this.eventCallbacks = Object.create(null); // name -> [callback]\n\n this._forcedToDisconnect = false;\n\n //// Reactive status\n this.currentStatus = {\n status: 'connecting',\n connected: false,\n retryCount: 0\n };\n\n if (Package.tracker) {\n this.statusListeners = new Package.tracker.Tracker.Dependency();\n }\n\n this.statusChanged = () => {\n if (this.statusListeners) {\n this.statusListeners.changed();\n }\n };\n\n //// Retry logic\n this._retry = new Retry();\n this.connectionTimer = null;\n }\n\n // Trigger a reconnect.\n reconnect(options) {\n options = options || Object.create(null);\n\n if (options.url) {\n this._changeUrl(options.url);\n }\n\n if (options._sockjsOptions) {\n this.options._sockjsOptions = options._sockjsOptions;\n }\n\n if (this.currentStatus.connected) {\n if (options._force || options.url) {\n this._lostConnection(forcedReconnectError);\n }\n return;\n }\n\n // if we're mid-connection, stop it.\n if (this.currentStatus.status === 'connecting') {\n // Pretend it's a clean close.\n this._lostConnection();\n }\n\n this._retry.clear();\n this.currentStatus.retryCount -= 1; // don't count manual retries\n this._retryNow();\n }\n\n disconnect(options) {\n options = options || Object.create(null);\n\n // Failed is permanent. If we're failed, don't let people go back\n // online by calling 'disconnect' then 'reconnect'.\n if (this._forcedToDisconnect) return;\n\n // If _permanent is set, permanently disconnect a stream. Once a stream\n // is forced to disconnect, it can never reconnect. This is for\n // error cases such as ddp version mismatch, where trying again\n // won't fix the problem.\n if (options._permanent) {\n this._forcedToDisconnect = true;\n }\n\n this._cleanup();\n this._retry.clear();\n\n this.currentStatus = {\n status: options._permanent ? 'failed' : 'offline',\n connected: false,\n retryCount: 0\n };\n\n if (options._permanent && options._error)\n this.currentStatus.reason = options._error;\n\n this.statusChanged();\n }\n\n // maybeError is set unless it's a clean protocol-level close.\n _lostConnection(maybeError) {\n this._cleanup(maybeError);\n this._retryLater(maybeError); // sets status. no need to do it here.\n }\n\n // fired when we detect that we've gone online. try to reconnect\n // immediately.\n _online() {\n // if we've requested to be offline by disconnecting, don't reconnect.\n if (this.currentStatus.status != 'offline') this.reconnect();\n }\n\n _retryLater(maybeError) {\n var timeout = 0;\n if (this.options.retry ||\n maybeError === forcedReconnectError) {\n timeout = this._retry.retryLater(\n this.currentStatus.retryCount,\n this._retryNow.bind(this)\n );\n this.currentStatus.status = 'waiting';\n this.currentStatus.retryTime = new Date().getTime() + timeout;\n } else {\n this.currentStatus.status = 'failed';\n delete this.currentStatus.retryTime;\n }\n\n this.currentStatus.connected = false;\n this.statusChanged();\n }\n\n _retryNow() {\n if (this._forcedToDisconnect) return;\n\n this.currentStatus.retryCount += 1;\n this.currentStatus.status = 'connecting';\n this.currentStatus.connected = false;\n delete this.currentStatus.retryTime;\n this.statusChanged();\n\n this._launchConnection();\n }\n\n // Get current status. Reactive.\n status() {\n if (this.statusListeners) {\n this.statusListeners.depend();\n }\n return this.currentStatus;\n }\n}\n","// @param url {String} URL to Meteor app, eg:\n// \"/\" or \"madewith.meteor.com\" or \"https://foo.meteor.com\"\n// or \"ddp+sockjs://ddp--****-foo.meteor.com/sockjs\"\n// @returns {String} URL to the endpoint with the specific scheme and subPath, e.g.\n// for scheme \"http\" and subPath \"sockjs\"\n// \"http://subdomain.meteor.com/sockjs\" or \"/sockjs\"\n// or \"https://ddp--1234-foo.meteor.com/sockjs\"\nfunction translateUrl(url, newSchemeBase, subPath) {\n if (!newSchemeBase) {\n newSchemeBase = 'http';\n }\n\n if (subPath !== \"sockjs\" && url.startsWith(\"/\")) {\n url = Meteor.absoluteUrl(url.substr(1));\n }\n\n var ddpUrlMatch = url.match(/^ddp(i?)\\+sockjs:\\/\\//);\n var httpUrlMatch = url.match(/^http(s?):\\/\\//);\n var newScheme;\n if (ddpUrlMatch) {\n // Remove scheme and split off the host.\n var urlAfterDDP = url.substr(ddpUrlMatch[0].length);\n newScheme = ddpUrlMatch[1] === 'i' ? newSchemeBase : newSchemeBase + 's';\n var slashPos = urlAfterDDP.indexOf('/');\n var host = slashPos === -1 ? urlAfterDDP : urlAfterDDP.substr(0, slashPos);\n var rest = slashPos === -1 ? '' : urlAfterDDP.substr(slashPos);\n\n // In the host (ONLY!), change '*' characters into random digits. This\n // allows different stream connections to connect to different hostnames\n // and avoid browser per-hostname connection limits.\n host = host.replace(/\\*/g, () => Math.floor(Math.random() * 10));\n\n return newScheme + '://' + host + rest;\n } else if (httpUrlMatch) {\n newScheme = !httpUrlMatch[1] ? newSchemeBase : newSchemeBase + 's';\n var urlAfterHttp = url.substr(httpUrlMatch[0].length);\n url = newScheme + '://' + urlAfterHttp;\n }\n\n // Prefix FQDNs but not relative URLs\n if (url.indexOf('://') === -1 && !url.startsWith('/')) {\n url = newSchemeBase + '://' + url;\n }\n\n // XXX This is not what we should be doing: if I have a site\n // deployed at \"/foo\", then DDP.connect(\"/\") should actually connect\n // to \"/\", not to \"/foo\". \"/\" is an absolute path. (Contrast: if\n // deployed at \"/foo\", it would be reasonable for DDP.connect(\"bar\")\n // to connect to \"/foo/bar\").\n //\n // We should make this properly honor absolute paths rather than\n // forcing the path to be relative to the site root. Simultaneously,\n // we should set DDP_DEFAULT_CONNECTION_URL to include the site\n // root. See also client_convenience.js #RationalizingRelativeDDPURLs\n url = Meteor._relativeToSiteRootUrl(url);\n\n if (url.endsWith('/')) return url + subPath;\n else return url + '/' + subPath;\n}\n\nexport function toSockjsUrl(url) {\n return translateUrl(url, 'http', 'sockjs');\n}\n\nexport function toWebsocketUrl(url) {\n return translateUrl(url, 'ws', 'websocket');\n}\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ObserveSequence = Package['observe-sequence'].ObserveSequence;
var _ = Package.underscore._;
var Tracker = Package.tracker.Tracker;
var Deps = Package.tracker.Deps;
var HTML = Package.htmljs.HTML;
var Blaze = Package.blaze.Blaze;
var UI = Package.blaze.UI;
var Handlebars = Package.blaze.Handlebars;
/* Package-scope variables */
var Spacebars;
(function(){
///////////////////////////////////////////////////////////////////////////////////
// //
// packages/spacebars/spacebars-runtime.js //
// //
///////////////////////////////////////////////////////////////////////////////////
//
Spacebars = {};
var tripleEquals = function (a, b) { return a === b; };
Spacebars.include = function (templateOrFunction, contentFunc, elseFunc) {
if (! templateOrFunction)
return null;
if (typeof templateOrFunction !== 'function') {
var template = templateOrFunction;
if (! Blaze.isTemplate(template))
throw new Error("Expected template or null, found: " + template);
var view = templateOrFunction.constructView(contentFunc, elseFunc);
view.__startsNewLexicalScope = true;
return view;
}
var templateVar = Blaze.ReactiveVar(null, tripleEquals);
var view = Blaze.View('Spacebars.include', function () {
var template = templateVar.get();
if (template === null)
return null;
if (! Blaze.isTemplate(template))
throw new Error("Expected template or null, found: " + template);
return template.constructView(contentFunc, elseFunc);
});
view.__templateVar = templateVar;
view.onViewCreated(function () {
this.autorun(function () {
templateVar.set(templateOrFunction());
});
});
view.__startsNewLexicalScope = true;
return view;
};
// Executes `{{foo bar baz}}` when called on `(foo, bar, baz)`.
// If `bar` and `baz` are functions, they are called before
// `foo` is called on them.
//
// This is the shared part of Spacebars.mustache and
// Spacebars.attrMustache, which differ in how they post-process the
// result.
Spacebars.mustacheImpl = function (value/*, args*/) {
var args = arguments;
// if we have any arguments (pos or kw), add an options argument
// if there isn't one.
if (args.length > 1) {
var kw = args[args.length - 1];
if (! (kw instanceof Spacebars.kw)) {
kw = Spacebars.kw();
// clone arguments into an actual array, then push
// the empty kw object.
args = Array.prototype.slice.call(arguments);
args.push(kw);
} else {
// For each keyword arg, call it if it's a function
var newHash = {};
for (var k in kw.hash) {
var v = kw.hash[k];
newHash[k] = (typeof v === 'function' ? v() : v);
}
args[args.length - 1] = Spacebars.kw(newHash);
}
}
return Spacebars.call.apply(null, args);
};
Spacebars.mustache = function (value/*, args*/) {
var result = Spacebars.mustacheImpl.apply(null, arguments);
if (result instanceof Spacebars.SafeString)
return HTML.Raw(result.toString());
else
// map `null`, `undefined`, and `false` to null, which is important
// so that attributes with nully values are considered absent.
// stringify anything else (e.g. strings, booleans, numbers including 0).
return (result == null || result === false) ? null : String(result);
};
Spacebars.attrMustache = function (value/*, args*/) {
var result = Spacebars.mustacheImpl.apply(null, arguments);
if (result == null || result === '') {
return null;
} else if (typeof result === 'object') {
return result;
} else if (typeof result === 'string' && HTML.isValidAttributeName(result)) {
var obj = {};
obj[result] = '';
return obj;
} else {
throw new Error("Expected valid attribute name, '', null, or object");
}
};
Spacebars.dataMustache = function (value/*, args*/) {
var result = Spacebars.mustacheImpl.apply(null, arguments);
return result;
};
// Idempotently wrap in `HTML.Raw`.
//
// Called on the return value from `Spacebars.mustache` in case the
// template uses triple-stache (`{{{foo bar baz}}}`).
Spacebars.makeRaw = function (value) {
if (value == null) // null or undefined
return null;
else if (value instanceof HTML.Raw)
return value;
else
return HTML.Raw(value);
};
// If `value` is a function, evaluate its `args` (by calling them, if they
// are functions), and then call it on them. Otherwise, return `value`.
//
// If `value` is not a function and is not null, then this method will assert
// that there are no args. We check for null before asserting because a user
// may write a template like {{user.fullNameWithPrefix 'Mr.'}}, where the
// function will be null until data is ready.
Spacebars.call = function (value/*, args*/) {
if (typeof value === 'function') {
// Evaluate arguments by calling them if they are functions.
var newArgs = [];
for (var i = 1; i < arguments.length; i++) {
var arg = arguments[i];
newArgs[i-1] = (typeof arg === 'function' ? arg() : arg);
}
return value.apply(null, newArgs);
} else {
if (value != null && arguments.length > 1) {
throw new Error("Can't call non-function: " + value);
}
return value;
}
};
// Call this as `Spacebars.kw({ ... })`. The return value
// is `instanceof Spacebars.kw`.
Spacebars.kw = function (hash) {
if (! (this instanceof Spacebars.kw))
// called without new; call with new
return new Spacebars.kw(hash);
this.hash = hash || {};
};
// Call this as `Spacebars.SafeString("some HTML")`. The return value
// is `instanceof Spacebars.SafeString` (and `instanceof Handlebars.SafeString).
Spacebars.SafeString = function (html) {
if (! (this instanceof Spacebars.SafeString))
// called without new; call with new
return new Spacebars.SafeString(html);
return new Handlebars.SafeString(html);
};
Spacebars.SafeString.prototype = Handlebars.SafeString.prototype;
// `Spacebars.dot(foo, "bar", "baz")` performs a special kind
// of `foo.bar.baz` that allows safe indexing of `null` and
// indexing of functions (which calls the function). If the
// result is a function, it is always a bound function (e.g.
// a wrapped version of `baz` that always uses `foo.bar` as
// `this`).
//
// In `Spacebars.dot(foo, "bar")`, `foo` is assumed to be either
// a non-function value or a "fully-bound" function wrapping a value,
// where fully-bound means it takes no arguments and ignores `this`.
//
// `Spacebars.dot(foo, "bar")` performs the following steps:
//
// * If `foo` is falsy, return `foo`.
//
// * If `foo` is a function, call it (set `foo` to `foo()`).
//
// * If `foo` is falsy now, return `foo`.
//
// * Return `foo.bar`, binding it to `foo` if it's a function.
Spacebars.dot = function (value, id1/*, id2, ...*/) {
if (arguments.length > 2) {
// Note: doing this recursively is probably less efficient than
// doing it in an iterative loop.
var argsForRecurse = [];
argsForRecurse.push(Spacebars.dot(value, id1));
argsForRecurse.push.apply(argsForRecurse,
Array.prototype.slice.call(arguments, 2));
return Spacebars.dot.apply(null, argsForRecurse);
}
if (typeof value === 'function')
value = value();
if (! value)
return value; // falsy, don't index, pass through
var result = value[id1];
if (typeof result !== 'function')
return result;
// `value[id1]` (or `value()[id1]`) is a function.
// Bind it so that when called, `value` will be placed in `this`.
return function (/*arguments*/) {
return result.apply(value, arguments);
};
};
// Spacebars.With implements the conditional logic of rendering
// the `{{else}}` block if the argument is falsy. It combines
// a Blaze.If with a Blaze.With (the latter only in the truthy
// case, since the else block is evaluated without entering
// a new data context).
Spacebars.With = function (argFunc, contentFunc, elseFunc) {
var argVar = new Blaze.ReactiveVar;
var view = Blaze.View('Spacebars_with', function () {
return Blaze.If(function () { return argVar.get(); },
function () { return Blaze.With(function () {
return argVar.get(); }, contentFunc); },
elseFunc);
});
view.onViewCreated(function () {
this.autorun(function () {
argVar.set(argFunc());
// This is a hack so that autoruns inside the body
// of the #with get stopped sooner. It reaches inside
// our ReactiveVar to access its dep.
Tracker.onInvalidate(function () {
argVar.dep.changed();
});
// Take the case of `{{#with A}}{{B}}{{/with}}`. The goal
// is to not re-render `B` if `A` changes to become falsy
// and `B` is simultaneously invalidated.
//
// A series of autoruns are involved:
//
// 1. This autorun (argument to Spacebars.With)
// 2. Argument to Blaze.If
// 3. Blaze.If view re-render
// 4. Argument to Blaze.With
// 5. The template tag `{{B}}`
//
// When (3) is invalidated, it immediately stops (4) and (5)
// because of a Tracker.onInvalidate built into materializeView.
// (When a View's render method is invalidated, it immediately
// tears down all the subviews, via a Tracker.onInvalidate much
// like this one.
//
// Suppose `A` changes to become falsy, and `B` changes at the
// same time (i.e. without an intervening flush).
// Without the code above, this happens:
//
// - (1) and (5) are invalidated.
// - (1) runs, invalidating (2) and (4).
// - (5) runs.
// - (2) runs, invalidating (3), stopping (4) and (5).
//
// With the code above:
//
// - (1) and (5) are invalidated, invalidating (2) and (4).
// - (1) runs.
// - (2) runs, invalidating (3), stopping (4) and (5).
//
// If the re-run of (5) is originally enqueued before (1), all
// bets are off, but typically that doesn't seem to be the
// case. Anyway, doing this is always better than not doing it,
// because it might save a bunch of DOM from being updated
// needlessly.
});
});
return view;
};
// XXX COMPAT WITH 0.9.0
Spacebars.TemplateWith = Blaze._TemplateWith;
///////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("spacebars", {
Spacebars: Spacebars
});
})();
(function () {
/* Exports */
Package._define("standard-minifier-css");
})();
(function () {
/* Exports */
Package._define("standard-minifier-js");
})();
(function () {
/* Exports */
Package._define("templating-compiler");
})();
(function () {
/* Exports */
Package._define("templating-runtime");
})();
(function () {
/* Exports */
Package._define("templating");
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var Tracker, Deps, computation;
var require = meteorInstall({"node_modules":{"meteor":{"tracker":{"tracker.js":function(){
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/tracker/tracker.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////
// Package docs at http://docs.meteor.com/#tracker //
/////////////////////////////////////////////////////
/**
* @namespace Tracker
* @summary The namespace for Tracker-related methods.
*/
Tracker = {};
/**
* @namespace Deps
* @deprecated
*/
Deps = Tracker; // http://docs.meteor.com/#tracker_active
/**
* @summary True if there is a current computation, meaning that dependencies on reactive data sources will be tracked and potentially cause the current computation to be rerun.
* @locus Client
* @type {Boolean}
*/
Tracker.active = false; // http://docs.meteor.com/#tracker_currentcomputation
/**
* @summary The current computation, or `null` if there isn't one. The current computation is the [`Tracker.Computation`](#tracker_computation) object created by the innermost active call to `Tracker.autorun`, and it's the computation that gains dependencies when reactive data sources are accessed.
* @locus Client
* @type {Tracker.Computation}
*/
Tracker.currentComputation = null;
function setCurrentComputation(c) {
Tracker.currentComputation = c;
Tracker.active = !!c;
}
function _debugFunc() {
// We want this code to work without Meteor, and also without
// "console" (which is technically non-standard and may be missing
// on some browser we come across, like it was on IE 7).
//
// Lazy evaluation because `Meteor` does not exist right away.(??)
return typeof Meteor !== "undefined" ? Meteor._debug : typeof console !== "undefined" && console.error ? function () {
console.error.apply(console, arguments);
} : function () {};
}
function _maybeSuppressMoreLogs(messagesLength) {
// Sometimes when running tests, we intentionally suppress logs on expected
// printed errors. Since the current implementation of _throwOrLog can log
// multiple separate log messages, suppress all of them if at least one suppress
// is expected as we still want them to count as one.
if (typeof Meteor !== "undefined") {
if (Meteor._suppressed_log_expected()) {
Meteor._suppress_log(messagesLength - 1);
}
}
}
function _throwOrLog(from, e) {
if (throwFirstError) {
throw e;
} else {
var printArgs = ["Exception from Tracker " + from + " function:"];
if (e.stack && e.message && e.name) {
var idx = e.stack.indexOf(e.message);
if (idx < 0 || idx > e.name.length + 2) {
// check for "Error: "
// message is not part of the stack
var message = e.name + ": " + e.message;
printArgs.push(message);
}
}
printArgs.push(e.stack);
_maybeSuppressMoreLogs(printArgs.length);
for (var i = 0; i < printArgs.length; i++) {
_debugFunc()(printArgs[i]);
}
}
} // Takes a function `f`, and wraps it in a `Meteor._noYieldsAllowed`
// block if we are running on the server. On the client, returns the
// original function (since `Meteor._noYieldsAllowed` is a
// no-op). This has the benefit of not adding an unnecessary stack
// frame on the client.
function withNoYieldsAllowed(f) {
if (typeof Meteor === 'undefined' || Meteor.isClient) {
return f;
} else {
return function () {
var args = arguments;
Meteor._noYieldsAllowed(function () {
f.apply(null, args);
});
};
}
}
var nextId = 1; // computations whose callbacks we should call at flush time
var pendingComputations = []; // `true` if a Tracker.flush is scheduled, or if we are in Tracker.flush now
var willFlush = false; // `true` if we are in Tracker.flush now
var inFlush = false; // `true` if we are computing a computation now, either first time
// or recompute. This matches Tracker.active unless we are inside
// Tracker.nonreactive, which nullfies currentComputation even though
// an enclosing computation may still be running.
var inCompute = false; // `true` if the `_throwFirstError` option was passed in to the call
// to Tracker.flush that we are in. When set, throw rather than log the
// first error encountered while flushing. Before throwing the error,
// finish flushing (from a finally block), logging any subsequent
// errors.
var throwFirstError = false;
var afterFlushCallbacks = [];
function requireFlush() {
if (!willFlush) {
// We want this code to work without Meteor, see debugFunc above
if (typeof Meteor !== "undefined") Meteor._setImmediate(Tracker._runFlush);else setTimeout(Tracker._runFlush, 0);
willFlush = true;
}
} // Tracker.Computation constructor is visible but private
// (throws an error if you try to call it)
var constructingComputation = false; //
// http://docs.meteor.com/#tracker_computation
/**
* @summary A Computation object represents code that is repeatedly rerun
* in response to
* reactive data changes. Computations don't have return values; they just
* perform actions, such as rerendering a template on the screen. Computations
* are created using Tracker.autorun. Use stop to prevent further rerunning of a
* computation.
* @instancename computation
*/
Tracker.Computation = class Computation {
constructor(f, parent, onError) {
if (!constructingComputation) throw new Error("Tracker.Computation constructor is private; use Tracker.autorun");
constructingComputation = false; // http://docs.meteor.com/#computation_stopped
/**
* @summary True if this computation has been stopped.
* @locus Client
* @memberOf Tracker.Computation
* @instance
* @name stopped
*/
this.stopped = false; // http://docs.meteor.com/#computation_invalidated
/**
* @summary True if this computation has been invalidated (and not yet rerun), or if it has been stopped.
* @locus Client
* @memberOf Tracker.Computation
* @instance
* @name invalidated
* @type {Boolean}
*/
this.invalidated = false; // http://docs.meteor.com/#computation_firstrun
/**
* @summary True during the initial run of the computation at the time `Tracker.autorun` is called, and false on subsequent reruns and at other times.
* @locus Client
* @memberOf Tracker.Computation
* @instance
* @name firstRun
* @type {Boolean}
*/
this.firstRun = true;
this._id = nextId++;
this._onInvalidateCallbacks = [];
this._onStopCallbacks = []; // the plan is at some point to use the parent relation
// to constrain the order that computations are processed
this._parent = parent;
this._func = f;
this._onError = onError;
this._recomputing = false;
var errored = true;
try {
this._compute();
errored = false;
} finally {
this.firstRun = false;
if (errored) this.stop();
}
} // http://docs.meteor.com/#computation_oninvalidate
/**
* @summary Registers `callback` to run when this computation is next invalidated, or runs it immediately if the computation is already invalidated. The callback is run exactly once and not upon future invalidations unless `onInvalidate` is called again after the computation becomes valid again.
* @locus Client
* @param {Function} callback Function to be called on invalidation. Receives one argument, the computation that was invalidated.
*/
onInvalidate(f) {
if (typeof f !== 'function') throw new Error("onInvalidate requires a function");
if (this.invalidated) {
Tracker.nonreactive(() => {
withNoYieldsAllowed(f)(this);
});
} else {
this._onInvalidateCallbacks.push(f);
}
}
/**
* @summary Registers `callback` to run when this computation is stopped, or runs it immediately if the computation is already stopped. The callback is run after any `onInvalidate` callbacks.
* @locus Client
* @param {Function} callback Function to be called on stop. Receives one argument, the computation that was stopped.
*/
onStop(f) {
if (typeof f !== 'function') throw new Error("onStop requires a function");
if (this.stopped) {
Tracker.nonreactive(() => {
withNoYieldsAllowed(f)(this);
});
} else {
this._onStopCallbacks.push(f);
}
} // http://docs.meteor.com/#computation_invalidate
/**
* @summary Invalidates this computation so that it will be rerun.
* @locus Client
*/
invalidate() {
if (!this.invalidated) {
// if we're currently in _recompute(), don't enqueue
// ourselves, since we'll rerun immediately anyway.
if (!this._recomputing && !this.stopped) {
requireFlush();
pendingComputations.push(this);
}
this.invalidated = true; // callbacks can't add callbacks, because
// this.invalidated === true.
for (var i = 0, f; f = this._onInvalidateCallbacks[i]; i++) {
Tracker.nonreactive(() => {
withNoYieldsAllowed(f)(this);
});
}
this._onInvalidateCallbacks = [];
}
} // http://docs.meteor.com/#computation_stop
/**
* @summary Prevents this computation from rerunning.
* @locus Client
*/
stop() {
if (!this.stopped) {
this.stopped = true;
this.invalidate();
for (var i = 0, f; f = this._onStopCallbacks[i]; i++) {
Tracker.nonreactive(() => {
withNoYieldsAllowed(f)(this);
});
}
this._onStopCallbacks = [];
}
}
_compute() {
this.invalidated = false;
var previous = Tracker.currentComputation;
setCurrentComputation(this);
var previousInCompute = inCompute;
inCompute = true;
try {
withNoYieldsAllowed(this._func)(this);
} finally {
setCurrentComputation(previous);
inCompute = previousInCompute;
}
}
_needsRecompute() {
return this.invalidated && !this.stopped;
}
_recompute() {
this._recomputing = true;
try {
if (this._needsRecompute()) {
try {
this._compute();
} catch (e) {
if (this._onError) {
this._onError(e);
} else {
_throwOrLog("recompute", e);
}
}
}
} finally {
this._recomputing = false;
}
}
/**
* @summary Process the reactive updates for this computation immediately
* and ensure that the computation is rerun. The computation is rerun only
* if it is invalidated.
* @locus Client
*/
flush() {
if (this._recomputing) return;
this._recompute();
}
/**
* @summary Causes the function inside this computation to run and
* synchronously process all reactive updtes.
* @locus Client
*/
run() {
this.invalidate();
this.flush();
}
}; //
// http://docs.meteor.com/#tracker_dependency
/**
* @summary A Dependency represents an atomic unit of reactive data that a
* computation might depend on. Reactive data sources such as Session or
* Minimongo internally create different Dependency objects for different
* pieces of data, each of which may be depended on by multiple computations.
* When the data changes, the computations are invalidated.
* @class
* @instanceName dependency
*/
Tracker.Dependency = class Dependency {
constructor() {
this._dependentsById = Object.create(null);
} // http://docs.meteor.com/#dependency_depend
//
// Adds `computation` to this set if it is not already
// present. Returns true if `computation` is a new member of the set.
// If no argument, defaults to currentComputation, or does nothing
// if there is no currentComputation.
/**
* @summary Declares that the current computation (or `fromComputation` if given) depends on `dependency`. The computation will be invalidated the next time `dependency` changes.
If there is no current computation and `depend()` is called with no arguments, it does nothing and returns false.
Returns true if the computation is a new dependent of `dependency` rather than an existing one.
* @locus Client
* @param {Tracker.Computation} [fromComputation] An optional computation declared to depend on `dependency` instead of the current computation.
* @returns {Boolean}
*/
depend(computation) {
if (!computation) {
if (!Tracker.active) return false;
computation = Tracker.currentComputation;
}
var id = computation._id;
if (!(id in this._dependentsById)) {
this._dependentsById[id] = computation;
computation.onInvalidate(() => {
delete this._dependentsById[id];
});
return true;
}
return false;
} // http://docs.meteor.com/#dependency_changed
/**
* @summary Invalidate all dependent computations immediately and remove them as dependents.
* @locus Client
*/
changed() {
for (var id in this._dependentsById) this._dependentsById[id].invalidate();
} // http://docs.meteor.com/#dependency_hasdependents
/**
* @summary True if this Dependency has one or more dependent Computations, which would be invalidated if this Dependency were to change.
* @locus Client
* @returns {Boolean}
*/
hasDependents() {
for (var id in this._dependentsById) return true;
return false;
}
}; // http://docs.meteor.com/#tracker_flush
/**
* @summary Process all reactive updates immediately and ensure that all invalidated computations are rerun.
* @locus Client
*/
Tracker.flush = function (options) {
Tracker._runFlush({
finishSynchronously: true,
throwFirstError: options && options._throwFirstError
});
};
/**
* @summary True if we are computing a computation now, either first time or recompute. This matches Tracker.active unless we are inside Tracker.nonreactive, which nullfies currentComputation even though an enclosing computation may still be running.
* @locus Client
* @returns {Boolean}
*/
Tracker.inFlush = function () {
return inFlush;
}; // Run all pending computations and afterFlush callbacks. If we were not called
// directly via Tracker.flush, this may return before they're all done to allow
// the event loop to run a little before continuing.
Tracker._runFlush = function (options) {
// XXX What part of the comment below is still true? (We no longer
// have Spark)
//
// Nested flush could plausibly happen if, say, a flush causes
// DOM mutation, which causes a "blur" event, which runs an
// app event handler that calls Tracker.flush. At the moment
// Spark blocks event handlers during DOM mutation anyway,
// because the LiveRange tree isn't valid. And we don't have
// any useful notion of a nested flush.
//
// https://app.asana.com/0/159908330244/385138233856
if (Tracker.inFlush()) throw new Error("Can't call Tracker.flush while flushing");
if (inCompute) throw new Error("Can't flush inside Tracker.autorun");
options = options || {};
inFlush = true;
willFlush = true;
throwFirstError = !!options.throwFirstError;
var recomputedCount = 0;
var finishedTry = false;
try {
while (pendingComputations.length || afterFlushCallbacks.length) {
// recompute all pending computations
while (pendingComputations.length) {
var comp = pendingComputations.shift();
comp._recompute();
if (comp._needsRecompute()) {
pendingComputations.unshift(comp);
}
if (!options.finishSynchronously && ++recomputedCount > 1000) {
finishedTry = true;
return;
}
}
if (afterFlushCallbacks.length) {
// call one afterFlush callback, which may
// invalidate more computations
var func = afterFlushCallbacks.shift();
try {
func();
} catch (e) {
_throwOrLog("afterFlush", e);
}
}
}
finishedTry = true;
} finally {
if (!finishedTry) {
// we're erroring due to throwFirstError being true.
inFlush = false; // needed before calling `Tracker.flush()` again
// finish flushing
Tracker._runFlush({
finishSynchronously: options.finishSynchronously,
throwFirstError: false
});
}
willFlush = false;
inFlush = false;
if (pendingComputations.length || afterFlushCallbacks.length) {
// We're yielding because we ran a bunch of computations and we aren't
// required to finish synchronously, so we'd like to give the event loop a
// chance. We should flush again soon.
if (options.finishSynchronously) {
throw new Error("still have more to do?"); // shouldn't happen
}
setTimeout(requireFlush, 10);
}
}
}; // http://docs.meteor.com/#tracker_autorun
//
// Run f(). Record its dependencies. Rerun it whenever the
// dependencies change.
//
// Returns a new Computation, which is also passed to f.
//
// Links the computation to the current computation
// so that it is stopped if the current computation is invalidated.
/**
* @callback Tracker.ComputationFunction
* @param {Tracker.Computation}
*/
/**
* @summary Run a function now and rerun it later whenever its dependencies
* change. Returns a Computation object that can be used to stop or observe the
* rerunning.
* @locus Client
* @param {Tracker.ComputationFunction} runFunc The function to run. It receives
* one argument: the Computation object that will be returned.
* @param {Object} [options]
* @param {Function} options.onError Optional. The function to run when an error
* happens in the Computation. The only argument it receives is the Error
* thrown. Defaults to the error being logged to the console.
* @returns {Tracker.Computation}
*/
Tracker.autorun = function (f, options) {
if (typeof f !== 'function') throw new Error('Tracker.autorun requires a function argument');
options = options || {};
constructingComputation = true;
var c = new Tracker.Computation(f, Tracker.currentComputation, options.onError);
if (Tracker.active) Tracker.onInvalidate(function () {
c.stop();
});
return c;
}; // http://docs.meteor.com/#tracker_nonreactive
//
// Run `f` with no current computation, returning the return value
// of `f`. Used to turn off reactivity for the duration of `f`,
// so that reactive data sources accessed by `f` will not result in any
// computations being invalidated.
/**
* @summary Run a function without tracking dependencies.
* @locus Client
* @param {Function} func A function to call immediately.
*/
Tracker.nonreactive = function (f) {
var previous = Tracker.currentComputation;
setCurrentComputation(null);
try {
return f();
} finally {
setCurrentComputation(previous);
}
}; // http://docs.meteor.com/#tracker_oninvalidate
/**
* @summary Registers a new [`onInvalidate`](#computation_oninvalidate) callback on the current computation (which must exist), to be called immediately when the current computation is invalidated or stopped.
* @locus Client
* @param {Function} callback A callback function that will be invoked as `func(c)`, where `c` is the computation on which the callback is registered.
*/
Tracker.onInvalidate = function (f) {
if (!Tracker.active) throw new Error("Tracker.onInvalidate requires a currentComputation");
Tracker.currentComputation.onInvalidate(f);
}; // http://docs.meteor.com/#tracker_afterflush
/**
* @summary Schedules a function to be called during the next flush, or later in the current flush if one is in progress, after all invalidated computations have been rerun. The function will be run once and not on subsequent flushes unless `afterFlush` is called again.
* @locus Client
* @param {Function} callback A function to call at flush time.
*/
Tracker.afterFlush = function (f) {
afterFlushCallbacks.push(f);
requireFlush();
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/tracker/tracker.js");
/* Exports */
Package._define("tracker", {
Tracker: Tracker,
Deps: Deps
});
})();
//# sourceURL=meteor://💻app/packages/tracker.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvdHJhY2tlci90cmFja2VyLmpzIl0sIm5hbWVzIjpbIlRyYWNrZXIiLCJEZXBzIiwiYWN0aXZlIiwiY3VycmVudENvbXB1dGF0aW9uIiwic2V0Q3VycmVudENvbXB1dGF0aW9uIiwiYyIsIl9kZWJ1Z0Z1bmMiLCJNZXRlb3IiLCJfZGVidWciLCJjb25zb2xlIiwiZXJyb3IiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9tYXliZVN1cHByZXNzTW9yZUxvZ3MiLCJtZXNzYWdlc0xlbmd0aCIsIl9zdXBwcmVzc2VkX2xvZ19leHBlY3RlZCIsIl9zdXBwcmVzc19sb2ciLCJfdGhyb3dPckxvZyIsImZyb20iLCJlIiwidGhyb3dGaXJzdEVycm9yIiwicHJpbnRBcmdzIiwic3RhY2siLCJtZXNzYWdlIiwibmFtZSIsImlkeCIsImluZGV4T2YiLCJsZW5ndGgiLCJwdXNoIiwiaSIsIndpdGhOb1lpZWxkc0FsbG93ZWQiLCJmIiwiaXNDbGllbnQiLCJhcmdzIiwiX25vWWllbGRzQWxsb3dlZCIsIm5leHRJZCIsInBlbmRpbmdDb21wdXRhdGlvbnMiLCJ3aWxsRmx1c2giLCJpbkZsdXNoIiwiaW5Db21wdXRlIiwiYWZ0ZXJGbHVzaENhbGxiYWNrcyIsInJlcXVpcmVGbHVzaCIsIl9zZXRJbW1lZGlhdGUiLCJfcnVuRmx1c2giLCJzZXRUaW1lb3V0IiwiY29uc3RydWN0aW5nQ29tcHV0YXRpb24iLCJDb21wdXRhdGlvbiIsImNvbnN0cnVjdG9yIiwicGFyZW50Iiwib25FcnJvciIsIkVycm9yIiwic3RvcHBlZCIsImludmFsaWRhdGVkIiwiZmlyc3RSdW4iLCJfaWQiLCJfb25JbnZhbGlkYXRlQ2FsbGJhY2tzIiwiX29uU3RvcENhbGxiYWNrcyIsIl9wYXJlbnQiLCJfZnVuYyIsIl9vbkVycm9yIiwiX3JlY29tcHV0aW5nIiwiZXJyb3JlZCIsIl9jb21wdXRlIiwic3RvcCIsIm9uSW52YWxpZGF0ZSIsIm5vbnJlYWN0aXZlIiwib25TdG9wIiwiaW52YWxpZGF0ZSIsInByZXZpb3VzIiwicHJldmlvdXNJbkNvbXB1dGUiLCJfbmVlZHNSZWNvbXB1dGUiLCJfcmVjb21wdXRlIiwiZmx1c2giLCJydW4iLCJEZXBlbmRlbmN5IiwiX2RlcGVuZGVudHNCeUlkIiwiT2JqZWN0IiwiY3JlYXRlIiwiZGVwZW5kIiwiY29tcHV0YXRpb24iLCJpZCIsImNoYW5nZWQiLCJoYXNEZXBlbmRlbnRzIiwib3B0aW9ucyIsImZpbmlzaFN5bmNocm9ub3VzbHkiLCJfdGhyb3dGaXJzdEVycm9yIiwicmVjb21wdXRlZENvdW50IiwiZmluaXNoZWRUcnkiLCJjb21wIiwic2hpZnQiLCJ1bnNoaWZ0IiwiZnVuYyIsImF1dG9ydW4iLCJhZnRlckZsdXNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUFBLE9BQU8sR0FBRyxFQUFWO0FBRUE7Ozs7O0FBSUFDLElBQUksR0FBR0QsT0FBUCxDLENBRUE7O0FBRUE7Ozs7OztBQUtBQSxPQUFPLENBQUNFLE1BQVIsR0FBaUIsS0FBakIsQyxDQUVBOztBQUVBOzs7Ozs7QUFLQUYsT0FBTyxDQUFDRyxrQkFBUixHQUE2QixJQUE3Qjs7QUFFQSxTQUFTQyxxQkFBVCxDQUErQkMsQ0FBL0IsRUFBa0M7QUFDaENMLFNBQU8sQ0FBQ0csa0JBQVIsR0FBNkJFLENBQTdCO0FBQ0FMLFNBQU8sQ0FBQ0UsTUFBUixHQUFpQixDQUFDLENBQUVHLENBQXBCO0FBQ0Q7O0FBRUQsU0FBU0MsVUFBVCxHQUFzQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUSxPQUFPQyxNQUFQLEtBQWtCLFdBQWxCLEdBQWdDQSxNQUFNLENBQUNDLE1BQXZDLEdBQ0UsT0FBT0MsT0FBUCxLQUFtQixXQUFwQixJQUFvQ0EsT0FBTyxDQUFDQyxLQUE1QyxHQUNBLFlBQVk7QUFBRUQsV0FBTyxDQUFDQyxLQUFSLENBQWNDLEtBQWQsQ0FBb0JGLE9BQXBCLEVBQTZCRyxT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Q0QsQ0FoQkQsQyxDQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUFLQUwsT0FBTyxDQUFDaUUsV0FBUixHQUFzQixVQUFVbEMsQ0FBVixFQUFhO0FBQ2pDLE1BQUlxQyxRQUFRLEdBQUdwRSxPQUFPLENBQUNHLGtCQUF2QjtBQUNBQyx1QkFBcUIsQ0FBQyxJQUFELENBQXJCOztBQUNBLE1BQUk7QUFDRixXQUFPMkIsQ0FBQyxFQUFSO0FBQ0QsR0FGRCxTQUVVO0FBQ1IzQix5QkFBcUIsQ0FBQ2dFLFFBQUQsQ0FBckI7QUFDRDtBQUNGLENBUkQsQyxDQVVBOztBQUVBOzs7Ozs7O0FBS0FwRSxPQUFPLENBQUNnRSxZQUFSLEdBQXVCLFVBQVVqQyxDQUFWLEVBQWE7QUFDbEMsTUFBSSxDQUFFL0IsT0FBTyxDQUFDRSxNQUFkLEVBQ0UsTUFBTSxJQUFJZ0QsS0FBSixDQUFVLG9EQUFWLENBQU47QUFFRmxELFNBQU8sQ0FBQ0csa0JBQVIsQ0FBMkI2RCxZQUEzQixDQUF3Q2pDLENBQXhDO0FBQ0QsQ0FMRCxDLENBT0E7O0FBRUE7Ozs7Ozs7QUFLQS9CLE9BQU8sQ0FBQzZGLFVBQVIsR0FBcUIsVUFBVTlELENBQVYsRUFBYTtBQUNoQ1MscUJBQW1CLENBQUNaLElBQXBCLENBQXlCRyxDQUF6QjtBQUNBVSxjQUFZO0FBQ2IsQ0FIRCxDIiwiZmlsZSI6Ii9wYWNrYWdlcy90cmFja2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFBhY2thZ2UgZG9jcyBhdCBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyN0cmFja2VyIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgVHJhY2tlclxuICogQHN1bW1hcnkgVGhlIG5hbWVzcGFjZSBmb3IgVHJhY2tlci1yZWxhdGVkIG1ldGhvZHMuXG4gKi9cblRyYWNrZXIgPSB7fTtcblxuLyoqXG4gKiBAbmFtZXNwYWNlIERlcHNcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkRlcHMgPSBUcmFja2VyO1xuXG4vLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyN0cmFja2VyX2FjdGl2ZVxuXG4vKipcbiAqIEBzdW1tYXJ5IFRydWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IGNvbXB1dGF0aW9uLCBtZWFuaW5nIHRoYXQgZGVwZW5kZW5jaWVzIG9uIHJlYWN0aXZlIGRhdGEgc291cmNlcyB3aWxsIGJlIHRyYWNrZWQgYW5kIHBvdGVudGlhbGx5IGNhdXNlIHRoZSBjdXJyZW50IGNvbXB1dGF0aW9uIHRvIGJlIHJlcnVuLlxuICogQGxvY3VzIENsaWVudFxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cblRyYWNrZXIuYWN0aXZlID0gZmFsc2U7XG5cbi8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI3RyYWNrZXJfY3VycmVudGNvbXB1dGF0aW9uXG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIGN1cnJlbnQgY29tcHV0YXRpb24sIG9yIGBudWxsYCBpZiB0aGVyZSBpc24ndCBvbmUuICBUaGUgY3VycmVudCBjb21wdXRhdGlvbiBpcyB0aGUgW2BUcmFja2VyLkNvbXB1dGF0aW9uYF0oI3RyYWNrZXJfY29tcHV0YXRpb24pIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBpbm5lcm1vc3QgYWN0aXZlIGNhbGwgdG8gYFRyYWNrZXIuYXV0b3J1bmAsIGFuZCBpdCdzIHRoZSBjb21wdXRhdGlvbiB0aGF0IGdhaW5zIGRlcGVuZGVuY2llcyB3aGVuIHJlYWN0aXZlIGRhdGEgc291cmNlcyBhcmUgYWNjZXNzZWQuXG4gKiBAbG9jdXMgQ2xpZW50XG4gKiBAdHlwZSB7VHJhY2tlci5Db21wdXRhdGlvbn1cbiAqL1xuVHJhY2tlci5jdXJyZW50Q29tcHV0YXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50Q29tcHV0YXRpb24oYykge1xuICBUcmFja2VyLmN1cnJlbnRDb21wdXRhdGlvbiA9IGM7XG4gIFRyYWNrZXIuYWN0aXZlID0gISEgYztcbn1cblxuZnVuY3Rpb24gX2RlYnVnRnVuYygpIHtcbiAgLy8gV2Ugd2FudCB0aGlzIGNvZGUgdG8gd29yayB3aXRob3V0IE1ldGVvciwgYW5kIGFsc28gd2l0aG91dFxuICAvLyBcImNvbnNvbGVcIiAod2hpY2ggaXMgdGVjaG5pY2FsbHkgbm9uLXN0YW5kYXJkIGFuZCBtYXkgYmUgbWlzc2luZ1xuICAvLyBvbiBzb21lIGJyb3dzZXIgd2UgY29tZSBhY3Jvc3MsIGxpa2UgaXQgd2FzIG9uIElFIDcpLlxuICAvL1xuICAvLyBMYXp5IGV2YWx1YXRpb24gYmVjYXVzZSBgTWV0ZW9yYCBkb2VzIG5vdCBleGlzdCByaWdodCBhd2F5Lig/PylcbiAgcmV0dXJuICh0eXBlb2YgTWV0ZW9yICE9PSBcInVuZGVmaW5lZFwiID8gTWV0ZW9yLl9kZWJ1ZyA6XG4gICAgICAgICAgKCh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgJiYgY29uc29sZS5lcnJvciA/XG4gICAgICAgICAgIGZ1bmN0aW9uICgpIHsgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpOyB9IDpcbiAgICAgICAgICAgZnVuY3Rpb24gKCkge30pKTtcbn1cblxuZnVuY3Rpb24gX21heWJlU3VwcHJlc3NNb3JlTG9ncyhtZXNzYWdlc0xlbmd0aCkge1xuICAvLyBTb21ldGltZXMgd2hlbiBydW5uaW5nIHRlc3RzLCB3ZSBpbnRlbnRpb25hbGx5IHN1cHByZXNzIGxvZ3Mgb24gZXhwZWN0ZWRcbiAgLy8gcHJpbnRlZCBlcnJvcnMuIFNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIF90aHJvd09yTG9nIGNhbiBsb2dcbiAgLy8gbXVsdGlwbGUgc2VwYXJhdGUgbG9nIG1lc3NhZ2VzLCBzdXBwcmVzcyBhbGwgb2YgdGhlbSBpZiBhdCBsZWFzdCBvbmUgc3VwcHJlc3NcbiAgLy8gaXMgZXhwZWN0ZWQgYXMgd2Ugc3RpbGwgd2FudCB0aGVtIHRvIGNvdW50IGFzIG9uZS5cbiAgaWYgKHR5cGVvZiBNZXRlb3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAoTWV0ZW9yLl9zdXBwcmVzc2VkX2xvZ19leHBlY3RlZCgpKSB7XG4gICAgICBNZXRlb3IuX3N1cHByZXNzX2xvZyhtZXNzYWdlc0xlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBfdGhyb3dPckxvZyhmcm9tLCBlKSB7XG4gIGlmICh0aHJvd0ZpcnN0RXJyb3IpIHtcbiAgICB0aHJvdyBlO1xuICB9IGVsc2Uge1xuICAgIHZhciBwcmludEFyZ3MgPSBbXCJFeGNlcHRpb24gZnJvbSBUcmFja2VyIFwiICsgZnJvbSArIFwiIGZ1bmN0aW9uOlwiXTtcbiAgICBpZiAoZS5zdGFjayAmJiBlLm1lc3NhZ2UgJiYgZS5uYW1lKSB7XG4gICAgICB2YXIgaWR4ID0gZS5zdGFjay5pbmRleE9mKGUubWVzc2FnZSk7XG4gICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPiBlLm5hbWUubGVuZ3RoICsgMikgeyAvLyBjaGVjayBmb3IgXCJFcnJvcjogXCJcbiAgICAgICAgLy8gbWVzc2FnZSBpcyBub3QgcGFydCBvZiB0aGUgc3RhY2tcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBlLm5hbWUgKyBcIjogXCIgKyBlLm1lc3NhZ2U7XG4gICAgICAgIHByaW50QXJncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcmludEFyZ3MucHVzaChlLnN0YWNrKTtcbiAgICBfbWF5YmVTdXBwcmVzc01vcmVMb2dzKHByaW50QXJncy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmludEFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9kZWJ1Z0Z1bmMoKShwcmludEFyZ3NbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUYWtlcyBhIGZ1bmN0aW9uIGBmYCwgYW5kIHdyYXBzIGl0IGluIGEgYE1ldGVvci5fbm9ZaWVsZHNBbGxvd2VkYFxuLy8gYmxvY2sgaWYgd2UgYXJlIHJ1bm5pbmcgb24gdGhlIHNlcnZlci4gT24gdGhlIGNsaWVudCwgcmV0dXJucyB0aGVcbi8vIG9yaWdpbmFsIGZ1bmN0aW9uIChzaW5jZSBgTWV0ZW9yLl9ub1lpZWxkc0FsbG93ZWRgIGlzIGFcbi8vIG5vLW9wKS4gVGhpcyBoYXMgdGhlIGJlbmVmaXQgb2Ygbm90IGFkZGluZyBhbiB1bm5lY2Vzc2FyeSBzdGFja1xuLy8gZnJhbWUgb24gdGhlIGNsaWVudC5cbmZ1bmN0aW9uIHdpdGhOb1lpZWxkc0FsbG93ZWQoZikge1xuICBpZiAoKHR5cGVvZiBNZXRlb3IgPT09ICd1bmRlZmluZWQnKSB8fCBNZXRlb3IuaXNDbGllbnQpIHtcbiAgICByZXR1cm4gZjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBNZXRlb3IuX25vWWllbGRzQWxsb3dlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbnZhciBuZXh0SWQgPSAxO1xuLy8gY29tcHV0YXRpb25zIHdob3NlIGNhbGxiYWNrcyB3ZSBzaG91bGQgY2FsbCBhdCBmbHVzaCB0aW1lXG52YXIgcGVuZGluZ0NvbXB1dGF0aW9ucyA9IFtdO1xuLy8gYHRydWVgIGlmIGEgVHJhY2tlci5mbHVzaCBpcyBzY2hlZHVsZWQsIG9yIGlmIHdlIGFyZSBpbiBUcmFja2VyLmZsdXNoIG5vd1xudmFyIHdpbGxGbHVzaCA9IGZhbHNlO1xuLy8gYHRydWVgIGlmIHdlIGFyZSBpbiBUcmFja2VyLmZsdXNoIG5vd1xudmFyIGluRmx1c2ggPSBmYWxzZTtcbi8vIGB0cnVlYCBpZiB3ZSBhcmUgY29tcHV0aW5nIGEgY29tcHV0YXRpb24gbm93LCBlaXRoZXIgZmlyc3QgdGltZVxuLy8gb3IgcmVjb21wdXRlLiAgVGhpcyBtYXRjaGVzIFRyYWNrZXIuYWN0aXZlIHVubGVzcyB3ZSBhcmUgaW5zaWRlXG4vLyBUcmFja2VyLm5vbnJlYWN0aXZlLCB3aGljaCBudWxsZmllcyBjdXJyZW50Q29tcHV0YXRpb24gZXZlbiB0aG91Z2hcbi8vIGFuIGVuY2xvc2luZyBjb21wdXRhdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZy5cbnZhciBpbkNvbXB1dGUgPSBmYWxzZTtcbi8vIGB0cnVlYCBpZiB0aGUgYF90aHJvd0ZpcnN0RXJyb3JgIG9wdGlvbiB3YXMgcGFzc2VkIGluIHRvIHRoZSBjYWxsXG4vLyB0byBUcmFja2VyLmZsdXNoIHRoYXQgd2UgYXJlIGluLiBXaGVuIHNldCwgdGhyb3cgcmF0aGVyIHRoYW4gbG9nIHRoZVxuLy8gZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgZmx1c2hpbmcuIEJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IsXG4vLyBmaW5pc2ggZmx1c2hpbmcgKGZyb20gYSBmaW5hbGx5IGJsb2NrKSwgbG9nZ2luZyBhbnkgc3Vic2VxdWVudFxuLy8gZXJyb3JzLlxudmFyIHRocm93Rmlyc3RFcnJvciA9IGZhbHNlO1xuXG52YXIgYWZ0ZXJGbHVzaENhbGxiYWNrcyA9IFtdO1xuXG5mdW5jdGlvbiByZXF1aXJlRmx1c2goKSB7XG4gIGlmICghIHdpbGxGbHVzaCkge1xuICAgIC8vIFdlIHdhbnQgdGhpcyBjb2RlIHRvIHdvcmsgd2l0aG91dCBNZXRlb3IsIHNlZSBkZWJ1Z0Z1bmMgYWJvdmVcbiAgICBpZiAodHlwZW9mIE1ldGVvciAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIE1ldGVvci5fc2V0SW1tZWRpYXRlKFRyYWNrZXIuX3J1bkZsdXNoKTtcbiAgICBlbHNlXG4gICAgICBzZXRUaW1lb3V0KFRyYWNrZXIuX3J1bkZsdXNoLCAwKTtcbiAgICB3aWxsRmx1c2ggPSB0cnVlO1xuICB9XG59XG5cbi8vIFRyYWNrZXIuQ29tcHV0YXRpb24gY29uc3RydWN0b3IgaXMgdmlzaWJsZSBidXQgcHJpdmF0ZVxuLy8gKHRocm93cyBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGNhbGwgaXQpXG52YXIgY29uc3RydWN0aW5nQ29tcHV0YXRpb24gPSBmYWxzZTtcblxuLy9cbi8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI3RyYWNrZXJfY29tcHV0YXRpb25cblxuLyoqXG4gKiBAc3VtbWFyeSBBIENvbXB1dGF0aW9uIG9iamVjdCByZXByZXNlbnRzIGNvZGUgdGhhdCBpcyByZXBlYXRlZGx5IHJlcnVuXG4gKiBpbiByZXNwb25zZSB0b1xuICogcmVhY3RpdmUgZGF0YSBjaGFuZ2VzLiBDb21wdXRhdGlvbnMgZG9uJ3QgaGF2ZSByZXR1cm4gdmFsdWVzOyB0aGV5IGp1c3RcbiAqIHBlcmZvcm0gYWN0aW9ucywgc3VjaCBhcyByZXJlbmRlcmluZyBhIHRlbXBsYXRlIG9uIHRoZSBzY3JlZW4uIENvbXB1dGF0aW9uc1xuICogYXJlIGNyZWF0ZWQgdXNpbmcgVHJhY2tlci5hdXRvcnVuLiBVc2Ugc3RvcCB0byBwcmV2ZW50IGZ1cnRoZXIgcmVydW5uaW5nIG9mIGFcbiAqIGNvbXB1dGF0aW9uLlxuICogQGluc3RhbmNlbmFtZSBjb21wdXRhdGlvblxuICovXG5UcmFja2VyLkNvbXB1dGF0aW9uID0gY2xhc3MgQ29tcHV0YXRpb24ge1xuICBjb25zdHJ1Y3RvcihmLCBwYXJlbnQsIG9uRXJyb3IpIHtcbiAgICBpZiAoISBjb25zdHJ1Y3RpbmdDb21wdXRhdGlvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUcmFja2VyLkNvbXB1dGF0aW9uIGNvbnN0cnVjdG9yIGlzIHByaXZhdGU7IHVzZSBUcmFja2VyLmF1dG9ydW5cIik7XG4gICAgY29uc3RydWN0aW5nQ29tcHV0YXRpb24gPSBmYWxzZTtcblxuICAgIC8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI2NvbXB1dGF0aW9uX3N0b3BwZWRcblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFRydWUgaWYgdGhpcyBjb21wdXRhdGlvbiBoYXMgYmVlbiBzdG9wcGVkLlxuICAgICAqIEBsb2N1cyBDbGllbnRcbiAgICAgKiBAbWVtYmVyT2YgVHJhY2tlci5Db21wdXRhdGlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBuYW1lICBzdG9wcGVkXG4gICAgICovXG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG5cbiAgICAvLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNjb21wdXRhdGlvbl9pbnZhbGlkYXRlZFxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgVHJ1ZSBpZiB0aGlzIGNvbXB1dGF0aW9uIGhhcyBiZWVuIGludmFsaWRhdGVkIChhbmQgbm90IHlldCByZXJ1biksIG9yIGlmIGl0IGhhcyBiZWVuIHN0b3BwZWQuXG4gICAgICogQGxvY3VzIENsaWVudFxuICAgICAqIEBtZW1iZXJPZiBUcmFja2VyLkNvbXB1dGF0aW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG5hbWUgIGludmFsaWRhdGVkXG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkYXRlZCA9IGZhbHNlO1xuXG4gICAgLy8gaHR0cDovL2RvY3MubWV0ZW9yLmNvbS8jY29tcHV0YXRpb25fZmlyc3RydW5cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFRydWUgZHVyaW5nIHRoZSBpbml0aWFsIHJ1biBvZiB0aGUgY29tcHV0YXRpb24gYXQgdGhlIHRpbWUgYFRyYWNrZXIuYXV0b3J1bmAgaXMgY2FsbGVkLCBhbmQgZmFsc2Ugb24gc3Vic2VxdWVudCByZXJ1bnMgYW5kIGF0IG90aGVyIHRpbWVzLlxuICAgICAqIEBsb2N1cyBDbGllbnRcbiAgICAgKiBAbWVtYmVyT2YgVHJhY2tlci5Db21wdXRhdGlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBuYW1lICBmaXJzdFJ1blxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuZmlyc3RSdW4gPSB0cnVlO1xuXG4gICAgdGhpcy5faWQgPSBuZXh0SWQrKztcbiAgICB0aGlzLl9vbkludmFsaWRhdGVDYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLl9vblN0b3BDYWxsYmFja3MgPSBbXTtcbiAgICAvLyB0aGUgcGxhbiBpcyBhdCBzb21lIHBvaW50IHRvIHVzZSB0aGUgcGFyZW50IHJlbGF0aW9uXG4gICAgLy8gdG8gY29uc3RyYWluIHRoZSBvcmRlciB0aGF0IGNvbXB1dGF0aW9ucyBhcmUgcHJvY2Vzc2VkXG4gICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuX2Z1bmMgPSBmO1xuICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yO1xuICAgIHRoaXMuX3JlY29tcHV0aW5nID0gZmFsc2U7XG5cbiAgICB2YXIgZXJyb3JlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NvbXB1dGUoKTtcbiAgICAgIGVycm9yZWQgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5maXJzdFJ1biA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yZWQpXG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI2NvbXB1dGF0aW9uX29uaW52YWxpZGF0ZVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYGNhbGxiYWNrYCB0byBydW4gd2hlbiB0aGlzIGNvbXB1dGF0aW9uIGlzIG5leHQgaW52YWxpZGF0ZWQsIG9yIHJ1bnMgaXQgaW1tZWRpYXRlbHkgaWYgdGhlIGNvbXB1dGF0aW9uIGlzIGFscmVhZHkgaW52YWxpZGF0ZWQuICBUaGUgY2FsbGJhY2sgaXMgcnVuIGV4YWN0bHkgb25jZSBhbmQgbm90IHVwb24gZnV0dXJlIGludmFsaWRhdGlvbnMgdW5sZXNzIGBvbkludmFsaWRhdGVgIGlzIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgY29tcHV0YXRpb24gYmVjb21lcyB2YWxpZCBhZ2Fpbi5cbiAgICogQGxvY3VzIENsaWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBGdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gaW52YWxpZGF0aW9uLiBSZWNlaXZlcyBvbmUgYXJndW1lbnQsIHRoZSBjb21wdXRhdGlvbiB0aGF0IHdhcyBpbnZhbGlkYXRlZC5cbiAgICovXG4gIG9uSW52YWxpZGF0ZShmKSB7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib25JbnZhbGlkYXRlIHJlcXVpcmVzIGEgZnVuY3Rpb25cIik7XG5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlZCkge1xuICAgICAgVHJhY2tlci5ub25yZWFjdGl2ZSgoKSA9PiB7XG4gICAgICAgIHdpdGhOb1lpZWxkc0FsbG93ZWQoZikodGhpcyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25JbnZhbGlkYXRlQ2FsbGJhY2tzLnB1c2goZik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBgY2FsbGJhY2tgIHRvIHJ1biB3aGVuIHRoaXMgY29tcHV0YXRpb24gaXMgc3RvcHBlZCwgb3IgcnVucyBpdCBpbW1lZGlhdGVseSBpZiB0aGUgY29tcHV0YXRpb24gaXMgYWxyZWFkeSBzdG9wcGVkLiAgVGhlIGNhbGxiYWNrIGlzIHJ1biBhZnRlciBhbnkgYG9uSW52YWxpZGF0ZWAgY2FsbGJhY2tzLlxuICAgKiBAbG9jdXMgQ2xpZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBzdG9wLiBSZWNlaXZlcyBvbmUgYXJndW1lbnQsIHRoZSBjb21wdXRhdGlvbiB0aGF0IHdhcyBzdG9wcGVkLlxuICAgKi9cbiAgb25TdG9wKGYpIHtcbiAgICBpZiAodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvblN0b3AgcmVxdWlyZXMgYSBmdW5jdGlvblwiKTtcblxuICAgIGlmICh0aGlzLnN0b3BwZWQpIHtcbiAgICAgIFRyYWNrZXIubm9ucmVhY3RpdmUoKCkgPT4ge1xuICAgICAgICB3aXRoTm9ZaWVsZHNBbGxvd2VkKGYpKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uU3RvcENhbGxiYWNrcy5wdXNoKGYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI2NvbXB1dGF0aW9uX2ludmFsaWRhdGVcblxuICAvKipcbiAgICogQHN1bW1hcnkgSW52YWxpZGF0ZXMgdGhpcyBjb21wdXRhdGlvbiBzbyB0aGF0IGl0IHdpbGwgYmUgcmVydW4uXG4gICAqIEBsb2N1cyBDbGllbnRcbiAgICovXG4gIGludmFsaWRhdGUoKSB7XG4gICAgaWYgKCEgdGhpcy5pbnZhbGlkYXRlZCkge1xuICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGluIF9yZWNvbXB1dGUoKSwgZG9uJ3QgZW5xdWV1ZVxuICAgICAgLy8gb3Vyc2VsdmVzLCBzaW5jZSB3ZSdsbCByZXJ1biBpbW1lZGlhdGVseSBhbnl3YXkuXG4gICAgICBpZiAoISB0aGlzLl9yZWNvbXB1dGluZyAmJiAhIHRoaXMuc3RvcHBlZCkge1xuICAgICAgICByZXF1aXJlRmx1c2goKTtcbiAgICAgICAgcGVuZGluZ0NvbXB1dGF0aW9ucy5wdXNoKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmludmFsaWRhdGVkID0gdHJ1ZTtcblxuICAgICAgLy8gY2FsbGJhY2tzIGNhbid0IGFkZCBjYWxsYmFja3MsIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMuaW52YWxpZGF0ZWQgPT09IHRydWUuXG4gICAgICBmb3IodmFyIGkgPSAwLCBmOyBmID0gdGhpcy5fb25JbnZhbGlkYXRlQ2FsbGJhY2tzW2ldOyBpKyspIHtcbiAgICAgICAgVHJhY2tlci5ub25yZWFjdGl2ZSgoKSA9PiB7XG4gICAgICAgICAgd2l0aE5vWWllbGRzQWxsb3dlZChmKSh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vbkludmFsaWRhdGVDYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNjb21wdXRhdGlvbl9zdG9wXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFByZXZlbnRzIHRoaXMgY29tcHV0YXRpb24gZnJvbSByZXJ1bm5pbmcuXG4gICAqIEBsb2N1cyBDbGllbnRcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgaWYgKCEgdGhpcy5zdG9wcGVkKSB7XG4gICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICBmb3IodmFyIGkgPSAwLCBmOyBmID0gdGhpcy5fb25TdG9wQ2FsbGJhY2tzW2ldOyBpKyspIHtcbiAgICAgICAgVHJhY2tlci5ub25yZWFjdGl2ZSgoKSA9PiB7XG4gICAgICAgICAgd2l0aE5vWWllbGRzQWxsb3dlZChmKSh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vblN0b3BDYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gIH1cblxuICBfY29tcHV0ZSgpIHtcbiAgICB0aGlzLmludmFsaWRhdGVkID0gZmFsc2U7XG5cbiAgICB2YXIgcHJldmlvdXMgPSBUcmFja2VyLmN1cnJlbnRDb21wdXRhdGlvbjtcbiAgICBzZXRDdXJyZW50Q29tcHV0YXRpb24odGhpcyk7XG4gICAgdmFyIHByZXZpb3VzSW5Db21wdXRlID0gaW5Db21wdXRlO1xuICAgIGluQ29tcHV0ZSA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHdpdGhOb1lpZWxkc0FsbG93ZWQodGhpcy5fZnVuYykodGhpcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRDb21wdXRhdGlvbihwcmV2aW91cyk7XG4gICAgICBpbkNvbXB1dGUgPSBwcmV2aW91c0luQ29tcHV0ZTtcbiAgICB9XG4gIH1cblxuICBfbmVlZHNSZWNvbXB1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZGF0ZWQgJiYgISB0aGlzLnN0b3BwZWQ7XG4gIH1cblxuICBfcmVjb21wdXRlKCkge1xuICAgIHRoaXMuX3JlY29tcHV0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX25lZWRzUmVjb21wdXRlKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9jb21wdXRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3Rocm93T3JMb2coXCJyZWNvbXB1dGVcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlY29tcHV0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3MgdGhlIHJlYWN0aXZlIHVwZGF0ZXMgZm9yIHRoaXMgY29tcHV0YXRpb24gaW1tZWRpYXRlbHlcbiAgICogYW5kIGVuc3VyZSB0aGF0IHRoZSBjb21wdXRhdGlvbiBpcyByZXJ1bi4gVGhlIGNvbXB1dGF0aW9uIGlzIHJlcnVuIG9ubHlcbiAgICogaWYgaXQgaXMgaW52YWxpZGF0ZWQuXG4gICAqIEBsb2N1cyBDbGllbnRcbiAgICovXG4gIGZsdXNoKCkge1xuICAgIGlmICh0aGlzLl9yZWNvbXB1dGluZylcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuX3JlY29tcHV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENhdXNlcyB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoaXMgY29tcHV0YXRpb24gdG8gcnVuIGFuZFxuICAgKiBzeW5jaHJvbm91c2x5IHByb2Nlc3MgYWxsIHJlYWN0aXZlIHVwZHRlcy5cbiAgICogQGxvY3VzIENsaWVudFxuICAgKi9cbiAgcnVuKCkge1xuICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgIHRoaXMuZmx1c2goKTtcbiAgfVxufTtcblxuLy9cbi8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI3RyYWNrZXJfZGVwZW5kZW5jeVxuXG4vKipcbiAqIEBzdW1tYXJ5IEEgRGVwZW5kZW5jeSByZXByZXNlbnRzIGFuIGF0b21pYyB1bml0IG9mIHJlYWN0aXZlIGRhdGEgdGhhdCBhXG4gKiBjb21wdXRhdGlvbiBtaWdodCBkZXBlbmQgb24uIFJlYWN0aXZlIGRhdGEgc291cmNlcyBzdWNoIGFzIFNlc3Npb24gb3JcbiAqIE1pbmltb25nbyBpbnRlcm5hbGx5IGNyZWF0ZSBkaWZmZXJlbnQgRGVwZW5kZW5jeSBvYmplY3RzIGZvciBkaWZmZXJlbnRcbiAqIHBpZWNlcyBvZiBkYXRhLCBlYWNoIG9mIHdoaWNoIG1heSBiZSBkZXBlbmRlZCBvbiBieSBtdWx0aXBsZSBjb21wdXRhdGlvbnMuXG4gKiBXaGVuIHRoZSBkYXRhIGNoYW5nZXMsIHRoZSBjb21wdXRhdGlvbnMgYXJlIGludmFsaWRhdGVkLlxuICogQGNsYXNzXG4gKiBAaW5zdGFuY2VOYW1lIGRlcGVuZGVuY3lcbiAqL1xuVHJhY2tlci5EZXBlbmRlbmN5ID0gY2xhc3MgRGVwZW5kZW5jeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2RlcGVuZGVudHNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI2RlcGVuZGVuY3lfZGVwZW5kXG4gIC8vXG4gIC8vIEFkZHMgYGNvbXB1dGF0aW9uYCB0byB0aGlzIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeVxuICAvLyBwcmVzZW50LiAgUmV0dXJucyB0cnVlIGlmIGBjb21wdXRhdGlvbmAgaXMgYSBuZXcgbWVtYmVyIG9mIHRoZSBzZXQuXG4gIC8vIElmIG5vIGFyZ3VtZW50LCBkZWZhdWx0cyB0byBjdXJyZW50Q29tcHV0YXRpb24sIG9yIGRvZXMgbm90aGluZ1xuICAvLyBpZiB0aGVyZSBpcyBubyBjdXJyZW50Q29tcHV0YXRpb24uXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGN1cnJlbnQgY29tcHV0YXRpb24gKG9yIGBmcm9tQ29tcHV0YXRpb25gIGlmIGdpdmVuKSBkZXBlbmRzIG9uIGBkZXBlbmRlbmN5YC4gIFRoZSBjb21wdXRhdGlvbiB3aWxsIGJlIGludmFsaWRhdGVkIHRoZSBuZXh0IHRpbWUgYGRlcGVuZGVuY3lgIGNoYW5nZXMuXG5cbiAgIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgY29tcHV0YXRpb24gYW5kIGBkZXBlbmQoKWAgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBpdCBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgZmFsc2UuXG5cbiAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcHV0YXRpb24gaXMgYSBuZXcgZGVwZW5kZW50IG9mIGBkZXBlbmRlbmN5YCByYXRoZXIgdGhhbiBhbiBleGlzdGluZyBvbmUuXG4gICAqIEBsb2N1cyBDbGllbnRcbiAgICogQHBhcmFtIHtUcmFja2VyLkNvbXB1dGF0aW9ufSBbZnJvbUNvbXB1dGF0aW9uXSBBbiBvcHRpb25hbCBjb21wdXRhdGlvbiBkZWNsYXJlZCB0byBkZXBlbmQgb24gYGRlcGVuZGVuY3lgIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgY29tcHV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgZGVwZW5kKGNvbXB1dGF0aW9uKSB7XG4gICAgaWYgKCEgY29tcHV0YXRpb24pIHtcbiAgICAgIGlmICghIFRyYWNrZXIuYWN0aXZlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbXB1dGF0aW9uID0gVHJhY2tlci5jdXJyZW50Q29tcHV0YXRpb247XG4gICAgfVxuICAgIHZhciBpZCA9IGNvbXB1dGF0aW9uLl9pZDtcbiAgICBpZiAoISAoaWQgaW4gdGhpcy5fZGVwZW5kZW50c0J5SWQpKSB7XG4gICAgICB0aGlzLl9kZXBlbmRlbnRzQnlJZFtpZF0gPSBjb21wdXRhdGlvbjtcbiAgICAgIGNvbXB1dGF0aW9uLm9uSW52YWxpZGF0ZSgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kZXBlbmRlbnRzQnlJZFtpZF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNkZXBlbmRlbmN5X2NoYW5nZWRcblxuICAvKipcbiAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhbGwgZGVwZW5kZW50IGNvbXB1dGF0aW9ucyBpbW1lZGlhdGVseSBhbmQgcmVtb3ZlIHRoZW0gYXMgZGVwZW5kZW50cy5cbiAgICogQGxvY3VzIENsaWVudFxuICAgKi9cbiAgY2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9kZXBlbmRlbnRzQnlJZClcbiAgICAgIHRoaXMuX2RlcGVuZGVudHNCeUlkW2lkXS5pbnZhbGlkYXRlKCk7XG4gIH1cblxuICAvLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNkZXBlbmRlbmN5X2hhc2RlcGVuZGVudHNcblxuICAvKipcbiAgICogQHN1bW1hcnkgVHJ1ZSBpZiB0aGlzIERlcGVuZGVuY3kgaGFzIG9uZSBvciBtb3JlIGRlcGVuZGVudCBDb21wdXRhdGlvbnMsIHdoaWNoIHdvdWxkIGJlIGludmFsaWRhdGVkIGlmIHRoaXMgRGVwZW5kZW5jeSB3ZXJlIHRvIGNoYW5nZS5cbiAgICogQGxvY3VzIENsaWVudFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGhhc0RlcGVuZGVudHMoKSB7XG4gICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fZGVwZW5kZW50c0J5SWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8vIGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI3RyYWNrZXJfZmx1c2hcblxuLyoqXG4gKiBAc3VtbWFyeSBQcm9jZXNzIGFsbCByZWFjdGl2ZSB1cGRhdGVzIGltbWVkaWF0ZWx5IGFuZCBlbnN1cmUgdGhhdCBhbGwgaW52YWxpZGF0ZWQgY29tcHV0YXRpb25zIGFyZSByZXJ1bi5cbiAqIEBsb2N1cyBDbGllbnRcbiAqL1xuVHJhY2tlci5mbHVzaCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIFRyYWNrZXIuX3J1bkZsdXNoKHsgZmluaXNoU3luY2hyb25vdXNseTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvd0ZpcnN0RXJyb3I6IG9wdGlvbnMgJiYgb3B0aW9ucy5fdGhyb3dGaXJzdEVycm9yIH0pO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSBUcnVlIGlmIHdlIGFyZSBjb21wdXRpbmcgYSBjb21wdXRhdGlvbiBub3csIGVpdGhlciBmaXJzdCB0aW1lIG9yIHJlY29tcHV0ZS4gIFRoaXMgbWF0Y2hlcyBUcmFja2VyLmFjdGl2ZSB1bmxlc3Mgd2UgYXJlIGluc2lkZSBUcmFja2VyLm5vbnJlYWN0aXZlLCB3aGljaCBudWxsZmllcyBjdXJyZW50Q29tcHV0YXRpb24gZXZlbiB0aG91Z2ggYW4gZW5jbG9zaW5nIGNvbXB1dGF0aW9uIG1heSBzdGlsbCBiZSBydW5uaW5nLlxuICogQGxvY3VzIENsaWVudFxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cblRyYWNrZXIuaW5GbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGluRmx1c2g7XG59XG5cbi8vIFJ1biBhbGwgcGVuZGluZyBjb21wdXRhdGlvbnMgYW5kIGFmdGVyRmx1c2ggY2FsbGJhY2tzLiAgSWYgd2Ugd2VyZSBub3QgY2FsbGVkXG4vLyBkaXJlY3RseSB2aWEgVHJhY2tlci5mbHVzaCwgdGhpcyBtYXkgcmV0dXJuIGJlZm9yZSB0aGV5J3JlIGFsbCBkb25lIHRvIGFsbG93XG4vLyB0aGUgZXZlbnQgbG9vcCB0byBydW4gYSBsaXR0bGUgYmVmb3JlIGNvbnRpbnVpbmcuXG5UcmFja2VyLl9ydW5GbHVzaCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIC8vIFhYWCBXaGF0IHBhcnQgb2YgdGhlIGNvbW1lbnQgYmVsb3cgaXMgc3RpbGwgdHJ1ZT8gKFdlIG5vIGxvbmdlclxuICAvLyBoYXZlIFNwYXJrKVxuICAvL1xuICAvLyBOZXN0ZWQgZmx1c2ggY291bGQgcGxhdXNpYmx5IGhhcHBlbiBpZiwgc2F5LCBhIGZsdXNoIGNhdXNlc1xuICAvLyBET00gbXV0YXRpb24sIHdoaWNoIGNhdXNlcyBhIFwiYmx1clwiIGV2ZW50LCB3aGljaCBydW5zIGFuXG4gIC8vIGFwcCBldmVudCBoYW5kbGVyIHRoYXQgY2FsbHMgVHJhY2tlci5mbHVzaC4gIEF0IHRoZSBtb21lbnRcbiAgLy8gU3BhcmsgYmxvY2tzIGV2ZW50IGhhbmRsZXJzIGR1cmluZyBET00gbXV0YXRpb24gYW55d2F5LFxuICAvLyBiZWNhdXNlIHRoZSBMaXZlUmFuZ2UgdHJlZSBpc24ndCB2YWxpZC4gIEFuZCB3ZSBkb24ndCBoYXZlXG4gIC8vIGFueSB1c2VmdWwgbm90aW9uIG9mIGEgbmVzdGVkIGZsdXNoLlxuICAvL1xuICAvLyBodHRwczovL2FwcC5hc2FuYS5jb20vMC8xNTk5MDgzMzAyNDQvMzg1MTM4MjMzODU2XG4gIGlmIChUcmFja2VyLmluRmx1c2goKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjYWxsIFRyYWNrZXIuZmx1c2ggd2hpbGUgZmx1c2hpbmdcIik7XG5cbiAgaWYgKGluQ29tcHV0ZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmbHVzaCBpbnNpZGUgVHJhY2tlci5hdXRvcnVuXCIpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGluRmx1c2ggPSB0cnVlO1xuICB3aWxsRmx1c2ggPSB0cnVlO1xuICB0aHJvd0ZpcnN0RXJyb3IgPSAhISBvcHRpb25zLnRocm93Rmlyc3RFcnJvcjtcblxuICB2YXIgcmVjb21wdXRlZENvdW50ID0gMDtcbiAgdmFyIGZpbmlzaGVkVHJ5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgd2hpbGUgKHBlbmRpbmdDb21wdXRhdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgIGFmdGVyRmx1c2hDYWxsYmFja3MubGVuZ3RoKSB7XG5cbiAgICAgIC8vIHJlY29tcHV0ZSBhbGwgcGVuZGluZyBjb21wdXRhdGlvbnNcbiAgICAgIHdoaWxlIChwZW5kaW5nQ29tcHV0YXRpb25zLmxlbmd0aCkge1xuICAgICAgICB2YXIgY29tcCA9IHBlbmRpbmdDb21wdXRhdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgY29tcC5fcmVjb21wdXRlKCk7XG4gICAgICAgIGlmIChjb21wLl9uZWVkc1JlY29tcHV0ZSgpKSB7XG4gICAgICAgICAgcGVuZGluZ0NvbXB1dGF0aW9ucy51bnNoaWZ0KGNvbXApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEgb3B0aW9ucy5maW5pc2hTeW5jaHJvbm91c2x5ICYmICsrcmVjb21wdXRlZENvdW50ID4gMTAwMCkge1xuICAgICAgICAgIGZpbmlzaGVkVHJ5ID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFmdGVyRmx1c2hDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNhbGwgb25lIGFmdGVyRmx1c2ggY2FsbGJhY2ssIHdoaWNoIG1heVxuICAgICAgICAvLyBpbnZhbGlkYXRlIG1vcmUgY29tcHV0YXRpb25zXG4gICAgICAgIHZhciBmdW5jID0gYWZ0ZXJGbHVzaENhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZ1bmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIF90aHJvd09yTG9nKFwiYWZ0ZXJGbHVzaFwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2hlZFRyeSA9IHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCEgZmluaXNoZWRUcnkpIHtcbiAgICAgIC8vIHdlJ3JlIGVycm9yaW5nIGR1ZSB0byB0aHJvd0ZpcnN0RXJyb3IgYmVpbmcgdHJ1ZS5cbiAgICAgIGluRmx1c2ggPSBmYWxzZTsgLy8gbmVlZGVkIGJlZm9yZSBjYWxsaW5nIGBUcmFja2VyLmZsdXNoKClgIGFnYWluXG4gICAgICAvLyBmaW5pc2ggZmx1c2hpbmdcbiAgICAgIFRyYWNrZXIuX3J1bkZsdXNoKHtcbiAgICAgICAgZmluaXNoU3luY2hyb25vdXNseTogb3B0aW9ucy5maW5pc2hTeW5jaHJvbm91c2x5LFxuICAgICAgICB0aHJvd0ZpcnN0RXJyb3I6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgd2lsbEZsdXNoID0gZmFsc2U7XG4gICAgaW5GbHVzaCA9IGZhbHNlO1xuICAgIGlmIChwZW5kaW5nQ29tcHV0YXRpb25zLmxlbmd0aCB8fCBhZnRlckZsdXNoQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgLy8gV2UncmUgeWllbGRpbmcgYmVjYXVzZSB3ZSByYW4gYSBidW5jaCBvZiBjb21wdXRhdGlvbnMgYW5kIHdlIGFyZW4ndFxuICAgICAgLy8gcmVxdWlyZWQgdG8gZmluaXNoIHN5bmNocm9ub3VzbHksIHNvIHdlJ2QgbGlrZSB0byBnaXZlIHRoZSBldmVudCBsb29wIGFcbiAgICAgIC8vIGNoYW5jZS4gV2Ugc2hvdWxkIGZsdXNoIGFnYWluIHNvb24uXG4gICAgICBpZiAob3B0aW9ucy5maW5pc2hTeW5jaHJvbm91c2x5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInN0aWxsIGhhdmUgbW9yZSB0byBkbz9cIik7ICAvLyBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KHJlcXVpcmVGbHVzaCwgMTApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gaHR0cDovL2RvY3MubWV0ZW9yLmNvbS8jdHJhY2tlcl9hdXRvcnVuXG4vL1xuLy8gUnVuIGYoKS4gUmVjb3JkIGl0cyBkZXBlbmRlbmNpZXMuIFJlcnVuIGl0IHdoZW5ldmVyIHRoZVxuLy8gZGVwZW5kZW5jaWVzIGNoYW5nZS5cbi8vXG4vLyBSZXR1cm5zIGEgbmV3IENvbXB1dGF0aW9uLCB3aGljaCBpcyBhbHNvIHBhc3NlZCB0byBmLlxuLy9cbi8vIExpbmtzIHRoZSBjb21wdXRhdGlvbiB0byB0aGUgY3VycmVudCBjb21wdXRhdGlvblxuLy8gc28gdGhhdCBpdCBpcyBzdG9wcGVkIGlmIHRoZSBjdXJyZW50IGNvbXB1dGF0aW9uIGlzIGludmFsaWRhdGVkLlxuXG4vKipcbiAqIEBjYWxsYmFjayBUcmFja2VyLkNvbXB1dGF0aW9uRnVuY3Rpb25cbiAqIEBwYXJhbSB7VHJhY2tlci5Db21wdXRhdGlvbn1cbiAqL1xuLyoqXG4gKiBAc3VtbWFyeSBSdW4gYSBmdW5jdGlvbiBub3cgYW5kIHJlcnVuIGl0IGxhdGVyIHdoZW5ldmVyIGl0cyBkZXBlbmRlbmNpZXNcbiAqIGNoYW5nZS4gUmV0dXJucyBhIENvbXB1dGF0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3Agb3Igb2JzZXJ2ZSB0aGVcbiAqIHJlcnVubmluZy5cbiAqIEBsb2N1cyBDbGllbnRcbiAqIEBwYXJhbSB7VHJhY2tlci5Db21wdXRhdGlvbkZ1bmN0aW9ufSBydW5GdW5jIFRoZSBmdW5jdGlvbiB0byBydW4uIEl0IHJlY2VpdmVzXG4gKiBvbmUgYXJndW1lbnQ6IHRoZSBDb21wdXRhdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5vbkVycm9yIE9wdGlvbmFsLiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdoZW4gYW4gZXJyb3JcbiAqIGhhcHBlbnMgaW4gdGhlIENvbXB1dGF0aW9uLiBUaGUgb25seSBhcmd1bWVudCBpdCByZWNlaXZlcyBpcyB0aGUgRXJyb3JcbiAqIHRocm93bi4gRGVmYXVsdHMgdG8gdGhlIGVycm9yIGJlaW5nIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cbiAqIEByZXR1cm5zIHtUcmFja2VyLkNvbXB1dGF0aW9ufVxuICovXG5UcmFja2VyLmF1dG9ydW4gPSBmdW5jdGlvbiAoZiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcmFja2VyLmF1dG9ydW4gcmVxdWlyZXMgYSBmdW5jdGlvbiBhcmd1bWVudCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGNvbnN0cnVjdGluZ0NvbXB1dGF0aW9uID0gdHJ1ZTtcbiAgdmFyIGMgPSBuZXcgVHJhY2tlci5Db21wdXRhdGlvbihcbiAgICBmLCBUcmFja2VyLmN1cnJlbnRDb21wdXRhdGlvbiwgb3B0aW9ucy5vbkVycm9yKTtcblxuICBpZiAoVHJhY2tlci5hY3RpdmUpXG4gICAgVHJhY2tlci5vbkludmFsaWRhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgYy5zdG9wKCk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGM7XG59O1xuXG4vLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyN0cmFja2VyX25vbnJlYWN0aXZlXG4vL1xuLy8gUnVuIGBmYCB3aXRoIG5vIGN1cnJlbnQgY29tcHV0YXRpb24sIHJldHVybmluZyB0aGUgcmV0dXJuIHZhbHVlXG4vLyBvZiBgZmAuICBVc2VkIHRvIHR1cm4gb2ZmIHJlYWN0aXZpdHkgZm9yIHRoZSBkdXJhdGlvbiBvZiBgZmAsXG4vLyBzbyB0aGF0IHJlYWN0aXZlIGRhdGEgc291cmNlcyBhY2Nlc3NlZCBieSBgZmAgd2lsbCBub3QgcmVzdWx0IGluIGFueVxuLy8gY29tcHV0YXRpb25zIGJlaW5nIGludmFsaWRhdGVkLlxuXG4vKipcbiAqIEBzdW1tYXJ5IFJ1biBhIGZ1bmN0aW9uIHdpdGhvdXQgdHJhY2tpbmcgZGVwZW5kZW5jaWVzLlxuICogQGxvY3VzIENsaWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBBIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkuXG4gKi9cblRyYWNrZXIubm9ucmVhY3RpdmUgPSBmdW5jdGlvbiAoZikge1xuICB2YXIgcHJldmlvdXMgPSBUcmFja2VyLmN1cnJlbnRDb21wdXRhdGlvbjtcbiAgc2V0Q3VycmVudENvbXB1dGF0aW9uKG51bGwpO1xuICB0cnkge1xuICAgIHJldHVybiBmKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudENvbXB1dGF0aW9uKHByZXZpb3VzKTtcbiAgfVxufTtcblxuLy8gaHR0cDovL2RvY3MubWV0ZW9yLmNvbS8jdHJhY2tlcl9vbmludmFsaWRhdGVcblxuLyoqXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYSBuZXcgW2BvbkludmFsaWRhdGVgXSgjY29tcHV0YXRpb25fb25pbnZhbGlkYXRlKSBjYWxsYmFjayBvbiB0aGUgY3VycmVudCBjb21wdXRhdGlvbiAod2hpY2ggbXVzdCBleGlzdCksIHRvIGJlIGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBjdXJyZW50IGNvbXB1dGF0aW9uIGlzIGludmFsaWRhdGVkIG9yIHN0b3BwZWQuXG4gKiBAbG9jdXMgQ2xpZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGFzIGBmdW5jKGMpYCwgd2hlcmUgYGNgIGlzIHRoZSBjb21wdXRhdGlvbiBvbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC5cbiAqL1xuVHJhY2tlci5vbkludmFsaWRhdGUgPSBmdW5jdGlvbiAoZikge1xuICBpZiAoISBUcmFja2VyLmFjdGl2ZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFja2VyLm9uSW52YWxpZGF0ZSByZXF1aXJlcyBhIGN1cnJlbnRDb21wdXRhdGlvblwiKTtcblxuICBUcmFja2VyLmN1cnJlbnRDb21wdXRhdGlvbi5vbkludmFsaWRhdGUoZik7XG59O1xuXG4vLyBodHRwOi8vZG9jcy5tZXRlb3IuY29tLyN0cmFja2VyX2FmdGVyZmx1c2hcblxuLyoqXG4gKiBAc3VtbWFyeSBTY2hlZHVsZXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBuZXh0IGZsdXNoLCBvciBsYXRlciBpbiB0aGUgY3VycmVudCBmbHVzaCBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3MsIGFmdGVyIGFsbCBpbnZhbGlkYXRlZCBjb21wdXRhdGlvbnMgaGF2ZSBiZWVuIHJlcnVuLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgcnVuIG9uY2UgYW5kIG5vdCBvbiBzdWJzZXF1ZW50IGZsdXNoZXMgdW5sZXNzIGBhZnRlckZsdXNoYCBpcyBjYWxsZWQgYWdhaW4uXG4gKiBAbG9jdXMgQ2xpZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGNhbGwgYXQgZmx1c2ggdGltZS5cbiAqL1xuVHJhY2tlci5hZnRlckZsdXNoID0gZnVuY3Rpb24gKGYpIHtcbiAgYWZ0ZXJGbHVzaENhbGxiYWNrcy5wdXNoKGYpO1xuICByZXF1aXJlRmx1c2goKTtcbn07XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/tracker/tracker.js"],"names":["Tracker","Deps","active","currentComputation","setCurrentComputation","c","_debugFunc","Meteor","_debug","console","error","apply","arguments","_maybeSuppressMoreLogs","messagesLength","_suppressed_log_expected","_suppress_log","_throwOrLog","from","e","throwFirstError","printArgs","stack","message","name","idx","indexOf","length","push","i","withNoYieldsAllowed","f","isClient","args","_noYieldsAllowed","nextId","pendingComputations","willFlush","inFlush","inCompute","afterFlushCallbacks","requireFlush","_setImmediate","_runFlush","setTimeout","constructingComputation","Computation","constructor","parent","onError","Error","stopped","invalidated","firstRun","_id","_onInvalidateCallbacks","_onStopCallbacks","_parent","_func","_onError","_recomputing","errored","_compute","stop","onInvalidate","nonreactive","onStop","invalidate","previous","previousInCompute","_needsRecompute","_recompute","flush","run","Dependency","_dependentsById","Object","create","depend","computation","id","changed","hasDependents","options","finishSynchronously","_throwFirstError","recomputedCount","finishedTry","comp","shift","unshift","func","autorun","afterFlush"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;;AAEA;;;;AAIAA,OAAO,GAAG,EAAV;AAEA;;;;;AAIAC,IAAI,GAAGD,OAAP,C,CAEA;;AAEA;;;;;;AAKAA,OAAO,CAACE,MAAR,GAAiB,KAAjB,C,CAEA;;AAEA;;;;;;AAKAF,OAAO,CAACG,kBAAR,GAA6B,IAA7B;;AAEA,SAASC,qBAAT,CAA+BC,CAA/B,EAAkC;AAChCL,SAAO,CAACG,kBAAR,GAA6BE,CAA7B;AACAL,SAAO,CAACE,MAAR,GAAiB,CAAC,CAAEG,CAApB;AACD;;AAED,SAASC,UAAT,GAAsB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAQ,OAAOC,MAAP,KAAkB,WAAlB,GAAgCA,MAAM,CAACC,MAAvC,GACE,OAAOC,OAAP,KAAmB,WAApB,IAAoCA,OAAO,CAACC,KAA5C,GACA,YAAY;AAAED,WAAO,CAACC,KAAR,CAAcC,KAAd,CAAoBF,OAApB,EAA6BG,SAA7B;AAA0C,GADxD,GAEA,YAAY,CAAE,CAHvB;AAID;;AAED,SAASC,sBAAT,CAAgCC,cAAhC,EAAgD;AAC9C;AACA;AACA;AACA;AACA,MAAI,OAAOP,MAAP,KAAkB,WAAtB,EAAmC;AACjC,QAAIA,MAAM,CAACQ,wBAAP,EAAJ,EAAuC;AACrCR,YAAM,CAACS,aAAP,CAAqBF,cAAc,GAAG,CAAtC;AACD;AACF;AACF;;AAED,SAASG,WAAT,CAAqBC,IAArB,EAA2BC,CAA3B,EAA8B;AAC5B,MAAIC,eAAJ,EAAqB;AACnB,UAAMD,CAAN;AACD,GAFD,MAEO;AACL,QAAIE,SAAS,GAAG,CAAC,4BAA4BH,IAA5B,GAAmC,YAApC,CAAhB;;AACA,QAAIC,CAAC,CAACG,KAAF,IAAWH,CAAC,CAACI,OAAb,IAAwBJ,CAAC,CAACK,IAA9B,EAAoC;AAClC,UAAIC,GAAG,GAAGN,CAAC,CAACG,KAAF,CAAQI,OAAR,CAAgBP,CAAC,CAACI,OAAlB,CAAV;;AACA,UAAIE,GAAG,GAAG,CAAN,IAAWA,GAAG,GAAGN,CAAC,CAACK,IAAF,CAAOG,MAAP,GAAgB,CAArC,EAAwC;AAAE;AACxC;AACA,YAAIJ,OAAO,GAAGJ,CAAC,CAACK,IAAF,GAAS,IAAT,GAAgBL,CAAC,CAACI,OAAhC;AACAF,iBAAS,CAACO,IAAV,CAAeL,OAAf;AACD;AACF;;AACDF,aAAS,CAACO,IAAV,CAAeT,CAAC,CAACG,KAAjB;;AACAT,0BAAsB,CAACQ,SAAS,CAACM,MAAX,CAAtB;;AAEA,SAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,SAAS,CAACM,MAA9B,EAAsCE,CAAC,EAAvC,EAA2C;AACzCvB,gBAAU,GAAGe,SAAS,CAACQ,CAAD,CAAZ,CAAV;AACD;AACF;AACF,C,CAED;AACA;AACA;AACA;AACA;;;AACA,SAASC,mBAAT,CAA6BC,CAA7B,EAAgC;AAC9B,MAAK,OAAOxB,MAAP,KAAkB,WAAnB,IAAmCA,MAAM,CAACyB,QAA9C,EAAwD;AACtD,WAAOD,CAAP;AACD,GAFD,MAEO;AACL,WAAO,YAAY;AACjB,UAAIE,IAAI,GAAGrB,SAAX;;AACAL,YAAM,CAAC2B,gBAAP,CAAwB,YAAY;AAClCH,SAAC,CAACpB,KAAF,CAAQ,IAAR,EAAcsB,IAAd;AACD,OAFD;AAGD,KALD;AAMD;AACF;;AAED,IAAIE,MAAM,GAAG,CAAb,C,CACA;;AACA,IAAIC,mBAAmB,GAAG,EAA1B,C,CACA;;AACA,IAAIC,SAAS,GAAG,KAAhB,C,CACA;;AACA,IAAIC,OAAO,GAAG,KAAd,C,CACA;AACA;AACA;AACA;;AACA,IAAIC,SAAS,GAAG,KAAhB,C,CACA;AACA;AACA;AACA;AACA;;AACA,IAAInB,eAAe,GAAG,KAAtB;AAEA,IAAIoB,mBAAmB,GAAG,EAA1B;;AAEA,SAASC,YAAT,GAAwB;AACtB,MAAI,CAAEJ,SAAN,EAAiB;AACf;AACA,QAAI,OAAO9B,MAAP,KAAkB,WAAtB,EACEA,MAAM,CAACmC,aAAP,CAAqB1C,OAAO,CAAC2C,SAA7B,EADF,KAGEC,UAAU,CAAC5C,OAAO,CAAC2C,SAAT,EAAoB,CAApB,CAAV;AACFN,aAAS,GAAG,IAAZ;AACD;AACF,C,CAED;AACA;;;AACA,IAAIQ,uBAAuB,GAAG,KAA9B,C,CAEA;AACA;;AAEA;;;;;;;;;;AASA7C,OAAO,CAAC8C,WAAR,GAAsB,MAAMA,WAAN,CAAkB;AACtCC,aAAW,CAAChB,CAAD,EAAIiB,MAAJ,EAAYC,OAAZ,EAAqB;AAC9B,QAAI,CAAEJ,uBAAN,EACE,MAAM,IAAIK,KAAJ,CACJ,iEADI,CAAN;AAEFL,2BAAuB,GAAG,KAA1B,CAJ8B,CAM9B;;AAEA;;;;;;;;AAOA,SAAKM,OAAL,GAAe,KAAf,CAf8B,CAiB9B;;AAEA;;;;;;;;;AAQA,SAAKC,WAAL,GAAmB,KAAnB,CA3B8B,CA6B9B;;AAEA;;;;;;;;;AAQA,SAAKC,QAAL,GAAgB,IAAhB;AAEA,SAAKC,GAAL,GAAWnB,MAAM,EAAjB;AACA,SAAKoB,sBAAL,GAA8B,EAA9B;AACA,SAAKC,gBAAL,GAAwB,EAAxB,CA3C8B,CA4C9B;AACA;;AACA,SAAKC,OAAL,GAAeT,MAAf;AACA,SAAKU,KAAL,GAAa3B,CAAb;AACA,SAAK4B,QAAL,GAAgBV,OAAhB;AACA,SAAKW,YAAL,GAAoB,KAApB;AAEA,QAAIC,OAAO,GAAG,IAAd;;AACA,QAAI;AACF,WAAKC,QAAL;;AACAD,aAAO,GAAG,KAAV;AACD,KAHD,SAGU;AACR,WAAKR,QAAL,GAAgB,KAAhB;AACA,UAAIQ,OAAJ,EACE,KAAKE,IAAL;AACH;AACF,GA7DqC,CA+DtC;;AAEA;;;;;;;AAKAC,cAAY,CAACjC,CAAD,EAAI;AACd,QAAI,OAAOA,CAAP,KAAa,UAAjB,EACE,MAAM,IAAImB,KAAJ,CAAU,kCAAV,CAAN;;AAEF,QAAI,KAAKE,WAAT,EAAsB;AACpBpD,aAAO,CAACiE,WAAR,CAAoB,MAAM;AACxBnC,2BAAmB,CAACC,CAAD,CAAnB,CAAuB,IAAvB;AACD,OAFD;AAGD,KAJD,MAIO;AACL,WAAKwB,sBAAL,CAA4B3B,IAA5B,CAAiCG,CAAjC;AACD;AACF;AAED;;;;;;;AAKAmC,QAAM,CAACnC,CAAD,EAAI;AACR,QAAI,OAAOA,CAAP,KAAa,UAAjB,EACE,MAAM,IAAImB,KAAJ,CAAU,4BAAV,CAAN;;AAEF,QAAI,KAAKC,OAAT,EAAkB;AAChBnD,aAAO,CAACiE,WAAR,CAAoB,MAAM;AACxBnC,2BAAmB,CAACC,CAAD,CAAnB,CAAuB,IAAvB;AACD,OAFD;AAGD,KAJD,MAIO;AACL,WAAKyB,gBAAL,CAAsB5B,IAAtB,CAA2BG,CAA3B;AACD;AACF,GAnGqC,CAqGtC;;AAEA;;;;;;AAIAoC,YAAU,GAAG;AACX,QAAI,CAAE,KAAKf,WAAX,EAAwB;AACtB;AACA;AACA,UAAI,CAAE,KAAKQ,YAAP,IAAuB,CAAE,KAAKT,OAAlC,EAA2C;AACzCV,oBAAY;AACZL,2BAAmB,CAACR,IAApB,CAAyB,IAAzB;AACD;;AAED,WAAKwB,WAAL,GAAmB,IAAnB,CARsB,CAUtB;AACA;;AACA,WAAI,IAAIvB,CAAC,GAAG,CAAR,EAAWE,CAAf,EAAkBA,CAAC,GAAG,KAAKwB,sBAAL,CAA4B1B,CAA5B,CAAtB,EAAsDA,CAAC,EAAvD,EAA2D;AACzD7B,eAAO,CAACiE,WAAR,CAAoB,MAAM;AACxBnC,6BAAmB,CAACC,CAAD,CAAnB,CAAuB,IAAvB;AACD,SAFD;AAGD;;AACD,WAAKwB,sBAAL,GAA8B,EAA9B;AACD;AACF,GA/HqC,CAiItC;;AAEA;;;;;;AAIAQ,MAAI,GAAG;AACL,QAAI,CAAE,KAAKZ,OAAX,EAAoB;AAClB,WAAKA,OAAL,GAAe,IAAf;AACA,WAAKgB,UAAL;;AACA,WAAI,IAAItC,CAAC,GAAG,CAAR,EAAWE,CAAf,EAAkBA,CAAC,GAAG,KAAKyB,gBAAL,CAAsB3B,CAAtB,CAAtB,EAAgDA,CAAC,EAAjD,EAAqD;AACnD7B,eAAO,CAACiE,WAAR,CAAoB,MAAM;AACxBnC,6BAAmB,CAACC,CAAD,CAAnB,CAAuB,IAAvB;AACD,SAFD;AAGD;;AACD,WAAKyB,gBAAL,GAAwB,EAAxB;AACD;AACF;;AAEDM,UAAQ,GAAG;AACT,SAAKV,WAAL,GAAmB,KAAnB;AAEA,QAAIgB,QAAQ,GAAGpE,OAAO,CAACG,kBAAvB;AACAC,yBAAqB,CAAC,IAAD,CAArB;AACA,QAAIiE,iBAAiB,GAAG9B,SAAxB;AACAA,aAAS,GAAG,IAAZ;;AACA,QAAI;AACFT,yBAAmB,CAAC,KAAK4B,KAAN,CAAnB,CAAgC,IAAhC;AACD,KAFD,SAEU;AACRtD,2BAAqB,CAACgE,QAAD,CAArB;AACA7B,eAAS,GAAG8B,iBAAZ;AACD;AACF;;AAEDC,iBAAe,GAAG;AAChB,WAAO,KAAKlB,WAAL,IAAoB,CAAE,KAAKD,OAAlC;AACD;;AAEDoB,YAAU,GAAG;AACX,SAAKX,YAAL,GAAoB,IAApB;;AACA,QAAI;AACF,UAAI,KAAKU,eAAL,EAAJ,EAA4B;AAC1B,YAAI;AACF,eAAKR,QAAL;AACD,SAFD,CAEE,OAAO3C,CAAP,EAAU;AACV,cAAI,KAAKwC,QAAT,EAAmB;AACjB,iBAAKA,QAAL,CAAcxC,CAAd;AACD,WAFD,MAEO;AACLF,uBAAW,CAAC,WAAD,EAAcE,CAAd,CAAX;AACD;AACF;AACF;AACF,KAZD,SAYU;AACR,WAAKyC,YAAL,GAAoB,KAApB;AACD;AACF;AAED;;;;;;;;AAMAY,OAAK,GAAG;AACN,QAAI,KAAKZ,YAAT,EACE;;AAEF,SAAKW,UAAL;AACD;AAED;;;;;;;AAKAE,KAAG,GAAG;AACJ,SAAKN,UAAL;AACA,SAAKK,KAAL;AACD;;AA/MqC,CAAxC,C,CAkNA;AACA;;AAEA;;;;;;;;;;AASAxE,OAAO,CAAC0E,UAAR,GAAqB,MAAMA,UAAN,CAAiB;AACpC3B,aAAW,GAAG;AACZ,SAAK4B,eAAL,GAAuBC,MAAM,CAACC,MAAP,CAAc,IAAd,CAAvB;AACD,GAHmC,CAKpC;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;AAUAC,QAAM,CAACC,WAAD,EAAc;AAClB,QAAI,CAAEA,WAAN,EAAmB;AACjB,UAAI,CAAE/E,OAAO,CAACE,MAAd,EACE,OAAO,KAAP;AAEF6E,iBAAW,GAAG/E,OAAO,CAACG,kBAAtB;AACD;;AACD,QAAI6E,EAAE,GAAGD,WAAW,CAACzB,GAArB;;AACA,QAAI,EAAG0B,EAAE,IAAI,KAAKL,eAAd,CAAJ,EAAoC;AAClC,WAAKA,eAAL,CAAqBK,EAArB,IAA2BD,WAA3B;AACAA,iBAAW,CAACf,YAAZ,CAAyB,MAAM;AAC7B,eAAO,KAAKW,eAAL,CAAqBK,EAArB,CAAP;AACD,OAFD;AAGA,aAAO,IAAP;AACD;;AACD,WAAO,KAAP;AACD,GAtCmC,CAwCpC;;AAEA;;;;;;AAIAC,SAAO,GAAG;AACR,SAAK,IAAID,EAAT,IAAe,KAAKL,eAApB,EACE,KAAKA,eAAL,CAAqBK,EAArB,EAAyBb,UAAzB;AACH,GAjDmC,CAmDpC;;AAEA;;;;;;;AAKAe,eAAa,GAAG;AACd,SAAK,IAAIF,EAAT,IAAe,KAAKL,eAApB,EACE,OAAO,IAAP;;AACF,WAAO,KAAP;AACD;;AA9DmC,CAAtC,C,CAiEA;;AAEA;;;;;AAIA3E,OAAO,CAACwE,KAAR,GAAgB,UAAUW,OAAV,EAAmB;AACjCnF,SAAO,CAAC2C,SAAR,CAAkB;AAAEyC,uBAAmB,EAAE,IAAvB;AACEhE,mBAAe,EAAE+D,OAAO,IAAIA,OAAO,CAACE;AADtC,GAAlB;AAED,CAHD;AAKA;;;;;;;AAKArF,OAAO,CAACsC,OAAR,GAAkB,YAAY;AAC5B,SAAOA,OAAP;AACD,CAFD,C,CAIA;AACA;AACA;;;AACAtC,OAAO,CAAC2C,SAAR,GAAoB,UAAUwC,OAAV,EAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAInF,OAAO,CAACsC,OAAR,EAAJ,EACE,MAAM,IAAIY,KAAJ,CAAU,yCAAV,CAAN;AAEF,MAAIX,SAAJ,EACE,MAAM,IAAIW,KAAJ,CAAU,oCAAV,CAAN;AAEFiC,SAAO,GAAGA,OAAO,IAAI,EAArB;AAEA7C,SAAO,GAAG,IAAV;AACAD,WAAS,GAAG,IAAZ;AACAjB,iBAAe,GAAG,CAAC,CAAE+D,OAAO,CAAC/D,eAA7B;AAEA,MAAIkE,eAAe,GAAG,CAAtB;AACA,MAAIC,WAAW,GAAG,KAAlB;;AACA,MAAI;AACF,WAAOnD,mBAAmB,CAACT,MAApB,IACAa,mBAAmB,CAACb,MAD3B,EACmC;AAEjC;AACA,aAAOS,mBAAmB,CAACT,MAA3B,EAAmC;AACjC,YAAI6D,IAAI,GAAGpD,mBAAmB,CAACqD,KAApB,EAAX;;AACAD,YAAI,CAACjB,UAAL;;AACA,YAAIiB,IAAI,CAAClB,eAAL,EAAJ,EAA4B;AAC1BlC,6BAAmB,CAACsD,OAApB,CAA4BF,IAA5B;AACD;;AAED,YAAI,CAAEL,OAAO,CAACC,mBAAV,IAAiC,EAAEE,eAAF,GAAoB,IAAzD,EAA+D;AAC7DC,qBAAW,GAAG,IAAd;AACA;AACD;AACF;;AAED,UAAI/C,mBAAmB,CAACb,MAAxB,EAAgC;AAC9B;AACA;AACA,YAAIgE,IAAI,GAAGnD,mBAAmB,CAACiD,KAApB,EAAX;;AACA,YAAI;AACFE,cAAI;AACL,SAFD,CAEE,OAAOxE,CAAP,EAAU;AACVF,qBAAW,CAAC,YAAD,EAAeE,CAAf,CAAX;AACD;AACF;AACF;;AACDoE,eAAW,GAAG,IAAd;AACD,GA9BD,SA8BU;AACR,QAAI,CAAEA,WAAN,EAAmB;AACjB;AACAjD,aAAO,GAAG,KAAV,CAFiB,CAEA;AACjB;;AACAtC,aAAO,CAAC2C,SAAR,CAAkB;AAChByC,2BAAmB,EAAED,OAAO,CAACC,mBADb;AAEhBhE,uBAAe,EAAE;AAFD,OAAlB;AAID;;AACDiB,aAAS,GAAG,KAAZ;AACAC,WAAO,GAAG,KAAV;;AACA,QAAIF,mBAAmB,CAACT,MAApB,IAA8Ba,mBAAmB,CAACb,MAAtD,EAA8D;AAC5D;AACA;AACA;AACA,UAAIwD,OAAO,CAACC,mBAAZ,EAAiC;AAC/B,cAAM,IAAIlC,KAAJ,CAAU,wBAAV,CAAN,CAD+B,CACa;AAC7C;;AACDN,gBAAU,CAACH,YAAD,EAAe,EAAf,CAAV;AACD;AACF;AACF,CA9ED,C,CAgFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAIA;;;;;;;;;;;;;;;AAaAzC,OAAO,CAAC4F,OAAR,GAAkB,UAAU7D,CAAV,EAAaoD,OAAb,EAAsB;AACtC,MAAI,OAAOpD,CAAP,KAAa,UAAjB,EACE,MAAM,IAAImB,KAAJ,CAAU,8CAAV,CAAN;AAEFiC,SAAO,GAAGA,OAAO,IAAI,EAArB;AAEAtC,yBAAuB,GAAG,IAA1B;AACA,MAAIxC,CAAC,GAAG,IAAIL,OAAO,CAAC8C,WAAZ,CACNf,CADM,EACH/B,OAAO,CAACG,kBADL,EACyBgF,OAAO,CAAClC,OADjC,CAAR;AAGA,MAAIjD,OAAO,CAACE,MAAZ,EACEF,OAAO,CAACgE,YAAR,CAAqB,YAAY;AAC/B3D,KAAC,CAAC0D,IAAF;AACD,GAFD;AAIF,SAAO1D,CAAP;AACD,CAhBD,C,CAkBA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;AAKAL,OAAO,CAACiE,WAAR,GAAsB,UAAUlC,CAAV,EAAa;AACjC,MAAIqC,QAAQ,GAAGpE,OAAO,CAACG,kBAAvB;AACAC,uBAAqB,CAAC,IAAD,CAArB;;AACA,MAAI;AACF,WAAO2B,CAAC,EAAR;AACD,GAFD,SAEU;AACR3B,yBAAqB,CAACgE,QAAD,CAArB;AACD;AACF,CARD,C,CAUA;;AAEA;;;;;;;AAKApE,OAAO,CAACgE,YAAR,GAAuB,UAAUjC,CAAV,EAAa;AAClC,MAAI,CAAE/B,OAAO,CAACE,MAAd,EACE,MAAM,IAAIgD,KAAJ,CAAU,oDAAV,CAAN;AAEFlD,SAAO,CAACG,kBAAR,CAA2B6D,YAA3B,CAAwCjC,CAAxC;AACD,CALD,C,CAOA;;AAEA;;;;;;;AAKA/B,OAAO,CAAC6F,UAAR,GAAqB,UAAU9D,CAAV,EAAa;AAChCS,qBAAmB,CAACZ,IAApB,CAAyBG,CAAzB;AACAU,cAAY;AACb,CAHD,C","file":"/packages/tracker.js","sourcesContent":["/////////////////////////////////////////////////////\n// Package docs at http://docs.meteor.com/#tracker //\n/////////////////////////////////////////////////////\n\n/**\n * @namespace Tracker\n * @summary The namespace for Tracker-related methods.\n */\nTracker = {};\n\n/**\n * @namespace Deps\n * @deprecated\n */\nDeps = Tracker;\n\n// http://docs.meteor.com/#tracker_active\n\n/**\n * @summary True if there is a current computation, meaning that dependencies on reactive data sources will be tracked and potentially cause the current computation to be rerun.\n * @locus Client\n * @type {Boolean}\n */\nTracker.active = false;\n\n// http://docs.meteor.com/#tracker_currentcomputation\n\n/**\n * @summary The current computation, or `null` if there isn't one. The current computation is the [`Tracker.Computation`](#tracker_computation) object created by the innermost active call to `Tracker.autorun`, and it's the computation that gains dependencies when reactive data sources are accessed.\n * @locus Client\n * @type {Tracker.Computation}\n */\nTracker.currentComputation = null;\n\nfunction setCurrentComputation(c) {\n Tracker.currentComputation = c;\n Tracker.active = !! c;\n}\n\nfunction _debugFunc() {\n // We want this code to work without Meteor, and also without\n // \"console\" (which is technically non-standard and may be missing\n // on some browser we come across, like it was on IE 7).\n //\n // Lazy evaluation because `Meteor` does not exist right away.(??)\n return (typeof Meteor !== \"undefined\" ? Meteor._debug :\n ((typeof console !== \"undefined\") && console.error ?\n function () { console.error.apply(console, arguments); } :\n function () {}));\n}\n\nfunction _maybeSuppressMoreLogs(messagesLength) {\n // Sometimes when running tests, we intentionally suppress logs on expected\n // printed errors. Since the current implementation of _throwOrLog can log\n // multiple separate log messages, suppress all of them if at least one suppress\n // is expected as we still want them to count as one.\n if (typeof Meteor !== \"undefined\") {\n if (Meteor._suppressed_log_expected()) {\n Meteor._suppress_log(messagesLength - 1);\n }\n }\n}\n\nfunction _throwOrLog(from, e) {\n if (throwFirstError) {\n throw e;\n } else {\n var printArgs = [\"Exception from Tracker \" + from + \" function:\"];\n if (e.stack && e.message && e.name) {\n var idx = e.stack.indexOf(e.message);\n if (idx < 0 || idx > e.name.length + 2) { // check for \"Error: \"\n // message is not part of the stack\n var message = e.name + \": \" + e.message;\n printArgs.push(message);\n }\n }\n printArgs.push(e.stack);\n _maybeSuppressMoreLogs(printArgs.length);\n\n for (var i = 0; i < printArgs.length; i++) {\n _debugFunc()(printArgs[i]);\n }\n }\n}\n\n// Takes a function `f`, and wraps it in a `Meteor._noYieldsAllowed`\n// block if we are running on the server. On the client, returns the\n// original function (since `Meteor._noYieldsAllowed` is a\n// no-op). This has the benefit of not adding an unnecessary stack\n// frame on the client.\nfunction withNoYieldsAllowed(f) {\n if ((typeof Meteor === 'undefined') || Meteor.isClient) {\n return f;\n } else {\n return function () {\n var args = arguments;\n Meteor._noYieldsAllowed(function () {\n f.apply(null, args);\n });\n };\n }\n}\n\nvar nextId = 1;\n// computations whose callbacks we should call at flush time\nvar pendingComputations = [];\n// `true` if a Tracker.flush is scheduled, or if we are in Tracker.flush now\nvar willFlush = false;\n// `true` if we are in Tracker.flush now\nvar inFlush = false;\n// `true` if we are computing a computation now, either first time\n// or recompute. This matches Tracker.active unless we are inside\n// Tracker.nonreactive, which nullfies currentComputation even though\n// an enclosing computation may still be running.\nvar inCompute = false;\n// `true` if the `_throwFirstError` option was passed in to the call\n// to Tracker.flush that we are in. When set, throw rather than log the\n// first error encountered while flushing. Before throwing the error,\n// finish flushing (from a finally block), logging any subsequent\n// errors.\nvar throwFirstError = false;\n\nvar afterFlushCallbacks = [];\n\nfunction requireFlush() {\n if (! willFlush) {\n // We want this code to work without Meteor, see debugFunc above\n if (typeof Meteor !== \"undefined\")\n Meteor._setImmediate(Tracker._runFlush);\n else\n setTimeout(Tracker._runFlush, 0);\n willFlush = true;\n }\n}\n\n// Tracker.Computation constructor is visible but private\n// (throws an error if you try to call it)\nvar constructingComputation = false;\n\n//\n// http://docs.meteor.com/#tracker_computation\n\n/**\n * @summary A Computation object represents code that is repeatedly rerun\n * in response to\n * reactive data changes. Computations don't have return values; they just\n * perform actions, such as rerendering a template on the screen. Computations\n * are created using Tracker.autorun. Use stop to prevent further rerunning of a\n * computation.\n * @instancename computation\n */\nTracker.Computation = class Computation {\n constructor(f, parent, onError) {\n if (! constructingComputation)\n throw new Error(\n \"Tracker.Computation constructor is private; use Tracker.autorun\");\n constructingComputation = false;\n\n // http://docs.meteor.com/#computation_stopped\n\n /**\n * @summary True if this computation has been stopped.\n * @locus Client\n * @memberOf Tracker.Computation\n * @instance\n * @name stopped\n */\n this.stopped = false;\n\n // http://docs.meteor.com/#computation_invalidated\n\n /**\n * @summary True if this computation has been invalidated (and not yet rerun), or if it has been stopped.\n * @locus Client\n * @memberOf Tracker.Computation\n * @instance\n * @name invalidated\n * @type {Boolean}\n */\n this.invalidated = false;\n\n // http://docs.meteor.com/#computation_firstrun\n\n /**\n * @summary True during the initial run of the computation at the time `Tracker.autorun` is called, and false on subsequent reruns and at other times.\n * @locus Client\n * @memberOf Tracker.Computation\n * @instance\n * @name firstRun\n * @type {Boolean}\n */\n this.firstRun = true;\n\n this._id = nextId++;\n this._onInvalidateCallbacks = [];\n this._onStopCallbacks = [];\n // the plan is at some point to use the parent relation\n // to constrain the order that computations are processed\n this._parent = parent;\n this._func = f;\n this._onError = onError;\n this._recomputing = false;\n\n var errored = true;\n try {\n this._compute();\n errored = false;\n } finally {\n this.firstRun = false;\n if (errored)\n this.stop();\n }\n }\n\n // http://docs.meteor.com/#computation_oninvalidate\n\n /**\n * @summary Registers `callback` to run when this computation is next invalidated, or runs it immediately if the computation is already invalidated. The callback is run exactly once and not upon future invalidations unless `onInvalidate` is called again after the computation becomes valid again.\n * @locus Client\n * @param {Function} callback Function to be called on invalidation. Receives one argument, the computation that was invalidated.\n */\n onInvalidate(f) {\n if (typeof f !== 'function')\n throw new Error(\"onInvalidate requires a function\");\n\n if (this.invalidated) {\n Tracker.nonreactive(() => {\n withNoYieldsAllowed(f)(this);\n });\n } else {\n this._onInvalidateCallbacks.push(f);\n }\n }\n\n /**\n * @summary Registers `callback` to run when this computation is stopped, or runs it immediately if the computation is already stopped. The callback is run after any `onInvalidate` callbacks.\n * @locus Client\n * @param {Function} callback Function to be called on stop. Receives one argument, the computation that was stopped.\n */\n onStop(f) {\n if (typeof f !== 'function')\n throw new Error(\"onStop requires a function\");\n\n if (this.stopped) {\n Tracker.nonreactive(() => {\n withNoYieldsAllowed(f)(this);\n });\n } else {\n this._onStopCallbacks.push(f);\n }\n }\n\n // http://docs.meteor.com/#computation_invalidate\n\n /**\n * @summary Invalidates this computation so that it will be rerun.\n * @locus Client\n */\n invalidate() {\n if (! this.invalidated) {\n // if we're currently in _recompute(), don't enqueue\n // ourselves, since we'll rerun immediately anyway.\n if (! this._recomputing && ! this.stopped) {\n requireFlush();\n pendingComputations.push(this);\n }\n\n this.invalidated = true;\n\n // callbacks can't add callbacks, because\n // this.invalidated === true.\n for(var i = 0, f; f = this._onInvalidateCallbacks[i]; i++) {\n Tracker.nonreactive(() => {\n withNoYieldsAllowed(f)(this);\n });\n }\n this._onInvalidateCallbacks = [];\n }\n }\n\n // http://docs.meteor.com/#computation_stop\n\n /**\n * @summary Prevents this computation from rerunning.\n * @locus Client\n */\n stop() {\n if (! this.stopped) {\n this.stopped = true;\n this.invalidate();\n for(var i = 0, f; f = this._onStopCallbacks[i]; i++) {\n Tracker.nonreactive(() => {\n withNoYieldsAllowed(f)(this);\n });\n }\n this._onStopCallbacks = [];\n }\n }\n\n _compute() {\n this.invalidated = false;\n\n var previous = Tracker.currentComputation;\n setCurrentComputation(this);\n var previousInCompute = inCompute;\n inCompute = true;\n try {\n withNoYieldsAllowed(this._func)(this);\n } finally {\n setCurrentComputation(previous);\n inCompute = previousInCompute;\n }\n }\n\n _needsRecompute() {\n return this.invalidated && ! this.stopped;\n }\n\n _recompute() {\n this._recomputing = true;\n try {\n if (this._needsRecompute()) {\n try {\n this._compute();\n } catch (e) {\n if (this._onError) {\n this._onError(e);\n } else {\n _throwOrLog(\"recompute\", e);\n }\n }\n }\n } finally {\n this._recomputing = false;\n }\n }\n\n /**\n * @summary Process the reactive updates for this computation immediately\n * and ensure that the computation is rerun. The computation is rerun only\n * if it is invalidated.\n * @locus Client\n */\n flush() {\n if (this._recomputing)\n return;\n\n this._recompute();\n }\n\n /**\n * @summary Causes the function inside this computation to run and\n * synchronously process all reactive updtes.\n * @locus Client\n */\n run() {\n this.invalidate();\n this.flush();\n }\n};\n\n//\n// http://docs.meteor.com/#tracker_dependency\n\n/**\n * @summary A Dependency represents an atomic unit of reactive data that a\n * computation might depend on. Reactive data sources such as Session or\n * Minimongo internally create different Dependency objects for different\n * pieces of data, each of which may be depended on by multiple computations.\n * When the data changes, the computations are invalidated.\n * @class\n * @instanceName dependency\n */\nTracker.Dependency = class Dependency {\n constructor() {\n this._dependentsById = Object.create(null);\n }\n\n // http://docs.meteor.com/#dependency_depend\n //\n // Adds `computation` to this set if it is not already\n // present. Returns true if `computation` is a new member of the set.\n // If no argument, defaults to currentComputation, or does nothing\n // if there is no currentComputation.\n\n /**\n * @summary Declares that the current computation (or `fromComputation` if given) depends on `dependency`. The computation will be invalidated the next time `dependency` changes.\n\n If there is no current computation and `depend()` is called with no arguments, it does nothing and returns false.\n\n Returns true if the computation is a new dependent of `dependency` rather than an existing one.\n * @locus Client\n * @param {Tracker.Computation} [fromComputation] An optional computation declared to depend on `dependency` instead of the current computation.\n * @returns {Boolean}\n */\n depend(computation) {\n if (! computation) {\n if (! Tracker.active)\n return false;\n\n computation = Tracker.currentComputation;\n }\n var id = computation._id;\n if (! (id in this._dependentsById)) {\n this._dependentsById[id] = computation;\n computation.onInvalidate(() => {\n delete this._dependentsById[id];\n });\n return true;\n }\n return false;\n }\n\n // http://docs.meteor.com/#dependency_changed\n\n /**\n * @summary Invalidate all dependent computations immediately and remove them as dependents.\n * @locus Client\n */\n changed() {\n for (var id in this._dependentsById)\n this._dependentsById[id].invalidate();\n }\n\n // http://docs.meteor.com/#dependency_hasdependents\n\n /**\n * @summary True if this Dependency has one or more dependent Computations, which would be invalidated if this Dependency were to change.\n * @locus Client\n * @returns {Boolean}\n */\n hasDependents() {\n for (var id in this._dependentsById)\n return true;\n return false;\n }\n};\n\n// http://docs.meteor.com/#tracker_flush\n\n/**\n * @summary Process all reactive updates immediately and ensure that all invalidated computations are rerun.\n * @locus Client\n */\nTracker.flush = function (options) {\n Tracker._runFlush({ finishSynchronously: true,\n throwFirstError: options && options._throwFirstError });\n};\n\n/**\n * @summary True if we are computing a computation now, either first time or recompute. This matches Tracker.active unless we are inside Tracker.nonreactive, which nullfies currentComputation even though an enclosing computation may still be running.\n * @locus Client\n * @returns {Boolean}\n */\nTracker.inFlush = function () {\n return inFlush;\n}\n\n// Run all pending computations and afterFlush callbacks. If we were not called\n// directly via Tracker.flush, this may return before they're all done to allow\n// the event loop to run a little before continuing.\nTracker._runFlush = function (options) {\n // XXX What part of the comment below is still true? (We no longer\n // have Spark)\n //\n // Nested flush could plausibly happen if, say, a flush causes\n // DOM mutation, which causes a \"blur\" event, which runs an\n // app event handler that calls Tracker.flush. At the moment\n // Spark blocks event handlers during DOM mutation anyway,\n // because the LiveRange tree isn't valid. And we don't have\n // any useful notion of a nested flush.\n //\n // https://app.asana.com/0/159908330244/385138233856\n if (Tracker.inFlush())\n throw new Error(\"Can't call Tracker.flush while flushing\");\n\n if (inCompute)\n throw new Error(\"Can't flush inside Tracker.autorun\");\n\n options = options || {};\n\n inFlush = true;\n willFlush = true;\n throwFirstError = !! options.throwFirstError;\n\n var recomputedCount = 0;\n var finishedTry = false;\n try {\n while (pendingComputations.length ||\n afterFlushCallbacks.length) {\n\n // recompute all pending computations\n while (pendingComputations.length) {\n var comp = pendingComputations.shift();\n comp._recompute();\n if (comp._needsRecompute()) {\n pendingComputations.unshift(comp);\n }\n\n if (! options.finishSynchronously && ++recomputedCount > 1000) {\n finishedTry = true;\n return;\n }\n }\n\n if (afterFlushCallbacks.length) {\n // call one afterFlush callback, which may\n // invalidate more computations\n var func = afterFlushCallbacks.shift();\n try {\n func();\n } catch (e) {\n _throwOrLog(\"afterFlush\", e);\n }\n }\n }\n finishedTry = true;\n } finally {\n if (! finishedTry) {\n // we're erroring due to throwFirstError being true.\n inFlush = false; // needed before calling `Tracker.flush()` again\n // finish flushing\n Tracker._runFlush({\n finishSynchronously: options.finishSynchronously,\n throwFirstError: false\n });\n }\n willFlush = false;\n inFlush = false;\n if (pendingComputations.length || afterFlushCallbacks.length) {\n // We're yielding because we ran a bunch of computations and we aren't\n // required to finish synchronously, so we'd like to give the event loop a\n // chance. We should flush again soon.\n if (options.finishSynchronously) {\n throw new Error(\"still have more to do?\"); // shouldn't happen\n }\n setTimeout(requireFlush, 10);\n }\n }\n};\n\n// http://docs.meteor.com/#tracker_autorun\n//\n// Run f(). Record its dependencies. Rerun it whenever the\n// dependencies change.\n//\n// Returns a new Computation, which is also passed to f.\n//\n// Links the computation to the current computation\n// so that it is stopped if the current computation is invalidated.\n\n/**\n * @callback Tracker.ComputationFunction\n * @param {Tracker.Computation}\n */\n/**\n * @summary Run a function now and rerun it later whenever its dependencies\n * change. Returns a Computation object that can be used to stop or observe the\n * rerunning.\n * @locus Client\n * @param {Tracker.ComputationFunction} runFunc The function to run. It receives\n * one argument: the Computation object that will be returned.\n * @param {Object} [options]\n * @param {Function} options.onError Optional. The function to run when an error\n * happens in the Computation. The only argument it receives is the Error\n * thrown. Defaults to the error being logged to the console.\n * @returns {Tracker.Computation}\n */\nTracker.autorun = function (f, options) {\n if (typeof f !== 'function')\n throw new Error('Tracker.autorun requires a function argument');\n\n options = options || {};\n\n constructingComputation = true;\n var c = new Tracker.Computation(\n f, Tracker.currentComputation, options.onError);\n\n if (Tracker.active)\n Tracker.onInvalidate(function () {\n c.stop();\n });\n\n return c;\n};\n\n// http://docs.meteor.com/#tracker_nonreactive\n//\n// Run `f` with no current computation, returning the return value\n// of `f`. Used to turn off reactivity for the duration of `f`,\n// so that reactive data sources accessed by `f` will not result in any\n// computations being invalidated.\n\n/**\n * @summary Run a function without tracking dependencies.\n * @locus Client\n * @param {Function} func A function to call immediately.\n */\nTracker.nonreactive = function (f) {\n var previous = Tracker.currentComputation;\n setCurrentComputation(null);\n try {\n return f();\n } finally {\n setCurrentComputation(previous);\n }\n};\n\n// http://docs.meteor.com/#tracker_oninvalidate\n\n/**\n * @summary Registers a new [`onInvalidate`](#computation_oninvalidate) callback on the current computation (which must exist), to be called immediately when the current computation is invalidated or stopped.\n * @locus Client\n * @param {Function} callback A callback function that will be invoked as `func(c)`, where `c` is the computation on which the callback is registered.\n */\nTracker.onInvalidate = function (f) {\n if (! Tracker.active)\n throw new Error(\"Tracker.onInvalidate requires a currentComputation\");\n\n Tracker.currentComputation.onInvalidate(f);\n};\n\n// http://docs.meteor.com/#tracker_afterflush\n\n/**\n * @summary Schedules a function to be called during the next flush, or later in the current flush if one is in progress, after all invalidated computations have been rerun. The function will be run once and not on subsequent flushes unless `afterFlush` is called again.\n * @locus Client\n * @param {Function} callback A function to call at flush time.\n */\nTracker.afterFlush = function (f) {\n afterFlushCallbacks.push(f);\n requireFlush();\n};\n"]}
\ No newline at end of file
(function () {
/* Imports */
var Blaze = Package.blaze.Blaze;
var UI = Package.blaze.UI;
var Handlebars = Package.blaze.Handlebars;
/* Exports */
Package._define("ui", {
Blaze: Blaze,
UI: UI,
Handlebars: Handlebars
});
})();
(function () {
/* Package-scope variables */
var exports, _;
(function(){
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/underscore/pre.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Define an object named exports. This will cause underscore.js to put `_` as a
// field on it, instead of in the global namespace. See also post.js.
exports = {};
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/underscore/underscore.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Underscore.js 1.5.2
// http://underscorejs.org
// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `exports` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var
push = ArrayProto.push,
slice = ArrayProto.slice,
concat = ArrayProto.concat,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object via a string identifier,
// for Closure Compiler "advanced" mode.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root._ = _;
}
// Current version.
_.VERSION = '1.5.2';
// Collection Functions
// --------------------
// METEOR CHANGE: Define _isArguments instead of depending on
// _.isArguments which is defined using each. In looksLikeArray
// (which each depends on), we then use _isArguments instead of
// _.isArguments.
var _isArguments = function (obj) {
return toString.call(obj) === '[object Arguments]';
};
// Define a fallback version of the method in browsers (ahem, IE), where
// there isn't any inspectable "Arguments" type.
if (!_isArguments(arguments)) {
_isArguments = function (obj) {
return !!(obj && hasOwnProperty.call(obj, 'callee') && typeof obj.callee === 'function');
};
}
// METEOR CHANGE: _.each({length: 5}) should be treated like an object, not an
// array. This looksLikeArray function is introduced by Meteor, and replaces
// all instances of `obj.length === +obj.length`.
// https://github.com/meteor/meteor/issues/594
// https://github.com/jashkenas/underscore/issues/770
var looksLikeArray = function (obj) {
return (obj.length === +obj.length
// _.isArguments not yet necessarily defined here
&& (_isArguments(obj) || obj.constructor !== Object));
};
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (looksLikeArray(obj)) {
for (var i = 0, length = obj.length; i < length; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
}
}
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results.push(iterator.call(context, value, index, list));
});
return results;
};
var reduceError = 'Reduce of empty array with no initial value';
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError(reduceError);
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var length = obj.length;
if (!looksLikeArray(obj)) {
var keys = _.keys(obj);
length = keys.length;
}
each(obj, function(value, index, list) {
index = keys ? keys[--length] : --length;
if (!initial) {
memo = obj[index];
initial = true;
} else {
memo = iterator.call(context, memo, obj[index], index, list);
}
});
if (!initial) throw new TypeError(reduceError);
return memo;
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, iterator, context) {
var result;
any(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results.push(value);
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, iterator, context) {
return _.filter(obj, function(value, index, list) {
return !iterator.call(context, value, index, list);
}, context);
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result || (result = iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if the array or object contains a given value (using `===`).
// Aliased as `include`.
_.contains = _.include = function(obj, target) {
if (obj == null) return false;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
return any(obj, function(value) {
return value === target;
});
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
return (isFunc ? method : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, function(value){ return value[key]; });
};
// Convenience version of a common use case of `filter`: selecting only objects
// containing specific `key:value` pairs.
_.where = function(obj, attrs, first) {
if (_.isEmpty(attrs)) return first ? void 0 : [];
return _[first ? 'find' : 'filter'](obj, function(value) {
for (var key in attrs) {
if (attrs[key] !== value[key]) return false;
}
return true;
});
};
// Convenience version of a common use case of `find`: getting the first object
// containing specific `key:value` pairs.
_.findWhere = function(obj, attrs) {
return _.where(obj, attrs, true);
};
// Return the maximum element or (element-based computation).
// Can't optimize arrays of integers longer than 65,535 elements.
// See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
return Math.max.apply(Math, obj);
}
if (!iterator && _.isEmpty(obj)) return -Infinity;
var result = {computed : -Infinity, value: -Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed > result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
return Math.min.apply(Math, obj);
}
if (!iterator && _.isEmpty(obj)) return Infinity;
var result = {computed : Infinity, value: Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed < result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Shuffle an array, using the modern version of the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
_.shuffle = function(obj) {
var rand;
var index = 0;
var shuffled = [];
each(obj, function(value) {
rand = _.random(index++);
shuffled[index - 1] = shuffled[rand];
shuffled[rand] = value;
});
return shuffled;
};
// Sample **n** random values from an array.
// If **n** is not specified, returns a single random element from the array.
// The internal `guard` argument allows it to work with `map`.
_.sample = function(obj, n, guard) {
if (arguments.length < 2 || guard) {
return obj[_.random(obj.length - 1)];
}
return _.shuffle(obj).slice(0, Math.max(0, n));
};
// An internal function to generate lookup iterators.
var lookupIterator = function(value) {
return _.isFunction(value) ? value : function(obj){ return obj[value]; };
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, value, context) {
var iterator = lookupIterator(value);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
return function(obj, value, context) {
var result = {};
var iterator = value == null ? _.identity : lookupIterator(value);
each(obj, function(value, index) {
var key = iterator.call(context, value, index, obj);
behavior(result, key, value);
});
return result;
};
};
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = group(function(result, key, value) {
(_.has(result, key) ? result[key] : (result[key] = [])).push(value);
});
// Indexes the object's values by a criterion, similar to `groupBy`, but for
// when you know that your index values will be unique.
_.indexBy = group(function(result, key, value) {
result[key] = value;
});
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
_.countBy = group(function(result, key) {
_.has(result, key) ? result[key]++ : result[key] = 1;
});
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator, context) {
iterator = iterator == null ? _.identity : lookupIterator(iterator);
var value = iterator.call(context, obj);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >>> 1;
iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
}
return low;
};
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
if (looksLikeArray(obj)) return _.map(obj, _.identity);
return _.values(obj);
};
// Return the number of elements in an object.
_.size = function(obj) {
if (obj == null) return 0;
return (looksLikeArray(obj)) ? obj.length : _.keys(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head` and `take`. The **guard** check
// allows it to work with `_.map`.
_.first = _.head = _.take = function(array, n, guard) {
if (array == null) return void 0;
return (n == null) || guard ? array[0] : slice.call(array, 0, n);
};
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
};
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if (array == null) return void 0;
if ((n == null) || guard) {
return array[array.length - 1];
} else {
return slice.call(array, Math.max(array.length - n, 0));
}
};
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
// Especially useful on the arguments object. Passing an **n** will return
// the rest N values in the array. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = _.drop = function(array, n, guard) {
return slice.call(array, (n == null) || guard ? 1 : n);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, _.identity);
};
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, output) {
if (shallow && _.every(input, _.isArray)) {
return concat.apply(output, input);
}
each(input, function(value) {
if (_.isArray(value) || _.isArguments(value)) {
shallow ? push.apply(output, value) : flatten(value, shallow, output);
} else {
output.push(value);
}
});
return output;
};
// Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
return flatten(array, shallow, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iterator, context) {
if (_.isFunction(isSorted)) {
context = iterator;
iterator = isSorted;
isSorted = false;
}
var initial = iterator ? _.map(array, iterator, context) : array;
var results = [];
var seen = [];
each(initial, function(value, index) {
if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
seen.push(value);
results.push(array[index]);
}
});
return results;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(_.flatten(arguments, true));
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
return _.filter(array, function(value){ return !_.contains(rest, value); });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var length = _.max(_.pluck(arguments, "length").concat(0));
var results = new Array(length);
for (var i = 0; i < length; i++) {
results[i] = _.pluck(arguments, '' + i);
}
return results;
};
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values.
_.object = function(list, values) {
if (list == null) return {};
var result = {};
for (var i = 0, length = list.length; i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i = 0, length = array.length;
if (isSorted) {
if (typeof isSorted == 'number') {
i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
} else {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item, from) {
if (array == null) return -1;
var hasIndex = from != null;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
}
var i = (hasIndex ? from : array.length);
while (i--) if (array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(length);
while(idx < length) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Reusable constructor function for prototype setting.
var ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
ctor.prototype = null;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context.
_.partial = function(func) {
var args = slice.call(arguments, 1);
return function() {
return func.apply(this, args.concat(slice.call(arguments)));
};
};
// Bind all of an object's methods to that object. Useful for ensuring that
// all callbacks defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length === 0) throw new Error("bindAll must be passed function names");
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(null, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
_.throttle = function(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
options || (options = {});
var later = function() {
previous = options.leading === false ? 0 : new Date;
timeout = null;
result = func.apply(context, args);
};
return function() {
var now = new Date;
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout, args, context, timestamp, result;
return function() {
context = this;
args = arguments;
timestamp = new Date();
var later = function() {
var last = (new Date()) - timestamp;
if (last < wait) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) result = func.apply(context, args);
}
};
var callNow = immediate && !timeout;
if (!timeout) {
timeout = setTimeout(later, wait);
}
if (callNow) result = func.apply(context, args);
return result;
};
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
memo = func.apply(this, arguments);
func = null;
return memo;
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return function() {
var args = [func];
push.apply(args, arguments);
return wrapper.apply(this, args);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length - 1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys.push(key);
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var values = new Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[keys[i]];
}
return values;
};
// Convert an object into a list of `[key, value]` pairs.
_.pairs = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
var pairs = new Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [keys[i], obj[keys[i]]];
}
return pairs;
};
// Invert the keys and values of an object. The values must be serializable.
_.invert = function(obj) {
var result = {};
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result;
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
// Return a copy of the object only containing the whitelisted properties.
_.pick = function(obj) {
var copy = {};
var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
each(keys, function(key) {
if (key in obj) copy[key] = obj[key];
});
return copy;
};
// Return a copy of the object without the blacklisted properties.
_.omit = function(obj) {
var copy = {};
var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
for (var key in obj) {
if (!_.contains(keys, key)) copy[key] = obj[key];
}
return copy;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
if (obj[prop] === void 0) obj[prop] = source[prop];
}
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Internal recursive comparison function for `isEqual`.
var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a == 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a instanceof _) a = a._wrapped;
if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className != toString.call(b)) return false;
switch (className) {
// Strings, numbers, dates, and booleans are compared by value.
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return a == String(b);
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
// other numeric values.
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a == +b;
// RegExps are compared by their source patterns and flags.
case '[object RegExp]':
return a.source == b.source &&
a.global == b.global &&
a.multiline == b.multiline &&
a.ignoreCase == b.ignoreCase;
}
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (aStack[length] == a) return bStack[length] == b;
}
// Objects with different constructors are not equivalent, but `Object`s
// from different frames are.
var aCtor = a.constructor, bCtor = b.constructor;
if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
_.isFunction(bCtor) && (bCtor instanceof bCtor))) {
return false;
}
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
var size = 0, result = true;
// Recursively compare objects and arrays.
if (className == '[object Array]') {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size == b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
}
}
} else {
// Deep compare objects.
for (var key in a) {
if (_.has(a, key)) {
// Count the expected number of properties.
size++;
// Deep compare each member.
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
}
}
// Ensure that both objects contain the same number of properties.
if (result) {
for (key in b) {
if (_.has(b, key) && !(size--)) break;
}
result = !size;
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
return result;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, [], []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (obj == null) return true;
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
return obj === Object(obj);
};
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) == '[object ' + name + ']';
};
});
// Define a fallback version of the method in browsers (ahem, IE), where
// there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return !!(obj && _.has(obj, 'callee'));
};
}
// Optimize `isFunction` if appropriate.
if (typeof (/./) !== 'function') {
_.isFunction = function(obj) {
return typeof obj === 'function';
};
}
// Is a given object a finite number?
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
// Run a function **n** times.
_.times = function(n, iterator, context) {
var accum = Array(Math.max(0, n));
for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
return accum;
};
// Return a random integer between min and max (inclusive).
_.random = function(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
};
// List of HTML entities for escaping.
var entityMap = {
escape: {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;'
}
};
entityMap.unescape = _.invert(entityMap.escape);
// Regexes containing the keys and values listed immediately above.
var entityRegexes = {
escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
};
// Functions for escaping and unescaping strings to/from HTML interpolation.
_.each(['escape', 'unescape'], function(method) {
_[method] = function(string) {
if (string == null) return '';
return ('' + string).replace(entityRegexes[method], function(match) {
return entityMap[method][match];
});
};
});
// If the value of the named `property` is a function then invoke it with the
// `object` as context; otherwise, return it.
_.result = function(object, property) {
if (object == null) return void 0;
var value = object[property];
return _.isFunction(value) ? value.call(object) : value;
};
// Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
return result.call(this, func.apply(_, args));
};
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
// Add a "chain" function, which will delegate to the wrapper.
_.chain = function(obj) {
return _(obj).chain();
};
// OOP
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
// Helper function to continue chaining intermediate results.
var result = function(obj) {
return this._chain ? _(obj).chain() : obj;
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
var obj = this._wrapped;
method.apply(obj, arguments);
if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
return result.call(this, obj);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
return result.call(this, method.apply(this._wrapped, arguments));
};
});
_.extend(_.prototype, {
// Start chaining a wrapped Underscore object.
chain: function() {
this._chain = true;
return this;
},
// Extracts the result from a wrapped and chained object.
value: function() {
return this._wrapped;
}
});
}).call(this);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/underscore/post.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// This exports object was created in pre.js. Now copy the `_` object from it
// into the package-scope variable `_`, which will get exported.
_ = exports._;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("underscore", {
_: _
});
})();
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var ECMAScript = Package.ecmascript.ECMAScript;
var _ = Package.underscore._;
var meteorInstall = Package.modules.meteorInstall;
var meteorBabelHelpers = Package['babel-runtime'].meteorBabelHelpers;
var Promise = Package.promise.Promise;
/* Package-scope variables */
var WebAppHashing;
var require = meteorInstall({"node_modules":{"meteor":{"webapp-hashing":{"webapp-hashing.js":function(require){
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/webapp-hashing/webapp-hashing.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var crypto = Npm.require("crypto");
WebAppHashing = {}; // Calculate a hash of all the client resources downloaded by the
// browser, including the application HTML, runtime config, code, and
// static files.
//
// This hash *must* change if any resources seen by the browser
// change, and ideally *doesn't* change for any server-only changes
// (but the second is a performance enhancement, not a hard
// requirement).
WebAppHashing.calculateClientHash = function (manifest, includeFilter, runtimeConfigOverride) {
var hash = crypto.createHash('sha1'); // Omit the old hashed client values in the new hash. These may be
// modified in the new boilerplate.
var runtimeCfg = _.omit(__meteor_runtime_config__, ['autoupdateVersion', 'autoupdateVersionRefreshable', 'autoupdateVersionCordova']);
if (runtimeConfigOverride) {
runtimeCfg = runtimeConfigOverride;
}
hash.update(JSON.stringify(runtimeCfg, 'utf8'));
_.each(manifest, function (resource) {
if ((!includeFilter || includeFilter(resource.type)) && (resource.where === 'client' || resource.where === 'internal')) {
hash.update(resource.path);
hash.update(resource.hash);
}
});
return hash.digest('hex');
};
WebAppHashing.calculateCordovaCompatibilityHash = function (platformVersion, pluginVersions) {
const hash = crypto.createHash('sha1');
hash.update(platformVersion); // Sort plugins first so iteration order doesn't affect the hash
const plugins = Object.keys(pluginVersions).sort();
for (let plugin of plugins) {
const version = pluginVersions[plugin];
hash.update(plugin);
hash.update(version);
}
return hash.digest('hex');
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
}}}}},{
"extensions": [
".js",
".json"
]
});
require("/node_modules/meteor/webapp-hashing/webapp-hashing.js");
/* Exports */
Package._define("webapp-hashing", {
WebAppHashing: WebAppHashing
});
})();
//# sourceURL=meteor://💻app/packages/webapp-hashing.js
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvd2ViYXBwLWhhc2hpbmcvd2ViYXBwLWhhc2hpbmcuanMiXSwibmFtZXMiOlsiY3J5cHRvIiwiTnBtIiwicmVxdWlyZSIsIldlYkFwcEhhc2hpbmciLCJjYWxjdWxhdGVDbGllbnRIYXNoIiwibWFuaWZlc3QiLCJpbmNsdWRlRmlsdGVyIiwicnVudGltZUNvbmZpZ092ZXJyaWRlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJydW50aW1lQ2ZnIiwiXyIsIm9taXQiLCJfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImVhY2giLCJyZXNvdXJjZSIsInR5cGUiLCJ3aGVyZSIsInBhdGgiLCJkaWdlc3QiLCJjYWxjdWxhdGVDb3Jkb3ZhQ29tcGF0aWJpbGl0eUhhc2giLCJwbGF0Zm9ybVZlcnNpb24iLCJwbHVnaW5WZXJzaW9ucyIsInBsdWdpbnMiLCJPYmplY3QiLCJrZXlzIiwic29ydCIsInBsdWdpbiIsInZlcnNpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsTUFBTSxHQUFHQyxHQUFHLENBQUNDLE9BQUosQ0FBWSxRQUFaLENBQWI7O0FBRUFDLGFBQWEsR0FBRyxFQUFoQixDLENBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsYUFBYSxDQUFDQyxtQkFBZCxHQUNFLFVBQVVDLFFBQVYsRUFBb0JDLGFBQXBCLEVBQW1DQyxxQkFBbkMsRUFBMEQ7QUFDMUQsTUFBSUMsSUFBSSxHQUFHUixNQUFNLENBQUNTLFVBQVAsQ0FBa0IsTUFBbEIsQ0FBWCxDQUQwRCxDQUcxRDtBQUNBOztBQUNBLE1BQUlDLFVBQVUsR0FBR0MsQ0FBQyxDQUFDQyxJQUFGLENBQU9DLHlCQUFQLEVBQ2YsQ0FBQyxtQkFBRCxFQUFzQiw4QkFBdEIsRUFDQywwQkFERCxDQURlLENBQWpCOztBQUlBLE1BQUlOLHFCQUFKLEVBQTJCO0FBQ3pCRyxjQUFVLEdBQUdILHFCQUFiO0FBQ0Q7O0FBRURDLE1BQUksQ0FBQ00sTUFBTCxDQUFZQyxJQUFJLENBQUNDLFNBQUwsQ0FBZU4sVUFBZixFQUEyQixNQUEzQixDQUFaOztBQUVBQyxHQUFDLENBQUNNLElBQUYsQ0FBT1osUUFBUCxFQUFpQixVQUFVYSxRQUFWLEVBQW9CO0FBQ2pDLFFBQUksQ0FBQyxDQUFFWixhQUFGLElBQW1CQSxhQUFhLENBQUNZLFFBQVEsQ0FBQ0MsSUFBVixDQUFqQyxNQUNDRCxRQUFRLENBQUNFLEtBQVQsS0FBbUIsUUFBbkIsSUFBK0JGLFFBQVEsQ0FBQ0UsS0FBVCxLQUFtQixVQURuRCxDQUFKLEVBQ29FO0FBQ3BFWixVQUFJLENBQUNNLE1BQUwsQ0FBWUksUUFBUSxDQUFDRyxJQUFyQjtBQUNBYixVQUFJLENBQUNNLE1BQUwsQ0FBWUksUUFBUSxDQUFDVixJQUFyQjtBQUNEO0FBQ0YsR0FORDs7QUFPQSxTQUFPQSxJQUFJLENBQUNjLE1BQUwsQ0FBWSxLQUFaLENBQVA7QUFDRCxDQXhCRDs7QUEwQkFuQixhQUFhLENBQUNvQixpQ0FBZCxHQUNFLFVBQVNDLGVBQVQsRUFBMEJDLGNBQTFCLEVBQTBDO0FBQzFDLFFBQU1qQixJQUFJLEdBQUdSLE1BQU0sQ0FBQ1MsVUFBUCxDQUFrQixNQUFsQixDQUFiO0FBRUFELE1BQUksQ0FBQ00sTUFBTCxDQUFZVSxlQUFaLEVBSDBDLENBSzFDOztBQUNBLFFBQU1FLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVlILGNBQVosRUFBNEJJLElBQTVCLEVBQWhCOztBQUNBLE9BQUssSUFBSUMsTUFBVCxJQUFtQkosT0FBbkIsRUFBNEI7QUFDMUIsVUFBTUssT0FBTyxHQUFHTixjQUFjLENBQUNLLE1BQUQsQ0FBOUI7QUFDQXRCLFFBQUksQ0FBQ00sTUFBTCxDQUFZZ0IsTUFBWjtBQUNBdEIsUUFBSSxDQUFDTSxNQUFMLENBQVlpQixPQUFaO0FBQ0Q7O0FBRUQsU0FBT3ZCLElBQUksQ0FBQ2MsTUFBTCxDQUFZLEtBQVosQ0FBUDtBQUNELENBZkQsQyIsImZpbGUiOiIvcGFja2FnZXMvd2ViYXBwLWhhc2hpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY3J5cHRvID0gTnBtLnJlcXVpcmUoXCJjcnlwdG9cIik7XG5cbldlYkFwcEhhc2hpbmcgPSB7fTtcblxuLy8gQ2FsY3VsYXRlIGEgaGFzaCBvZiBhbGwgdGhlIGNsaWVudCByZXNvdXJjZXMgZG93bmxvYWRlZCBieSB0aGVcbi8vIGJyb3dzZXIsIGluY2x1ZGluZyB0aGUgYXBwbGljYXRpb24gSFRNTCwgcnVudGltZSBjb25maWcsIGNvZGUsIGFuZFxuLy8gc3RhdGljIGZpbGVzLlxuLy9cbi8vIFRoaXMgaGFzaCAqbXVzdCogY2hhbmdlIGlmIGFueSByZXNvdXJjZXMgc2VlbiBieSB0aGUgYnJvd3NlclxuLy8gY2hhbmdlLCBhbmQgaWRlYWxseSAqZG9lc24ndCogY2hhbmdlIGZvciBhbnkgc2VydmVyLW9ubHkgY2hhbmdlc1xuLy8gKGJ1dCB0aGUgc2Vjb25kIGlzIGEgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQsIG5vdCBhIGhhcmRcbi8vIHJlcXVpcmVtZW50KS5cblxuV2ViQXBwSGFzaGluZy5jYWxjdWxhdGVDbGllbnRIYXNoID1cbiAgZnVuY3Rpb24gKG1hbmlmZXN0LCBpbmNsdWRlRmlsdGVyLCBydW50aW1lQ29uZmlnT3ZlcnJpZGUpIHtcbiAgdmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpO1xuXG4gIC8vIE9taXQgdGhlIG9sZCBoYXNoZWQgY2xpZW50IHZhbHVlcyBpbiB0aGUgbmV3IGhhc2guIFRoZXNlIG1heSBiZVxuICAvLyBtb2RpZmllZCBpbiB0aGUgbmV3IGJvaWxlcnBsYXRlLlxuICB2YXIgcnVudGltZUNmZyA9IF8ub21pdChfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLFxuICAgIFsnYXV0b3VwZGF0ZVZlcnNpb24nLCAnYXV0b3VwZGF0ZVZlcnNpb25SZWZyZXNoYWJsZScsXG4gICAgICdhdXRvdXBkYXRlVmVyc2lvbkNvcmRvdmEnXSk7XG5cbiAgaWYgKHJ1bnRpbWVDb25maWdPdmVycmlkZSkge1xuICAgIHJ1bnRpbWVDZmcgPSBydW50aW1lQ29uZmlnT3ZlcnJpZGU7XG4gIH1cblxuICBoYXNoLnVwZGF0ZShKU09OLnN0cmluZ2lmeShydW50aW1lQ2ZnLCAndXRmOCcpKTtcblxuICBfLmVhY2gobWFuaWZlc3QsIGZ1bmN0aW9uIChyZXNvdXJjZSkge1xuICAgICAgaWYgKCghIGluY2x1ZGVGaWx0ZXIgfHwgaW5jbHVkZUZpbHRlcihyZXNvdXJjZS50eXBlKSkgJiZcbiAgICAgICAgICAocmVzb3VyY2Uud2hlcmUgPT09ICdjbGllbnQnIHx8IHJlc291cmNlLndoZXJlID09PSAnaW50ZXJuYWwnKSkge1xuICAgICAgaGFzaC51cGRhdGUocmVzb3VyY2UucGF0aCk7XG4gICAgICBoYXNoLnVwZGF0ZShyZXNvdXJjZS5oYXNoKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufTtcblxuV2ViQXBwSGFzaGluZy5jYWxjdWxhdGVDb3Jkb3ZhQ29tcGF0aWJpbGl0eUhhc2ggPVxuICBmdW5jdGlvbihwbGF0Zm9ybVZlcnNpb24sIHBsdWdpblZlcnNpb25zKSB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpO1xuXG4gIGhhc2gudXBkYXRlKHBsYXRmb3JtVmVyc2lvbik7XG5cbiAgLy8gU29ydCBwbHVnaW5zIGZpcnN0IHNvIGl0ZXJhdGlvbiBvcmRlciBkb2Vzbid0IGFmZmVjdCB0aGUgaGFzaFxuICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMocGx1Z2luVmVyc2lvbnMpLnNvcnQoKTtcbiAgZm9yIChsZXQgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcGx1Z2luVmVyc2lvbnNbcGx1Z2luXTtcbiAgICBoYXNoLnVwZGF0ZShwbHVnaW4pO1xuICAgIGhhc2gudXBkYXRlKHZlcnNpb24pO1xuICB9XG5cbiAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbn07XG4iXX0=
{"version":3,"sources":["meteor://💻app/packages/webapp-hashing/webapp-hashing.js"],"names":["crypto","Npm","require","WebAppHashing","calculateClientHash","manifest","includeFilter","runtimeConfigOverride","hash","createHash","runtimeCfg","_","omit","__meteor_runtime_config__","update","JSON","stringify","each","resource","type","where","path","digest","calculateCordovaCompatibilityHash","platformVersion","pluginVersions","plugins","Object","keys","sort","plugin","version"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAIA,MAAM,GAAGC,GAAG,CAACC,OAAJ,CAAY,QAAZ,CAAb;;AAEAC,aAAa,GAAG,EAAhB,C,CAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAA,aAAa,CAACC,mBAAd,GACE,UAAUC,QAAV,EAAoBC,aAApB,EAAmCC,qBAAnC,EAA0D;AAC1D,MAAIC,IAAI,GAAGR,MAAM,CAACS,UAAP,CAAkB,MAAlB,CAAX,CAD0D,CAG1D;AACA;;AACA,MAAIC,UAAU,GAAGC,CAAC,CAACC,IAAF,CAAOC,yBAAP,EACf,CAAC,mBAAD,EAAsB,8BAAtB,EACC,0BADD,CADe,CAAjB;;AAIA,MAAIN,qBAAJ,EAA2B;AACzBG,cAAU,GAAGH,qBAAb;AACD;;AAEDC,MAAI,CAACM,MAAL,CAAYC,IAAI,CAACC,SAAL,CAAeN,UAAf,EAA2B,MAA3B,CAAZ;;AAEAC,GAAC,CAACM,IAAF,CAAOZ,QAAP,EAAiB,UAAUa,QAAV,EAAoB;AACjC,QAAI,CAAC,CAAEZ,aAAF,IAAmBA,aAAa,CAACY,QAAQ,CAACC,IAAV,CAAjC,MACCD,QAAQ,CAACE,KAAT,KAAmB,QAAnB,IAA+BF,QAAQ,CAACE,KAAT,KAAmB,UADnD,CAAJ,EACoE;AACpEZ,UAAI,CAACM,MAAL,CAAYI,QAAQ,CAACG,IAArB;AACAb,UAAI,CAACM,MAAL,CAAYI,QAAQ,CAACV,IAArB;AACD;AACF,GAND;;AAOA,SAAOA,IAAI,CAACc,MAAL,CAAY,KAAZ,CAAP;AACD,CAxBD;;AA0BAnB,aAAa,CAACoB,iCAAd,GACE,UAASC,eAAT,EAA0BC,cAA1B,EAA0C;AAC1C,QAAMjB,IAAI,GAAGR,MAAM,CAACS,UAAP,CAAkB,MAAlB,CAAb;AAEAD,MAAI,CAACM,MAAL,CAAYU,eAAZ,EAH0C,CAK1C;;AACA,QAAME,OAAO,GAAGC,MAAM,CAACC,IAAP,CAAYH,cAAZ,EAA4BI,IAA5B,EAAhB;;AACA,OAAK,IAAIC,MAAT,IAAmBJ,OAAnB,EAA4B;AAC1B,UAAMK,OAAO,GAAGN,cAAc,CAACK,MAAD,CAA9B;AACAtB,QAAI,CAACM,MAAL,CAAYgB,MAAZ;AACAtB,QAAI,CAACM,MAAL,CAAYiB,OAAZ;AACD;;AAED,SAAOvB,IAAI,CAACc,MAAL,CAAY,KAAZ,CAAP;AACD,CAfD,C","file":"/packages/webapp-hashing.js","sourcesContent":["var crypto = Npm.require(\"crypto\");\n\nWebAppHashing = {};\n\n// Calculate a hash of all the client resources downloaded by the\n// browser, including the application HTML, runtime config, code, and\n// static files.\n//\n// This hash *must* change if any resources seen by the browser\n// change, and ideally *doesn't* change for any server-only changes\n// (but the second is a performance enhancement, not a hard\n// requirement).\n\nWebAppHashing.calculateClientHash =\n function (manifest, includeFilter, runtimeConfigOverride) {\n var hash = crypto.createHash('sha1');\n\n // Omit the old hashed client values in the new hash. These may be\n // modified in the new boilerplate.\n var runtimeCfg = _.omit(__meteor_runtime_config__,\n ['autoupdateVersion', 'autoupdateVersionRefreshable',\n 'autoupdateVersionCordova']);\n\n if (runtimeConfigOverride) {\n runtimeCfg = runtimeConfigOverride;\n }\n\n hash.update(JSON.stringify(runtimeCfg, 'utf8'));\n\n _.each(manifest, function (resource) {\n if ((! includeFilter || includeFilter(resource.type)) &&\n (resource.where === 'client' || resource.where === 'internal')) {\n hash.update(resource.path);\n hash.update(resource.hash);\n }\n });\n return hash.digest('hex');\n};\n\nWebAppHashing.calculateCordovaCompatibilityHash =\n function(platformVersion, pluginVersions) {\n const hash = crypto.createHash('sha1');\n\n hash.update(platformVersion);\n\n // Sort plugins first so iteration order doesn't affect the hash\n const plugins = Object.keys(pluginVersions).sort();\n for (let plugin of plugins) {\n const version = pluginVersions[plugin];\n hash.update(plugin);\n hash.update(version);\n }\n\n return hash.digest('hex');\n};\n"]}
\ No newline at end of file
This diff could not be displayed because it is too large.
{"version":3,"sources":["meteor://💻app/packages/webapp/webapp_server.js","meteor://💻app/packages/webapp/connect.js","meteor://💻app/packages/webapp/socket_file.js"],"names":["module1","module","export","WebApp","WebAppInternals","assert","link","default","v","readFileSync","createServer","pathJoin","pathDirname","join","dirname","parseUrl","parse","createHash","connect","compress","cookieParser","query","parseRequest","basicAuth","lookupUserAgent","lookup","isModern","send","removeExistingSocketFile","registerSocketFileCleanup","onMessage","SHORT_SOCKET_TIMEOUT","LONG_SOCKET_TIMEOUT","hasOwn","Object","prototype","hasOwnProperty","NpmModules","version","Npm","require","defaultArch","clientPrograms","archPath","bundledJsCssUrlRewriteHook","url","bundledPrefix","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","sha1","contents","hash","update","digest","shouldCompress","req","res","headers","filter","camelCase","name","parts","split","toLowerCase","i","length","charAt","toUpperCase","substr","identifyBrowser","userAgentString","userAgent","family","major","minor","patch","categorizeRequest","_","extend","browser","pick","htmlAttributeHooks","getHtmlAttributes","request","combinedAttributes","each","hook","attributes","Error","addHtmlAttributeHook","push","appUrl","RoutePolicy","classify","Meteor","startup","getter","key","arch","program","value","calculateClientHash","clientHash","calculateClientHashRefreshable","calculateClientHashNonRefreshable","getRefreshableAssets","_timeoutAdjustmentRequestCallback","setTimeout","finishListeners","listeners","removeAllListeners","on","l","boilerplateByArch","boilerplateDataCallbacks","create","registerBoilerplateDataCallback","callback","previousCallback","strictEqual","getBoilerplate","getBoilerplateAsync","await","boilerplate","data","assign","baseData","htmlAttributes","madeChanges","promise","Promise","resolve","keys","forEach","then","result","stream","toHTMLStream","statusCode","generateBoilerplateInstance","manifest","additionalOptions","runtimeConfig","clone","runtimeConfigOverrides","Boilerplate","pathMapper","itemPath","baseDataExtension","additionalStaticJs","map","pathname","meteorRuntimeConfig","JSON","stringify","encodeURIComponent","rootUrlPathPrefix","sriMode","inlineScriptsAllowed","inline","staticFilesMiddleware","staticFilesByArch","next","method","decodeURIComponent","e","serveStaticJs","s","writeHead","write","end","has","path","getArchAndPath","paused","info","getStaticFileInfo","maxAge","cacheable","setHeader","sourceMapUrl","type","content","absolutePath","maxage","dotfiles","lastModified","err","Log","error","pipe","originalPath","call","staticArchList","archIndex","indexOf","unshift","splice","some","staticFiles","finalize","pathParts","archKey","startsWith","archCleaned","slice","parsePort","port","parsedPort","parseInt","Number","isNaN","pauseClient","generateClientProgram","runWebAppServer","shuttingDown","syncQueue","_SynchronousQueue","getItemPathname","itemUrl","reloadClientPrograms","runTask","configJson","__meteor_bootstrap__","clientArchs","clientPaths","stack","process","exit","unpause","clientDir","serverDir","programJsonPath","programJson","code","format","item","where","sourceMap","PUBLIC_SETTINGS","configOverrides","oldProgram","newProgram","WebAppHashing","versionRefreshable","versionNonRefreshable","cordovaCompatibilityVersions","manifestUrlPrefix","replace","manifestUrl","Package","autoupdate","AUTOUPDATE_VERSION","Autoupdate","autoupdateVersion","env","generateBoilerplateForArch","defaultOptionsForArch","DDP_DEFAULT_CONNECTION_URL","MOBILE_DDP_URL","absoluteUrl","ROOT_URL","MOBILE_ROOT_URL","generateBoilerplate","refreshableAssets","css","file","app","rawConnectHandlers","use","isValidUrl","getPathParts","shift","isPrefixOf","prefix","array","every","part","response","pathPrefix","prefixParts","meteorInternalHandlers","packageAndAppHandlers","suppressConnectErrors","status","newHeaders","catch","httpServer","onListeningCallbacks","socket","destroyed","message","destroy","connectHandlers","connectApp","onListening","f","startListening","listenOptions","cb","listen","exports","main","argv","startHttpServer","bindEnvironment","METEOR_PRINT_ON_LISTEN","console","log","callbacks","localPort","PORT","unixSocketPath","UNIX_SOCKET_PATH","test","host","BIND_IP","setInlineScriptsAllowed","enableSubresourceIntegrity","use_credentials","setBundledJsCssUrlRewriteHook","hookFn","setBundledJsCssPrefix","self","addStaticJs","npmConnect","connectArgs","handlers","apply","originalUse","useArgs","originalLength","entry","originalHandle","handle","asyncApply","arguments","statSync","unlinkSync","existsSync","socketPath","isSocket","eventEmitter","signal"],"mappings":"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","file":"/packages/webapp.js","sourcesContent":["import assert from \"assert\";\nimport { readFileSync } from \"fs\";\nimport { createServer } from \"http\";\nimport {\n join as pathJoin,\n dirname as pathDirname,\n} from \"path\";\nimport { parse as parseUrl } from \"url\";\nimport { createHash } from \"crypto\";\nimport { connect } from \"./connect.js\";\nimport compress from \"compression\";\nimport cookieParser from \"cookie-parser\";\nimport query from \"qs-middleware\";\nimport parseRequest from \"parseurl\";\nimport basicAuth from \"basic-auth-connect\";\nimport { lookup as lookupUserAgent } from \"useragent\";\nimport { isModern } from \"meteor/modern-browsers\";\nimport send from \"send\";\nimport {\n removeExistingSocketFile,\n registerSocketFileCleanup,\n} from './socket_file.js';\n\nvar SHORT_SOCKET_TIMEOUT = 5*1000;\nvar LONG_SOCKET_TIMEOUT = 120*1000;\n\nexport const WebApp = {};\nexport const WebAppInternals = {};\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// backwards compat to 2.0 of connect\nconnect.basicAuth = basicAuth;\n\nWebAppInternals.NpmModules = {\n connect: {\n version: Npm.require('connect/package.json').version,\n module: connect,\n }\n};\n\n// Though we might prefer to use web.browser (modern) as the default\n// architecture, safety requires a more compatible defaultArch.\nWebApp.defaultArch = 'web.browser.legacy';\n\n// XXX maps archs to manifests\nWebApp.clientPrograms = {};\n\n// XXX maps archs to program path on filesystem\nvar archPath = {};\n\nvar bundledJsCssUrlRewriteHook = function (url) {\n var bundledPrefix =\n __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || '';\n return bundledPrefix + url;\n};\n\nvar sha1 = function (contents) {\n var hash = createHash('sha1');\n hash.update(contents);\n return hash.digest('hex');\n};\n\n function shouldCompress(req, res) {\n if (req.headers['x-no-compression']) {\n // don't compress responses with this request header\n return false;\n }\n\n // fallback to standard filter function\n return compress.filter(req, res);\n};\n\n// #BrowserIdentification\n//\n// We have multiple places that want to identify the browser: the\n// unsupported browser page, the appcache package, and, eventually\n// delivering browser polyfills only as needed.\n//\n// To avoid detecting the browser in multiple places ad-hoc, we create a\n// Meteor \"browser\" object. It uses but does not expose the npm\n// useragent module (we could choose a different mechanism to identify\n// the browser in the future if we wanted to). The browser object\n// contains\n//\n// * `name`: the name of the browser in camel case\n// * `major`, `minor`, `patch`: integers describing the browser version\n//\n// Also here is an early version of a Meteor `request` object, intended\n// to be a high-level description of the request without exposing\n// details of connect's low-level `req`. Currently it contains:\n//\n// * `browser`: browser identification object described above\n// * `url`: parsed url, including parsed query params\n//\n// As a temporary hack there is a `categorizeRequest` function on WebApp which\n// converts a connect `req` to a Meteor `request`. This can go away once smart\n// packages such as appcache are being passed a `request` object directly when\n// they serve content.\n//\n// This allows `request` to be used uniformly: it is passed to the html\n// attributes hook, and the appcache package can use it when deciding\n// whether to generate a 404 for the manifest.\n//\n// Real routing / server side rendering will probably refactor this\n// heavily.\n\n\n// e.g. \"Mobile Safari\" => \"mobileSafari\"\nvar camelCase = function (name) {\n var parts = name.split(' ');\n parts[0] = parts[0].toLowerCase();\n for (var i = 1; i < parts.length; ++i) {\n parts[i] = parts[i].charAt(0).toUpperCase() + parts[i].substr(1);\n }\n return parts.join('');\n};\n\nvar identifyBrowser = function (userAgentString) {\n var userAgent = lookupUserAgent(userAgentString);\n return {\n name: camelCase(userAgent.family),\n major: +userAgent.major,\n minor: +userAgent.minor,\n patch: +userAgent.patch\n };\n};\n\n// XXX Refactor as part of implementing real routing.\nWebAppInternals.identifyBrowser = identifyBrowser;\n\nWebApp.categorizeRequest = function (req) {\n return _.extend({\n browser: identifyBrowser(req.headers['user-agent']),\n url: parseUrl(req.url, true)\n }, _.pick(req, 'dynamicHead', 'dynamicBody', 'headers', 'cookies'));\n};\n\n// HTML attribute hooks: functions to be called to determine any attributes to\n// be added to the '<html>' tag. Each function is passed a 'request' object (see\n// #BrowserIdentification) and should return null or object.\nvar htmlAttributeHooks = [];\nvar getHtmlAttributes = function (request) {\n var combinedAttributes = {};\n _.each(htmlAttributeHooks || [], function (hook) {\n var attributes = hook(request);\n if (attributes === null)\n return;\n if (typeof attributes !== 'object')\n throw Error(\"HTML attribute hook must return null or object\");\n _.extend(combinedAttributes, attributes);\n });\n return combinedAttributes;\n};\nWebApp.addHtmlAttributeHook = function (hook) {\n htmlAttributeHooks.push(hook);\n};\n\n// Serve app HTML for this URL?\nvar appUrl = function (url) {\n if (url === '/favicon.ico' || url === '/robots.txt')\n return false;\n\n // NOTE: app.manifest is not a web standard like favicon.ico and\n // robots.txt. It is a file name we have chosen to use for HTML5\n // appcache URLs. It is included here to prevent using an appcache\n // then removing it from poisoning an app permanently. Eventually,\n // once we have server side routing, this won't be needed as\n // unknown URLs with return a 404 automatically.\n if (url === '/app.manifest')\n return false;\n\n // Avoid serving app HTML for declared routes such as /sockjs/.\n if (RoutePolicy.classify(url))\n return false;\n\n // we currently return app HTML on all URLs by default\n return true;\n};\n\n\n// We need to calculate the client hash after all packages have loaded\n// to give them a chance to populate __meteor_runtime_config__.\n//\n// Calculating the hash during startup means that packages can only\n// populate __meteor_runtime_config__ during load, not during startup.\n//\n// Calculating instead it at the beginning of main after all startup\n// hooks had run would allow packages to also populate\n// __meteor_runtime_config__ during startup, but that's too late for\n// autoupdate because it needs to have the client hash at startup to\n// insert the auto update version itself into\n// __meteor_runtime_config__ to get it to the client.\n//\n// An alternative would be to give autoupdate a \"post-start,\n// pre-listen\" hook to allow it to insert the auto update version at\n// the right moment.\n\nMeteor.startup(function () {\n function getter(key) {\n return function (arch) {\n arch = arch || WebApp.defaultArch;\n const program = WebApp.clientPrograms[arch];\n const value = program && program[key];\n // If this is the first time we have calculated this hash,\n // program[key] will be a thunk (lazy function with no parameters)\n // that we should call to do the actual computation.\n return typeof value === \"function\"\n ? program[key] = value()\n : value;\n };\n }\n\n WebApp.calculateClientHash = WebApp.clientHash = getter(\"version\");\n WebApp.calculateClientHashRefreshable = getter(\"versionRefreshable\");\n WebApp.calculateClientHashNonRefreshable = getter(\"versionNonRefreshable\");\n WebApp.getRefreshableAssets = getter(\"refreshableAssets\");\n});\n\n\n\n// When we have a request pending, we want the socket timeout to be long, to\n// give ourselves a while to serve it, and to allow sockjs long polls to\n// complete. On the other hand, we want to close idle sockets relatively\n// quickly, so that we can shut down relatively promptly but cleanly, without\n// cutting off anyone's response.\nWebApp._timeoutAdjustmentRequestCallback = function (req, res) {\n // this is really just req.socket.setTimeout(LONG_SOCKET_TIMEOUT);\n req.setTimeout(LONG_SOCKET_TIMEOUT);\n // Insert our new finish listener to run BEFORE the existing one which removes\n // the response from the socket.\n var finishListeners = res.listeners('finish');\n // XXX Apparently in Node 0.12 this event was called 'prefinish'.\n // https://github.com/joyent/node/commit/7c9b6070\n // But it has switched back to 'finish' in Node v4:\n // https://github.com/nodejs/node/pull/1411\n res.removeAllListeners('finish');\n res.on('finish', function () {\n res.setTimeout(SHORT_SOCKET_TIMEOUT);\n });\n _.each(finishListeners, function (l) { res.on('finish', l); });\n};\n\n\n// Will be updated by main before we listen.\n// Map from client arch to boilerplate object.\n// Boilerplate object has:\n// - func: XXX\n// - baseData: XXX\nvar boilerplateByArch = {};\n\n// Register a callback function that can selectively modify boilerplate\n// data given arguments (request, data, arch). The key should be a unique\n// identifier, to prevent accumulating duplicate callbacks from the same\n// call site over time. Callbacks will be called in the order they were\n// registered. A callback should return false if it did not make any\n// changes affecting the boilerplate. Passing null deletes the callback.\n// Any previous callback registered for this key will be returned.\nconst boilerplateDataCallbacks = Object.create(null);\nWebAppInternals.registerBoilerplateDataCallback = function (key, callback) {\n const previousCallback = boilerplateDataCallbacks[key];\n\n if (typeof callback === \"function\") {\n boilerplateDataCallbacks[key] = callback;\n } else {\n assert.strictEqual(callback, null);\n delete boilerplateDataCallbacks[key];\n }\n\n // Return the previous callback in case the new callback needs to call\n // it; for example, when the new callback is a wrapper for the old.\n return previousCallback || null;\n};\n\n// Given a request (as returned from `categorizeRequest`), return the\n// boilerplate HTML to serve for that request.\n//\n// If a previous connect middleware has rendered content for the head or body,\n// returns the boilerplate with that content patched in otherwise\n// memoizes on HTML attributes (used by, eg, appcache) and whether inline\n// scripts are currently allowed.\n// XXX so far this function is always called with arch === 'web.browser'\nfunction getBoilerplate(request, arch) {\n return getBoilerplateAsync(request, arch).await();\n}\n\nfunction getBoilerplateAsync(request, arch) {\n const boilerplate = boilerplateByArch[arch];\n const data = Object.assign({}, boilerplate.baseData, {\n htmlAttributes: getHtmlAttributes(request),\n }, _.pick(request, \"dynamicHead\", \"dynamicBody\"));\n\n let madeChanges = false;\n let promise = Promise.resolve();\n\n Object.keys(boilerplateDataCallbacks).forEach(key => {\n promise = promise.then(() => {\n const callback = boilerplateDataCallbacks[key];\n return callback(request, data, arch);\n }).then(result => {\n // Callbacks should return false if they did not make any changes.\n if (result !== false) {\n madeChanges = true;\n }\n });\n });\n\n return promise.then(() => ({\n stream: boilerplate.toHTMLStream(data),\n statusCode: data.statusCode,\n headers: data.headers,\n }));\n}\n\nWebAppInternals.generateBoilerplateInstance = function (arch,\n manifest,\n additionalOptions) {\n additionalOptions = additionalOptions || {};\n\n var runtimeConfig = _.extend(\n _.clone(__meteor_runtime_config__),\n additionalOptions.runtimeConfigOverrides || {}\n );\n\n return new Boilerplate(arch, manifest, _.extend({\n pathMapper(itemPath) {\n return pathJoin(archPath[arch], itemPath);\n },\n baseDataExtension: {\n additionalStaticJs: _.map(\n additionalStaticJs || [],\n function (contents, pathname) {\n return {\n pathname: pathname,\n contents: contents\n };\n }\n ),\n // Convert to a JSON string, then get rid of most weird characters, then\n // wrap in double quotes. (The outermost JSON.stringify really ought to\n // just be \"wrap in double quotes\" but we use it to be safe.) This might\n // end up inside a <script> tag so we need to be careful to not include\n // \"</script>\", but normal {{spacebars}} escaping escapes too much! See\n // https://github.com/meteor/meteor/issues/3730\n meteorRuntimeConfig: JSON.stringify(\n encodeURIComponent(JSON.stringify(runtimeConfig))),\n rootUrlPathPrefix: __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || '',\n bundledJsCssUrlRewriteHook: bundledJsCssUrlRewriteHook,\n sriMode: sriMode,\n inlineScriptsAllowed: WebAppInternals.inlineScriptsAllowed(),\n inline: additionalOptions.inline\n }\n }, additionalOptions));\n};\n\n// A mapping from url path to architecture (e.g. \"web.browser\") to static\n// file information with the following fields:\n// - type: the type of file to be served\n// - cacheable: optionally, whether the file should be cached or not\n// - sourceMapUrl: optionally, the url of the source map\n//\n// Info also contains one of the following:\n// - content: the stringified content that should be served at this path\n// - absolutePath: the absolute path on disk to the file\n\n// Serve static files from the manifest or added with\n// `addStaticJs`. Exported for tests.\nWebAppInternals.staticFilesMiddleware = async function (\n staticFilesByArch,\n req,\n res,\n next,\n) {\n if ('GET' != req.method && 'HEAD' != req.method && 'OPTIONS' != req.method) {\n next();\n return;\n }\n var pathname = parseRequest(req).pathname;\n try {\n pathname = decodeURIComponent(pathname);\n } catch (e) {\n next();\n return;\n }\n\n var serveStaticJs = function (s) {\n res.writeHead(200, {\n 'Content-type': 'application/javascript; charset=UTF-8'\n });\n res.write(s);\n res.end();\n };\n\n if (_.has(additionalStaticJs, pathname) &&\n ! WebAppInternals.inlineScriptsAllowed()) {\n serveStaticJs(additionalStaticJs[pathname]);\n return;\n }\n\n const { arch, path } = getArchAndPath(\n pathname,\n identifyBrowser(req.headers[\"user-agent\"]),\n );\n\n // If pauseClient(arch) has been called, program.paused will be a\n // Promise that will be resolved when the program is unpaused.\n const program = WebApp.clientPrograms[arch];\n await program.paused;\n\n if (path === \"/meteor_runtime_config.js\" &&\n ! WebAppInternals.inlineScriptsAllowed()) {\n serveStaticJs(`__meteor_runtime_config__ = ${program.meteorRuntimeConfig};`);\n return;\n }\n\n const info = getStaticFileInfo(staticFilesByArch, pathname, path, arch);\n if (! info) {\n next();\n return;\n }\n\n // We don't need to call pause because, unlike 'static', once we call into\n // 'send' and yield to the event loop, we never call another handler with\n // 'next'.\n\n // Cacheable files are files that should never change. Typically\n // named by their hash (eg meteor bundled js and css files).\n // We cache them ~forever (1yr).\n const maxAge = info.cacheable\n ? 1000 * 60 * 60 * 24 * 365\n : 0;\n\n if (info.cacheable) {\n // Since we use req.headers[\"user-agent\"] to determine whether the\n // client should receive modern or legacy resources, tell the client\n // to invalidate cached resources when/if its user agent string\n // changes in the future.\n res.setHeader(\"Vary\", \"User-Agent\");\n }\n\n // Set the X-SourceMap header, which current Chrome, FireFox, and Safari\n // understand. (The SourceMap header is slightly more spec-correct but FF\n // doesn't understand it.)\n //\n // You may also need to enable source maps in Chrome: open dev tools, click\n // the gear in the bottom right corner, and select \"enable source maps\".\n if (info.sourceMapUrl) {\n res.setHeader('X-SourceMap',\n __meteor_runtime_config__.ROOT_URL_PATH_PREFIX +\n info.sourceMapUrl);\n }\n\n if (info.type === \"js\" ||\n info.type === \"dynamic js\") {\n res.setHeader(\"Content-Type\", \"application/javascript; charset=UTF-8\");\n } else if (info.type === \"css\") {\n res.setHeader(\"Content-Type\", \"text/css; charset=UTF-8\");\n } else if (info.type === \"json\") {\n res.setHeader(\"Content-Type\", \"application/json; charset=UTF-8\");\n }\n\n if (info.hash) {\n res.setHeader('ETag', '\"' + info.hash + '\"');\n }\n\n if (info.content) {\n res.write(info.content);\n res.end();\n } else {\n send(req, info.absolutePath, {\n maxage: maxAge,\n dotfiles: 'allow', // if we specified a dotfile in the manifest, serve it\n lastModified: false // don't set last-modified based on the file date\n }).on('error', function (err) {\n Log.error(\"Error serving static file \" + err);\n res.writeHead(500);\n res.end();\n }).on('directory', function () {\n Log.error(\"Unexpected directory \" + info.absolutePath);\n res.writeHead(500);\n res.end();\n }).pipe(res);\n }\n};\n\nfunction getStaticFileInfo(staticFilesByArch, originalPath, path, arch) {\n if (! hasOwn.call(WebApp.clientPrograms, arch)) {\n return null;\n }\n\n // Get a list of all available static file architectures, with arch\n // first in the list if it exists.\n const staticArchList = Object.keys(staticFilesByArch);\n const archIndex = staticArchList.indexOf(arch);\n if (archIndex > 0) {\n staticArchList.unshift(staticArchList.splice(archIndex, 1)[0]);\n }\n\n let info = null;\n\n staticArchList.some(arch => {\n const staticFiles = staticFilesByArch[arch];\n\n function finalize(path) {\n info = staticFiles[path];\n // Sometimes we register a lazy function instead of actual data in\n // the staticFiles manifest.\n if (typeof info === \"function\") {\n info = staticFiles[path] = info();\n }\n return info;\n }\n\n // If staticFiles contains originalPath with the arch inferred above,\n // use that information.\n if (hasOwn.call(staticFiles, originalPath)) {\n return finalize(originalPath);\n }\n\n // If getArchAndPath returned an alternate path, try that instead.\n if (path !== originalPath &&\n hasOwn.call(staticFiles, path)) {\n return finalize(path);\n }\n });\n\n return info;\n}\n\nfunction getArchAndPath(path, browser) {\n const pathParts = path.split(\"/\");\n const archKey = pathParts[1];\n\n if (archKey.startsWith(\"__\")) {\n const archCleaned = \"web.\" + archKey.slice(2);\n if (hasOwn.call(WebApp.clientPrograms, archCleaned)) {\n pathParts.splice(1, 1); // Remove the archKey part.\n return {\n arch: archCleaned,\n path: pathParts.join(\"/\"),\n };\n }\n }\n\n // TODO Perhaps one day we could infer Cordova clients here, so that we\n // wouldn't have to use prefixed \"/__cordova/...\" URLs.\n const arch = isModern(browser)\n ? \"web.browser\"\n : \"web.browser.legacy\";\n\n if (hasOwn.call(WebApp.clientPrograms, arch)) {\n return { arch, path };\n }\n\n return {\n arch: WebApp.defaultArch,\n path,\n };\n}\n\n// Parse the passed in port value. Return the port as-is if it's a String\n// (e.g. a Windows Server style named pipe), otherwise return the port as an\n// integer.\n//\n// DEPRECATED: Direct use of this function is not recommended; it is no\n// longer used internally, and will be removed in a future release.\nWebAppInternals.parsePort = port => {\n let parsedPort = parseInt(port);\n if (Number.isNaN(parsedPort)) {\n parsedPort = port;\n }\n return parsedPort;\n}\n\nimport { onMessage } from \"meteor/inter-process-messaging\";\n\nonMessage(\"webapp-pause-client\", async ({ arch }) => {\n WebAppInternals.pauseClient(arch);\n});\n\nonMessage(\"webapp-reload-client\", async ({ arch }) => {\n WebAppInternals.generateClientProgram(arch);\n});\n\nfunction runWebAppServer() {\n var shuttingDown = false;\n var syncQueue = new Meteor._SynchronousQueue();\n\n var getItemPathname = function (itemUrl) {\n return decodeURIComponent(parseUrl(itemUrl).pathname);\n };\n\n WebAppInternals.reloadClientPrograms = function () {\n syncQueue.runTask(function() {\n const staticFilesByArch = Object.create(null);\n\n const { configJson } = __meteor_bootstrap__;\n const clientArchs = configJson.clientArchs ||\n Object.keys(configJson.clientPaths);\n\n try {\n clientArchs.forEach(arch => {\n generateClientProgram(arch, staticFilesByArch);\n });\n WebAppInternals.staticFilesByArch = staticFilesByArch;\n } catch (e) {\n Log.error(\"Error reloading the client program: \" + e.stack);\n process.exit(1);\n }\n });\n };\n\n // Pause any incoming requests and make them wait for the program to be\n // unpaused the next time generateClientProgram(arch) is called.\n WebAppInternals.pauseClient = function (arch) {\n syncQueue.runTask(() => {\n const program = WebApp.clientPrograms[arch];\n const { unpause } = program;\n program.paused = new Promise(resolve => {\n if (typeof unpause === \"function\") {\n // If there happens to be an existing program.unpause function,\n // compose it with the resolve function.\n program.unpause = function () {\n unpause();\n resolve();\n };\n } else {\n program.unpause = resolve;\n }\n });\n });\n };\n\n WebAppInternals.generateClientProgram = function (arch) {\n syncQueue.runTask(() => generateClientProgram(arch));\n };\n\n function generateClientProgram(\n arch,\n staticFilesByArch = WebAppInternals.staticFilesByArch,\n ) {\n const clientDir = pathJoin(\n pathDirname(__meteor_bootstrap__.serverDir),\n arch,\n );\n\n // read the control for the client we'll be serving up\n const programJsonPath = pathJoin(clientDir, \"program.json\");\n\n let programJson;\n try {\n programJson = JSON.parse(readFileSync(programJsonPath));\n } catch (e) {\n if (e.code === \"ENOENT\") return;\n throw e;\n }\n\n if (programJson.format !== \"web-program-pre1\") {\n throw new Error(\"Unsupported format for client assets: \" +\n JSON.stringify(programJson.format));\n }\n\n if (! programJsonPath || ! clientDir || ! programJson) {\n throw new Error(\"Client config file not parsed.\");\n }\n\n archPath[arch] = clientDir;\n const staticFiles = staticFilesByArch[arch] = Object.create(null);\n\n const { manifest } = programJson;\n manifest.forEach(item => {\n if (item.url && item.where === \"client\") {\n staticFiles[getItemPathname(item.url)] = {\n absolutePath: pathJoin(clientDir, item.path),\n cacheable: item.cacheable,\n hash: item.hash,\n // Link from source to its map\n sourceMapUrl: item.sourceMapUrl,\n type: item.type\n };\n\n if (item.sourceMap) {\n // Serve the source map too, under the specified URL. We assume\n // all source maps are cacheable.\n staticFiles[getItemPathname(item.sourceMapUrl)] = {\n absolutePath: pathJoin(clientDir, item.sourceMap),\n cacheable: true\n };\n }\n }\n });\n\n const { PUBLIC_SETTINGS } = __meteor_runtime_config__;\n const configOverrides = {\n PUBLIC_SETTINGS,\n };\n\n const oldProgram = WebApp.clientPrograms[arch];\n const newProgram = WebApp.clientPrograms[arch] = {\n format: \"web-program-pre1\",\n manifest: manifest,\n // Use arrow functions so that these versions can be lazily\n // calculated later, and so that they will not be included in the\n // staticFiles[manifestUrl].content string below.\n //\n // Note: these version calculations must be kept in agreement with\n // CordovaBuilder#appendVersion in tools/cordova/builder.js, or hot\n // code push will reload Cordova apps unnecessarily.\n version: () => WebAppHashing.calculateClientHash(\n manifest, null, configOverrides),\n versionRefreshable: () => WebAppHashing.calculateClientHash(\n manifest, type => type === \"css\", configOverrides),\n versionNonRefreshable: () => WebAppHashing.calculateClientHash(\n manifest, type => type !== \"css\", configOverrides),\n cordovaCompatibilityVersions: programJson.cordovaCompatibilityVersions,\n PUBLIC_SETTINGS,\n };\n\n // Expose program details as a string reachable via the following URL.\n const manifestUrlPrefix = \"/__\" + arch.replace(/^web\\./, \"\");\n const manifestUrl = manifestUrlPrefix + getItemPathname(\"/manifest.json\");\n\n staticFiles[manifestUrl] = () => {\n if (Package.autoupdate) {\n const {\n AUTOUPDATE_VERSION =\n Package.autoupdate.Autoupdate.autoupdateVersion\n } = process.env;\n\n if (AUTOUPDATE_VERSION) {\n newProgram.version = AUTOUPDATE_VERSION;\n }\n }\n\n if (typeof newProgram.version === \"function\") {\n newProgram.version = newProgram.version();\n }\n\n return {\n content: JSON.stringify(newProgram),\n cacheable: false,\n hash: newProgram.version,\n type: \"json\"\n };\n };\n\n generateBoilerplateForArch(arch);\n\n // If there are any requests waiting on oldProgram.paused, let them\n // continue now (using the new program).\n if (oldProgram &&\n oldProgram.paused) {\n oldProgram.unpause();\n }\n };\n\n const defaultOptionsForArch = {\n 'web.cordova': {\n runtimeConfigOverrides: {\n // XXX We use absoluteUrl() here so that we serve https://\n // URLs to cordova clients if force-ssl is in use. If we were\n // to use __meteor_runtime_config__.ROOT_URL instead of\n // absoluteUrl(), then Cordova clients would immediately get a\n // HCP setting their DDP_DEFAULT_CONNECTION_URL to\n // http://example.meteor.com. This breaks the app, because\n // force-ssl doesn't serve CORS headers on 302\n // redirects. (Plus it's undesirable to have clients\n // connecting to http://example.meteor.com when force-ssl is\n // in use.)\n DDP_DEFAULT_CONNECTION_URL: process.env.MOBILE_DDP_URL ||\n Meteor.absoluteUrl(),\n ROOT_URL: process.env.MOBILE_ROOT_URL ||\n Meteor.absoluteUrl()\n }\n },\n\n \"web.browser\": {\n runtimeConfigOverrides: {\n isModern: true,\n }\n },\n\n \"web.browser.legacy\": {\n runtimeConfigOverrides: {\n isModern: false,\n }\n },\n };\n\n WebAppInternals.generateBoilerplate = function () {\n // This boilerplate will be served to the mobile devices when used with\n // Meteor/Cordova for the Hot-Code Push and since the file will be served by\n // the device's server, it is important to set the DDP url to the actual\n // Meteor server accepting DDP connections and not the device's file server.\n syncQueue.runTask(function() {\n Object.keys(WebApp.clientPrograms)\n .forEach(generateBoilerplateForArch);\n });\n };\n\n function generateBoilerplateForArch(arch) {\n const program = WebApp.clientPrograms[arch];\n const additionalOptions = defaultOptionsForArch[arch] || {};\n const { baseData } = boilerplateByArch[arch] =\n WebAppInternals.generateBoilerplateInstance(\n arch,\n program.manifest,\n additionalOptions,\n );\n // We need the runtime config with overrides for meteor_runtime_config.js:\n program.meteorRuntimeConfig = JSON.stringify({\n ...__meteor_runtime_config__,\n ...(additionalOptions.runtimeConfigOverrides || null),\n });\n program.refreshableAssets = baseData.css.map(file => ({\n url: bundledJsCssUrlRewriteHook(file.url),\n }));\n }\n\n WebAppInternals.reloadClientPrograms();\n\n // webserver\n var app = connect();\n\n // Packages and apps can add handlers that run before any other Meteor\n // handlers via WebApp.rawConnectHandlers.\n var rawConnectHandlers = connect();\n app.use(rawConnectHandlers);\n\n // Auto-compress any json, javascript, or text.\n app.use(compress({filter: shouldCompress}));\n\n // parse cookies into an object\n app.use(cookieParser());\n\n // We're not a proxy; reject (without crashing) attempts to treat us like\n // one. (See #1212.)\n app.use(function(req, res, next) {\n if (RoutePolicy.isValidUrl(req.url)) {\n next();\n return;\n }\n res.writeHead(400);\n res.write(\"Not a proxy\");\n res.end();\n });\n\n // Parse the query string into res.query. Used by oauth_server, but it's\n // generally pretty handy..\n //\n // Do this before the next middleware destroys req.url if a path prefix\n // is set to close #10111.\n app.use(query());\n\n function getPathParts(path) {\n const parts = path.split(\"/\");\n while (parts[0] === \"\") parts.shift();\n return parts;\n }\n\n function isPrefixOf(prefix, array) {\n return prefix.length <= array.length &&\n prefix.every((part, i) => part === array[i]);\n }\n\n // Strip off the path prefix, if it exists.\n app.use(function (request, response, next) {\n const pathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;\n const { pathname } = parseUrl(request.url);\n\n // check if the path in the url starts with the path prefix\n if (pathPrefix) {\n const prefixParts = getPathParts(pathPrefix);\n const pathParts = getPathParts(pathname);\n if (isPrefixOf(prefixParts, pathParts)) {\n request.url = \"/\" + pathParts.slice(prefixParts.length).join(\"/\");\n return next();\n }\n }\n\n if (pathname === \"/favicon.ico\" ||\n pathname === \"/robots.txt\") {\n return next();\n }\n\n if (pathPrefix) {\n response.writeHead(404);\n response.write(\"Unknown path\");\n response.end();\n return;\n }\n\n next();\n });\n\n // Serve static files from the manifest.\n // This is inspired by the 'static' middleware.\n app.use(function (req, res, next) {\n WebAppInternals.staticFilesMiddleware(\n WebAppInternals.staticFilesByArch,\n req, res, next\n );\n });\n\n // Core Meteor packages like dynamic-import can add handlers before\n // other handlers added by package and application code.\n app.use(WebAppInternals.meteorInternalHandlers = connect());\n\n // Packages and apps can add handlers to this via WebApp.connectHandlers.\n // They are inserted before our default handler.\n var packageAndAppHandlers = connect();\n app.use(packageAndAppHandlers);\n\n var suppressConnectErrors = false;\n // connect knows it is an error handler because it has 4 arguments instead of\n // 3. go figure. (It is not smart enough to find such a thing if it's hidden\n // inside packageAndAppHandlers.)\n app.use(function (err, req, res, next) {\n if (!err || !suppressConnectErrors || !req.headers['x-suppress-error']) {\n next(err);\n return;\n }\n res.writeHead(err.status, { 'Content-Type': 'text/plain' });\n res.end(\"An error message\");\n });\n\n app.use(async function (req, res, next) {\n if (! appUrl(req.url)) {\n return next();\n\n } else {\n var headers = {\n 'Content-Type': 'text/html; charset=utf-8'\n };\n\n if (shuttingDown) {\n headers['Connection'] = 'Close';\n }\n\n var request = WebApp.categorizeRequest(req);\n\n if (request.url.query && request.url.query['meteor_css_resource']) {\n // In this case, we're requesting a CSS resource in the meteor-specific\n // way, but we don't have it. Serve a static css file that indicates that\n // we didn't have it, so we can detect that and refresh. Make sure\n // that any proxies or CDNs don't cache this error! (Normally proxies\n // or CDNs are smart enough not to cache error pages, but in order to\n // make this hack work, we need to return the CSS file as a 200, which\n // would otherwise be cached.)\n headers['Content-Type'] = 'text/css; charset=utf-8';\n headers['Cache-Control'] = 'no-cache';\n res.writeHead(200, headers);\n res.write(\".meteor-css-not-found-error { width: 0px;}\");\n res.end();\n return;\n }\n\n if (request.url.query && request.url.query['meteor_js_resource']) {\n // Similarly, we're requesting a JS resource that we don't have.\n // Serve an uncached 404. (We can't use the same hack we use for CSS,\n // because actually acting on that hack requires us to have the JS\n // already!)\n headers['Cache-Control'] = 'no-cache';\n res.writeHead(404, headers);\n res.end(\"404 Not Found\");\n return;\n }\n\n if (request.url.query && request.url.query['meteor_dont_serve_index']) {\n // When downloading files during a Cordova hot code push, we need\n // to detect if a file is not available instead of inadvertently\n // downloading the default index page.\n // So similar to the situation above, we serve an uncached 404.\n headers['Cache-Control'] = 'no-cache';\n res.writeHead(404, headers);\n res.end(\"404 Not Found\");\n return;\n }\n\n const { arch } = getArchAndPath(\n parseRequest(req).pathname,\n request.browser,\n );\n\n // If pauseClient(arch) has been called, program.paused will be a\n // Promise that will be resolved when the program is unpaused.\n await WebApp.clientPrograms[arch].paused;\n\n return getBoilerplateAsync(request, arch).then(({\n stream,\n statusCode,\n headers: newHeaders,\n }) => {\n if (!statusCode) {\n statusCode = res.statusCode ? res.statusCode : 200;\n }\n\n if (newHeaders) {\n Object.assign(headers, newHeaders);\n }\n\n res.writeHead(statusCode, headers);\n\n stream.pipe(res, {\n // End the response when the stream ends.\n end: true,\n });\n\n }).catch(error => {\n Log.error(\"Error running template: \" + error.stack);\n res.writeHead(500, headers);\n res.end();\n });\n }\n });\n\n // Return 404 by default, if no other handlers serve this URL.\n app.use(function (req, res) {\n res.writeHead(404);\n res.end();\n });\n\n\n var httpServer = createServer(app);\n var onListeningCallbacks = [];\n\n // After 5 seconds w/o data on a socket, kill it. On the other hand, if\n // there's an outstanding request, give it a higher timeout instead (to avoid\n // killing long-polling requests)\n httpServer.setTimeout(SHORT_SOCKET_TIMEOUT);\n\n // Do this here, and then also in livedata/stream_server.js, because\n // stream_server.js kills all the current request handlers when installing its\n // own.\n httpServer.on('request', WebApp._timeoutAdjustmentRequestCallback);\n\n // If the client gave us a bad request, tell it instead of just closing the\n // socket. This lets load balancers in front of us differentiate between \"a\n // server is randomly closing sockets for no reason\" and \"client sent a bad\n // request\".\n //\n // This will only work on Node 6; Node 4 destroys the socket before calling\n // this event. See https://github.com/nodejs/node/pull/4557/ for details.\n httpServer.on('clientError', (err, socket) => {\n // Pre-Node-6, do nothing.\n if (socket.destroyed) {\n return;\n }\n\n if (err.message === 'Parse Error') {\n socket.end('HTTP/1.1 400 Bad Request\\r\\n\\r\\n');\n } else {\n // For other errors, use the default behavior as if we had no clientError\n // handler.\n socket.destroy(err);\n }\n });\n\n // start up app\n _.extend(WebApp, {\n connectHandlers: packageAndAppHandlers,\n rawConnectHandlers: rawConnectHandlers,\n httpServer: httpServer,\n connectApp: app,\n // For testing.\n suppressConnectErrors: function () {\n suppressConnectErrors = true;\n },\n onListening: function (f) {\n if (onListeningCallbacks)\n onListeningCallbacks.push(f);\n else\n f();\n },\n // This can be overridden by users who want to modify how listening works\n // (eg, to run a proxy like Apollo Engine Proxy in front of the server).\n startListening: function (httpServer, listenOptions, cb) {\n httpServer.listen(listenOptions, cb);\n },\n });\n\n // Let the rest of the packages (and Meteor.startup hooks) insert connect\n // middlewares and update __meteor_runtime_config__, then keep going to set up\n // actually serving HTML.\n exports.main = argv => {\n WebAppInternals.generateBoilerplate();\n\n const startHttpServer = listenOptions => {\n WebApp.startListening(httpServer, listenOptions, Meteor.bindEnvironment(() => {\n if (process.env.METEOR_PRINT_ON_LISTEN) {\n console.log(\"LISTENING\");\n }\n const callbacks = onListeningCallbacks;\n onListeningCallbacks = null;\n callbacks.forEach(callback => { callback(); });\n }, e => {\n console.error(\"Error listening:\", e);\n console.error(e && e.stack);\n }));\n };\n\n let localPort = process.env.PORT || 0;\n const unixSocketPath = process.env.UNIX_SOCKET_PATH;\n\n if (unixSocketPath) {\n // Start the HTTP server using a socket file.\n removeExistingSocketFile(unixSocketPath);\n startHttpServer({ path: unixSocketPath });\n registerSocketFileCleanup(unixSocketPath);\n } else {\n localPort = isNaN(Number(localPort)) ? localPort : Number(localPort);\n if (/\\\\\\\\?.+\\\\pipe\\\\?.+/.test(localPort)) {\n // Start the HTTP server using Windows Server style named pipe.\n startHttpServer({ path: localPort });\n } else if (typeof localPort === \"number\") {\n // Start the HTTP server using TCP.\n startHttpServer({\n port: localPort,\n host: process.env.BIND_IP || \"0.0.0.0\"\n });\n } else {\n throw new Error(\"Invalid PORT specified\");\n }\n }\n\n return \"DAEMON\";\n };\n}\n\nvar inlineScriptsAllowed = true;\n\nWebAppInternals.inlineScriptsAllowed = function () {\n return inlineScriptsAllowed;\n};\n\nWebAppInternals.setInlineScriptsAllowed = function (value) {\n inlineScriptsAllowed = value;\n WebAppInternals.generateBoilerplate();\n};\n\nvar sriMode;\n\nWebAppInternals.enableSubresourceIntegrity = function(use_credentials = false) {\n sriMode = use_credentials ? 'use-credentials' : 'anonymous';\n WebAppInternals.generateBoilerplate();\n};\n\nWebAppInternals.setBundledJsCssUrlRewriteHook = function (hookFn) {\n bundledJsCssUrlRewriteHook = hookFn;\n WebAppInternals.generateBoilerplate();\n};\n\nWebAppInternals.setBundledJsCssPrefix = function (prefix) {\n var self = this;\n self.setBundledJsCssUrlRewriteHook(\n function (url) {\n return prefix + url;\n });\n};\n\n// Packages can call `WebAppInternals.addStaticJs` to specify static\n// JavaScript to be included in the app. This static JS will be inlined,\n// unless inline scripts have been disabled, in which case it will be\n// served under `/<sha1 of contents>`.\nvar additionalStaticJs = {};\nWebAppInternals.addStaticJs = function (contents) {\n additionalStaticJs[\"/\" + sha1(contents) + \".js\"] = contents;\n};\n\n// Exported for tests\nWebAppInternals.getBoilerplate = getBoilerplate;\nWebAppInternals.additionalStaticJs = additionalStaticJs;\n\n// Start the server!\nrunWebAppServer();\n","import npmConnect from \"connect\";\n\nexport function connect(...connectArgs) {\n const handlers = npmConnect.apply(this, connectArgs);\n const originalUse = handlers.use;\n\n // Wrap the handlers.use method so that any provided handler functions\n // alway run in a Fiber.\n handlers.use = function use(...useArgs) {\n const { stack } = this;\n const originalLength = stack.length;\n const result = originalUse.apply(this, useArgs);\n\n // If we just added anything to the stack, wrap each new entry.handle\n // with a function that calls Promise.asyncApply to ensure the\n // original handler runs in a Fiber.\n for (let i = originalLength; i < stack.length; ++i) {\n const entry = stack[i];\n const originalHandle = entry.handle;\n\n if (originalHandle.length >= 4) {\n // If the original handle had four (or more) parameters, the\n // wrapper must also have four parameters, since connect uses\n // handle.length to dermine whether to pass the error as the first\n // argument to the handle function.\n entry.handle = function handle(err, req, res, next) {\n return Promise.asyncApply(originalHandle, this, arguments);\n };\n } else {\n entry.handle = function handle(req, res, next) {\n return Promise.asyncApply(originalHandle, this, arguments);\n };\n }\n }\n\n return result;\n };\n\n return handlers;\n}\n","import { statSync, unlinkSync, existsSync } from 'fs';\n\n// Since a new socket file will be created when the HTTP server\n// starts up, if found remove the existing file.\n//\n// WARNING:\n// This will remove the configured socket file without warning. If\n// the configured socket file is already in use by another application,\n// it will still be removed. Node does not provide a reliable way to\n// differentiate between a socket file that is already in use by\n// another application or a stale socket file that has been\n// left over after a SIGKILL. Since we have no reliable way to\n// differentiate between these two scenarios, the best course of\n// action during startup is to remove any existing socket file. This\n// is not the safest course of action as removing the existing socket\n// file could impact an application using it, but this approach helps\n// ensure the HTTP server can startup without manual\n// intervention (e.g. asking for the verification and cleanup of socket\n// files before allowing the HTTP server to be started).\n//\n// The above being said, as long as the socket file path is\n// configured carefully when the application is deployed (and extra\n// care is taken to make sure the configured path is unique and doesn't\n// conflict with another socket file path), then there should not be\n// any issues with this approach.\nexport const removeExistingSocketFile = (socketPath) => {\n try {\n if (statSync(socketPath).isSocket()) {\n // Since a new socket file will be created, remove the existing\n // file.\n unlinkSync(socketPath);\n } else {\n throw new Error(\n `An existing file was found at \"${socketPath}\" and it is not ` +\n 'a socket file. Please confirm PORT is pointing to valid and ' +\n 'un-used socket file path.'\n );\n }\n } catch (error) {\n // If there is no existing socket file to cleanup, great, we'll\n // continue normally. If the caught exception represents any other\n // issue, re-throw.\n if (error.code !== 'ENOENT') {\n throw error;\n }\n }\n};\n\n// Remove the socket file when done to avoid leaving behind a stale one.\n// Note - a stale socket file is still left behind if the running node\n// process is killed via signal 9 - SIGKILL.\nexport const registerSocketFileCleanup =\n (socketPath, eventEmitter = process) => {\n ['exit', 'SIGINT', 'SIGHUP', 'SIGTERM'].forEach(signal => {\n eventEmitter.on(signal, Meteor.bindEnvironment(() => {\n if (existsSync(socketPath)) {\n unlinkSync(socketPath);\n }\n }));\n });\n };\n"]}
\ No newline at end of file
// Tiny profiler
//
// Enable by setting the environment variable `METEOR_PROFILE`.
//
// The main entry point is `Profile`, which wraps an existing function
// and returns a new function which, when called, calls the original
// function and profiles it.
//
// before:
//
// foo: function (a) {
// return a + this.b;
// },
//
// after:
//
// foo: Profile("foo", function (a) {
// return a + this.b;
// }),
//
// The advantage of this form is that it doesn't change the
// indentation of the wrapped code, which makes merging changes from
// other code branches easier.
//
// If profiling is disabled (if `METEOR_PROFILE` isn't set), `Profile`
// simply returns the original function.
//
// To run a profiling session and print the report, call `Profile.run`:
//
// var createBundle = function () {
// Profile.run("bundle", function () {
// ...code to create the bundle which includes calls to `Profile`.
// });
// };
//
// Code is not profiled when called outside of a `Profile.run`, so the
// times in the report only include the time spent inside of the call
// to `Profile.run`.
//
// Sometimes you'll want to use a name for the profile bucket which
// depends on the arguments passed to the function or the value of
// `this`. In this case you can pass a function for the bucket
// argument, which will be called to get the bucket name.
//
// before:
// build: function (target) {
// ... build target ...
// },
//
// after:
// build: Profile(
// function (target) { return "build " + target; },
// function (target) {
// ... build target ...
// }),
//
// But if it's easier, you can use `Profile.time` instead, which
// immediately calls the passed function with no arguments and
// profiles it, and returns what the function returns.
//
// foo: function (a) {
// var self = this;
// return Profile.time("foo", function () {
// return a + self.b;
// });
// },
//
// build: function (target) {
// var self = this;
// self.doSomeSetup();
// Profile.time("build " + target, function () {
// ... build target ...
// });
// self.doSomeCleanup();
// },
//
// The disadvantage is that you end up changing the indentation of the
// profiled code, which makes merging branches more painful. But you
// can profile anywhere in the code; you don't have to just profile at
// function boundaries.
//
// Note profiling code will itself add a bit of execution time.
// If you profile in a tight loop and your total execution time is
// going up, you're probably starting to profile how long it takes to
// profile things :).
//
// If another profile (such as "compile js") is called while the first
// function is currently being profiled, this creates an entry like
// this:
//
// build client : compile js
//
// which can continue to be nested, e.g.,
//
// build client : compile js : read source files
//
// The total time reported for a bucket such as "build client" doesn't
// change regardless of whether it has child entries or not. However,
// if an entry has child entries, it automatically gets an "other"
// entry:
//
// build client: 400.0
// compile js: 300.0
// read source files: 20.0
// other compile js: 280.0
// other build client: 100.0
//
// The "other" entry reports how much time was spent in the "build
// client" entry not spent in the other child entries.
//
// The are two reports displayed: the hierarchical report and the
// leaf time report. The hierarchical report looks like the example
// above and shows how much time was spent in each entry within its
// parent entry.
//
// The primary purpose of the hierarchical report is to be able to see
// where times are unaccounted for. If you see a lot of time being
// spent in an "other" bucket, and you don't know what it is, you can
// add more profiling to dig deeper.
//
// The leaf time report shows the total time spent within leaf
// buckets. For example, if if multiple steps have "read source
// files", the leaf time reports shows the total amount of time spent
// in "read source files" across all calls.
//
// Once you see in the hierarchical report that you have a good handle
// on accounting for most of the time, the leaf report shows you which
// buckets are the most expensive.
//
// By only including leaf buckets, the times in the leaf report are
// non-overlapping. (The total of the times equals the elapsed time
// being profiled).
//
// For example, suppose "A" is profiled for a total time of 200ms, and
// that includes a call to "B" of 150ms:
//
// B: 150
// A (without B): 50
//
// and suppose there's another call to "A" which *doesn't* include a
// call to "B":
//
// A: 300
//
// and there's a call to "B" directly:
//
// B: 100
//
// All for a total time of 600ms. In the hierarchical report, this
// looks like:
//
// A: 500.0
// B: 150.0
// other A: 350.0
// B: 100.0
//
// and in the leaf time report:
//
// other A: 350.0
// B: 250.0
//
// In both reports the grand total is 600ms.
var _ = require('underscore');
var Fiber = require('fibers');
Profile.enabled = !!process.env['METEOR_PROFILE'];
var filter = parseFloat(process.env['METEOR_PROFILE']); // ms
if (isNaN(filter)) {
filter = 100; // ms
}
var bucketStats = {};
var SPACES_STR = ' '; // return a string of `x` spaces
var spaces = function (x) {
while (SPACES_STR.length < x) {
SPACES_STR = SPACES_STR + SPACES_STR;
}
return SPACES_STR.slice(0, x);
};
var DOTS_STR = '.'; // return a string of `x` dots
var dots = function (x) {
while (DOTS_STR.length < x) {
DOTS_STR = DOTS_STR + DOTS_STR;
}
return DOTS_STR.slice(0, x);
};
var leftAlign = function (str, len) {
if (str.length < len) {
str = str + spaces(len - str.length);
}
return str;
};
var rightAlign = function (str, len) {
if (str.length < len) {
str = spaces(len - str.length) + str;
}
return str;
};
var leftRightAlign = function (str1, str2, len) {
var middle = Math.max(1, len - str1.length - str2.length);
return str1 + spaces(middle) + str2;
};
var leftRightDots = function (str1, str2, len) {
var middle = Math.max(1, len - str1.length - str2.length);
return str1 + dots(middle) + str2;
};
var printIndentation = function (isLastLeafStack) {
if (_.isEmpty(isLastLeafStack)) {
return '';
}
var init = _.map(_.initial(isLastLeafStack), function (isLastLeaf) {
return isLastLeaf ? ' ' : '│ ';
}).join('');
var last = _.last(isLastLeafStack) ? '└─ ' : '├─ ';
return init + last;
};
var formatMs = function (n) {
// integer with thousands separators
return String(Math.round(n)).replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " ms";
};
var encodeEntryKey = function (entry) {
return entry.join('\t');
};
var decodeEntryKey = function (key) {
return key.split('\t');
};
var globalEntry = [];
var running = false;
var runningName;
var start = function () {
bucketStats = {};
running = true;
};
function Profile(bucketName, f) {
if (!Profile.enabled) {
return f;
}
return Object.assign(function profileWrapper() {
if (!running) {
return f.apply(this, arguments);
}
var name;
if (_.isFunction(bucketName)) {
name = bucketName.apply(this, arguments);
} else {
name = bucketName;
}
var currentEntry;
if (Fiber.current) {
currentEntry = Fiber.current.profilerEntry || (Fiber.current.profilerEntry = []);
} else {
currentEntry = globalEntry;
}
currentEntry.push(name);
var key = encodeEntryKey(currentEntry);
var start = process.hrtime();
var err = null;
try {
return f.apply(this, arguments);
} catch (e) {
err = e;
} finally {
var elapsed = process.hrtime(start);
var stats = bucketStats[key] || (bucketStats[key] = {
time: 0.0,
count: 0
});
stats.time += elapsed[0] * 1000 + elapsed[1] / 1000000;
stats.count++;
currentEntry.pop();
}
if (err) {
throw err;
}
}, f);
}
var time = function (bucket, f) {
return Profile(bucket, f)();
};
var entries = null;
var prefix = "| ";
var entryName = function (entry) {
return _.last(entry);
};
var entryStats = function (entry) {
return bucketStats[encodeEntryKey(entry)];
};
var entryTime = function (entry) {
return entryStats(entry).time;
};
var isTopLevelEntry = function (entry) {
return entry.length === 1;
};
var topLevelEntries = function () {
return _.filter(entries, isTopLevelEntry);
};
var print = function (text) {
console.log(prefix + text);
};
var isChild = function (entry1, entry2) {
if (entry2.length !== entry1.length + 1) {
return false;
}
for (var i = entry1.length - 1; i >= 0; i--) {
if (entry1[i] !== entry2[i]) {
return false;
}
}
return true;
};
var children = function (entry1) {
return _.filter(entries, function (entry2) {
return isChild(entry1, entry2);
});
};
var hasChildren = function (entry) {
return children(entry).length !== 0;
};
var hasSignificantChildren = function (entry) {
return _.some(children(entry), function (entry) {
return entryTime(entry) >= filter;
});
};
var isLeaf = function (entry) {
return !hasChildren(entry);
};
var otherTime = function (entry) {
var total = 0;
_.each(children(entry), function (child) {
total += entryTime(child);
});
return entryTime(entry) - total;
};
var injectOtherTime = function (entry) {
var name = "other " + entryName(entry);
var other = _.clone(entry);
other.push(name);
bucketStats[encodeEntryKey(other)] = {
time: otherTime(entry),
count: entryStats(entry).count,
isOther: true
};
entries.push(other);
};
var reportOn = function (entry, isLastLeafStack) {
isLastLeafStack = isLastLeafStack || [];
var stats = entryStats(entry);
var isParent = hasSignificantChildren(entry);
var name = entryName(entry);
print((isParent ? leftRightDots : leftRightAlign)(printIndentation(isLastLeafStack) + name, formatMs(stats.time), 70) + (stats.isOther ? "" : " (" + stats.count + ")"));
if (isParent) {
var childrenList = _.filter(children(entry), function (entry) {
var stats = entryStats(entry);
return stats.time > filter;
});
_.each(childrenList, function (child, i) {
var isLastLeaf = i === childrenList.length - 1;
reportOn(child, isLastLeafStack.concat(isLastLeaf));
});
}
};
var reportHierarchy = function () {
_.each(topLevelEntries(), function (entry) {
reportOn(entry);
});
};
var allLeafs = function () {
return _.union(_.map(_.filter(entries, isLeaf), entryName));
};
var leafTotals = function (leafName) {
var time = 0;
var count = 0;
_.each(_.filter(entries, function (entry) {
return entryName(entry) === leafName && isLeaf(entry);
}), function (leaf) {
var stats = entryStats(leaf);
time += stats.time;
count += stats.count;
});
return {
time,
count
};
};
var reportHotLeaves = function () {
print('Top leaves:');
var totals = [];
_.each(allLeafs(), function (leaf) {
var info = leafTotals(leaf);
totals.push({
name: leaf,
time: info.time,
count: info.count
});
});
totals.sort(function (a, b) {
return a.time === b.time ? 0 : a.time > b.time ? -1 : 1;
});
_.each(totals, function (total) {
if (total.time < 100) {
// hard-coded larger filter to quality as "hot" here
return;
}
print(leftRightDots(total.name, formatMs(total.time), 65) + ` (${total.count})`);
});
};
var getTopLevelTotal = function () {
var topTotal = 0;
_.each(topLevelEntries(), function (entry) {
topTotal += entryTime(entry);
});
return topTotal;
};
var setupReport = function () {
entries = _.map(_.keys(bucketStats), decodeEntryKey);
_.each(_.filter(entries, hasSignificantChildren), function (parent) {
injectOtherTime(parent);
});
};
var reportNum = 1;
var report = function () {
if (!Profile.enabled) {
return;
}
running = false;
print('');
setupReport();
reportHierarchy();
print('');
reportHotLeaves();
print('');
print(`(#${reportNum}) Total: ${formatMs(getTopLevelTotal())}` + ` (${runningName})`);
print('');
};
var run = function (bucketName, f) {
if (!Profile.enabled) {
return f();
} else if (running) {
// We've kept the calls to Profile.run in the tool disjoint so far,
// and should probably keep doing so, but if we mess up, warn and continue.
console.log("Warning: Nested Profile.run at " + bucketName);
return time(bucketName, f);
} else {
runningName = bucketName;
print(`(#${reportNum}) Profiling: ${runningName}`);
start();
try {
return time(bucketName, f);
} finally {
report();
reportNum++;
}
}
};
Profile.time = time;
Profile.run = run;
exports.Profile = Profile;
//# sourceMappingURL=profile.js.map
\ No newline at end of file
{
"format": "javascript-image-pre1",
"arch": "os",
"load": [
{
"node_modules": "npm/node_modules/meteor/meteor/node_modules",
"path": "packages/meteor.js"
},
{
"path": "packages/meteor-base.js"
},
{
"path": "packages/mobile-experience.js"
},
{
"node_modules": "npm/node_modules/meteor/npm-mongo/node_modules",
"path": "packages/npm-mongo.js"
},
{
"path": "packages/ecmascript-runtime.js"
},
{
"node_modules": "npm/node_modules/meteor/modules-runtime/node_modules",
"path": "packages/modules-runtime.js"
},
{
"node_modules": "npm/node_modules/meteor/modules/node_modules",
"path": "packages/modules.js"
},
{
"path": "packages/modern-browsers.js"
},
{
"node_modules": "npm/node_modules/meteor/es5-shim/node_modules",
"path": "packages/es5-shim.js"
},
{
"node_modules": "npm/node_modules/meteor/promise/node_modules",
"path": "packages/promise.js"
},
{
"node_modules": "npm/node_modules/meteor/ecmascript-runtime-client/node_modules",
"path": "packages/ecmascript-runtime-client.js"
},
{
"node_modules": "npm/node_modules/meteor/ecmascript-runtime-server/node_modules",
"path": "packages/ecmascript-runtime-server.js"
},
{
"node_modules": "npm/node_modules/meteor/babel-compiler/node_modules",
"path": "packages/babel-compiler.js"
},
{
"sourceMap": "packages/ecmascript.js.map",
"path": "packages/ecmascript.js"
},
{
"node_modules": "npm/node_modules/meteor/babel-runtime/node_modules",
"path": "packages/babel-runtime.js"
},
{
"node_modules": "npm/node_modules/meteor/fetch/node_modules",
"path": "packages/fetch.js"
},
{
"node_modules": "npm/node_modules/meteor/inter-process-messaging/node_modules",
"path": "packages/inter-process-messaging.js"
},
{
"path": "packages/dynamic-import.js"
},
{
"sourceMap": "packages/base64.js.map",
"path": "packages/base64.js"
},
{
"sourceMap": "packages/ejson.js.map",
"path": "packages/ejson.js"
},
{
"sourceMap": "packages/diff-sequence.js.map",
"path": "packages/diff-sequence.js"
},
{
"path": "packages/geojson-utils.js"
},
{
"sourceMap": "packages/id-map.js.map",
"path": "packages/id-map.js"
},
{
"sourceMap": "packages/random.js.map",
"path": "packages/random.js"
},
{
"sourceMap": "packages/mongo-id.js.map",
"path": "packages/mongo-id.js"
},
{
"sourceMap": "packages/ordered-dict.js.map",
"path": "packages/ordered-dict.js"
},
{
"sourceMap": "packages/tracker.js.map",
"path": "packages/tracker.js"
},
{
"sourceMap": "packages/minimongo.js.map",
"path": "packages/minimongo.js"
},
{
"sourceMap": "packages/check.js.map",
"path": "packages/check.js"
},
{
"sourceMap": "packages/retry.js.map",
"path": "packages/retry.js"
},
{
"sourceMap": "packages/callback-hook.js.map",
"path": "packages/callback-hook.js"
},
{
"sourceMap": "packages/ddp-common.js.map",
"path": "packages/ddp-common.js"
},
{
"path": "packages/reload.js"
},
{
"node_modules": "npm/node_modules/meteor/socket-stream-client/node_modules",
"sourceMap": "packages/socket-stream-client.js.map",
"path": "packages/socket-stream-client.js"
},
{
"node_modules": "npm/node_modules/meteor/ddp-client/node_modules",
"sourceMap": "packages/ddp-client.js.map",
"path": "packages/ddp-client.js"
},
{
"path": "packages/underscore.js"
},
{
"node_modules": "npm/node_modules/meteor/logging/node_modules",
"sourceMap": "packages/logging.js.map",
"path": "packages/logging.js"
},
{
"sourceMap": "packages/routepolicy.js.map",
"path": "packages/routepolicy.js"
},
{
"node_modules": "npm/node_modules/meteor/boilerplate-generator/node_modules",
"sourceMap": "packages/boilerplate-generator.js.map",
"path": "packages/boilerplate-generator.js"
},
{
"sourceMap": "packages/webapp-hashing.js.map",
"path": "packages/webapp-hashing.js"
},
{
"node_modules": "npm/node_modules/meteor/webapp/node_modules",
"sourceMap": "packages/webapp.js.map",
"path": "packages/webapp.js"
},
{
"path": "packages/autopublish.js"
},
{
"node_modules": "npm/node_modules/meteor/ddp-server/node_modules",
"sourceMap": "packages/ddp-server.js.map",
"path": "packages/ddp-server.js"
},
{
"path": "packages/ddp.js"
},
{
"sourceMap": "packages/allow-deny.js.map",
"path": "packages/allow-deny.js"
},
{
"node_modules": "npm/node_modules/meteor/mongo-decimal/node_modules",
"sourceMap": "packages/mongo-decimal.js.map",
"path": "packages/mongo-decimal.js"
},
{
"sourceMap": "packages/binary-heap.js.map",
"path": "packages/binary-heap.js"
},
{
"path": "packages/insecure.js"
},
{
"node_modules": "npm/node_modules/meteor/mongo/node_modules",
"sourceMap": "packages/mongo.js.map",
"path": "packages/mongo.js"
},
{
"path": "packages/blaze-html-templates.js"
},
{
"path": "packages/reactive-var.js"
},
{
"path": "packages/standard-minifier-css.js"
},
{
"path": "packages/standard-minifier-js.js"
},
{
"sourceMap": "packages/shell-server.js.map",
"path": "packages/shell-server.js"
},
{
"path": "packages/livedata.js"
},
{
"path": "packages/hot-code-push.js"
},
{
"path": "packages/launch-screen.js"
},
{
"path": "packages/jquery.js"
},
{
"path": "packages/observe-sequence.js"
},
{
"path": "packages/deps.js"
},
{
"path": "packages/htmljs.js"
},
{
"path": "packages/blaze.js"
},
{
"path": "packages/ui.js"
},
{
"path": "packages/spacebars.js"
},
{
"path": "packages/templating-compiler.js"
},
{
"path": "packages/templating-runtime.js"
},
{
"path": "packages/templating.js"
},
{
"sourceMap": "packages/autoupdate.js.map",
"path": "packages/autoupdate.js"
},
{
"node_modules": "npm/node_modules",
"path": "app/global-imports.js"
},
{
"node_modules": "npm/node_modules",
"sourceMap": "app/app.js.map",
"path": "app/app.js"
}
]
}
\ No newline at end of file
var fs = require("fs");
var path = require("path");
var serverJsonPath = path.resolve(process.argv[2]);
module.exports = JSON.parse(
fs.readFileSync(serverJsonPath, 'utf8').normalize('NFC')
);
body{padding:10px;font-family:sans-serif}
\ No newline at end of file
{
"minifier": {
"name": "standard-minifier-js",
"version": "2.4.1"
},
"totalMinifiedBytes": 512621,
"totalMinifiedGzipBytes": 154402,
"minifiedBytesByPackage": {
"packages/meteor.js": 9484,
"packages/meteor-base.js": 31,
"packages/mobile-experience.js": 37,
"packages/modules-runtime.js": 4199,
"packages/modules.js": [
14664,
{
"node_modules": {
"meteor": {
"modules": {
"client.js": 124,
"css.js": 261,
"install-packages.js": 1866,
"process.js": 347,
"reify.js": 71,
"stubs.js": 97,
"node_modules": {
"reify": {
"lib": {
"runtime": {
"index.js": 933,
"utils.js": 1217,
"entry.js": 3299
}
}
}
}
}
},
"meteor-node-stubs": {
"package.json": 85,
"index.js": 354,
"map.json": 946,
"deps": {
"process.js": 36
},
"node_modules": {
"process": {
"browser.js": 1686
}
}
},
"@babel": {
"runtime": {
"package.json": 492,
"helpers": {
"interopRequireDefault.js": 79,
"typeof.js": 505,
"toConsumableArray.js": 148,
"arrayWithoutHoles.js": 132,
"iterableToArray.js": 153,
"nonIterableSpread.js": 112,
"inheritsLoose.js": 123,
"objectSpread.js": 380,
"defineProperty.js": 148,
"assertThisInitialized.js": 151
}
}
}
}
}
],
"packages/modern-browsers.js": 35,
"packages/babel-compiler.js": 34,
"packages/ecmascript.js": 30,
"packages/ecmascript-runtime.js": 38,
"packages/babel-runtime.js": [
1566,
{
"node_modules": {
"meteor": {
"babel-runtime": {
"babel-runtime.js": 678,
"node_modules": {
"meteor-babel-helpers": {
"package.json": 88,
"index.js": 389
}
}
}
}
}
}
],
"packages/promise.js": [
5590,
{
"node_modules": {
"meteor": {
"promise": {
"modern.js": 23,
"legacy.js": 95,
"client.js": 71,
"extensions.js": 391,
"node_modules": {
"promise": {
"lib": {
"es6-extensions.js": 1211,
"core.js": 1828
}
},
"asap": {
"package.json": 247,
"raw.js": 63,
"browser-raw.js": 671
},
"meteor-promise": {
"package.json": 119,
"promise_client.js": 266
}
}
}
}
}
}
],
"packages/fetch.js": [
7837,
{
"node_modules": {
"meteor": {
"fetch": {
"legacy.js": 110,
"node_modules": {
"whatwg-fetch": {
"package.json": 80,
"fetch.js": 7273
}
}
}
}
}
}
],
"packages/dynamic-import.js": [
4583,
{
"node_modules": {
"meteor": {
"dynamic-import": {
"client.js": 1552,
"cache.js": 1930,
"common.js": 60,
"dynamic-versions.js": 640
}
}
}
}
],
"packages/es5-shim.js": [
28121,
{
"node_modules": {
"meteor": {
"es5-shim": {
"client.js": 132,
"console.js": 289,
"export_globals.js": 152,
"import_globals.js": 75,
"node_modules": {
"es5-shim": {
"es5-shim.js": 22233,
"es5-sham.js": 4829
}
}
}
}
}
}
],
"packages/ecmascript-runtime-client.js": [
77305,
{
"node_modules": {
"meteor": {
"ecmascript-runtime-client": {
"modern.js": 683,
"legacy.js": 1344,
"node_modules": {
"core-js": {
"modules": {
"es6.symbol.js": 3582,
"_global.js": 184,
"_has.js": 84,
"_descriptors.js": 123,
"_fails.js": 74,
"_export.js": 530,
"_core.js": 76,
"_hide.js": 167,
"_object-dp.js": 334,
"_an-object.js": 121,
"_is-object.js": 94,
"_ie8-dom-define.js": 168,
"_dom-create.js": 147,
"_to-primitive.js": 342,
"_property-desc.js": 111,
"_redefine.js": 496,
"_uid.js": 129,
"_ctx.js": 303,
"_a-function.js": 113,
"_meta.js": 608,
"_shared.js": 284,
"_library.js": 29,
"_set-to-string-tag.js": 173,
"_wks.js": 190,
"_wks-ext.js": 30,
"_wks-define.js": 226,
"_enum-keys.js": 208,
"_object-keys.js": 127,
"_object-keys-internal.js": 261,
"_to-iobject.js": 94,
"_iobject.js": 143,
"_cof.js": 86,
"_defined.js": 103,
"_array-includes.js": 291,
"_to-length.js": 113,
"_to-integer.js": 102,
"_to-absolute-index.js": 121,
"_shared-key.js": 107,
"_enum-bug-keys.js": 133,
"_object-gops.js": 47,
"_object-pie.js": 42,
"_is-array.js": 94,
"_object-create.js": 577,
"_object-dps.js": 225,
"_html.js": 77,
"_object-gopn-ext.js": 316,
"_object-gopn.js": 163,
"_object-gopd.js": 313,
"es6.map.js": 346,
"_collection-strong.js": 1600,
"_redefine-all.js": 104,
"_an-instance.js": 140,
"_for-of.js": 520,
"_iter-call.js": 161,
"_is-array-iter.js": 150,
"_iterators.js": 29,
"core.get-iterator-method.js": 187,
"_classof.js": 343,
"_iter-define.js": 1013,
"_iter-create.js": 255,
"_object-gpo.js": 290,
"_to-object.js": 81,
"_iter-step.js": 66,
"_set-species.js": 219,
"_validate-collection.js": 151,
"_collection.js": 1283,
"_iter-detect.js": 303,
"_inherit-if-required.js": 198,
"_set-proto.js": 444,
"es6.set.js": 280,
"es6.string.iterator.js": 258,
"_string-at.js": 317,
"es6.array.is-array.js": 75,
"es6.array.from.js": 654,
"_create-property.js": 134,
"es6.array.of.js": 312,
"es6.array.join.js": 211,
"_strict-method.js": 143,
"es6.array.slice.js": 419,
"es6.array.sort.js": 308,
"es6.array.for-each.js": 189,
"_array-methods.js": 491,
"_array-species-create.js": 101,
"_array-species-constructor.js": 257,
"es6.array.map.js": 177,
"es6.array.filter.js": 183,
"es6.array.some.js": 179,
"es6.array.every.js": 181,
"es6.array.reduce.js": 199,
"_array-reduce.js": 368,
"es6.array.reduce-right.js": 209,
"es6.array.index-of.js": 251,
"es6.array.last-index-of.js": 429,
"es6.array.copy-within.js": 128,
"_array-copy-within.js": 367,
"_add-to-unscopables.js": 134,
"es6.array.fill.js": 109,
"_array-fill.js": 279,
"es6.array.find.js": 256,
"es6.array.find-index.js": 264,
"es6.array.species.js": 41,
"es6.array.iterator.js": 415,
"es6.function.bind.js": 71,
"_bind.js": 476,
"_invoke.js": 343,
"es6.function.name.js": 215,
"es6.function.has-instance.js": 317,
"es6.math.acosh.js": 257,
"_math-log1p.js": 102,
"es6.math.asinh.js": 173,
"es6.math.atanh.js": 146,
"es6.math.cbrt.js": 130,
"_math-sign.js": 86,
"es6.math.clz32.js": 129,
"es6.math.cosh.js": 104,
"es6.math.expm1.js": 98,
"_math-expm1.js": 191,
"es6.math.fround.js": 76,
"_math-fround.js": 271,
"es6.math.hypot.js": 230,
"es6.math.imul.js": 252,
"es6.math.log10.js": 101,
"es6.math.log1p.js": 74,
"es6.math.log2.js": 97,
"es6.math.sign.js": 72,
"es6.math.sinh.js": 232,
"es6.math.tanh.js": 168,
"es6.math.trunc.js": 106,
"es6.object.create.js": 80,
"es6.object.define-property.js": 111,
"es6.object.define-properties.js": 112,
"es6.object.get-own-property-descriptor.js": 161,
"_object-sap.js": 185,
"es6.object.get-prototype-of.js": 143,
"es6.object.keys.js": 134,
"es6.object.get-own-property-names.js": 99,
"es6.object.freeze.js": 149,
"es6.object.seal.js": 147,
"es6.object.prevent-extensions.js": 160,
"es6.object.is-frozen.js": 125,
"es6.object.is-sealed.js": 125,
"es6.object.is-extensible.js": 131,
"es6.object.assign.js": 84,
"_object-assign.js": 533,
"es6.object.is.js": 73,
"_same-value.js": 94,
"es6.object.set-prototype-of.js": 88,
"es6.object.to-string.js": 198,
"es6.regexp.constructor.js": 753,
"_is-regexp.js": 158,
"_flags.js": 206,
"es6.regexp.to-string.js": 439,
"es6.regexp.flags.js": 132,
"es6.regexp.match.js": 191,
"_fix-re-wks.js": 379,
"es6.regexp.replace.js": 191,
"es6.regexp.search.js": 192,
"es6.regexp.split.js": 1286,
"es6.string.from-code-point.js": 385,
"es6.string.raw.js": 252,
"es6.string.trim.js": 104,
"_string-trim.js": 390,
"_string-ws.js": 108,
"es6.string.code-point-at.js": 132,
"es6.string.ends-with.js": 357,
"_string-context.js": 167,
"_fails-is-regexp.js": 153,
"es6.string.includes.js": 228,
"es6.string.repeat.js": 80,
"_string-repeat.js": 237,
"es6.string.starts-with.js": 339,
"es6.string.anchor.js": 118,
"_string-html.js": 357,
"es6.string.big.js": 113,
"es6.string.blink.js": 117,
"es6.string.bold.js": 112,
"es6.string.fixed.js": 114,
"es6.string.fontcolor.js": 125,
"es6.string.fontsize.js": 123,
"es6.string.italics.js": 115,
"es6.string.link.js": 116,
"es6.string.small.js": 117,
"es6.string.strike.js": 119,
"es6.string.sub.js": 113,
"es6.string.sup.js": 113,
"es6.weak-map.js": 886,
"_collection-weak.js": 1095,
"web.dom.iterable.js": 886,
"es6.weak-set.js": 265,
"es7.array.includes.js": 211,
"es7.array.flat-map.js": 330,
"_flatten-into-array.js": 409,
"es7.array.flatten.js": 336,
"es7.object.get-own-property-descriptors.js": 279,
"_own-keys.js": 196,
"es7.object.values.js": 115,
"_object-to-array.js": 231,
"es7.object.entries.js": 116,
"es7.object.define-getter.js": 262,
"_object-forced-pam.js": 172,
"es7.object.define-setter.js": 262,
"es7.object.lookup-getter.js": 299,
"es7.object.lookup-setter.js": 299,
"es7.string.pad-start.js": 237,
"_string-pad.js": 289,
"_user-agent.js": 78,
"es7.string.pad-end.js": 235,
"es6.number.epsilon.js": 75,
"es6.number.is-finite.js": 132,
"es6.number.is-integer.js": 80,
"_is-integer.js": 113,
"es6.number.is-nan.js": 84,
"es6.number.is-safe-integer.js": 148,
"es6.number.max-safe-integer.js": 85,
"es6.number.min-safe-integer.js": 86,
"es6.number.parse-float.js": 113,
"_parse-float.js": 200,
"es6.number.parse-int.js": 107,
"_parse-int.js": 228,
"es6.typed.uint8-array.js": 103,
"_typed-array.js": 6990,
"_typed.js": 382,
"_typed-buffer.js": 3650,
"_to-index.js": 177,
"_species-constructor.js": 180,
"es6.typed.uint32-array.js": 104
},
"es6": {
"array.js": 793,
"function.js": 167,
"math.js": 574,
"object.js": 757,
"regexp.js": 299,
"string.js": 951,
"weak-map.js": 157,
"weak-set.js": 155
},
"es7": {
"array.js": 158,
"object.js": 344
}
}
}
}
}
}
}
],
"packages/base64.js": [
1995,
{
"node_modules": {
"meteor": {
"base64": {
"base64.js": 1494
}
}
}
}
],
"packages/ejson.js": [
7279,
{
"node_modules": {
"meteor": {
"ejson": {
"ejson.js": 5746,
"stringify.js": 1001
}
}
}
}
],
"packages/diff-sequence.js": [
3072,
{
"node_modules": {
"meteor": {
"diff-sequence": {
"diff.js": 2524
}
}
}
}
],
"packages/geojson-utils.js": [
5171,
{
"node_modules": {
"meteor": {
"geojson-utils": {
"main.js": 48,
"geojson-utils.js": 4784
}
}
}
}
],
"packages/id-map.js": [
1833,
{
"node_modules": {
"meteor": {
"id-map": {
"id-map.js": 1314
}
}
}
}
],
"packages/random.js": [
3709,
{
"node_modules": {
"meteor": {
"random": {
"random.js": 3217
}
}
}
}
],
"packages/mongo-id.js": [
2383,
{
"node_modules": {
"meteor": {
"mongo-id": {
"id.js": 1809
}
}
}
}
],
"packages/ordered-dict.js": [
3975,
{
"node_modules": {
"meteor": {
"ordered-dict": {
"ordered_dict.js": 3437
}
}
}
}
],
"packages/tracker.js": [
5250,
{
"node_modules": {
"meteor": {
"tracker": {
"tracker.js": 4743
}
}
}
}
],
"packages/minimongo.js": [
47518,
{
"node_modules": {
"meteor": {
"minimongo": {
"minimongo_client.js": 48,
"common.js": 13388,
"cursor.js": 5121,
"local_collection.js": 21021,
"matcher.js": 2932,
"minimongo_common.js": 235,
"observe_handle.js": 100,
"sorter.js": 3704
}
}
}
}
],
"packages/check.js": [
6735,
{
"node_modules": {
"meteor": {
"check": {
"match.js": 5866,
"isPlainObject.js": 327
}
}
}
}
],
"packages/retry.js": [
1484,
{
"node_modules": {
"meteor": {
"retry": {
"retry.js": 970
}
}
}
}
],
"packages/callback-hook.js": [
1794,
{
"node_modules": {
"meteor": {
"callback-hook": {
"hook.js": 1281
}
}
}
}
],
"packages/ddp-common.js": [
5516,
{
"node_modules": {
"meteor": {
"ddp-common": {
"namespace.js": 16,
"heartbeat.js": 1687,
"utils.js": 1569,
"method_invocation.js": 587,
"random_stream.js": 699
}
}
}
}
],
"packages/reload.js": [
2237,
{
"node_modules": {
"meteor": {
"reload": {
"reload.js": 1736
}
}
}
}
],
"packages/socket-stream-client.js": [
38338,
{
"node_modules": {
"meteor": {
"socket-stream-client": {
"sockjs-0.3.4.js": 30489,
"browser.js": 3583,
"common.js": 2930,
"urls.js": 739
}
}
}
}
],
"packages/ddp-client.js": [
25498,
{
"node_modules": {
"meteor": {
"ddp-client": {
"client": {
"client.js": 134,
"client_convenience.js": 912
},
"common": {
"MethodInvoker.js": 1379,
"livedata_connection.js": 21047,
"namespace.js": 1060
}
}
}
}
}
],
"packages/ddp.js": 78,
"packages/ddp-server.js": 30,
"packages/allow-deny.js": [
6140,
{
"node_modules": {
"meteor": {
"allow-deny": {
"allow-deny.js": 5463
}
}
}
}
],
"packages/insecure.js": 28,
"packages/mongo.js": [
9420,
{
"node_modules": {
"meteor": {
"mongo": {
"local_collection_driver.js": 438,
"collection.js": 8058
}
}
}
}
],
"packages/blaze-html-templates.js": 40,
"packages/reactive-var.js": 818,
"packages/standard-minifier-css.js": 41,
"packages/standard-minifier-js.js": 40,
"packages/shell-server.js": 32,
"packages/autopublish.js": 31,
"packages/webapp.js": [
887,
{
"node_modules": {
"meteor": {
"webapp": {
"webapp_client.js": 372
}
}
}
}
],
"packages/livedata.js": 105,
"packages/hot-code-push.js": 33,
"packages/jquery.js": [
97271,
{
"node_modules": {
"meteor": {
"jquery": {
"main.js": 134,
"jquery.js": 96823
}
}
}
}
],
"packages/underscore.js": 14349,
"packages/observe-sequence.js": 2915,
"packages/deps.js": 111,
"packages/htmljs.js": 10030,
"packages/blaze.js": 39095,
"packages/spacebars.js": 2928,
"packages/templating-compiler.js": 39,
"packages/templating-runtime.js": 3045,
"packages/templating.js": 103,
"packages/launch-screen.js": 787,
"packages/ui.js": 137,
"packages/autoupdate.js": [
4103,
{
"node_modules": {
"meteor": {
"autoupdate": {
"autoupdate_client.js": 1935,
"client_versions.js": 1508
}
}
}
}
],
"app/global-imports.js": [
869,
{}
],
"app/app.js": [
1653,
{
"client": {
"main.html": 56,
"template.main.js": 1038,
"main.js": 398
}
}
]
}
}
<title>demo_meteor</title>
\ No newline at end of file
{
"format": "web-program-pre1",
"manifest": [
{
"path": "d584cc2c9be3271f727d52433ca950c5a7e86701.js",
"where": "client",
"type": "js",
"cacheable": true,
"url": "/d584cc2c9be3271f727d52433ca950c5a7e86701.js?meteor_js_resource=true",
"size": 512621,
"hash": "d584cc2c9be3271f727d52433ca950c5a7e86701",
"sri": "hKQAd9GPhW+cByHvQU4lLhW4468aSo98O0SS3OGBHP5KT8Gu/yPPAeOZEgna57858DHiAqh30CJnPlQW7p8w1w=="
},
{
"path": "d584cc2c9be3271f727d52433ca950c5a7e86701.stats.json",
"where": "client",
"type": "json",
"cacheable": true,
"url": "/d584cc2c9be3271f727d52433ca950c5a7e86701.stats.json?meteor_js_resource=true",
"size": 22631,
"hash": "942ca3f54284cbf79373a75e65656c50532091a9",
"sri": "8U0zmYEjy8QCX5eTLO0OSMGVlvQyuZxLXgmZV3Tj6Yfl31Kxna0ByX3LWg0JN2CGzU0ycAt0f7ukBFwlaVzTuw=="
},
{
"path": "524ea151167f0aa67862fb6b681b532466a7bc87.css",
"where": "client",
"type": "css",
"cacheable": true,
"url": "/524ea151167f0aa67862fb6b681b532466a7bc87.css?meteor_css_resource=true",
"size": 41,
"hash": "524ea151167f0aa67862fb6b681b532466a7bc87",
"sri": "i8bAVDu6h2Wq7aL10YRcZblFqWuxypPZVPO25SR5u2NHxFViEbL11ku9nyreJFGlKb9Ne9fDQ775tbwY0PKCKg=="
},
{
"path": "head.html",
"where": "internal",
"type": "head",
"hash": "e6c4aa46cc5943640d3056a9330bc37602fc89d3"
}
]
}
\ No newline at end of file
body{padding:10px;font-family:sans-serif}
\ No newline at end of file
This diff could not be displayed because it is too large.
{
"minifier": {
"name": "standard-minifier-js",
"version": "2.4.1"
},
"totalMinifiedBytes": 389855,
"totalMinifiedGzipBytes": 121371,
"minifiedBytesByPackage": {
"packages/meteor.js": 9484,
"packages/meteor-base.js": 31,
"packages/mobile-experience.js": 37,
"packages/modules-runtime.js": 4199,
"packages/modules.js": [
13157,
{
"node_modules": {
"meteor": {
"modules": {
"client.js": 124,
"css.js": 261,
"install-packages.js": 1838,
"process.js": 347,
"reify.js": 71,
"stubs.js": 97,
"node_modules": {
"reify": {
"lib": {
"runtime": {
"index.js": 933,
"utils.js": 1217,
"entry.js": 3299
}
}
}
}
}
},
"meteor-node-stubs": {
"package.json": 85,
"index.js": 354,
"map.json": 946,
"deps": {
"process.js": 36
},
"node_modules": {
"process": {
"browser.js": 1686
}
}
},
"@babel": {
"runtime": {
"package.json": 492,
"helpers": {
"interopRequireDefault.js": 79,
"objectSpread.js": 380,
"defineProperty.js": 148
}
}
}
}
}
],
"packages/modern-browsers.js": 35,
"packages/babel-compiler.js": 34,
"packages/ecmascript.js": 30,
"packages/ecmascript-runtime.js": 38,
"packages/babel-runtime.js": [
1566,
{
"node_modules": {
"meteor": {
"babel-runtime": {
"babel-runtime.js": 678,
"node_modules": {
"meteor-babel-helpers": {
"package.json": 88,
"index.js": 389
}
}
}
}
}
}
],
"packages/promise.js": [
1319,
{
"node_modules": {
"meteor": {
"promise": {
"modern.js": 23,
"client.js": 71,
"extensions.js": 391,
"node_modules": {
"meteor-promise": {
"package.json": 119,
"promise_client.js": 266
}
}
}
}
}
}
],
"packages/fetch.js": [
406,
{
"node_modules": {
"meteor": {
"fetch": {
"modern.js": 92
}
}
}
}
],
"packages/dynamic-import.js": [
4583,
{
"node_modules": {
"meteor": {
"dynamic-import": {
"client.js": 1552,
"cache.js": 1930,
"common.js": 60,
"dynamic-versions.js": 640
}
}
}
}
],
"packages/es5-shim.js": 28,
"packages/ecmascript-runtime-client.js": [
13119,
{
"node_modules": {
"meteor": {
"ecmascript-runtime-client": {
"modern.js": 683,
"node_modules": {
"core-js": {
"modules": {
"es7.object.get-own-property-descriptors.js": 279,
"_export.js": 530,
"_global.js": 184,
"_core.js": 76,
"_hide.js": 167,
"_object-dp.js": 334,
"_an-object.js": 121,
"_is-object.js": 94,
"_ie8-dom-define.js": 168,
"_descriptors.js": 123,
"_fails.js": 74,
"_dom-create.js": 147,
"_to-primitive.js": 342,
"_property-desc.js": 111,
"_redefine.js": 496,
"_has.js": 84,
"_uid.js": 129,
"_ctx.js": 303,
"_a-function.js": 113,
"_own-keys.js": 196,
"_object-gopn.js": 163,
"_object-keys-internal.js": 261,
"_to-iobject.js": 94,
"_iobject.js": 143,
"_cof.js": 86,
"_defined.js": 103,
"_array-includes.js": 291,
"_to-length.js": 113,
"_to-integer.js": 102,
"_to-absolute-index.js": 121,
"_shared-key.js": 107,
"_shared.js": 284,
"_library.js": 29,
"_enum-bug-keys.js": 133,
"_object-gops.js": 47,
"_object-gopd.js": 313,
"_object-pie.js": 42,
"_create-property.js": 134,
"es6.object.is.js": 73,
"_same-value.js": 94,
"es6.function.name.js": 215,
"es6.number.is-finite.js": 132,
"es6.number.is-nan.js": 84,
"es7.array.flatten.js": 336,
"_flatten-into-array.js": 409,
"_is-array.js": 94,
"_wks.js": 190,
"_to-object.js": 81,
"_array-species-create.js": 101,
"_array-species-constructor.js": 257,
"_add-to-unscopables.js": 134,
"es7.array.flat-map.js": 330,
"es7.object.values.js": 115,
"_object-to-array.js": 231,
"_object-keys.js": 127,
"es7.object.entries.js": 116,
"es7.string.pad-start.js": 237,
"_string-pad.js": 289,
"_string-repeat.js": 237,
"_user-agent.js": 78,
"es7.string.pad-end.js": 235
}
}
}
}
}
}
}
],
"packages/base64.js": [
1823,
{
"node_modules": {
"meteor": {
"base64": {
"base64.js": 1454
}
}
}
}
],
"packages/ejson.js": [
6259,
{
"node_modules": {
"meteor": {
"ejson": {
"ejson.js": 4958,
"stringify.js": 901
}
}
}
}
],
"packages/diff-sequence.js": [
2886,
{
"node_modules": {
"meteor": {
"diff-sequence": {
"diff.js": 2470
}
}
}
}
],
"packages/geojson-utils.js": [
5171,
{
"node_modules": {
"meteor": {
"geojson-utils": {
"main.js": 48,
"geojson-utils.js": 4784
}
}
}
}
],
"packages/id-map.js": [
1273,
{
"node_modules": {
"meteor": {
"id-map": {
"id-map.js": 886
}
}
}
}
],
"packages/random.js": [
3577,
{
"node_modules": {
"meteor": {
"random": {
"random.js": 3217
}
}
}
}
],
"packages/mongo-id.js": [
1773,
{
"node_modules": {
"meteor": {
"mongo-id": {
"id.js": 1329
}
}
}
}
],
"packages/ordered-dict.js": [
3029,
{
"node_modules": {
"meteor": {
"ordered-dict": {
"ordered_dict.js": 2623
}
}
}
}
],
"packages/tracker.js": [
4512,
{
"node_modules": {
"meteor": {
"tracker": {
"tracker.js": 4135
}
}
}
}
],
"packages/minimongo.js": [
43224,
{
"node_modules": {
"meteor": {
"minimongo": {
"minimongo_client.js": 48,
"common.js": 12171,
"cursor.js": 4588,
"local_collection.js": 19643,
"matcher.js": 2512,
"minimongo_common.js": 208,
"observe_handle.js": 52,
"sorter.js": 3147
}
}
}
}
],
"packages/check.js": [
6140,
{
"node_modules": {
"meteor": {
"check": {
"match.js": 5422,
"isPlainObject.js": 308
}
}
}
}
],
"packages/retry.js": [
1090,
{
"node_modules": {
"meteor": {
"retry": {
"retry.js": 708
}
}
}
}
],
"packages/callback-hook.js": [
1536,
{
"node_modules": {
"meteor": {
"callback-hook": {
"hook.js": 1153
}
}
}
}
],
"packages/ddp-common.js": [
4597,
{
"node_modules": {
"meteor": {
"ddp-common": {
"namespace.js": 16,
"heartbeat.js": 1287,
"utils.js": 1348,
"method_invocation.js": 485,
"random_stream.js": 635
}
}
}
}
],
"packages/reload.js": [
1977,
{
"node_modules": {
"meteor": {
"reload": {
"reload.js": 1608
}
}
}
}
],
"packages/socket-stream-client.js": [
36896,
{
"node_modules": {
"meteor": {
"socket-stream-client": {
"browser.js": 3031,
"common.js": 2511,
"sockjs-0.3.4.js": 30254,
"urls.js": 694
}
}
}
}
],
"packages/ddp-client.js": [
22449,
{
"node_modules": {
"meteor": {
"ddp-client": {
"client": {
"client.js": 134,
"client_convenience.js": 862
},
"common": {
"MethodInvoker.js": 1144,
"livedata_connection.js": 18540,
"namespace.js": 933
}
}
}
}
}
],
"packages/ddp.js": 78,
"packages/ddp-server.js": 30,
"packages/allow-deny.js": [
5811,
{
"node_modules": {
"meteor": {
"allow-deny": {
"allow-deny.js": 5266
}
}
}
}
],
"packages/insecure.js": 28,
"packages/mongo.js": [
8993,
{
"node_modules": {
"meteor": {
"mongo": {
"local_collection_driver.js": 360,
"collection.js": 7835
}
}
}
}
],
"packages/blaze-html-templates.js": 40,
"packages/reactive-var.js": 818,
"packages/standard-minifier-css.js": 41,
"packages/standard-minifier-js.js": 40,
"packages/shell-server.js": 32,
"packages/autopublish.js": 31,
"packages/webapp.js": [
694,
{
"node_modules": {
"meteor": {
"webapp": {
"webapp_client.js": 311
}
}
}
}
],
"packages/livedata.js": 105,
"packages/hot-code-push.js": 33,
"packages/jquery.js": [
97271,
{
"node_modules": {
"meteor": {
"jquery": {
"main.js": 134,
"jquery.js": 96823
}
}
}
}
],
"packages/underscore.js": 14349,
"packages/observe-sequence.js": 2915,
"packages/deps.js": 111,
"packages/htmljs.js": 10030,
"packages/blaze.js": 39095,
"packages/spacebars.js": 2928,
"packages/templating-compiler.js": 39,
"packages/templating-runtime.js": 3045,
"packages/templating.js": 103,
"packages/launch-screen.js": 787,
"packages/ui.js": 137,
"packages/autoupdate.js": [
3554,
{
"node_modules": {
"meteor": {
"autoupdate": {
"autoupdate_client.js": 1878,
"client_versions.js": 1148
}
}
}
}
],
"app/global-imports.js": [
728,
{}
],
"app/app.js": [
1589,
{
"client": {
"main.html": 56,
"template.main.js": 1038,
"main.js": 334
}
}
]
}
}
<title>demo_meteor</title>
\ No newline at end of file
{
"format": "web-program-pre1",
"manifest": [
{
"path": "de04ef85f1bde0c8a6519613f728f985cfb4008b.js",
"where": "client",
"type": "js",
"cacheable": true,
"url": "/de04ef85f1bde0c8a6519613f728f985cfb4008b.js?meteor_js_resource=true",
"size": 389855,
"hash": "de04ef85f1bde0c8a6519613f728f985cfb4008b",
"sri": "rOB/BaeVrTfd16l2aWwyoejzfUH9KNS9R/SrJKUL6Fa6UQQ++xjkfk5BjtZ8GmqFl3bBMJUUFm7LXPOr/EBiGg=="
},
{
"path": "de04ef85f1bde0c8a6519613f728f985cfb4008b.stats.json",
"where": "client",
"type": "json",
"cacheable": true,
"url": "/de04ef85f1bde0c8a6519613f728f985cfb4008b.stats.json?meteor_js_resource=true",
"size": 12936,
"hash": "a158811ac0f43bde6eb8636b0e7b28557592cc3a",
"sri": "33OtdkjeT8JXSvx+GP4Ql+SZCdpwvGahIrsYvE9twXvFpR4kPoWE0h638TDlebdWikHKD9dkFlCB4UioBa3Vmg=="
},
{
"path": "524ea151167f0aa67862fb6b681b532466a7bc87.css",
"where": "client",
"type": "css",
"cacheable": true,
"url": "/524ea151167f0aa67862fb6b681b532466a7bc87.css?meteor_css_resource=true",
"size": 41,
"hash": "524ea151167f0aa67862fb6b681b532466a7bc87",
"sri": "i8bAVDu6h2Wq7aL10YRcZblFqWuxypPZVPO25SR5u2NHxFViEbL11ku9nyreJFGlKb9Ne9fDQ775tbwY0PKCKg=="
},
{
"path": "head.html",
"where": "internal",
"type": "head",
"hash": "e6c4aa46cc5943640d3056a9330bc37602fc89d3"
}
]
}
\ No newline at end of file
{
"format": "site-archive-pre1",
"builtBy": "Meteor METEOR@1.8.1",
"programs": [
{
"name": "web.browser",
"arch": "web.browser",
"path": "programs/web.browser/program.json"
},
{
"name": "web.browser.legacy",
"arch": "web.browser.legacy",
"path": "programs/web.browser.legacy/program.json"
},
{
"name": "server",
"arch": "os",
"path": "programs/server/boot.js"
}
],
"meteorRelease": "METEOR@1.8.1",
"nodeVersion": "8.15.1",
"npmVersion": "6.9.0"
}
\ No newline at end of file
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
"visualize": "meteor --production --extra-packages bundle-visualizer" "visualize": "meteor --production --extra-packages bundle-visualizer"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.3.4", "@babel/runtime": "^7.5.4",
"meteor-node-stubs": "^0.4.1" "meteor-node-stubs": "^0.4.1"
}, },
"meteor": { "meteor": {
......
{
"apps": [
{
"name": "demo_meteor",
"env": {
"ROOT_URL": "",
"PORT": 3000,
"MONGO_URL": "",
"METEOR_SETTINGS": {
"public": {},
"private": {}
}
},
"script": "\\opt\\meteor-apps\\demo_meteor\\bundle\\main.js",
"exec_mode": "cluster_mode",
"instances": 1
}
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment