footprintjs 9.48.2 → 9.48.4
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/dist/esm/lib/capture/ownData.d.ts +12 -1
- package/dist/esm/lib/capture/ownData.js +23 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +5 -4
- package/dist/esm/lib/memory/backtrack.d.ts +6 -0
- package/dist/esm/lib/memory/backtrack.js +18 -8
- package/dist/esm/lib/memory/merge.d.ts +1 -1
- package/dist/esm/lib/memory/merge.js +4 -12
- package/dist/esm/lib/memory/pathOps.d.ts +15 -12
- package/dist/esm/lib/memory/pathOps.js +30 -27
- package/dist/esm/lib/memory/utils.js +2 -10
- package/dist/esm/lib/slice/sliceForKey.js +5 -3
- package/dist/lib/capture/ownData.js +25 -3
- package/dist/lib/memory/TransactionBuffer.js +5 -4
- package/dist/lib/memory/backtrack.js +20 -9
- package/dist/lib/memory/merge.js +4 -12
- package/dist/lib/memory/pathOps.js +30 -27
- package/dist/lib/memory/utils.js +8 -16
- package/dist/lib/slice/sliceForKey.js +4 -2
- package/dist/types/lib/capture/ownData.d.ts +12 -1
- package/dist/types/lib/memory/backtrack.d.ts +6 -0
- package/dist/types/lib/memory/merge.d.ts +1 -1
- package/dist/types/lib/memory/pathOps.d.ts +15 -12
- package/package.json +3 -1
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
* ```
|
|
59
59
|
*/
|
|
60
60
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
-
exports._REVERSE_INDEX_THRESHOLD = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChain = void 0;
|
|
61
|
+
exports._REVERSE_INDEX_THRESHOLD = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChainFromCommit = exports.causalChain = void 0;
|
|
62
62
|
const commitLogUtils_js_1 = require("./commitLogUtils.js");
|
|
63
63
|
const keyPaths_js_1 = require("./keyPaths.js");
|
|
64
64
|
const logModel_js_1 = require("./logModel.js");
|
|
@@ -151,6 +151,19 @@ function incompleteSourcesFragment(commit) {
|
|
|
151
151
|
* @returns Root CausalNode with .parents forming the DAG, or undefined if startId not found
|
|
152
152
|
*/
|
|
153
153
|
function causalChain(commitLog, startId, getKeysRead, options) {
|
|
154
|
+
return buildCausalChain(commitLog, startId, getKeysRead, options);
|
|
155
|
+
}
|
|
156
|
+
exports.causalChain = causalChain;
|
|
157
|
+
/**
|
|
158
|
+
* Internal slice composition: keep the actual bundle selected by the writer
|
|
159
|
+
* query (including a nonempty continuation). This is not a public entry point.
|
|
160
|
+
* The read position still belongs to the execution's first commit.
|
|
161
|
+
*/
|
|
162
|
+
function causalChainFromCommit(commitLog, writer, getKeysRead, options) {
|
|
163
|
+
return buildCausalChain(commitLog, writer.runtimeStageId, getKeysRead, options, writer);
|
|
164
|
+
}
|
|
165
|
+
exports.causalChainFromCommit = causalChainFromCommit;
|
|
166
|
+
function buildCausalChain(commitLog, startId, getKeysRead, options, selectedWriter) {
|
|
154
167
|
const maxDepth = options?.maxDepth ?? 20;
|
|
155
168
|
const maxNodes = options?.maxNodes ?? 100;
|
|
156
169
|
const controlDeps = options?.controlDeps;
|
|
@@ -161,16 +174,15 @@ function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
161
174
|
// never mistake a truncated slice for a complete one.
|
|
162
175
|
let truncatedByDepth = false;
|
|
163
176
|
let truncatedByNodes = false;
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
177
|
+
// A continuation may write more data, but it is not another execution of
|
|
178
|
+
// the stage's reads. Use the shared FIRST-commit rule for every read cutoff;
|
|
179
|
+
// keep writer bundles separately for their write metadata and read prefixes.
|
|
180
|
+
const idxMap = (0, commitLogUtils_js_1.buildCommitIndex)(commitLog);
|
|
169
181
|
keyPaths_js_1.queryWork.units += commitLog.length;
|
|
170
182
|
const startIdx = idxMap.get(startId);
|
|
171
183
|
if (startIdx === undefined)
|
|
172
184
|
return undefined;
|
|
173
|
-
const startCommit = commitLog[startIdx];
|
|
185
|
+
const startCommit = selectedWriter ?? commitLog[startIdx];
|
|
174
186
|
// Pick writer lookup strategy based on log size
|
|
175
187
|
const findWriter = createWriterLookup(commitLog);
|
|
176
188
|
// Node dedup map: runtimeStageId → CausalNode (ensures DAG, not tree)
|
|
@@ -374,7 +386,6 @@ function causalChain(commitLog, startId, getKeysRead, options) {
|
|
|
374
386
|
}
|
|
375
387
|
return root;
|
|
376
388
|
}
|
|
377
|
-
exports.causalChain = causalChain;
|
|
378
389
|
// ── Utilities ──────────────────────────────────────────────────────────
|
|
379
390
|
/**
|
|
380
391
|
* Flatten the causal DAG into a BFS-ordered list of nodes.
|
|
@@ -460,4 +471,4 @@ exports.formatCausalChain = formatCausalChain;
|
|
|
460
471
|
// ── Exported for testing (internal) ────────────────────────────────────
|
|
461
472
|
/** @internal Exposed for testing the strategy selection. */
|
|
462
473
|
exports._REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
|
|
463
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHOzs7QUFFSCwyREFBcUQ7QUFFckQsK0NBQXNFO0FBQ3RFLCtDQUF5QztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBQSxrQ0FBYyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUEsc0JBQVEsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE9BQWU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJ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SUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQXJERCw4Q0FxREM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQy9DLFFBQUEsd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zPy5tYXhEZXB0aCA/PyAyMDtcbiAgY29uc3QgbWF4Tm9kZXMgPSBvcHRpb25zPy5tYXhOb2RlcyA/PyAxMDA7XG4gIGNvbnN0IGNvbnRyb2xEZXBzID0gb3B0aW9ucz8uY29udHJvbERlcHM7XG4gIGNvbnN0IHdlaWdoID0gb3B0aW9ucz8ud2VpZ2g7XG4gIGNvbnN0IHBlcldyaXRlID0gb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID09PSAncGVyLXdyaXRlJztcblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkuIFNldCBvbmx5IHdoZW4gYSBsaW1pdCBhY3R1YWxseVxuICAvLyBjdXRzIHRoZSBzbGljZTsgc3VyZmFjZWQgb24gdGhlIHJvb3QgYXMgYHRydW5jYXRlZGAgc28gYSBjb25zdW1lciBjYW5cbiAgLy8gbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBjb21wbGV0ZSBvbmUuXG4gIGxldCB0cnVuY2F0ZWRCeURlcHRoID0gZmFsc2U7XG4gIGxldCB0cnVuY2F0ZWRCeU5vZGVzID0gZmFsc2U7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHOzs7QUFFSCwyREFBdUU7QUFFdkUsK0NBQXNFO0FBQ3RFLCtDQUF5QztBQWdNekMsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBQSxrQ0FBYyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUEsc0JBQVEsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxPQUFPLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQTRCLEVBQUU7UUFDbEUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLE9BQWU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJ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QUFFLENBQUM7WUFDbEMsSUFBSSxDQUNGLE1BQU0sRUFDTixNQUFNLEdBQUcsQ0FBQyxFQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQXJERCw4Q0FxREM7QUFFRCwwRUFBMEU7QUFFMUUsNERBQTREO0FBQy9DLFFBQUEsd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiAgICAoXCJ3cm90ZVwiIGlzIHRoZSB3cml0ZXIgcnVsZSBvZiBga2V5UGF0aHMudHNgLCA5LjMzLjA6IGEgcm93IG9uIHRoZSBrZXksIGluc2lkZSBpdCwgb3JcbiAqICAgIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQg4oCUIHNvIGEgc3RhZ2UgdGhhdCByZWFkIGBjZmdgIGxpbmtzIHRvIHRoZSBzdWJmbG93IHNlZWQgb3JcbiAqICAgIG1lcmdlLWJhY2sgdGhhdCB3cm90ZSBgY2Zn4pCfYmApXG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBidWlsZENvbW1pdEluZGV4LCBmaW5kTGFzdFdyaXRlciB9IGZyb20gJy4vY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCB3cml0ZXNPbmx5SW5zaWRlIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQgeyBsb2dNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoaXMgbm9kZSBkZXBlbmRzIG9uLiBEQUc6IG11bHRpcGxlIHBhcmVudHNcbiAgICogcG9zc2libGUuIEtFUFQgZm9yIGNvbXBhdGliaWxpdHk7IHdpdGggdGhlIGBjb250cm9sRGVwc2Agb3B0aW9uXG4gICAqIChSRkMtMDAzIEQzKSBnb3Zlcm5pbmcgZGVjaWRlcnMgYXBwZWFyIGhlcmUgdG9vLiBGb3IgdHlwZWQva2V5ZWQvXG4gICAqIHdlaWdodGVkIGRldGFpbCB1c2Uge0BsaW5rIHBhcmVudEVkZ2VzfS5cbiAgICovXG4gIHBhcmVudHM6IENhdXNhbE5vZGVbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIG9uZSBlZGdlIHBlciBkZXBlbmRlbmN5IExJTksgKG5vdCBwZXIgcGFyZW50KTogYSBub2RlXG4gICAqIHJlYWRpbmcgdHdvIGtleXMgZnJvbSB0aGUgc2FtZSB3cml0ZXIgaGFzIE9ORSBlbnRyeSBpbiB7QGxpbmsgcGFyZW50c31cbiAgICogYnV0IFRXTyBgJ2RhdGEnYCBlZGdlcyBoZXJlLiBDb250cm9sIGRlcGVuZGVuY2llcyAodmlhIHRoZVxuICAgKiBgY29udHJvbERlcHNgIG9wdGlvbikgYWRkIGEgYCdjb250cm9sJ2AgZWRnZSB0byB0aGUgZ292ZXJuaW5nIGRlY2lkZXIuXG4gICAqL1xuICBwYXJlbnRFZGdlczogQ2F1c2FsRWRnZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlciDigJQgc3RhbXBlZCBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2AuIFByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIEFMU08gY29uc3VtZWRcbiAgICogdW50cmFja2VkIHJlYWQgcGF0aHMgKGBhcmdzYCAvIGBlbnZgIC8gdW5zaGFkb3dlZCBgc2lsZW50YCByZWFkcyk6IHRoZVxuICAgKiBiYWNrd2FyZCBzbGljZSB0aHJvdWdoIHRoaXMgbm9kZSBtYXkgYmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aG9zZSByZWFkc1xuICAgKiBwcm9kdWNlIG5vIHJlYWTihpJ3cml0ZSBlZGdlIHRvIGZvbGxvdy4gYGZvcm1hdENhdXNhbENoYWluYCByZW5kZXJzIHRoaXNcbiAgICogYXMgYSBg4pqgIOKApiBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLiBBYnNlbnQgd2hlbiB0aGUgc3RhZ2Unc1xuICAgKiByZWFkcyB3ZXJlIGZ1bGx5IHRyYWNrZWQuXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAnaW5jb21wbGV0ZS1zb3VyY2VzJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCt1xuICAgKiBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkXG4gICAqIG1lYW5zLiBUaGUgZmllbGQgY2FycmllcyBubyBgY29kZWAg4oCUIGl0cyB2YWx1ZXMgYXJlIHRoZVxuICAgKiB7QGxpbmsgVW50cmFja2VkU291cmNlfXMuXG4gICAqL1xuICBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IOKAlCBzZXQgb24gdGhlIFJPT1Qgbm9kZSBvbmx5LCBhbmQgb25seVxuICAgKiB3aGVuIGEgbGltaXQgYWN0dWFsbHkgY3V0IHRoZSBzbGljZTogYGJ5RGVwdGhgIHdoZW4gYSBub2RlIGF0IHRoZVxuICAgKiBgbWF4RGVwdGhgIGhvcml6b24gc3RpbGwgaGFkIGVkZ2VzIHRvIGV4cGFuZCwgYGJ5Tm9kZXNgIHdoZW4gdGhlXG4gICAqIGBtYXhOb2Rlc2AgYnVkZ2V0IGJsb2NrZWQgY3JlYXRpbmcgYSBkaXNjb3ZlcmVkIHBhcmVudC4gQWJzZW50IHdoZW4gdGhlXG4gICAqIHNsaWNlIGlzIGNvbXBsZXRlLiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGFwcGVuZHMgYSBg4pqgIHNsaWNlIHRydW5jYXRlZCDigKZgXG4gICAqIGxpbmUg4oCUIGEgY29uc3VtZXIgbXVzdCBuZXZlciBtaXN0YWtlIGEgdHJ1bmNhdGVkIHNsaWNlIGZvciBhIGZ1bGwgb25lLlxuICAgKiAoVW50aWwgOS40OC4wIGRldiBtb2RlIGFsc28gd2FybmVkIG9uIHRoZSBjb25zb2xlOyB0aGUgZmllbGQgaXMgdGhlXG4gICAqIHNpZ25hbCwgcmVhZCBpdC4pXG4gICAqXG4gICAqIFJlZ2lzdHJ5IGNvZGU6IGAndHJ1bmNhdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkXG4gICAqIG9uIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIG1lYW5zOyB0aGUgZmllbGQgY2FycmllcyBub1xuICAgKiBgY29kZWAuXG4gICAqL1xuICB0cnVuY2F0ZWQ/OiB7IGJ5RGVwdGg6IGJvb2xlYW47IGJ5Tm9kZXM6IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEY0YiAoOS4zMy4wKSDigJQgdGhlIGtleXMgdGhpcyBub2RlIHJlYWQgdGhhdCBOTyBjb21taXQgYmVmb3JlIGl0IHdyb3RlICh1bmRlciB0aGUgd3JpdGVyIHJ1bGUpLCBzbyB0aGVcbiAgICogd2FsayBoYXMgbm8gZWRnZSB0byBmb2xsb3cgZm9yIHRoZW06IHRoZWlyIHZhbHVlIGNhbWUgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhXG4gICAqIGNsb3N1cmUg4oCUIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuIFRoZSBjb2RlIHNheXMgc28gKGAncHJlLXJ1bi1vcmlnaW4nYCwgcmVnaXN0ZXJlZCBpblxuICAgKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2ApOyBga2V5c2AgYXJlIGluIHRoZSBvcmRlciB0aGUgd2FsayBtZXQgdGhlbS4gQUJTRU5UIHdoZW4gZXZlcnkga2V5XG4gICAqIHRoZSBub2RlIGV4cGFuZGVkIGhhZCBhIHdyaXRlciwgc28gc3VjaCBhIG5vZGUga2VlcHMgaXRzIDkuMzIuMCBzaGFwZS4gQmVmb3JlIDkuMzMuMCB0aGVzZSByZWFkcyB3ZXJlXG4gICAqIGRyb3BwZWQgd2l0aG91dCBhIHdvcmQuXG4gICAqL1xuICBwcmVSdW5SZWFkcz86IHsgY29kZTogUmVnaXN0ZXJlZENvZGU8J3ByZS1ydW4tb3JpZ2luJz47IGtleXM6IHN0cmluZ1tdIH07XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgYSB0eXBlZCBkZXBlbmRlbmN5IGVkZ2UgZnJvbSBhIGNoaWxkIG5vZGUgdG8gb25lIHBhcmVudC5cbiAqXG4gKiAtIGBraW5kOiAnZGF0YSdgICAgIOKAlCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jeTsgYGtleWAgaXMgdGhlIHN0YXRlIGtleS5cbiAqIC0gYGtpbmQ6ICdjb250cm9sJ2Ag4oCUIHRoZSBwYXJlbnQgaXMgdGhlIGRlY2lkZXIvc2VsZWN0b3Igd2hvc2UgZGVjaXNpb25cbiAqICAgYWxsb3dlZCB0aGUgY2hpbGQgdG8gcnVuOyBga2V5YCBpcyB0aGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuXG4gKlxuICogYHdlaWdodGAgZGVmYXVsdHMgdG8gMS4wOyB0aGUgYHdlaWdoYCBob29rIChSRkMtMDAzIEQ0KSBjYW4gb3ZlcnJpZGUgaXQuXG4gKiBUaGUgZW5naW5lIGl0c2VsZiBORVZFUiBjb21wdXRlcyB3ZWlnaHRzIOKAlCBzZW1hbnRpY3MgYmVsb25nIHRvIHRoZVxuICogY29uc3VtZXItaW5qZWN0ZWQgd2VpZ2hlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxFZGdlIHtcbiAgcGFyZW50OiBDYXVzYWxOb2RlO1xuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCc7XG4gIGtleT86IHN0cmluZztcbiAgd2VpZ2h0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGNGIgKDkuMzMuMCkg4oCUIHByZXNlbnQgb25seSBvbiBhIGAnZGF0YSdgIGVkZ2Ugd2hvc2UgcGFyZW50IHdyb3RlIGBrZXlgIE9OTFkgdGhyb3VnaCByb3dzIGluc2lkZSBpdFxuICAgKiAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSk6IHRoYXQgd3JpdGUgbWFkZSBwYXJ0XG4gICAqIG9mIHRoZSB2YWx1ZSwgYW5kIGVhcmxpZXIgd3JpdGVycyBtYXkgYWNjb3VudCBmb3IgdGhlIHJlc3QuIFJlZ2lzdGVyZWQgYXMgYCduZXN0ZWQtcm93cydgIGluXG4gICAqIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYC4gQWJzZW50IGZvciBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LCBzbyBhbiBleGFjdCBlZGdlIGtlZXBzXG4gICAqIGl0cyA5LjMyLjAgc2hhcGUuXG4gICAqL1xuICBiYXNpcz86IFJlZ2lzdGVyZWRDb2RlPCduZXN0ZWQtcm93cyc+O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgb25lIE8ocm93cykgYnVpbGQsIE8oZGVwdGggKyBsb2cgTikgcGVyIGxvb2t1cC5cbiAqIFRoZSBsb2cncyByZWFkIG1vZGVsIChgbG9nTW9kZWwudHNgOiBhIHBhdGggdHJpZSwgZWFjaCB0b3AtbGV2ZWwga2V5IGZvbGRlZCBhdFxuICogbW9zdCBvbmNlKSBhbnN3ZXJzIHRoZSB3cml0ZXIgcnVsZSDigJQgcm93cyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5IOKAlCBieVxuICogYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGxhc3Qgd3JpdGUgb24gb3IgaW5zaWRlIGl0LCB0aGVuIGEgdmVyZGljdCBvbmx5IGZvciB0aGVcbiAqIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0LiBUaGUgc2FtZSBhbnN3ZXIgYGZpbmRMYXN0V3JpdGVyYCBnaXZlcywgc28gdGhlXG4gKiBzdHJhdGVneSBzd2l0Y2ggYmVsb3cgbmV2ZXIgY2hhbmdlcyBhIHNsaWNlLlxuICovXG5mdW5jdGlvbiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSk6IFdyaXRlckxvb2t1cCB7XG4gIGNvbnN0IG1vZGVsID0gbG9nTW9kZWwoY29tbWl0TG9nKTtcbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGF0ID0gbW9kZWwubGFzdFdyaXRlckJlZm9yZShrZXksIGJlZm9yZUlkeCk7XG4gICAgcmV0dXJuIGF0ID49IDAgPyBjb21taXRMb2dbYXRdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSB0cmFjZSBlbnRyaWVzIG9mIGBjb21taXRgIHRoYXQgbWFrZSBpdCBhIHdyaXRlciBvZiBgbGlua0tleWAg4oCUIHRoZSBlbnRyaWVzIHdob3NlIHJlYWRcbiAqIHByZWZpeCAoYFRyYWNlRW50cnkucmVhZEtleXNgKSBhIHBlci13cml0ZSBlZGdlIGV4cGFuZHMgdGhyb3VnaC4gVGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBleGFjdFxuICogcGF0aCB3aGVuIHRoZXJlIGlzIG9uZSAodGhlICNQMSBiZWhhdmlvdXIsIHVuY2hhbmdlZCk7IG90aGVyd2lzZSBldmVyeSBlbnRyeSBpbnNpZGUgb3IgYXJvdW5kXG4gKiB0aGUga2V5ICg5LjMzLjA6IHRoZSBjb21taXQgd3JvdGUgdGhlIGtleSB0aHJvdWdoIGEgbmVzdGVkIHJvdyDigJQgYSBzdWJmbG93IHNlZWQsIGFuXG4gKiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayDigJQgYW5kIGFsbCBvZiB0aG9zZSByb3dzIHdyb3RlIGl0KS5cbiAqL1xuZnVuY3Rpb24gbGlua2luZ0VudHJpZXMoY29tbWl0OiBDb21taXRCdW5kbGUsIGxpbmtLZXk6IHN0cmluZyk6IFRyYWNlRW50cnlbXSB7XG4gIGNvbnN0IGV4YWN0ID0gY29tbWl0LnRyYWNlLmZpbmQoKHQpID0+IHQucGF0aCA9PT0gbGlua0tleSk7XG4gIGlmIChleGFjdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gW2V4YWN0XTtcbiAgcmV0dXJuIGNvbW1pdC50cmFjZS5maWx0ZXIoKHQpID0+IHJlbGF0aW9uKHQucGF0aCwgbGlua0tleSkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGJ1aWxkQ2F1c2FsQ2hhaW4oY29tbWl0TG9nLCBzdGFydElkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc2xpY2UgY29tcG9zaXRpb246IGtlZXAgdGhlIGFjdHVhbCBidW5kbGUgc2VsZWN0ZWQgYnkgdGhlIHdyaXRlclxuICogcXVlcnkgKGluY2x1ZGluZyBhIG5vbmVtcHR5IGNvbnRpbnVhdGlvbikuIFRoaXMgaXMgbm90IGEgcHVibGljIGVudHJ5IHBvaW50LlxuICogVGhlIHJlYWQgcG9zaXRpb24gc3RpbGwgYmVsb25ncyB0byB0aGUgZXhlY3V0aW9uJ3MgZmlyc3QgY29tbWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2F1c2FsQ2hhaW5Gcm9tQ29tbWl0KFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICB3cml0ZXI6IENvbW1pdEJ1bmRsZSxcbiAgZ2V0S2V5c1JlYWQ6IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogQ2F1c2FsQ2hhaW5PcHRpb25zLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBidWlsZENhdXNhbENoYWluKGNvbW1pdExvZywgd3JpdGVyLnJ1bnRpbWVTdGFnZUlkLCBnZXRLZXlzUmVhZCwgb3B0aW9ucywgd3JpdGVyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIHNlbGVjdGVkV3JpdGVyPzogQ29tbWl0QnVuZGxlLFxuKTogQ2F1c2FsTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucz8ubWF4RGVwdGggPz8gMjA7XG4gIGNvbnN0IG1heE5vZGVzID0gb3B0aW9ucz8ubWF4Tm9kZXMgPz8gMTAwO1xuICBjb25zdCBjb250cm9sRGVwcyA9IG9wdGlvbnM/LmNvbnRyb2xEZXBzO1xuICBjb25zdCB3ZWlnaCA9IG9wdGlvbnM/LndlaWdoO1xuICBjb25zdCBwZXJXcml0ZSA9IG9wdGlvbnM/LmVkZ2VBdHRyaWJ1dGlvbiA9PT0gJ3Blci13cml0ZSc7XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5LiBTZXQgb25seSB3aGVuIGEgbGltaXQgYWN0dWFsbHlcbiAgLy8gY3V0cyB0aGUgc2xpY2U7IHN1cmZhY2VkIG9uIHRoZSByb290IGFzIGB0cnVuY2F0ZWRgIHNvIGEgY29uc3VtZXIgY2FuXG4gIC8vIG5ldmVyIG1pc3Rha2UgYSB0cnVuY2F0ZWQgc2xpY2UgZm9yIGEgY29tcGxldGUgb25lLlxuICBsZXQgdHJ1bmNhdGVkQnlEZXB0aCA9IGZhbHNlO1xuICBsZXQgdHJ1bmNhdGVkQnlOb2RlcyA9IGZhbHNlO1xuXG4gIC8vIEEgY29udGludWF0aW9uIG1heSB3cml0ZSBtb3JlIGRhdGEsIGJ1dCBpdCBpcyBub3QgYW5vdGhlciBleGVjdXRpb24gb2ZcbiAgLy8gdGhlIHN0YWdlJ3MgcmVhZHMuIFVzZSB0aGUgc2hhcmVkIEZJUlNULWNvbW1pdCBydWxlIGZvciBldmVyeSByZWFkIGN1dG9mZjtcbiAgLy8ga2VlcCB3cml0ZXIgYnVuZGxlcyBzZXBhcmF0ZWx5IGZvciB0aGVpciB3cml0ZSBtZXRhZGF0YSBhbmQgcmVhZCBwcmVmaXhlcy5cbiAgY29uc3QgaWR4TWFwID0gYnVpbGRDb21taXRJbmRleChjb21taXRMb2cpO1xuICBxdWVyeVdvcmsudW5pdHMgKz0gY29tbWl0TG9nLmxlbmd0aDtcblxuICBjb25zdCBzdGFydElkeCA9IGlkeE1hcC5nZXQoc3RhcnRJZCk7XG4gIGlmIChzdGFydElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0YXJ0Q29tbWl0ID0gc2VsZWN0ZWRXcml0ZXIgPz8gY29tbWl0TG9nW3N0YXJ0SWR4XTtcblxuICAvLyBQaWNrIHdyaXRlciBsb29rdXAgc3RyYXRlZ3kgYmFzZWQgb24gbG9nIHNpemVcbiAgY29uc3QgZmluZFdyaXRlciA9IGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2cpO1xuXG4gIC8vIE5vZGUgZGVkdXAgbWFwOiBydW50aW1lU3RhZ2VJZCDihpIgQ2F1c2FsTm9kZSAoZW5zdXJlcyBEQUcsIG5vdCB0cmVlKVxuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhdXNhbE5vZGU+KCk7XG5cbiAgY29uc3Qgcm9vdDogQ2F1c2FsTm9kZSA9IHtcbiAgICBydW50aW1lU3RhZ2VJZDogc3RhcnRJZCxcbiAgICBzdGFnZUlkOiBzdGFydENvbW1pdC5zdGFnZUlkLFxuICAgIHN0YWdlTmFtZTogc3RhcnRDb21taXQuc3RhZ2UsXG4gICAga2V5c1dyaXR0ZW46IHN0YXJ0Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICBsaW5rZWRCeTogJycsXG4gICAgZGVwdGg6IDAsXG4gICAgcGFyZW50czogW10sXG4gICAgcGFyZW50RWRnZXM6IFtdLFxuICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoc3RhcnRDb21taXQpLFxuICB9O1xuICBub2RlTWFwLnNldChzdGFydElkLCByb290KTtcblxuICAvLyDilIDilIAgI1AxIHBlci13cml0ZSBhdHRyaWJ1dGlvbiBtYWNoaW5lcnkgKGluZXJ0IHVuZGVyICdzdGFnZScpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBleHBhbmRlZFJlYWRzOiBwZXIgbm9kZSwgdGhlIHJlYWRzIGFscmVhZHkgcXVldWVkIGZvciBleHBhbnNpb24g4oCUIGxhdGVcbiAgLy8gbGlua3MgdmlhIGFkZGl0aW9uYWwga2V5cyByZS1lbnF1ZXVlIG9ubHkgdGhlIERFTFRBLCBzbyB0aGUgc2xpY2UgZ3Jvd3NcbiAgLy8gbW9ub3RvbmljYWxseSB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcgYW5kIHRlcm1pbmF0ZXMgKGVhY2gga2V5XG4gIC8vIGV4cGFuZHMgYXQgbW9zdCBvbmNlIHBlciBub2RlKS4gZnVsbHlFeHBhbmRlZDogbm9kZXMgdGhhdCBmZWxsIGJhY2sgdG9cbiAgLy8gc3RhZ2UgbGV2ZWwgKG5vIHJlYWRLZXlzIG9uIGEgbGlua2luZyBlbnRyeSkg4oCUIG5vdGhpbmcgbGVmdCB0byBhZGQuXG4gIGNvbnN0IGV4cGFuZGVkUmVhZHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IGZ1bGx5RXhwYW5kZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgZm9yIHRoZSBnaXZlbiBsaW5raW5nIFdSSVRURU4ga2V5cy5cbiAgICogUGVyLXdyaXRlIG1vZGUgd2l0aCBwcm92ZW5hbmNlIHByZXNlbnQg4oaSIHVuaW9uIG9mIHRoZSBsaW5raW5nIHdyaXRlcydcbiAgICogdGVtcG9yYWwtcHJlZml4IGByZWFkS2V5c2AuIEFueSBsaW5raW5nIGVudHJ5IFdJVEhPVVQgYHJlYWRLZXlzYCAob3Igbm9cbiAgICogbGlua0tleXMgYXQgYWxsKSDihpIgaG9uZXN0IHN0YWdlLWxldmVsIGZhbGxiYWNrLCBmbGFnZ2VkIHZpYSB0aGUgc2Vjb25kXG4gICAqIHR1cGxlIG1lbWJlciBzbyB0aGUgY2FsbGVyIG1hcmtzIHRoZSBub2RlIGZ1bGx5IGV4cGFuZGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHNGb3JMaW5rcyhjb21taXQ6IENvbW1pdEJ1bmRsZSwgbGlua0tleXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogW3N0cmluZ1tdLCBib29sZWFuXSB7XG4gICAgaWYgKCFwZXJXcml0ZSB8fCAhbGlua0tleXMgfHwgbGlua0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgIH1cbiAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbGlua0tleSBvZiBsaW5rS2V5cykge1xuICAgICAgY29uc3QgZW50cmllcyA9IGxpbmtpbmdFbnRyaWVzKGNvbW1pdCwgbGlua0tleSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5zb21lKChlKSA9PiBlLnJlYWRLZXlzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSBmb3IgKGNvbnN0IHJrIG9mIGVudHJ5LnJlYWRLZXlzIGFzIHN0cmluZ1tdKSB1bmlvbi5hZGQocmspO1xuICAgIH1cbiAgICByZXR1cm4gW1suLi51bmlvbl0sIGZhbHNlXTtcbiAgfVxuXG4gIC8vIEJGUy93b3JrbGlzdCBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGgsIGtleXNUb0V4cGFuZF1cbiAgY29uc3QgW3Jvb3RSZWFkcywgcm9vdElzRnVsbF0gPSBwZXJXcml0ZVxuICAgID8gcmVhZHNGb3JMaW5rcyhzdGFydENvbW1pdCwgb3B0aW9ucz8ucm9vdExpbmtLZXlzKVxuICAgIDogW2dldEtleXNSZWFkKHN0YXJ0SWQpLCB0cnVlXTtcbiAgZXhwYW5kZWRSZWFkcy5zZXQoc3RhcnRJZCwgbmV3IFNldChyb290UmVhZHMpKTtcbiAgaWYgKHJvb3RJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHN0YXJ0SWQpO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8W0NhdXNhbE5vZGUsIG51bWJlciwgbnVtYmVyLCBzdHJpbmdbXV0+ID0gW1tyb290LCBzdGFydElkeCwgMCwgcm9vdFJlYWRzXV07XG4gIGxldCB2aXNpdGVkID0gMTtcblxuICAvKipcbiAgICogTGluayBgbm9kZSDihpIgcGFyZW50YCAoY3JlYXRpbmcgKyBlbnF1ZXVlaW5nIHRoZSBwYXJlbnQgd2hlbiBuZXcpLlxuICAgKiBTaGFyZWQgYnkgZGF0YS1lZGdlIGV4cGFuc2lvbiAocmVhZOKGkndyaXRlKSBhbmQgY29udHJvbC1lZGdlIGV4cGFuc2lvblxuICAgKiAoRDMpLiBPbmUgQ2F1c2FsRWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rOyBgcGFyZW50c2BcbiAgICoga2VlcHMgaXRzIGhpc3RvcmljYWwgb25lLWVudHJ5LXBlci1wYXJlbnQgZGVkdXAuXG4gICAqL1xuICBmdW5jdGlvbiBsaW5rUGFyZW50KFxuICAgIG5vZGU6IENhdXNhbE5vZGUsXG4gICAgcGFyZW50Q29tbWl0OiBDb21taXRCdW5kbGUsXG4gICAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnLFxuICAgIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50Q29tbWl0LnJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIHRoZSBkZWR1cCBzY2FucyBiZWxvdywgYW5kIHRoZSBwYXJlbnQncyB0cmFjZSB3aGVuIGl0IGlzIG5ldyDigJQgY291bnRlZCBmb3IgdGhlIHNjYWxpbmcgdGVzdFxuICAgIHF1ZXJ5V29yay51bml0cyArPSAxICsgbm9kZS5wYXJlbnRzLmxlbmd0aCArIG5vZGUucGFyZW50RWRnZXMubGVuZ3RoO1xuICAgIC8vICNQMTogdGhlIHBhcmVudCdzIGV4cGFuc2lvbiByZWFkcywgcmVzb2x2ZWQgTEFaSUxZIChvbmx5IGZvciBuZXcgbm9kZXNcbiAgICAvLyBvciBwZXItd3JpdGUgcmUtZXhwYW5zaW9uIOKAlCBkdXBsaWNhdGUgbGlua3MgdW5kZXIgJ3N0YWdlJyBwYXkgbm90aGluZykuXG4gICAgLy8gRGF0YSBsaW5rcyBleHBhbmQgdGhyb3VnaCB0aGUgcmVhZHMgdGhhdCBmZWQgdGhlIHBhcmVudCdzIHdyaXRlIG9mXG4gICAgLy8gYGtleWA7IGNvbnRyb2wgbGlua3MgZXhwYW5kIHRoZSBkZWNpZGVyIGF0IHN0YWdlIGxldmVsIChhIGRlY2lzaW9uXG4gICAgLy8gZGVwZW5kcyBvbiBldmVyeXRoaW5nIGl0IHJlYWQpLlxuICAgIGNvbnN0IHJlc29sdmVMaW5rUmVhZHMgPSAoKTogW3N0cmluZ1tdLCBib29sZWFuXSA9PlxuICAgICAga2luZCA9PT0gJ2RhdGEnXG4gICAgICAgID8gcmVhZHNGb3JMaW5rcyhwYXJlbnRDb21taXQsIGtleSAhPT0gdW5kZWZpbmVkID8gW2tleV0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogW2dldEtleXNSZWFkKHBhcmVudElkKSwgdHJ1ZV07XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHBhcmVudENvbW1pdC50cmFjZS5sZW5ndGg7XG4gICAgICBwYXJlbnROb2RlID0ge1xuICAgICAgICBydW50aW1lU3RhZ2VJZDogcGFyZW50SWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhcmVudENvbW1pdC5zdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhcmVudENvbW1pdC5zdGFnZSxcbiAgICAgICAga2V5c1dyaXR0ZW46IHBhcmVudENvbW1pdC50cmFjZS5tYXAoKHQpID0+IHQucGF0aCksXG4gICAgICAgIC8vIGxpbmtlZEJ5IHN0YXlzIGEgREFUQS1rZXkgY29uY2VwdCAoYmFjay1jb21wYXQpIOKAlCBjb250cm9sLWxpbmtlZFxuICAgICAgICAvLyBub2RlcyBjYXJyeSB0aGVpciBsYWJlbCBvbiB0aGUgZWRnZSBpbnN0ZWFkLlxuICAgICAgICBsaW5rZWRCeToga2luZCA9PT0gJ2RhdGEnID8ga2V5ID8/ICcnIDogJycsXG4gICAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICAgIHBhcmVudHM6IFtdLFxuICAgICAgICBwYXJlbnRFZGdlczogW10sXG4gICAgICAgIC4uLmluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQocGFyZW50Q29tbWl0KSxcbiAgICAgIH07XG4gICAgICBub2RlTWFwLnNldChwYXJlbnRJZCwgcGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG4gICAgICBjb25zdCBbbGlua1JlYWRzLCBsaW5rSXNGdWxsXSA9IHJlc29sdmVMaW5rUmVhZHMoKTtcbiAgICAgIGV4cGFuZGVkUmVhZHMuc2V0KHBhcmVudElkLCBuZXcgU2V0KGxpbmtSZWFkcykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHBhcmVudElkeCwgZGVwdGggKyAxLCBsaW5rUmVhZHNdKTtcbiAgICB9IGVsc2UgaWYgKHBlcldyaXRlICYmICFmdWxseUV4cGFuZGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIC8vICNQMSB3b3JrbGlzdDogYW4gRVhJU1RJTkcgbm9kZSBsaW5rZWQgdmlhIGFub3RoZXIga2V5IG1heSBvd2UgbW9yZVxuICAgICAgLy8gZXhwYW5zaW9uIOKAlCBlbnF1ZXVlIG9ubHkgdGhlIHJlYWRzIG5vdCB5ZXQgZXhwYW5kZWQgKG1vbm90b25lOyB0aGVcbiAgICAgIC8vIG5vZGUgYnVkZ2V0IGlzIHVudG91Y2hlZCwgbm8gbm9kZSBpcyBjcmVhdGVkKS4gUmUtZXhwYW5zaW9uIGtlZXBzXG4gICAgICAvLyB0aGUgbm9kZSdzIE9SSUdJTkFMIGRlcHRoIHNvIGl0cyBwYXJlbnRzIGdldCBhIGNvbnNpc3RlbnQgZGVwdGgrMS5cbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZFJlYWRzLmdldChwYXJlbnRJZCkhO1xuICAgICAgY29uc3QgZGVsdGEgPSBsaW5rUmVhZHMuZmlsdGVyKChrKSA9PiAhZXhwYW5kZWQuaGFzKGspKTtcbiAgICAgIGlmIChsaW5rSXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICBpZiAoZGVsdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgZGVsdGEpIGV4cGFuZGVkLmFkZChrKTtcbiAgICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRJZHggIT09IHVuZGVmaW5lZCkgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBwYXJlbnROb2RlLmRlcHRoLCBkZWx0YV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERBRyBtZXJnZTogb25lIHBhcmVudHNbXSBlbnRyeSBwZXIgZGlzdGluY3QgcGFyZW50IChoaXN0b3JpY2FsIHNoYXBlKVxuICAgIGlmICghbm9kZS5wYXJlbnRzLnNvbWUoKHApID0+IHAucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkKSkge1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgfVxuICAgIC8vIE9uZSBlZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbmsuIFRoZSB3ZWlnaGVyIChENClcbiAgICAvLyBzdGFtcHMgdGhlIHdlaWdodCBhdCBjcmVhdGlvbjsgYHVuZGVmaW5lZGAg4oaSIDEuMCDigJQgdGhlIGVuZ2luZSBuZXZlclxuICAgIC8vIGNvbXB1dGVzIHdlaWdodHMgaXRzZWxmLlxuICAgIGlmICghbm9kZS5wYXJlbnRFZGdlcy5zb21lKChlKSA9PiBlLnBhcmVudC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQgJiYgZS5raW5kID09PSBraW5kICYmIGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAvLyBFcnJvciBpc29sYXRpb24gKHJldmlldyBmaW5kaW5nKTogYSBjb25zdW1lciB3ZWlnaGVyIHRoYXQgdGhyb3dzXG4gICAgICAvLyBtdXN0IGRlZ3JhZGUgdG8gdGhlIGRlZmF1bHQgd2VpZ2h0LCBuZXZlciBjcmFzaCB0aGUgc2xpY2Ug4oCUIHRoZVxuICAgICAgLy8gc2FtZSBjb250cmFjdCBldmVyeSBvdGhlciBjb25zdW1lciBjYWxsYmFjayBpbiB0aGUgbGlicmFyeSBnZXRzLlxuICAgICAgbGV0IHdlaWdodCA9IDEuMDtcbiAgICAgIGlmICh3ZWlnaCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdlaWdodCA9IHdlaWdoKG5vZGUsIHBhcmVudE5vZGUsIGtleSwga2luZCkgPz8gMS4wO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiB3ZWlnaGVyIHRocmV3IOKAlCBrZWVwIDEuMCwgdGhlIHNsaWNlIHN0YXlzIHVzYWJsZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBraW5kID09PSAnZGF0YScgJiYga2V5ICE9PSB1bmRlZmluZWQgJiYgd3JpdGVzT25seUluc2lkZShwYXJlbnRDb21taXQsIGtleSk7XG4gICAgICBub2RlLnBhcmVudEVkZ2VzLnB1c2goe1xuICAgICAgICBwYXJlbnQ6IHBhcmVudE5vZGUsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGtleSxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICAuLi4obmVzdGVkICYmIHsgYmFzaXM6ICduZXN0ZWQtcm93cycgYXMgY29uc3QgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IDEgKyBrZXlzVG9FeHBhbmQubGVuZ3RoO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIHtcbiAgICAgICAgLy8gRjRiOiBzYXkgd2h5IHRoZXJlIGlzIG5vIGVkZ2Ug4oCUIG5vIGNvbW1pdCBiZWZvcmUgdGhpcyBub2RlIHdyb3RlIHRoZSBrZXkuXG4gICAgICAgIG5vZGUucHJlUnVuUmVhZHMgPz89IHsgY29kZTogJ3ByZS1ydW4tb3JpZ2luJywga2V5czogW10gfTtcbiAgICAgICAgaWYgKCFub2RlLnByZVJ1blJlYWRzLmtleXMuaW5jbHVkZXMoa2V5KSkgbm9kZS5wcmVSdW5SZWFkcy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS4gSXQgaXMgREFUQSwgYW5kIG9ubHlcbiAgLy8gZGF0YTogYSByZWFkZXIgcmVhZHMgYHJvb3QudHJ1bmNhdGVkYCAoYW5kIGBmb3JtYXRDYXVzYWxDaGFpbmAgcHJpbnRzIGl0KTsgdGhlIHJlY29yZCB3cml0ZXMgbm9cbiAgLy8gY29uc29sZSBsaW5lICh0aGUgZGV2LW1vZGUgd2FybmluZyB3ZW50IGluIEM2IOKAlCB0aGUgcmVjb3JkIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZikuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
|
package/dist/lib/memory/merge.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
|
|
4
|
-
*
|
|
4
|
+
* only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
|
|
5
5
|
* of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
|
|
6
6
|
* moved.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.deepSmartMerge = void 0;
|
|
10
|
+
const ownData_js_1 = require("../capture/ownData.js");
|
|
10
11
|
/**
|
|
11
12
|
* Deep union merge helper.
|
|
12
13
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
@@ -47,18 +48,9 @@ function mergeGuarded(dst, src, inFlight) {
|
|
|
47
48
|
for (const k of Object.keys(src)) {
|
|
48
49
|
const owns = Object.prototype.hasOwnProperty.call(out, k);
|
|
49
50
|
const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
|
|
50
|
-
|
|
51
|
-
// assigned too, unless an inherited key (notably __proto__) intercepts
|
|
52
|
-
// the write. Keep that key as DATA, rather than dropping it or invoking
|
|
53
|
-
// a setter; Reflect.has tests existence without reading an inherited getter.
|
|
54
|
-
if (!owns && Reflect.has(out, k)) {
|
|
55
|
-
Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
out[k] = value;
|
|
59
|
-
}
|
|
51
|
+
(0, ownData_js_1.putOwn)(out, k, value);
|
|
60
52
|
}
|
|
61
53
|
inFlight.delete(src);
|
|
62
54
|
return out;
|
|
63
55
|
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVILHNEQUErQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEdBQVEsRUFBRSxHQUFRO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBUSxFQUFFLEdBQVEsRUFBRSxRQUEwQztJQUNsRixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRXhELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7UUFDaEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUM7SUFFM0YsTUFBTSxHQUFHLEdBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUMsUUFBUSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLElBQUEsbUJBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbWVyZ2UudHMg4oCUIHRoZSB1bmlvbiBtZXJnZSB0aGUgYG1lcmdlYCB2ZXJiIGFwcGxpZXMuIEEgbGVhZiAoTDAsIGltcG9ydHNcbiAqIG9ubHkgdGhlIG93bi1zbG90IHdyaXRlcik6IGBkZWVwU21hcnRNZXJnZWAsIHRoZSBsYXcgZXZlcnkgcmVwbGF5LCBmb2xkIGFuZCByZWFkZXJcbiAqIG9mIGEgcmVjb3JkZWQgYG1lcmdlYCByb3cgcnVucy4gUmUtZXhwb3J0ZWQgZnJvbSBgdXRpbHMudHNgLCBzbyBubyBpbXBvcnRlclxuICogbW92ZWQuXG4gKi9cblxuaW1wb3J0IHsgcHV0T3duIH0gZnJvbSAnLi4vY2FwdHVyZS9vd25EYXRhLmpzJztcblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLCBpbmNsdWRpbmcgc3BlY2lhbCBrZXlzO1xuICogICBpbmhlcml0ZWQgZGVzdGluYXRpb24gdmFsdWVzIGFuZCBzZXR0ZXJzIG5ldmVyIHBhcnRpY2lwYXRlLlxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICpcbiAqIFRlcm1pbmF0ZXMgb24gYSBDWUNMSUMgYHNyY2AgKDkuMTguMSwgc2FtZSBsYXcgYXMge0BsaW5rIGRlZXBFcXVhbH06IGFcbiAqIHN0YXRlIHZhbHVlIHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBwcmVzZXJ2ZXMgY3ljbGVzKS4gQSBgc3JjYFxuICogb2JqZWN0IHJlLWVudGVyZWQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgbWVyZ2VkIGhpZ2hlciB1cCB0aGUgc3RhY2sgaGFuZHNcbiAqIGJhY2sgdGhlIG91dHB1dCBiZWluZyBidWlsdCBmb3IgaXQsIHNvIHRoZSBtZXJnZWQgdmFsdWUgbWlycm9ycyB0aGUgY3ljbGVcbiAqIGluc3RlYWQgb2YgdW5yb2xsaW5nIGl0IGZvcmV2ZXIuIE9ubHkgdGhlIGFuY2VzdG9ycyBvbiB0aGUgc3RhY2sgYXJlXG4gKiBndWFyZGVkIOKAlCBhIHNoYXJlZCAoYWN5Y2xpYykgYHNyY2AgcmVmZXJlbmNlIG1ldCBhZ2FpbiBhdCBhIGRpZmZlcmVudFxuICogYGRzdGAgbWVyZ2VzIGFnYWluc3QgVEhBVCBgZHN0YCwgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICByZXR1cm4gbWVyZ2VHdWFyZGVkKGRzdCwgc3JjLCB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUd1YXJkZWQoZHN0OiBhbnksIHNyYzogYW55LCBpbkZsaWdodDogV2Vha01hcDxvYmplY3QsIGFueT4gfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBpZiAoaW5GbGlnaHQ/LmhhcyhzcmMpKSByZXR1cm4gaW5GbGlnaHQuZ2V0KHNyYyk7IC8vIGN5Y2xlIOKAlCByZS1lbnRlciB0aGUgdmFsdWUgYmVpbmcgYnVpbHRcblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAoaW5GbGlnaHQgPz89IG5ldyBXZWFrTWFwKCkpLnNldChzcmMsIG91dCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgY29uc3Qgb3ducyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXQsIGspO1xuICAgIGNvbnN0IHZhbHVlID0gbWVyZ2VHdWFyZGVkKG93bnMgPyBvdXRba10gOiB1bmRlZmluZWQsIHNyY1trXSwgaW5GbGlnaHQpO1xuICAgIHB1dE93bihvdXQsIGssIHZhbHVlKTtcbiAgfVxuICBpbkZsaWdodC5kZWxldGUoc3JjKTtcbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|