@beiguancyc/parse-server 9.9.0-ruixiang.1 → 9.10.0-ruixiang.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/lib/Adapters/Files/setupFilesLink.js +85 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +46 -3
- package/lib/Controllers/DatabaseController.js +73 -8
- package/lib/Controllers/FilesController.js +6 -4
- package/lib/Controllers/index.js +4 -1
- package/lib/Deprecator/Deprecations.js +5 -1
- package/lib/GraphQL/ParseGraphQLServer.js +98 -2
- package/lib/GraphQL/helpers/objectsMutations.js +3 -3
- package/lib/GraphQL/helpers/objectsQueries.js +4 -4
- package/lib/GraphQL/loaders/usersQueries.js +2 -2
- package/lib/LiveQuery/ParseLiveQueryServer.js +80 -22
- package/lib/LiveQuery/Subscription.js +6 -2
- package/lib/Options/Definitions.js +12 -6
- package/lib/Options/docs.js +6 -5
- package/lib/Options/index.js +1 -1
- package/lib/RestQuery.js +23 -17
- package/lib/RestWrite.js +3 -8
- package/lib/Routers/AggregateRouter.js +5 -2
- package/lib/Routers/AudiencesRouter.js +2 -2
- package/lib/Routers/ClassesRouter.js +5 -5
- package/lib/Routers/FilesRouter.js +53 -9
- package/lib/Routers/FunctionsRouter.js +19 -1
- package/lib/Routers/IAPValidationRouter.js +2 -2
- package/lib/Routers/InstallationsRouter.js +2 -2
- package/lib/Routers/SessionsRouter.js +4 -4
- package/lib/Routers/UsersRouter.js +34 -11
- package/lib/Utils.js +18 -1
- package/lib/batch.js +16 -2
- package/lib/middlewares.js +64 -39
- package/lib/rest.js +10 -12
- package/lib/triggers.js +10 -2
- package/package.json +4 -1
- package/lib/ClientSDK.js +0 -39
package/README.md
CHANGED
|
@@ -73,6 +73,11 @@ A big _thank you_ 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
|
|
|
73
73
|
- [Restricting File URL Domains](#restricting-file-url-domains)
|
|
74
74
|
- [Idempotency Enforcement](#idempotency-enforcement)
|
|
75
75
|
- [Installations](#installations)
|
|
76
|
+
- [Options](#options)
|
|
77
|
+
- [`duplicateDeviceTokenActionEnforceAuth`](#duplicatedevicetokenactionenforceauth)
|
|
78
|
+
- [`duplicateDeviceTokenAction`](#duplicatedevicetokenaction)
|
|
79
|
+
- [`duplicateDeviceTokenMergePriority`](#duplicatedevicetokenmergepriority)
|
|
80
|
+
- [Configuration example](#configuration-example)
|
|
76
81
|
- [Localization](#localization)
|
|
77
82
|
- [Pages](#pages)
|
|
78
83
|
- [Localization with Directory Structure](#localization-with-directory-structure)
|
|
@@ -314,7 +319,7 @@ The client keys used with Parse are no longer necessary with Parse Server. If yo
|
|
|
314
319
|
|
|
315
320
|
## Route Allow List
|
|
316
321
|
|
|
317
|
-
The `routeAllowList` option restricts which API routes are accessible to external clients. When set, all external requests are denied by default unless the route matches one of the configured regex patterns. This is useful for apps where all logic runs in Cloud Code and clients should not access the API directly.
|
|
322
|
+
The `routeAllowList` option restricts which REST API routes are accessible to external clients. When set, all external REST API requests are denied by default unless the route matches one of the configured regex patterns. This is useful for apps where all logic runs in Cloud Code and clients should not access the REST API directly.
|
|
318
323
|
|
|
319
324
|
Internal calls from Cloud Code, Cloud Jobs, and triggers are not affected. Master key and maintenance key requests bypass the restriction.
|
|
320
325
|
|
|
@@ -334,7 +339,7 @@ const server = ParseServer({
|
|
|
334
339
|
|
|
335
340
|
Each entry is a regex pattern matched against the normalized route identifier. Patterns are auto-anchored with `^` and `$` for full-match semantics. For example, `classes/Chat` matches only `classes/Chat`, not `classes/ChatRoom`. Use `classes/Chat.*` to match both.
|
|
336
341
|
|
|
337
|
-
Setting an empty array `[]` blocks all external non-master-key requests (full lockdown). Not setting the option preserves current behavior (all routes accessible).
|
|
342
|
+
Setting an empty array `[]` blocks all external non-master-key REST API requests (full lockdown of REST API routes). Not setting the option preserves current behavior (all routes accessible).
|
|
338
343
|
|
|
339
344
|
### Covered Routes
|
|
340
345
|
|
|
@@ -395,6 +400,9 @@ The following table lists all route groups covered by `routeAllowList` with exam
|
|
|
395
400
|
> [!NOTE]
|
|
396
401
|
> File routes are not covered by `routeAllowList`. File upload access is controlled via the `fileUpload` option. File download and metadata access is controlled via the `fileDownload` option.
|
|
397
402
|
|
|
403
|
+
> [!NOTE]
|
|
404
|
+
> The GraphQL API is not covered by `routeAllowList`. `routeAllowList` gates the REST API per route, while every GraphQL operation is transported over a single endpoint with the operation, target class, and field set encoded in the request body — so per-route allow-list semantics do not compose with it.
|
|
405
|
+
|
|
398
406
|
## Email Verification and Password Reset
|
|
399
407
|
|
|
400
408
|
Verifying user email addresses and enabling password reset via email requires an email adapter. There are many email adapters provided and maintained by the community. The following is an example configuration with an example email adapter. See the [Parse Server Options][server-options] for more details and a full list of available options.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.setupFilesLink = setupFilesLink;
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* When filesAdapter.options.filesLinkTarget is set, create a symlink at
|
|
13
|
+
* files/{filesSubDirectory} -> filesLinkTarget before the FS adapter starts.
|
|
14
|
+
* This lets multiple Parse instances use distinct link names under files/
|
|
15
|
+
* without changing @parse/fs-files-adapter.
|
|
16
|
+
*
|
|
17
|
+
* @param {Object} filesAdapter parse-server filesAdapter config (module/class form with options)
|
|
18
|
+
*/
|
|
19
|
+
function setupFilesLink(filesAdapter) {
|
|
20
|
+
if (!filesAdapter || typeof filesAdapter !== 'object' || !filesAdapter.options) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const {
|
|
24
|
+
filesLinkTarget,
|
|
25
|
+
filesSubDirectory
|
|
26
|
+
} = filesAdapter.options;
|
|
27
|
+
if (filesLinkTarget === undefined || filesLinkTarget === null || filesLinkTarget === '') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!filesSubDirectory) {
|
|
31
|
+
throw new Error('filesAdapter.options.filesSubDirectory is required when filesLinkTarget is set.');
|
|
32
|
+
}
|
|
33
|
+
const targetPath = path.resolve(String(filesLinkTarget));
|
|
34
|
+
const linkPath = path.join('files', filesSubDirectory);
|
|
35
|
+
const linkParent = path.dirname(linkPath);
|
|
36
|
+
fs.mkdirSync(targetPath, {
|
|
37
|
+
recursive: true
|
|
38
|
+
});
|
|
39
|
+
fs.mkdirSync(linkParent, {
|
|
40
|
+
recursive: true
|
|
41
|
+
});
|
|
42
|
+
let linkStat;
|
|
43
|
+
try {
|
|
44
|
+
linkStat = fs.lstatSync(linkPath);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
if (err.code === 'ENOENT') {
|
|
47
|
+
createSymlink(targetPath, linkPath);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
if (linkStat.isSymbolicLink() || isWindowsJunction(linkPath, linkStat)) {
|
|
53
|
+
const currentTarget = path.resolve(path.dirname(linkPath), fs.readlinkSync(linkPath));
|
|
54
|
+
if (pathsEqual(currentTarget, targetPath)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`files link "${linkPath}" already points to "${currentTarget}", expected "${targetPath}".`);
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Cannot create files link at "${linkPath}": path already exists and is not a symlink.`);
|
|
60
|
+
}
|
|
61
|
+
function createSymlink(targetPath, linkPath) {
|
|
62
|
+
// junction on Windows avoids elevated privileges required for directory symlinks
|
|
63
|
+
const type = process.platform === 'win32' ? 'junction' : 'dir';
|
|
64
|
+
fs.symlinkSync(targetPath, linkPath, type);
|
|
65
|
+
}
|
|
66
|
+
function isWindowsJunction(linkPath, linkStat) {
|
|
67
|
+
// Directory junctions may not always report as symbolic links; readlink is definitive.
|
|
68
|
+
if (process.platform !== 'win32' || !linkStat.isDirectory()) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
fs.readlinkSync(linkPath);
|
|
73
|
+
return true;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function pathsEqual(a, b) {
|
|
79
|
+
if (process.platform === 'win32') {
|
|
80
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
81
|
+
}
|
|
82
|
+
return a === b;
|
|
83
|
+
}
|
|
84
|
+
var _default = exports.default = setupFilesLink;
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJzZXR1cEZpbGVzTGluayIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJmaWxlc0FkYXB0ZXIiLCJvcHRpb25zIiwiZmlsZXNMaW5rVGFyZ2V0IiwiZmlsZXNTdWJEaXJlY3RvcnkiLCJ1bmRlZmluZWQiLCJFcnJvciIsInRhcmdldFBhdGgiLCJyZXNvbHZlIiwiU3RyaW5nIiwibGlua1BhdGgiLCJqb2luIiwibGlua1BhcmVudCIsImRpcm5hbWUiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJsaW5rU3RhdCIsImxzdGF0U3luYyIsImVyciIsImNvZGUiLCJjcmVhdGVTeW1saW5rIiwiaXNTeW1ib2xpY0xpbmsiLCJpc1dpbmRvd3NKdW5jdGlvbiIsImN1cnJlbnRUYXJnZXQiLCJyZWFkbGlua1N5bmMiLCJwYXRoc0VxdWFsIiwidHlwZSIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN5bWxpbmtTeW5jIiwiaXNEaXJlY3RvcnkiLCJhIiwiYiIsInRvTG93ZXJDYXNlIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvc2V0dXBGaWxlc0xpbmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vKipcbiAqIFdoZW4gZmlsZXNBZGFwdGVyLm9wdGlvbnMuZmlsZXNMaW5rVGFyZ2V0IGlzIHNldCwgY3JlYXRlIGEgc3ltbGluayBhdFxuICogZmlsZXMve2ZpbGVzU3ViRGlyZWN0b3J5fSAtPiBmaWxlc0xpbmtUYXJnZXQgYmVmb3JlIHRoZSBGUyBhZGFwdGVyIHN0YXJ0cy5cbiAqIFRoaXMgbGV0cyBtdWx0aXBsZSBQYXJzZSBpbnN0YW5jZXMgdXNlIGRpc3RpbmN0IGxpbmsgbmFtZXMgdW5kZXIgZmlsZXMvXG4gKiB3aXRob3V0IGNoYW5naW5nIEBwYXJzZS9mcy1maWxlcy1hZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlc0FkYXB0ZXIgcGFyc2Utc2VydmVyIGZpbGVzQWRhcHRlciBjb25maWcgKG1vZHVsZS9jbGFzcyBmb3JtIHdpdGggb3B0aW9ucylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRmlsZXNMaW5rKGZpbGVzQWRhcHRlcikge1xuICBpZiAoIWZpbGVzQWRhcHRlciB8fCB0eXBlb2YgZmlsZXNBZGFwdGVyICE9PSAnb2JqZWN0JyB8fCAhZmlsZXNBZGFwdGVyLm9wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IGZpbGVzTGlua1RhcmdldCwgZmlsZXNTdWJEaXJlY3RvcnkgfSA9IGZpbGVzQWRhcHRlci5vcHRpb25zO1xuICBpZiAoZmlsZXNMaW5rVGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgZmlsZXNMaW5rVGFyZ2V0ID09PSBudWxsIHx8IGZpbGVzTGlua1RhcmdldCA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWZpbGVzU3ViRGlyZWN0b3J5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpbGVzQWRhcHRlci5vcHRpb25zLmZpbGVzU3ViRGlyZWN0b3J5IGlzIHJlcXVpcmVkIHdoZW4gZmlsZXNMaW5rVGFyZ2V0IGlzIHNldC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGVzTGlua1RhcmdldCkpO1xuICBjb25zdCBsaW5rUGF0aCA9IHBhdGguam9pbignZmlsZXMnLCBmaWxlc1N1YkRpcmVjdG9yeSk7XG4gIGNvbnN0IGxpbmtQYXJlbnQgPSBwYXRoLmRpcm5hbWUobGlua1BhdGgpO1xuXG4gIGZzLm1rZGlyU3luYyh0YXJnZXRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMubWtkaXJTeW5jKGxpbmtQYXJlbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGxldCBsaW5rU3RhdDtcbiAgdHJ5IHtcbiAgICBsaW5rU3RhdCA9IGZzLmxzdGF0U3luYyhsaW5rUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNyZWF0ZVN5bWxpbmsodGFyZ2V0UGF0aCwgbGlua1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAobGlua1N0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCBpc1dpbmRvd3NKdW5jdGlvbihsaW5rUGF0aCwgbGlua1N0YXQpKSB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUobGlua1BhdGgpLCBmcy5yZWFkbGlua1N5bmMobGlua1BhdGgpKTtcbiAgICBpZiAocGF0aHNFcXVhbChjdXJyZW50VGFyZ2V0LCB0YXJnZXRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZmlsZXMgbGluayBcIiR7bGlua1BhdGh9XCIgYWxyZWFkeSBwb2ludHMgdG8gXCIke2N1cnJlbnRUYXJnZXR9XCIsIGV4cGVjdGVkIFwiJHt0YXJnZXRQYXRofVwiLmBcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY3JlYXRlIGZpbGVzIGxpbmsgYXQgXCIke2xpbmtQYXRofVwiOiBwYXRoIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBub3QgYSBzeW1saW5rLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ltbGluayh0YXJnZXRQYXRoLCBsaW5rUGF0aCkge1xuICAvLyBqdW5jdGlvbiBvbiBXaW5kb3dzIGF2b2lkcyBlbGV2YXRlZCBwcml2aWxlZ2VzIHJlcXVpcmVkIGZvciBkaXJlY3Rvcnkgc3ltbGlua3NcbiAgY29uc3QgdHlwZSA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnanVuY3Rpb24nIDogJ2Rpcic7XG4gIGZzLnN5bWxpbmtTeW5jKHRhcmdldFBhdGgsIGxpbmtQYXRoLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dzSnVuY3Rpb24obGlua1BhdGgsIGxpbmtTdGF0KSB7XG4gIC8vIERpcmVjdG9yeSBqdW5jdGlvbnMgbWF5IG5vdCBhbHdheXMgcmVwb3J0IGFzIHN5bWJvbGljIGxpbmtzOyByZWFkbGluayBpcyBkZWZpbml0aXZlLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJyB8fCAhbGlua1N0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGZzLnJlYWRsaW5rU3luYyhsaW5rUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoc0VxdWFsKGEsIGIpIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpID09PSBiLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwRmlsZXNMaW5rO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUFDQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQSxDQUFBRSxPQUFBO0FBQUFGLE9BQUEsQ0FBQUcsY0FBQSxHQUFBQSxjQUFBO0FBRWIsTUFBTUMsRUFBRSxHQUFHQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLGNBQWNBLENBQUNJLFlBQVksRUFBRTtFQUMzQyxJQUFJLENBQUNBLFlBQVksSUFBSSxPQUFPQSxZQUFZLEtBQUssUUFBUSxJQUFJLENBQUNBLFlBQVksQ0FBQ0MsT0FBTyxFQUFFO0lBQzlFO0VBQ0Y7RUFFQSxNQUFNO0lBQUVDLGVBQWU7SUFBRUM7RUFBa0IsQ0FBQyxHQUFHSCxZQUFZLENBQUNDLE9BQU87RUFDbkUsSUFBSUMsZUFBZSxLQUFLRSxTQUFTLElBQUlGLGVBQWUsS0FBSyxJQUFJLElBQUlBLGVBQWUsS0FBSyxFQUFFLEVBQUU7SUFDdkY7RUFDRjtFQUVBLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7SUFDdEIsTUFBTSxJQUFJRSxLQUFLLENBQ2IsaUZBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTUMsVUFBVSxHQUFHUCxJQUFJLENBQUNRLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDTixlQUFlLENBQUMsQ0FBQztFQUN4RCxNQUFNTyxRQUFRLEdBQUdWLElBQUksQ0FBQ1csSUFBSSxDQUFDLE9BQU8sRUFBRVAsaUJBQWlCLENBQUM7RUFDdEQsTUFBTVEsVUFBVSxHQUFHWixJQUFJLENBQUNhLE9BQU8sQ0FBQ0gsUUFBUSxDQUFDO0VBRXpDWixFQUFFLENBQUNnQixTQUFTLENBQUNQLFVBQVUsRUFBRTtJQUFFUSxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDN0NqQixFQUFFLENBQUNnQixTQUFTLENBQUNGLFVBQVUsRUFBRTtJQUFFRyxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFFN0MsSUFBSUMsUUFBUTtFQUNaLElBQUk7SUFDRkEsUUFBUSxHQUFHbEIsRUFBRSxDQUFDbUIsU0FBUyxDQUFDUCxRQUFRLENBQUM7RUFDbkMsQ0FBQyxDQUFDLE9BQU9RLEdBQUcsRUFBRTtJQUNaLElBQUlBLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUN6QkMsYUFBYSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsQ0FBQztNQUNuQztJQUNGO0lBQ0EsTUFBTVEsR0FBRztFQUNYO0VBRUEsSUFBSUYsUUFBUSxDQUFDSyxjQUFjLENBQUMsQ0FBQyxJQUFJQyxpQkFBaUIsQ0FBQ1osUUFBUSxFQUFFTSxRQUFRLENBQUMsRUFBRTtJQUN0RSxNQUFNTyxhQUFhLEdBQUd2QixJQUFJLENBQUNRLE9BQU8sQ0FBQ1IsSUFBSSxDQUFDYSxPQUFPLENBQUNILFFBQVEsQ0FBQyxFQUFFWixFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQyxDQUFDO0lBQ3JGLElBQUllLFVBQVUsQ0FBQ0YsYUFBYSxFQUFFaEIsVUFBVSxDQUFDLEVBQUU7TUFDekM7SUFDRjtJQUNBLE1BQU0sSUFBSUQsS0FBSyxDQUNiLGVBQWVJLFFBQVEsd0JBQXdCYSxhQUFhLGdCQUFnQmhCLFVBQVUsSUFDeEYsQ0FBQztFQUNIO0VBRUEsTUFBTSxJQUFJRCxLQUFLLENBQ2IsZ0NBQWdDSSxRQUFRLDhDQUMxQyxDQUFDO0FBQ0g7QUFFQSxTQUFTVSxhQUFhQSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsRUFBRTtFQUMzQztFQUNBLE1BQU1nQixJQUFJLEdBQUdDLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sR0FBRyxVQUFVLEdBQUcsS0FBSztFQUM5RDlCLEVBQUUsQ0FBQytCLFdBQVcsQ0FBQ3RCLFVBQVUsRUFBRUcsUUFBUSxFQUFFZ0IsSUFBSSxDQUFDO0FBQzVDO0FBRUEsU0FBU0osaUJBQWlCQSxDQUFDWixRQUFRLEVBQUVNLFFBQVEsRUFBRTtFQUM3QztFQUNBLElBQUlXLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDWixRQUFRLENBQUNjLFdBQVcsQ0FBQyxDQUFDLEVBQUU7SUFDM0QsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJO0lBQ0ZoQyxFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQztJQUN6QixPQUFPLElBQUk7RUFDYixDQUFDLENBQUMsTUFBTTtJQUNOLE9BQU8sS0FBSztFQUNkO0FBQ0Y7QUFFQSxTQUFTZSxVQUFVQSxDQUFDTSxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN4QixJQUFJTCxPQUFPLENBQUNDLFFBQVEsS0FBSyxPQUFPLEVBQUU7SUFDaEMsT0FBT0csQ0FBQyxDQUFDRSxXQUFXLENBQUMsQ0FBQyxLQUFLRCxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0VBQzVDO0VBQ0EsT0FBT0YsQ0FBQyxLQUFLQyxDQUFDO0FBQ2hCO0FBQUMsSUFBQUUsUUFBQSxHQUFBeEMsT0FBQSxDQUFBRSxPQUFBLEdBRWNDLGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -4,8 +4,47 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
exports.findGeoIndexField = findGeoIndexField;
|
|
7
8
|
const mongodb = require('mongodb');
|
|
8
9
|
const Collection = mongodb.Collection;
|
|
10
|
+
|
|
11
|
+
// Query operators that require a geospatial index and therefore trigger
|
|
12
|
+
// on-demand `2d` index creation. `$geoWithin` / `$geoIntersects` are intentionally
|
|
13
|
+
// excluded: they can run as a collection scan and never raise a "no index" error.
|
|
14
|
+
const GEO_INDEX_QUERY_OPERATORS = ['$nearSphere', '$near', '$geoNear'];
|
|
15
|
+
|
|
16
|
+
// Find the field in a Mongo query document that is constrained by a geo operator
|
|
17
|
+
// requiring a geospatial index. Returns the field name (e.g. 'location'), or
|
|
18
|
+
// undefined if none is found. Used as the reliable source of truth for on-demand
|
|
19
|
+
// geo index creation, since the MongoDB error message that used to carry the field
|
|
20
|
+
// name (`... field=<name> ...`) was dropped in MongoDB 8.3+.
|
|
21
|
+
//
|
|
22
|
+
// A geo-near expression must be top-level or inside `$and`: MongoDB rejects it inside
|
|
23
|
+
// `$or` / `$nor` ("geo $near must be top-level expr") and forbids more than one per
|
|
24
|
+
// query ("Too many geoNear expressions"). So there is at most one field to find, and
|
|
25
|
+
// `$and` is the only combinator we need to recurse into.
|
|
26
|
+
function findGeoIndexField(query) {
|
|
27
|
+
if (!query || typeof query !== 'object') {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
for (const field of Object.keys(query)) {
|
|
31
|
+
const value = query[field];
|
|
32
|
+
// Recurse into `$and`, which holds an array of sub-queries.
|
|
33
|
+
if (field === '$and' && Array.isArray(value)) {
|
|
34
|
+
for (const subQuery of value) {
|
|
35
|
+
const found = findGeoIndexField(subQuery);
|
|
36
|
+
if (found) {
|
|
37
|
+
return found;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (value && typeof value === 'object' && GEO_INDEX_QUERY_OPERATORS.some(op => Object.prototype.hasOwnProperty.call(value, op))) {
|
|
43
|
+
return field;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
9
48
|
class MongoCollection {
|
|
10
49
|
constructor(mongoCollection) {
|
|
11
50
|
this._mongoCollection = mongoCollection;
|
|
@@ -53,8 +92,12 @@ class MongoCollection {
|
|
|
53
92
|
if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
|
|
54
93
|
throw error;
|
|
55
94
|
}
|
|
56
|
-
// Figure out
|
|
57
|
-
|
|
95
|
+
// Figure out which field needs a geo index.
|
|
96
|
+
// Older MongoDB embeds the field name in the error message (`... field=<name> ...`);
|
|
97
|
+
// MongoDB 8.3+ shortened the message to `unable to find index for $geoNear query`
|
|
98
|
+
// and no longer includes it, so fall back to reading the field from the query itself.
|
|
99
|
+
const messageMatch = error.message.match(/field=([A-Za-z_0-9]+) /);
|
|
100
|
+
const key = messageMatch && messageMatch[1] || findGeoIndexField(query);
|
|
58
101
|
if (!key) {
|
|
59
102
|
throw error;
|
|
60
103
|
}
|
|
@@ -209,4 +252,4 @@ class MongoCollection {
|
|
|
209
252
|
}
|
|
210
253
|
}
|
|
211
254
|
exports.default = MongoCollection;
|
|
212
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm1vbmdvQ29sbGVjdGlvbiIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kIiwicXVlcnkiLCJza2lwIiwibGltaXQiLCJzb3J0Iiwia2V5cyIsIm1heFRpbWVNUyIsImJhdGNoU2l6ZSIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImV4cGxhaW4iLCJjb21tZW50IiwiJHNjb3JlIiwic2NvcmUiLCIkbWV0YSIsIl9yYXdGaW5kIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJtZXNzYWdlIiwibWF0Y2giLCJrZXkiLCJpbmRleCIsImNyZWF0ZUluZGV4IiwidGhlbiIsImNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbiIsImxvY2FsZSIsInN0cmVuZ3RoIiwiZmluZE9wZXJhdGlvbiIsInByb2plY3QiLCJjb2xsYXRpb24iLCJ0b0FycmF5IiwiY291bnQiLCJPYmplY3QiLCJsZW5ndGgiLCJlc3RpbWF0ZWREb2N1bWVudENvdW50IiwiY291bnRPcGVyYXRpb24iLCJjb3VudERvY3VtZW50cyIsImRpc3RpbmN0IiwiZmllbGQiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImluc2VydE9uZSIsIm9iamVjdCIsInNlc3Npb24iLCJ1cHNlcnRPbmUiLCJ1cGRhdGUiLCJ1cGRhdGVPbmUiLCJ1cHNlcnQiLCJ1cGRhdGVNYW55IiwiZGVsZXRlTWFueSIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImluZGV4UmVxdWVzdCIsInVuaXF1ZSIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJkcm9wIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb0NvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbmNvbnN0IENvbGxlY3Rpb24gPSBtb25nb2RiLkNvbGxlY3Rpb247XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vbmdvQ29sbGVjdGlvbiB7XG4gIF9tb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IobW9uZ29Db2xsZWN0aW9uOiBDb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uID0gbW9uZ29Db2xsZWN0aW9uO1xuICB9XG5cbiAgLy8gRG9lcyBhIGZpbmQgd2l0aCBcInNtYXJ0IGluZGV4aW5nXCIuXG4gIC8vIEN1cnJlbnRseSB0aGlzIGp1c3QgbWVhbnMsIGlmIGl0IG5lZWRzIGEgZ2VvaW5kZXggYW5kIHRoZXJlIGlzXG4gIC8vIG5vbmUsIHRoZW4gYnVpbGQgdGhlIGdlb2luZGV4LlxuICAvLyBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGEgbG90IGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgYSBnb29kXG4gIC8vIGlkZWEuIE9yIGV2ZW4gaWYgdGhpcyBiZWhhdmlvciBpcyBhIGdvb2QgaWRlYS5cbiAgZmluZChcbiAgICBxdWVyeSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBTdXBwb3J0IGZvciBGdWxsIFRleHQgU2VhcmNoIC0gJHRleHRcbiAgICBpZiAoa2V5cyAmJiBrZXlzLiRzY29yZSkge1xuICAgICAgZGVsZXRlIGtleXMuJHNjb3JlO1xuICAgICAga2V5cy5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBrZXkgbmVlZHMgYW4gaW5kZXhcbiAgICAgIGNvbnN0IGtleSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2ZpZWxkPShbQS1aYS16XzAtOV0rKSAvKVsxXTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXRpb24gdG8gc3VwcG9ydCBjYXNlIGluc2Vuc2l0aXZlIHF1ZXJpZXNcbiAgICovXG4gIHN0YXRpYyBjYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgbG9jYWxlOiAnZW5fVVMnLCBzdHJlbmd0aDogMiB9O1xuICB9XG5cbiAgX3Jhd0ZpbmQoXG4gICAgcXVlcnksXG4gICAge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICBiYXRjaFNpemUsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgICAgY29tbWVudCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgICBiYXRjaFNpemUsXG4gICAgfSk7XG5cbiAgICBpZiAoa2V5cykge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24ucHJvamVjdChrZXlzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5jb2xsYXRpb24oTW9uZ29Db2xsZWN0aW9uLmNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbigpKTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZU1TKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5tYXhUaW1lTVMobWF4VGltZU1TKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwbGFpbiA/IGZpbmRPcGVyYXRpb24uZXhwbGFpbihleHBsYWluKSA6IGZpbmRPcGVyYXRpb24udG9BcnJheSgpO1xuICB9XG5cbiAgY291bnQocXVlcnksIHsgc2tpcCwgbGltaXQsIHNvcnQsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNvbW1lbnQgfSA9IHt9KSB7XG4gICAgLy8gSWYgcXVlcnkgaXMgZW1wdHksIHRoZW4gdXNlIGVzdGltYXRlZERvY3VtZW50Q291bnQgaW5zdGVhZC5cbiAgICAvLyBUaGlzIGlzIGR1ZSB0byBjb3VudERvY3VtZW50cyBwZXJmb3JtaW5nIGEgc2NhbixcbiAgICAvLyB3aGljaCBncmVhdGx5IGluY3JlYXNlcyBleGVjdXRpb24gdGltZSB3aGVuIGJlaW5nIHJ1biBvbiBsYXJnZSBjb2xsZWN0aW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbW9uZ29vc2UvaXNzdWVzLzY3MTMgZm9yIG1vcmUgaW5mbyByZWdhcmRpbmcgdGhpcyBwcm9ibGVtLlxuICAgIGlmICh0eXBlb2YgcXVlcnkgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmVzdGltYXRlZERvY3VtZW50Q291bnQoe1xuICAgICAgICBtYXhUaW1lTVMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudE9wZXJhdGlvbiA9IHRoaXMuX21vbmdvQ29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnRPcGVyYXRpb247XG4gIH1cblxuICBkaXN0aW5jdChmaWVsZCwgcXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRpc3RpbmN0KGZpZWxkLCBxdWVyeSk7XG4gIH1cblxuICBhZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb25cbiAgICAgIC5hZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4UmVxdWVzdCwge1xuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgIHNwYXJzZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsT0FBTyxHQUFHQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLE1BQU1DLFVBQVUsR0FBR0YsT0FBTyxDQUFDRSxVQUFVO0FBRXRCLE1BQU1DLGVBQWUsQ0FBQztFQUduQ0MsV0FBV0EsQ0FBQ0MsZUFBMkIsRUFBRTtJQUN2QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHRCxlQUFlO0VBQ3pDOztF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
|
|
255
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJHRU9fSU5ERVhfUVVFUllfT1BFUkFUT1JTIiwiZmluZEdlb0luZGV4RmllbGQiLCJxdWVyeSIsInVuZGVmaW5lZCIsImZpZWxkIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwiQXJyYXkiLCJpc0FycmF5Iiwic3ViUXVlcnkiLCJmb3VuZCIsInNvbWUiLCJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk1vbmdvQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwibW9uZ29Db2xsZWN0aW9uIiwiX21vbmdvQ29sbGVjdGlvbiIsImZpbmQiLCJza2lwIiwibGltaXQiLCJzb3J0IiwibWF4VGltZU1TIiwiYmF0Y2hTaXplIiwicmVhZFByZWZlcmVuY2UiLCJoaW50IiwiY2FzZUluc2Vuc2l0aXZlIiwiZXhwbGFpbiIsImNvbW1lbnQiLCIkc2NvcmUiLCJzY29yZSIsIiRtZXRhIiwiX3Jhd0ZpbmQiLCJjYXRjaCIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJtYXRjaCIsIm1lc3NhZ2VNYXRjaCIsImtleSIsImluZGV4IiwiY3JlYXRlSW5kZXgiLCJ0aGVuIiwiY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uIiwibG9jYWxlIiwic3RyZW5ndGgiLCJmaW5kT3BlcmF0aW9uIiwicHJvamVjdCIsImNvbGxhdGlvbiIsInRvQXJyYXkiLCJjb3VudCIsImxlbmd0aCIsImVzdGltYXRlZERvY3VtZW50Q291bnQiLCJjb3VudE9wZXJhdGlvbiIsImNvdW50RG9jdW1lbnRzIiwiZGlzdGluY3QiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImluc2VydE9uZSIsIm9iamVjdCIsInNlc3Npb24iLCJ1cHNlcnRPbmUiLCJ1cGRhdGUiLCJ1cGRhdGVPbmUiLCJ1cHNlcnQiLCJ1cGRhdGVNYW55IiwiZGVsZXRlTWFueSIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImluZGV4UmVxdWVzdCIsInVuaXF1ZSIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJkcm9wIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb0NvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbmNvbnN0IENvbGxlY3Rpb24gPSBtb25nb2RiLkNvbGxlY3Rpb247XG5cbi8vIFF1ZXJ5IG9wZXJhdG9ycyB0aGF0IHJlcXVpcmUgYSBnZW9zcGF0aWFsIGluZGV4IGFuZCB0aGVyZWZvcmUgdHJpZ2dlclxuLy8gb24tZGVtYW5kIGAyZGAgaW5kZXggY3JlYXRpb24uIGAkZ2VvV2l0aGluYCAvIGAkZ2VvSW50ZXJzZWN0c2AgYXJlIGludGVudGlvbmFsbHlcbi8vIGV4Y2x1ZGVkOiB0aGV5IGNhbiBydW4gYXMgYSBjb2xsZWN0aW9uIHNjYW4gYW5kIG5ldmVyIHJhaXNlIGEgXCJubyBpbmRleFwiIGVycm9yLlxuY29uc3QgR0VPX0lOREVYX1FVRVJZX09QRVJBVE9SUyA9IFsnJG5lYXJTcGhlcmUnLCAnJG5lYXInLCAnJGdlb05lYXInXTtcblxuLy8gRmluZCB0aGUgZmllbGQgaW4gYSBNb25nbyBxdWVyeSBkb2N1bWVudCB0aGF0IGlzIGNvbnN0cmFpbmVkIGJ5IGEgZ2VvIG9wZXJhdG9yXG4vLyByZXF1aXJpbmcgYSBnZW9zcGF0aWFsIGluZGV4LiBSZXR1cm5zIHRoZSBmaWVsZCBuYW1lIChlLmcuICdsb2NhdGlvbicpLCBvclxuLy8gdW5kZWZpbmVkIGlmIG5vbmUgaXMgZm91bmQuIFVzZWQgYXMgdGhlIHJlbGlhYmxlIHNvdXJjZSBvZiB0cnV0aCBmb3Igb24tZGVtYW5kXG4vLyBnZW8gaW5kZXggY3JlYXRpb24sIHNpbmNlIHRoZSBNb25nb0RCIGVycm9yIG1lc3NhZ2UgdGhhdCB1c2VkIHRvIGNhcnJ5IHRoZSBmaWVsZFxuLy8gbmFtZSAoYC4uLiBmaWVsZD08bmFtZT4gLi4uYCkgd2FzIGRyb3BwZWQgaW4gTW9uZ29EQiA4LjMrLlxuLy9cbi8vIEEgZ2VvLW5lYXIgZXhwcmVzc2lvbiBtdXN0IGJlIHRvcC1sZXZlbCBvciBpbnNpZGUgYCRhbmRgOiBNb25nb0RCIHJlamVjdHMgaXQgaW5zaWRlXG4vLyBgJG9yYCAvIGAkbm9yYCAoXCJnZW8gJG5lYXIgbXVzdCBiZSB0b3AtbGV2ZWwgZXhwclwiKSBhbmQgZm9yYmlkcyBtb3JlIHRoYW4gb25lIHBlclxuLy8gcXVlcnkgKFwiVG9vIG1hbnkgZ2VvTmVhciBleHByZXNzaW9uc1wiKS4gU28gdGhlcmUgaXMgYXQgbW9zdCBvbmUgZmllbGQgdG8gZmluZCwgYW5kXG4vLyBgJGFuZGAgaXMgdGhlIG9ubHkgY29tYmluYXRvciB3ZSBuZWVkIHRvIHJlY3Vyc2UgaW50by5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kR2VvSW5kZXhGaWVsZChxdWVyeSkge1xuICBpZiAoIXF1ZXJ5IHx8IHR5cGVvZiBxdWVyeSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocXVlcnkpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBxdWVyeVtmaWVsZF07XG4gICAgLy8gUmVjdXJzZSBpbnRvIGAkYW5kYCwgd2hpY2ggaG9sZHMgYW4gYXJyYXkgb2Ygc3ViLXF1ZXJpZXMuXG4gICAgaWYgKGZpZWxkID09PSAnJGFuZCcgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3Qgc3ViUXVlcnkgb2YgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kR2VvSW5kZXhGaWVsZChzdWJRdWVyeSk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICBHRU9fSU5ERVhfUVVFUllfT1BFUkFUT1JTLnNvbWUob3AgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBvcCkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vbmdvQ29sbGVjdGlvbiB7XG4gIF9tb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IobW9uZ29Db2xsZWN0aW9uOiBDb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uID0gbW9uZ29Db2xsZWN0aW9uO1xuICB9XG5cbiAgLy8gRG9lcyBhIGZpbmQgd2l0aCBcInNtYXJ0IGluZGV4aW5nXCIuXG4gIC8vIEN1cnJlbnRseSB0aGlzIGp1c3QgbWVhbnMsIGlmIGl0IG5lZWRzIGEgZ2VvaW5kZXggYW5kIHRoZXJlIGlzXG4gIC8vIG5vbmUsIHRoZW4gYnVpbGQgdGhlIGdlb2luZGV4LlxuICAvLyBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGEgbG90IGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgYSBnb29kXG4gIC8vIGlkZWEuIE9yIGV2ZW4gaWYgdGhpcyBiZWhhdmlvciBpcyBhIGdvb2QgaWRlYS5cbiAgZmluZChcbiAgICBxdWVyeSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBTdXBwb3J0IGZvciBGdWxsIFRleHQgU2VhcmNoIC0gJHRleHRcbiAgICBpZiAoa2V5cyAmJiBrZXlzLiRzY29yZSkge1xuICAgICAgZGVsZXRlIGtleXMuJHNjb3JlO1xuICAgICAga2V5cy5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgbmVlZHMgYSBnZW8gaW5kZXguXG4gICAgICAvLyBPbGRlciBNb25nb0RCIGVtYmVkcyB0aGUgZmllbGQgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSAoYC4uLiBmaWVsZD08bmFtZT4gLi4uYCk7XG4gICAgICAvLyBNb25nb0RCIDguMysgc2hvcnRlbmVkIHRoZSBtZXNzYWdlIHRvIGB1bmFibGUgdG8gZmluZCBpbmRleCBmb3IgJGdlb05lYXIgcXVlcnlgXG4gICAgICAvLyBhbmQgbm8gbG9uZ2VyIGluY2x1ZGVzIGl0LCBzbyBmYWxsIGJhY2sgdG8gcmVhZGluZyB0aGUgZmllbGQgZnJvbSB0aGUgcXVlcnkgaXRzZWxmLlxuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvZmllbGQ9KFtBLVphLXpfMC05XSspIC8pO1xuICAgICAgY29uc3Qga2V5ID0gKG1lc3NhZ2VNYXRjaCAmJiBtZXNzYWdlTWF0Y2hbMV0pIHx8IGZpbmRHZW9JbmRleEZpZWxkKHF1ZXJ5KTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXRpb24gdG8gc3VwcG9ydCBjYXNlIGluc2Vuc2l0aXZlIHF1ZXJpZXNcbiAgICovXG4gIHN0YXRpYyBjYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgbG9jYWxlOiAnZW5fVVMnLCBzdHJlbmd0aDogMiB9O1xuICB9XG5cbiAgX3Jhd0ZpbmQoXG4gICAgcXVlcnksXG4gICAge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICBiYXRjaFNpemUsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgICAgY29tbWVudCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgICBiYXRjaFNpemUsXG4gICAgfSk7XG5cbiAgICBpZiAoa2V5cykge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24ucHJvamVjdChrZXlzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5jb2xsYXRpb24oTW9uZ29Db2xsZWN0aW9uLmNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbigpKTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZU1TKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5tYXhUaW1lTVMobWF4VGltZU1TKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwbGFpbiA/IGZpbmRPcGVyYXRpb24uZXhwbGFpbihleHBsYWluKSA6IGZpbmRPcGVyYXRpb24udG9BcnJheSgpO1xuICB9XG5cbiAgY291bnQocXVlcnksIHsgc2tpcCwgbGltaXQsIHNvcnQsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNvbW1lbnQgfSA9IHt9KSB7XG4gICAgLy8gSWYgcXVlcnkgaXMgZW1wdHksIHRoZW4gdXNlIGVzdGltYXRlZERvY3VtZW50Q291bnQgaW5zdGVhZC5cbiAgICAvLyBUaGlzIGlzIGR1ZSB0byBjb3VudERvY3VtZW50cyBwZXJmb3JtaW5nIGEgc2NhbixcbiAgICAvLyB3aGljaCBncmVhdGx5IGluY3JlYXNlcyBleGVjdXRpb24gdGltZSB3aGVuIGJlaW5nIHJ1biBvbiBsYXJnZSBjb2xsZWN0aW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbW9uZ29vc2UvaXNzdWVzLzY3MTMgZm9yIG1vcmUgaW5mbyByZWdhcmRpbmcgdGhpcyBwcm9ibGVtLlxuICAgIGlmICh0eXBlb2YgcXVlcnkgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmVzdGltYXRlZERvY3VtZW50Q291bnQoe1xuICAgICAgICBtYXhUaW1lTVMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudE9wZXJhdGlvbiA9IHRoaXMuX21vbmdvQ29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnRPcGVyYXRpb247XG4gIH1cblxuICBkaXN0aW5jdChmaWVsZCwgcXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRpc3RpbmN0KGZpZWxkLCBxdWVyeSk7XG4gIH1cblxuICBhZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb25cbiAgICAgIC5hZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4UmVxdWVzdCwge1xuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgIHNwYXJzZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNsQyxNQUFNQyxVQUFVLEdBQUdGLE9BQU8sQ0FBQ0UsVUFBVTs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQzs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxpQkFBaUJBLENBQUNDLEtBQUssRUFBRTtFQUN2QyxJQUFJLENBQUNBLEtBQUssSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQ3ZDLE9BQU9DLFNBQVM7RUFDbEI7RUFDQSxLQUFLLE1BQU1DLEtBQUssSUFBSUMsTUFBTSxDQUFDQyxJQUFJLENBQUNKLEtBQUssQ0FBQyxFQUFFO0lBQ3RDLE1BQU1LLEtBQUssR0FBR0wsS0FBSyxDQUFDRSxLQUFLLENBQUM7SUFDMUI7SUFDQSxJQUFJQSxLQUFLLEtBQUssTUFBTSxJQUFJSSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDNUMsS0FBSyxNQUFNRyxRQUFRLElBQUlILEtBQUssRUFBRTtRQUM1QixNQUFNSSxLQUFLLEdBQUdWLGlCQUFpQixDQUFD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
|