@sochdb/sochdb 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +220 -33
- package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
- package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
- package/bin/sochdb-bulk.js +1 -1
- package/bin/sochdb-grpc-server.js +1 -1
- package/bin/sochdb-server.js +1 -1
- package/dist/cjs/context-builder.js +280 -0
- package/dist/cjs/database.js +2 -2
- package/dist/cjs/embedded/database.js +2 -2
- package/dist/cjs/errors.js +99 -7
- package/dist/cjs/index.js +40 -3
- package/dist/cjs/ipc-client.js +2 -2
- package/dist/cjs/memory/consolidation.js +202 -0
- package/dist/cjs/memory/extraction.js +181 -0
- package/dist/cjs/memory/index.js +26 -0
- package/dist/cjs/memory/retrieval.js +232 -0
- package/dist/cjs/memory/types.js +69 -0
- package/dist/cjs/namespace.js +255 -0
- package/dist/cjs/queue.js +289 -0
- package/dist/cjs/semantic-cache.js +220 -0
- package/dist/esm/context-builder.js +280 -0
- package/dist/esm/database.js +2 -2
- package/dist/esm/embedded/database.js +2 -2
- package/dist/esm/errors.js +107 -7
- package/dist/esm/index.js +40 -3
- package/dist/esm/ipc-client.js +2 -2
- package/dist/esm/memory/consolidation.js +206 -0
- package/dist/esm/memory/extraction.js +185 -0
- package/dist/esm/memory/index.js +26 -0
- package/dist/esm/memory/retrieval.js +243 -0
- package/dist/esm/memory/types.js +72 -0
- package/dist/esm/namespace.js +262 -0
- package/dist/esm/queue.js +291 -0
- package/dist/esm/semantic-cache.js +223 -0
- package/dist/types/context-builder.d.ts +97 -0
- package/dist/types/context-builder.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -1
- package/dist/types/embedded/database.d.ts +1 -1
- package/dist/types/errors.d.ts +57 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ipc-client.d.ts +1 -1
- package/dist/types/memory/consolidation.d.ts +66 -0
- package/dist/types/memory/consolidation.d.ts.map +1 -0
- package/dist/types/memory/extraction.d.ts +82 -0
- package/dist/types/memory/extraction.d.ts.map +1 -0
- package/dist/types/memory/index.d.ts +10 -0
- package/dist/types/memory/index.d.ts.map +1 -0
- package/dist/types/memory/retrieval.d.ts +46 -0
- package/dist/types/memory/retrieval.d.ts.map +1 -0
- package/dist/types/memory/types.d.ts +147 -0
- package/dist/types/memory/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +129 -0
- package/dist/types/namespace.d.ts.map +1 -0
- package/dist/types/queue.d.ts +120 -0
- package/dist/types/queue.d.ts.map +1 -0
- package/dist/types/semantic-cache.d.ts +84 -0
- package/dist/types/semantic-cache.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.GrpcClient = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
|
|
40
|
+
exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.NamespacePolicy = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
|
|
41
41
|
// Version
|
|
42
|
-
exports.VERSION = '0.4.
|
|
42
|
+
exports.VERSION = '0.4.1';
|
|
43
43
|
// Embedded mode (FFI) - NEW
|
|
44
44
|
var embedded_1 = require("./embedded");
|
|
45
45
|
Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
|
|
@@ -48,6 +48,36 @@ Object.defineProperty(exports, "EmbeddedTransaction", { enumerable: true, get: f
|
|
|
48
48
|
// Embedded mode (FFI) - Convenience alias
|
|
49
49
|
var embedded_3 = require("./embedded");
|
|
50
50
|
Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return embedded_3.EmbeddedDatabase; } });
|
|
51
|
+
// Namespace API (v0.4.1)
|
|
52
|
+
var namespace_1 = require("./namespace");
|
|
53
|
+
Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return namespace_1.Namespace; } });
|
|
54
|
+
Object.defineProperty(exports, "Collection", { enumerable: true, get: function () { return namespace_1.Collection; } });
|
|
55
|
+
Object.defineProperty(exports, "DistanceMetric", { enumerable: true, get: function () { return namespace_1.DistanceMetric; } });
|
|
56
|
+
Object.defineProperty(exports, "NamespaceNotFoundError", { enumerable: true, get: function () { return namespace_1.NamespaceNotFoundError; } });
|
|
57
|
+
Object.defineProperty(exports, "NamespaceExistsError", { enumerable: true, get: function () { return namespace_1.NamespaceExistsError; } });
|
|
58
|
+
Object.defineProperty(exports, "CollectionNotFoundError", { enumerable: true, get: function () { return namespace_1.CollectionNotFoundError; } });
|
|
59
|
+
Object.defineProperty(exports, "CollectionExistsError", { enumerable: true, get: function () { return namespace_1.CollectionExistsError; } });
|
|
60
|
+
// Queue API (v0.4.1)
|
|
61
|
+
var queue_1 = require("./queue");
|
|
62
|
+
Object.defineProperty(exports, "PriorityQueue", { enumerable: true, get: function () { return queue_1.PriorityQueue; } });
|
|
63
|
+
Object.defineProperty(exports, "TaskState", { enumerable: true, get: function () { return queue_1.TaskState; } });
|
|
64
|
+
Object.defineProperty(exports, "createQueue", { enumerable: true, get: function () { return queue_1.createQueue; } });
|
|
65
|
+
// Semantic Cache (v0.4.1)
|
|
66
|
+
var semantic_cache_1 = require("./semantic-cache");
|
|
67
|
+
Object.defineProperty(exports, "SemanticCache", { enumerable: true, get: function () { return semantic_cache_1.SemanticCache; } });
|
|
68
|
+
// Context Builder (v0.4.1)
|
|
69
|
+
var context_builder_1 = require("./context-builder");
|
|
70
|
+
Object.defineProperty(exports, "ContextQueryBuilder", { enumerable: true, get: function () { return context_builder_1.ContextQueryBuilder; } });
|
|
71
|
+
Object.defineProperty(exports, "ContextOutputFormat", { enumerable: true, get: function () { return context_builder_1.ContextOutputFormat; } });
|
|
72
|
+
Object.defineProperty(exports, "TruncationStrategy", { enumerable: true, get: function () { return context_builder_1.TruncationStrategy; } });
|
|
73
|
+
Object.defineProperty(exports, "createContextBuilder", { enumerable: true, get: function () { return context_builder_1.createContextBuilder; } });
|
|
74
|
+
// Memory System (v0.4.2)
|
|
75
|
+
var memory_1 = require("./memory");
|
|
76
|
+
Object.defineProperty(exports, "ExtractionPipeline", { enumerable: true, get: function () { return memory_1.ExtractionPipeline; } });
|
|
77
|
+
Object.defineProperty(exports, "Consolidator", { enumerable: true, get: function () { return memory_1.Consolidator; } });
|
|
78
|
+
Object.defineProperty(exports, "HybridRetriever", { enumerable: true, get: function () { return memory_1.HybridRetriever; } });
|
|
79
|
+
Object.defineProperty(exports, "AllowedSet", { enumerable: true, get: function () { return memory_1.AllowedSet; } });
|
|
80
|
+
Object.defineProperty(exports, "NamespacePolicy", { enumerable: true, get: function () { return memory_1.NamespacePolicy; } });
|
|
51
81
|
// Server mode (gRPC/IPC)
|
|
52
82
|
var grpc_client_1 = require("./grpc-client");
|
|
53
83
|
Object.defineProperty(exports, "SochDBClient", { enumerable: true, get: function () { return grpc_client_1.SochDBClient; } });
|
|
@@ -69,7 +99,14 @@ Object.defineProperty(exports, "ConnectionError", { enumerable: true, get: funct
|
|
|
69
99
|
Object.defineProperty(exports, "TransactionError", { enumerable: true, get: function () { return errors_1.TransactionError; } });
|
|
70
100
|
Object.defineProperty(exports, "ProtocolError", { enumerable: true, get: function () { return errors_1.ProtocolError; } });
|
|
71
101
|
Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return errors_1.DatabaseError; } });
|
|
102
|
+
// Lock errors (v0.4.1)
|
|
103
|
+
Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return errors_1.ErrorCode; } });
|
|
104
|
+
Object.defineProperty(exports, "LockError", { enumerable: true, get: function () { return errors_1.LockError; } });
|
|
105
|
+
Object.defineProperty(exports, "DatabaseLockedError", { enumerable: true, get: function () { return errors_1.DatabaseLockedError; } });
|
|
106
|
+
Object.defineProperty(exports, "LockTimeoutError", { enumerable: true, get: function () { return errors_1.LockTimeoutError; } });
|
|
107
|
+
Object.defineProperty(exports, "EpochMismatchError", { enumerable: true, get: function () { return errors_1.EpochMismatchError; } });
|
|
108
|
+
Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: function () { return errors_1.SplitBrainError; } });
|
|
72
109
|
// Convenience alias
|
|
73
110
|
var grpc_client_2 = require("./grpc-client");
|
|
74
111
|
Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFFNUIsMENBQTBDO0FBQzFDLHVDQUEwRDtBQUFqRCxvR0FBQSxnQkFBZ0IsT0FBWTtBQUVyQyx5QkFBeUI7QUFDekIseUNBUXFCO0FBUG5CLHNHQUFBLFNBQVMsT0FBQTtBQUNULHVHQUFBLFVBQVUsT0FBQTtBQUNWLDJHQUFBLGNBQWMsT0FBQTtBQUNkLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGlIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLG9IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLGtIQUFBLHFCQUFxQixPQUFBO0FBU3ZCLHFCQUFxQjtBQUNyQixpQ0FJaUI7QUFIZixzR0FBQSxhQUFhLE9BQUE7QUFDYixrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFTYiwwQkFBMEI7QUFDMUIsbURBRTBCO0FBRHhCLCtHQUFBLGFBQWEsT0FBQTtBQVFmLDJCQUEyQjtBQUMzQixxREFLMkI7QUFKekIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUhBQUEsb0JBQW9CLE9BQUE7QUFNdEIseUJBQXlCO0FBQ3pCLG1DQU1rQjtBQUxoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQixzR0FBQSxZQUFZLE9BQUE7QUFDWix5R0FBQSxlQUFlLE9BQUE7QUFDZixvR0FBQSxVQUFVLE9BQUE7QUFDVix5R0FBQSxlQUFlLE9BQUE7QUFpQmpCLHlCQUF5QjtBQUN6Qiw2Q0FBNkM7QUFBcEMsMkdBQUEsWUFBWSxPQUFBO0FBUXJCLDJDQUF5QztBQUFoQyx1R0FBQSxTQUFTLE9BQUE7QUFFbEIsbUJBQW1CO0FBQ25CLG1DQU1rQjtBQUxoQixvR0FBQSxVQUFVLE9BQUE7QUFDVix1R0FBQSxhQUFhLE9BQUE7QUFDYix5R0FBQSxlQUFlLE9BQUE7QUFDZiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwrR0FBQSxxQkFBcUIsT0FBQTtBQUd2QixtQkFBbUI7QUFDbkIsaUNBQWdDO0FBQXZCLDhGQUFBLEtBQUssT0FBQTtBQUdkLG1DQWFrQjtBQVpoQixxR0FBQSxXQUFXLE9BQUE7QUFDWCx5R0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQix1R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxhQUFhLE9BQUE7QUFDYix1QkFBdUI7QUFDdkIsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsNkdBQUEsbUJBQW1CLE9BQUE7QUFDbkIsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIseUdBQUEsZUFBZSxPQUFBO0FBR2pCLG9CQUFvQjtBQUNwQiw2Q0FBMkQ7QUFBbEQseUdBQUEsWUFBWSxPQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgTm9kZS5qcyBTREsgdjAuNC4wXG4gKiBcbiAqIER1YWwtbW9kZSBhcmNoaXRlY3R1cmU6IEVtYmVkZGVkIChGRkkpICsgU2VydmVyIChnUlBDL0lQQylcbiAqIFxuICogQXJjaGl0ZWN0dXJlOiBGbGV4aWJsZSBEZXBsb3ltZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBUaGlzIFNESyBzdXBwb3J0cyBCT1RIIG1vZGVzOlxuICogXG4gKiAxLiBFbWJlZGRlZCBNb2RlIChGRkkpIC0gRm9yIHNpbmdsZS1wcm9jZXNzIGFwcHM6XG4gKiAgICAtIERpcmVjdCBGRkkgYmluZGluZ3MgdG8gUnVzdCBsaWJyYXJpZXNcbiAqICAgIC0gTm8gc2VydmVyIHJlcXVpcmVkIC0ganVzdCBucG0gaW5zdGFsbCBhbmQgcnVuXG4gKiAgICAtIEJlc3QgZm9yOiBMb2NhbCBkZXZlbG9wbWVudCwgc2ltcGxlIGFwcHNcbiAqIFxuICogMi4gU2VydmVyIE1vZGUgKGdSUEMvSVBDKSAtIEZvciBkaXN0cmlidXRlZCBzeXN0ZW1zOlxuICogICAgLSBUaGluIGNsaWVudCBjb25uZWN0aW5nIHRvIHNvY2hkYi1ncnBjIHNlcnZlclxuICogICAgLSBCZXN0IGZvcjogUHJvZHVjdGlvbiwgbXVsdGktbGFuZ3VhZ2UsIHNjYWxhYmlsaXR5XG4gKiBcbiAqIEBleGFtcGxlIEVtYmVkZGVkIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBEaXJlY3QgRkZJIC0gbm8gc2VydmVyIG5lZWRlZFxuICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC40LjEnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgRW1iZWRkZWREYXRhYmFzZSBhcyBEYXRhYmFzZSB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG4gIE5hbWVzcGFjZVBvbGljeSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuZXhwb3J0IHR5cGUge1xuICBFbnRpdHksXG4gIFJlbGF0aW9uLFxuICBBc3NlcnRpb24sXG4gIFJhd0Fzc2VydGlvbixcbiAgQ2Fub25pY2FsRmFjdCxcbiAgRXh0cmFjdGlvblJlc3VsdCxcbiAgRXh0cmFjdGlvblNjaGVtYSxcbiAgQ29uc29saWRhdGlvbkNvbmZpZyxcbiAgUmV0cmlldmFsQ29uZmlnLFxuICBSZXRyaWV2YWxSZXN1bHQsXG4gIFJldHJpZXZhbFJlc3BvbnNlLFxuICBOYW1lc3BhY2VHcmFudCxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBTZXJ2ZXIgbW9kZSAoZ1JQQy9JUEMpXG5leHBvcnQgeyBTb2NoREJDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbmV4cG9ydCB0eXBlIHtcbiAgU2VhcmNoUmVzdWx0LFxuICBEb2N1bWVudCxcbiAgR3JhcGhOb2RlLFxuICBHcmFwaEVkZ2UsXG59IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuXG5leHBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICcuL2lwYy1jbGllbnQnO1xuXG4vLyBGb3JtYXQgdXRpbGl0aWVzXG5leHBvcnQge1xuICBXaXJlRm9ybWF0LFxuICBDb250ZXh0Rm9ybWF0LFxuICBDYW5vbmljYWxGb3JtYXQsXG4gIEZvcm1hdENhcGFiaWxpdGllcyxcbiAgRm9ybWF0Q29udmVyc2lvbkVycm9yLFxufSBmcm9tICcuL2Zvcm1hdCc7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnNcbmV4cG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5leHBvcnQgdHlwZSB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9xdWVyeSc7XG5cbmV4cG9ydCB7XG4gIFNvY2hEQkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uRXJyb3IsXG4gIFByb3RvY29sRXJyb3IsXG4gIERhdGFiYXNlRXJyb3IsXG4gIC8vIExvY2sgZXJyb3JzICh2MC40LjEpXG4gIEVycm9yQ29kZSxcbiAgTG9ja0Vycm9yLFxuICBEYXRhYmFzZUxvY2tlZEVycm9yLFxuICBMb2NrVGltZW91dEVycm9yLFxuICBFcG9jaE1pc21hdGNoRXJyb3IsXG4gIFNwbGl0QnJhaW5FcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgU29jaERCQ2xpZW50IGFzIEdycGNDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbiJdfQ==
|
package/dist/cjs/ipc-client.js
CHANGED
|
@@ -112,7 +112,7 @@ const MAX_MESSAGE_SIZE = 16 * 1024 * 1024; // 16 MB
|
|
|
112
112
|
*
|
|
113
113
|
* @example
|
|
114
114
|
* ```typescript
|
|
115
|
-
* import { IpcClient } from '@
|
|
115
|
+
* import { IpcClient } from '@sochdb/sochdb';
|
|
116
116
|
*
|
|
117
117
|
* const client = await IpcClient.connect('/tmp/sochdb.sock');
|
|
118
118
|
*
|
|
@@ -501,4 +501,4 @@ class IpcClient {
|
|
|
501
501
|
}
|
|
502
502
|
}
|
|
503
503
|
exports.IpcClient = IpcClient;
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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O0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sTUFBTSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhjRCw4QkFnY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBJUEMgQ2xpZW50XG4gKlxuICogQ29ubmVjdHMgdG8gYSBTb2NoREIgSVBDIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUHJvdG9jb2xFcnJvciwgVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbi8qKlxuICogV2lyZSBwcm90b2NvbCBvcGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgT3BDb2RlID0ge1xuICAvLyBDbGllbnQg4oaSIFNlcnZlciAobXVzdCBtYXRjaCBzb2NoZGItc3RvcmFnZS9zcmMvaXBjX3NlcnZlci5ycylcbiAgUHV0OiAweDAxLFxuICBHZXQ6IDB4MDIsXG4gIERlbGV0ZTogMHgwMyxcbiAgQmVnaW5UeG46IDB4MDQsXG4gIENvbW1pdFR4bjogMHgwNSxcbiAgQWJvcnRUeG46IDB4MDYsXG4gIFF1ZXJ5OiAweDA3LFxuICBDcmVhdGVUYWJsZTogMHgwOCxcbiAgUHV0UGF0aDogMHgwOSxcbiAgR2V0UGF0aDogMHgwQSxcbiAgU2NhbjogMHgwQixcbiAgQ2hlY2twb2ludDogMHgwQyxcbiAgU3RhdHM6IDB4MEQsXG4gIFBpbmc6IDB4MEUsXG5cbiAgLy8gU2VydmVyIOKGkiBDbGllbnRcbiAgT0s6IDB4ODAsXG4gIEVycm9yOiAweDgxLFxuICBWYWx1ZTogMHg4MixcbiAgVHhuSWQ6IDB4ODMsXG4gIFJvdzogMHg4NCxcbiAgRW5kU3RyZWFtOiAweDg1LFxuICBTdGF0c1Jlc3A6IDB4ODYsXG4gIFBvbmc6IDB4ODcsXG59IGFzIGNvbnN0O1xuXG4vLyBJbnRlcm5hbCBPcENvZGUgbWFwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgSW50ZXJuYWxPcENvZGUgPSB7XG4gIFBVVDogT3BDb2RlLlB1dCxcbiAgR0VUOiBPcENvZGUuR2V0LFxuICBERUxFVEU6IE9wQ29kZS5EZWxldGUsXG4gIEJFR0lOX1RYTjogT3BDb2RlLkJlZ2luVHhuLFxuICBDT01NSVRfVFhOOiBPcENvZGUuQ29tbWl0VHhuLFxuICBBQk9SVF9UWE46IE9wQ29kZS5BYm9ydFR4bixcbiAgUVVFUlk6IE9wQ29kZS5RdWVyeSxcbiAgUFVUX1BBVEg6IE9wQ29kZS5QdXRQYXRoLFxuICBHRVRfUEFUSDogT3BDb2RlLkdldFBhdGgsXG4gIFNDQU46IE9wQ29kZS5TY2FuLFxuICBDSEVDS1BPSU5UOiBPcENvZGUuQ2hlY2twb2ludCxcbiAgU1RBVFM6IE9wQ29kZS5TdGF0cyxcbiAgUElORzogT3BDb2RlLlBpbmcsXG4gIE9LOiBPcENvZGUuT0ssXG4gIEVSUk9SOiBPcENvZGUuRXJyb3IsXG4gIFZBTFVFOiBPcENvZGUuVmFsdWUsXG4gIFRYTl9JRDogT3BDb2RlLlR4bklkLFxuICBST1c6IE9wQ29kZS5Sb3csXG4gIEVORF9TVFJFQU06IE9wQ29kZS5FbmRTdHJlYW0sXG4gIFNUQVRTX1JFU1A6IE9wQ29kZS5TdGF0c1Jlc3AsXG4gIFBPTkc6IE9wQ29kZS5Qb25nLFxufSBhcyBjb25zdDtcblxuY29uc3QgTUFYX01FU1NBR0VfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7IC8vIDE2IE1CXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBJcGNDbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBjQ2xpZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gVW5peCBkb21haW4gc29ja2V0ICovXG4gIHNvY2tldFBhdGg6IHN0cmluZztcbiAgLyoqIENvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIGNvbm5lY3RUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogUmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHJlYWRUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIElQQyBDbGllbnQgZm9yIFNvY2hEQi5cbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBzZXJ2ZXIgdmlhIFVuaXggZG9tYWluIHNvY2tldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnQHN1c2hhbnRoL3NvY2hkYic7XG4gKlxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAqXG4gKiBhd2FpdCBjbGllbnQucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBjbGllbnQuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKlxuICogYXdhaXQgY2xpZW50LmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElwY0NsaWVudCB7XG4gIHByaXZhdGUgX3NvY2tldDogbmV0LlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9jb25maWc6IFJlcXVpcmVkPElwY0NsaWVudENvbmZpZz47XG4gIHByaXZhdGUgX3BlbmRpbmdSZWFkczogQXJyYXk8e1xuICAgIHJlc29sdmU6IChidWY6IEJ1ZmZlcikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIF9yZWFkQnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gIHByaXZhdGUgX2Nsb3NlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY29uZmlnOiBJcGNDbGllbnRDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBjb25uZWN0VGltZW91dDogNTAwMCxcbiAgICAgIHJlYWRUaW1lb3V0OiAzMDAwMCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSBTb2NoREIgSVBDIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHNvY2tldFBhdGggLSBQYXRoIHRvIHRoZSBVbml4IGRvbWFpbiBzb2NrZXRcbiAgICogQHJldHVybnMgQSBjb25uZWN0ZWQgSXBjQ2xpZW50IGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY29ubmVjdChzb2NrZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElwY0NsaWVudD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBJcGNDbGllbnQoeyBzb2NrZXRQYXRoIH0pO1xuICAgIGF3YWl0IGNsaWVudC5fY29ubmVjdCgpO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgeyBwYXRoOiB0aGlzLl9jb25maWcuc29ja2V0UGF0aCB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgc29ja2V0LnNldFRpbWVvdXQodGhpcy5fY29uZmlnLmNvbm5lY3RUaW1lb3V0KTtcblxuICAgICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0JykpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKGBDb25uZWN0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX3JlYWRCdWZmZXIsIGRhdGFdKTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUmVhZHMpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMgPSBbXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0J1ZmZlcigpOiB2b2lkIHtcbiAgICAvLyBQcm9jZXNzIGNvbXBsZXRlIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlclxuICAgIHdoaWxlICh0aGlzLl9yZWFkQnVmZmVyLmxlbmd0aCA+PSA1ICYmIHRoaXMuX3BlbmRpbmdSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9yZWFkQnVmZmVyLnJlYWRVSW50MzJMRSgxKTtcbiAgICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gNSArIGxlbmd0aDtcblxuICAgICAgaWYgKHRoaXMuX3JlYWRCdWZmZXIubGVuZ3RoID49IHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl9yZWFkQnVmZmVyLnN1YmFycmF5KDAsIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IHRoaXMuX3JlYWRCdWZmZXIuc3ViYXJyYXkodG90YWxMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nUmVhZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3NlbmQob3Bjb2RlOiBudW1iZXIsIHBheWxvYWQ6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCAhdGhpcy5fc29ja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdOb3QgY29ubmVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRW5jb2RlIG1lc3NhZ2U6IG9wY29kZSAoMSkgKyBsZW5ndGggKDQgTEUpICsgcGF5bG9hZFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuYWxsb2MoNSArIHBheWxvYWQubGVuZ3RoKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDgob3Bjb2RlLCAwKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDMyTEUocGF5bG9hZC5sZW5ndGgsIDEpO1xuICAgIHBheWxvYWQuY29weShtZXNzYWdlLCA1KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcblxuICAgICAgdGhpcy5fc29ja2V0IS53cml0ZShtZXNzYWdlLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucG9wKCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoYFdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGltZW91dCBmb3IgcmVzcG9uc2VcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9wZW5kaW5nUmVhZHMuZmluZEluZGV4KChwKSA9PiBwLnJlc29sdmUgPT09IHJlc29sdmUpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignUmVhZCB0aW1lb3V0JykpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLl9jb25maWcucmVhZFRpbWVvdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VSZXNwb25zZShyZXNwb25zZTogQnVmZmVyKTogeyBvcGNvZGU6IG51bWJlcjsgcGF5bG9hZDogQnVmZmVyIH0ge1xuICAgIGNvbnN0IG9wY29kZSA9IHJlc3BvbnNlLnJlYWRVSW50OCgwKTtcbiAgICBjb25zdCBsZW5ndGggPSByZXNwb25zZS5yZWFkVUludDMyTEUoMSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHJlc3BvbnNlLnN1YmFycmF5KDUsIDUgKyBsZW5ndGgpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuRVJST1IpIHtcbiAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3Bjb2RlLCBwYXlsb2FkIH07XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGEga2V5IGZvciB0aGUgd2lyZSBwcm90b2NvbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlS2V5KGtleTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aDtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuYWxsb2MoNCArIG1zZ0xlbik7XG4gICAgbXNnLndyaXRlVUludDMyQkUobXNnTGVuLCAwKTtcbiAgICBtc2cud3JpdGVVSW50OChJbnRlcm5hbE9wQ29kZS5HRVQsIDQpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKGtleS5sZW5ndGgsIDUpO1xuICAgIGtleS5jb3B5KG1zZywgOSk7XG4gICAgcmV0dXJuIG1zZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBrZXktdmFsdWUgcGFpciBmb3IgdGhlIHdpcmUgcHJvdG9jb2wuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGVuY29kZUtleVZhbHVlKGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVt2YWx1ZV9sZW46NF1bdmFsdWU6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aCArIDQgKyB2YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmFsbG9jKDQgKyBtc2dMZW4pO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKG1zZ0xlbiwgMCk7XG4gICAgbXNnLndyaXRlVUludDgoSW50ZXJuYWxPcENvZGUuUFVULCA0KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShrZXkubGVuZ3RoLCA1KTtcbiAgICBrZXkuY29weShtc2csIDkpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKHZhbHVlLmxlbmd0aCwgOSArIGtleS5sZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkobXNnLCAxMyArIGtleS5sZW5ndGgpO1xuICAgIHJldHVybiBtc2c7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkga2V5LlxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkdFVCwga2V5KTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5WQUxVRSkge1xuICAgICAgLy8gSWYgcGF5bG9hZCBpcyBlbXB0eSwgdGhlIGtleSBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAocGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIuXG4gICAqL1xuICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFbmNvZGU6IGtleV9sZW4gKDQgTEUpICsga2V5ICsgdmFsdWVcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDQgKyBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUoa2V5Lmxlbmd0aCwgMCk7XG4gICAga2V5LmNvcHkocGF5bG9hZCwgNCk7XG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsga2V5Lmxlbmd0aCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUFVULCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBrZXkuXG4gICAqL1xuICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuREVMRVRFLCBrZXkpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAvLyBFbmNvZGUgcGF0aCBhcyBzaW5nbGUgc2VnbWVudCBmb3Igbm93IChjb3VsZCBzcGxpdCBvbiAnLycgZm9yIG11bHRpLXNlZ21lbnQpXG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYygyICsgMiArIHBhdGhCdWYubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoMSwgMCk7IC8vIHBhdGhfY291bnQgPSAxXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKHBhdGhCdWYubGVuZ3RoLCAyKTsgLy8gcGF0aF9sZW5cbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgNCk7IC8vIHBhdGhcbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuR0VUX1BBVEgsIHBheWxvYWQpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkOiByZXNwb25zZVBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVkFMVUUpIHtcbiAgICAgIC8vIElmIHBheWxvYWQgaXMgZW1wdHksIHRoZSBrZXkgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKHJlc3BvbnNlUGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VQYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSB2YWx1ZSBhdCBhIHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLiArIHZhbHVlXG4gICAqL1xuICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMiArIDIgKyBwYXRoQnVmLmxlbmd0aCArIHZhbHVlLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKDEsIDApOyAvLyBwYXRoX2NvdW50ID0gMVxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgMik7IC8vIHBhdGhfbGVuXG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIDQpOyAvLyBwYXRoXG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsgcGF0aEJ1Zi5sZW5ndGgpOyAvLyB2YWx1ZVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBVVF9QQVRILCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHJldHVybiBUT09OLWZvcm1hdHRlZCByZXN1bHRzLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHBhdGhfbGVuKDIpICsgcGF0aCArIGxpbWl0KDQpICsgb2Zmc2V0KDQpICsgY29sc19jb3VudCgyKSArIFtjb2xfbGVuKDIpICsgY29sXS4uLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgcGF0aFByZWZpeDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXI7IGNvbHVtbnM/OiBzdHJpbmdbXSB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGhQcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgY29sdW1ucyA9IG9wdHMuY29sdW1ucyB8fCBbXTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgcGF5bG9hZCBzaXplXG4gICAgbGV0IHNpemUgPSAyICsgcGF0aEJ1Zi5sZW5ndGggKyA0ICsgNCArIDI7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgc2l6ZSArPSAyICsgQnVmZmVyLmJ5dGVMZW5ndGgoY29sLCAndXRmOCcpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIFxuICAgIC8vIFBhdGg6IHBhdGhfbGVuKDIgTEUpICsgcGF0aFxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMjtcbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gcGF0aEJ1Zi5sZW5ndGg7XG4gICAgXG4gICAgLy8gTGltaXQgKDQgTEUpIC0gMCBtZWFucyBubyBsaW1pdFxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLmxpbWl0IHx8IDAsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDQ7XG4gICAgXG4gICAgLy8gT2Zmc2V0ICg0IExFKVxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLm9mZnNldCB8fCAwLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIFxuICAgIC8vIENvbHVtbnM6IGNvdW50KDIgTEUpICsgW2NvbF9sZW4oMiBMRSkgKyBjb2xdLi4uXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKGNvbHVtbnMubGVuZ3RoLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbEJ1ZiA9IEJ1ZmZlci5mcm9tKGNvbCwgJ3V0ZjgnKTtcbiAgICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShjb2xCdWYubGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBjb2xCdWYuY29weShwYXlsb2FkLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGNvbEJ1Zi5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlFVRVJZLCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IHBheWxvYWQ6IHJlc3VsdFBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIHJlc3VsdFBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBrZXlzIHdpdGggYSBwcmVmaXgsIHJldHVybmluZyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNpbXBsZSBwcmVmaXgtYmFzZWQgaXRlcmF0aW9uLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHByZWZpeCBzdHJpbmdcbiAgICogUmVzcG9uc2UgZm9ybWF0OiBjb3VudCg0IExFKSArIFtrZXlfbGVuKDIgTEUpICsga2V5ICsgdmFsX2xlbig0IExFKSArIHZhbF0uLi5cbiAgICovXG4gIGFzeW5jIHNjYW4ocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4+IHtcbiAgICBjb25zdCBwcmVmaXhCdWYgPSBCdWZmZXIuZnJvbShwcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlNDQU4sIHByZWZpeEJ1Zik7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSAhPT0gSW50ZXJuYWxPcENvZGUuVkFMVUUgJiYgb3Bjb2RlICE9PSBJbnRlcm5hbE9wQ29kZS5PSykge1xuICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoYFVuZXhwZWN0ZWQgc2NhbiByZXNwb25zZSBvcGNvZGU6IDB4JHtvcGNvZGUudG9TdHJpbmcoMTYpfWApO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gRW1wdHkgcmVzdWx0XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzcG9uc2U6IGNvdW50KDQgTEUpICsgW2tleV9sZW4oMiBMRSkgKyBrZXkgKyB2YWxfbGVuKDQgTEUpICsgdmFsXS4uLlxuICAgIGNvbnN0IGNvdW50ID0gcGF5bG9hZC5yZWFkVUludDMyTEUoMCk7XG4gICAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBrZXk6IEJ1ZmZlcjsgdmFsdWU6IEJ1ZmZlciB9PiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSA0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBpZiAob2Zmc2V0ICsgMiA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdUcnVuY2F0ZWQgc2NhbiByZXNwb25zZSAoa2V5X2xlbiknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleUxlbiA9IHBheWxvYWQucmVhZFVJbnQxNkxFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMjtcblxuICAgICAgaWYgKG9mZnNldCArIGtleUxlbiArIDQgPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKGtleSt2YWxfbGVuKScpO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gcGF5bG9hZC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGtleUxlbik7XG4gICAgICBvZmZzZXQgKz0ga2V5TGVuO1xuXG4gICAgICBjb25zdCB2YWxMZW4gPSBwYXlsb2FkLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDQ7XG5cbiAgICAgIGlmIChvZmZzZXQgKyB2YWxMZW4gPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKHZhbHVlKScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgdmFsTGVuKTtcbiAgICAgIG9mZnNldCArPSB2YWxMZW47XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7IGtleSwgdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHF1ZXJ5QnVpbGRlcihwYXRoUHJlZml4OiBzdHJpbmcpOiBRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLCBwYXRoUHJlZml4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiBhIG5ldyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQkVHSU5fVFhOKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5UWE5fSUQpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnJlYWRCaWdVSW50NjRMRSgwKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXJyb3IoJ0ZhaWxlZCB0byBiZWdpbiB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQ09NTUlUX1RYTiwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGFib3J0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQUJPUlRfVFhOLCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGNoZWNrcG9pbnQuXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5DSEVDS1BPSU5UKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzLlxuICAgKi9cbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM6IG51bWJlcjtcbiAgICB3YWxTaXplQnl0ZXM6IG51bWJlcjtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgfT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5TVEFUUyk7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIHJldHVybiB7XG4gICAgICBtZW10YWJsZVNpemVCeXRlczoganNvbi5tZW10YWJsZV9zaXplX2J5dGVzIHx8IDAsXG4gICAgICB3YWxTaXplQnl0ZXM6IGpzb24ud2FsX3NpemVfYnl0ZXMgfHwgMCxcbiAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczoganNvbi5hY3RpdmVfdHJhbnNhY3Rpb25zIHx8IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBwaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUElORyk7XG4gICAgICBjb25zdCB7IG9wY29kZSB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICByZXR1cm4gb3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5QT05HO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuX3NvY2tldCEuZW5kKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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O0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sTUFBTSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhjRCw4QkFnY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBJUEMgQ2xpZW50XG4gKlxuICogQ29ubmVjdHMgdG8gYSBTb2NoREIgSVBDIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUHJvdG9jb2xFcnJvciwgVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbi8qKlxuICogV2lyZSBwcm90b2NvbCBvcGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgT3BDb2RlID0ge1xuICAvLyBDbGllbnQg4oaSIFNlcnZlciAobXVzdCBtYXRjaCBzb2NoZGItc3RvcmFnZS9zcmMvaXBjX3NlcnZlci5ycylcbiAgUHV0OiAweDAxLFxuICBHZXQ6IDB4MDIsXG4gIERlbGV0ZTogMHgwMyxcbiAgQmVnaW5UeG46IDB4MDQsXG4gIENvbW1pdFR4bjogMHgwNSxcbiAgQWJvcnRUeG46IDB4MDYsXG4gIFF1ZXJ5OiAweDA3LFxuICBDcmVhdGVUYWJsZTogMHgwOCxcbiAgUHV0UGF0aDogMHgwOSxcbiAgR2V0UGF0aDogMHgwQSxcbiAgU2NhbjogMHgwQixcbiAgQ2hlY2twb2ludDogMHgwQyxcbiAgU3RhdHM6IDB4MEQsXG4gIFBpbmc6IDB4MEUsXG5cbiAgLy8gU2VydmVyIOKGkiBDbGllbnRcbiAgT0s6IDB4ODAsXG4gIEVycm9yOiAweDgxLFxuICBWYWx1ZTogMHg4MixcbiAgVHhuSWQ6IDB4ODMsXG4gIFJvdzogMHg4NCxcbiAgRW5kU3RyZWFtOiAweDg1LFxuICBTdGF0c1Jlc3A6IDB4ODYsXG4gIFBvbmc6IDB4ODcsXG59IGFzIGNvbnN0O1xuXG4vLyBJbnRlcm5hbCBPcENvZGUgbWFwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgSW50ZXJuYWxPcENvZGUgPSB7XG4gIFBVVDogT3BDb2RlLlB1dCxcbiAgR0VUOiBPcENvZGUuR2V0LFxuICBERUxFVEU6IE9wQ29kZS5EZWxldGUsXG4gIEJFR0lOX1RYTjogT3BDb2RlLkJlZ2luVHhuLFxuICBDT01NSVRfVFhOOiBPcENvZGUuQ29tbWl0VHhuLFxuICBBQk9SVF9UWE46IE9wQ29kZS5BYm9ydFR4bixcbiAgUVVFUlk6IE9wQ29kZS5RdWVyeSxcbiAgUFVUX1BBVEg6IE9wQ29kZS5QdXRQYXRoLFxuICBHRVRfUEFUSDogT3BDb2RlLkdldFBhdGgsXG4gIFNDQU46IE9wQ29kZS5TY2FuLFxuICBDSEVDS1BPSU5UOiBPcENvZGUuQ2hlY2twb2ludCxcbiAgU1RBVFM6IE9wQ29kZS5TdGF0cyxcbiAgUElORzogT3BDb2RlLlBpbmcsXG4gIE9LOiBPcENvZGUuT0ssXG4gIEVSUk9SOiBPcENvZGUuRXJyb3IsXG4gIFZBTFVFOiBPcENvZGUuVmFsdWUsXG4gIFRYTl9JRDogT3BDb2RlLlR4bklkLFxuICBST1c6IE9wQ29kZS5Sb3csXG4gIEVORF9TVFJFQU06IE9wQ29kZS5FbmRTdHJlYW0sXG4gIFNUQVRTX1JFU1A6IE9wQ29kZS5TdGF0c1Jlc3AsXG4gIFBPTkc6IE9wQ29kZS5Qb25nLFxufSBhcyBjb25zdDtcblxuY29uc3QgTUFYX01FU1NBR0VfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7IC8vIDE2IE1CXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBJcGNDbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBjQ2xpZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gVW5peCBkb21haW4gc29ja2V0ICovXG4gIHNvY2tldFBhdGg6IHN0cmluZztcbiAgLyoqIENvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIGNvbm5lY3RUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogUmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHJlYWRUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIElQQyBDbGllbnQgZm9yIFNvY2hEQi5cbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBzZXJ2ZXIgdmlhIFVuaXggZG9tYWluIHNvY2tldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICpcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IElwY0NsaWVudC5jb25uZWN0KCcvdG1wL3NvY2hkYi5zb2NrJyk7XG4gKlxuICogYXdhaXQgY2xpZW50LnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGNvbnN0IHZhbHVlID0gYXdhaXQgY2xpZW50LmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICpcbiAqIGF3YWl0IGNsaWVudC5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJcGNDbGllbnQge1xuICBwcml2YXRlIF9zb2NrZXQ6IG5ldC5Tb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY29uZmlnOiBSZXF1aXJlZDxJcGNDbGllbnRDb25maWc+O1xuICBwcml2YXRlIF9wZW5kaW5nUmVhZHM6IEFycmF5PHtcbiAgICByZXNvbHZlOiAoYnVmOiBCdWZmZXIpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSBfcmVhZEJ1ZmZlcjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICBwcml2YXRlIF9jbG9zZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGNvbmZpZzogSXBjQ2xpZW50Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgY29ubmVjdFRpbWVvdXQ6IDUwMDAsXG4gICAgICByZWFkVGltZW91dDogMzAwMDAsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgU29jaERCIElQQyBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzb2NrZXRQYXRoIC0gUGF0aCB0byB0aGUgVW5peCBkb21haW4gc29ja2V0XG4gICAqIEByZXR1cm5zIEEgY29ubmVjdGVkIElwY0NsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IElwY0NsaWVudC5jb25uZWN0KCcvdG1wL3NvY2hkYi5zb2NrJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNvbm5lY3Qoc29ja2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxJcGNDbGllbnQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgSXBjQ2xpZW50KHsgc29ja2V0UGF0aCB9KTtcbiAgICBhd2FpdCBjbGllbnQuX2Nvbm5lY3QoKTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24oXG4gICAgICAgIHsgcGF0aDogdGhpcy5fY29uZmlnLnNvY2tldFBhdGggfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRoaXMuX2NvbmZpZy5jb25uZWN0VGltZW91dCk7XG5cbiAgICAgIHNvY2tldC5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoJ0Nvbm5lY3Rpb24gdGltZW91dCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcihgQ29ubmVjdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9yZWFkQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBlbmRpbmcgb2YgdGhpcy5fcGVuZGluZ1JlYWRzKSB7XG4gICAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignQ29ubmVjdGlvbiBjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzID0gW107XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NCdWZmZXIoKTogdm9pZCB7XG4gICAgLy8gUHJvY2VzcyBjb21wbGV0ZSBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXJcbiAgICB3aGlsZSAodGhpcy5fcmVhZEJ1ZmZlci5sZW5ndGggPj0gNSAmJiB0aGlzLl9wZW5kaW5nUmVhZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fcmVhZEJ1ZmZlci5yZWFkVUludDMyTEUoMSk7XG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IDUgKyBsZW5ndGg7XG5cbiAgICAgIGlmICh0aGlzLl9yZWFkQnVmZmVyLmxlbmd0aCA+PSB0b3RhbExlbmd0aCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fcmVhZEJ1ZmZlci5zdWJhcnJheSgwLCB0b3RhbExlbmd0aCk7XG4gICAgICAgIHRoaXMuX3JlYWRCdWZmZXIgPSB0aGlzLl9yZWFkQnVmZmVyLnN1YmFycmF5KHRvdGFsTGVuZ3RoKTtcblxuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fcGVuZGluZ1JlYWRzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZy5yZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9zZW5kKG9wY29kZTogbnVtYmVyLCBwYXlsb2FkOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCkpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignTm90IGNvbm5lY3RlZCcpO1xuICAgIH1cblxuICAgIC8vIEVuY29kZSBtZXNzYWdlOiBvcGNvZGUgKDEpICsgbGVuZ3RoICg0IExFKSArIHBheWxvYWRcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmFsbG9jKDUgKyBwYXlsb2FkLmxlbmd0aCk7XG4gICAgbWVzc2FnZS53cml0ZVVJbnQ4KG9wY29kZSwgMCk7XG4gICAgbWVzc2FnZS53cml0ZVVJbnQzMkxFKHBheWxvYWQubGVuZ3RoLCAxKTtcbiAgICBwYXlsb2FkLmNvcHkobWVzc2FnZSwgNSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7XG5cbiAgICAgIHRoaXMuX3NvY2tldCEud3JpdGUobWVzc2FnZSwgKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzLnBvcCgpO1xuICAgICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKGBXcml0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHRpbWVvdXQgZm9yIHJlc3BvbnNlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5fcGVuZGluZ1JlYWRzLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvbHZlID09PSByZXNvbHZlKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoJ1JlYWQgdGltZW91dCcpKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5fY29uZmlnLnJlYWRUaW1lb3V0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUmVzcG9uc2UocmVzcG9uc2U6IEJ1ZmZlcik6IHsgb3Bjb2RlOiBudW1iZXI7IHBheWxvYWQ6IEJ1ZmZlciB9IHtcbiAgICBjb25zdCBvcGNvZGUgPSByZXNwb25zZS5yZWFkVUludDgoMCk7XG4gICAgY29uc3QgbGVuZ3RoID0gcmVzcG9uc2UucmVhZFVJbnQzMkxFKDEpO1xuICAgIGNvbnN0IHBheWxvYWQgPSByZXNwb25zZS5zdWJhcnJheSg1LCA1ICsgbGVuZ3RoKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLkVSUk9SKSB7XG4gICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcihwYXlsb2FkLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIH1cblxuICAgIHJldHVybiB7IG9wY29kZSwgcGF5bG9hZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhIGtleSBmb3IgdGhlIHdpcmUgcHJvdG9jb2wuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGVuY29kZUtleShrZXk6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gRm9ybWF0OiBbbGVuZ3RoOjRdW29wOjFdW2tleV9sZW46NF1ba2V5Oi4uLl1cbiAgICBjb25zdCBtc2dMZW4gPSAxICsgNCArIGtleS5sZW5ndGg7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmFsbG9jKDQgKyBtc2dMZW4pO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKG1zZ0xlbiwgMCk7XG4gICAgbXNnLndyaXRlVUludDgoSW50ZXJuYWxPcENvZGUuR0VULCA0KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShrZXkubGVuZ3RoLCA1KTtcbiAgICBrZXkuY29weShtc2csIDkpO1xuICAgIHJldHVybiBtc2c7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGEga2V5LXZhbHVlIHBhaXIgZm9yIHRoZSB3aXJlIHByb3RvY29sLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBlbmNvZGVLZXlWYWx1ZShrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gRm9ybWF0OiBbbGVuZ3RoOjRdW29wOjFdW2tleV9sZW46NF1ba2V5Oi4uLl1bdmFsdWVfbGVuOjRdW3ZhbHVlOi4uLl1cbiAgICBjb25zdCBtc2dMZW4gPSAxICsgNCArIGtleS5sZW5ndGggKyA0ICsgdmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5hbGxvYyg0ICsgbXNnTGVuKTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShtc2dMZW4sIDApO1xuICAgIG1zZy53cml0ZVVJbnQ4KEludGVybmFsT3BDb2RlLlBVVCwgNCk7XG4gICAgbXNnLndyaXRlVUludDMyQkUoa2V5Lmxlbmd0aCwgNSk7XG4gICAga2V5LmNvcHkobXNnLCA5KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRSh2YWx1ZS5sZW5ndGgsIDkgKyBrZXkubGVuZ3RoKTtcbiAgICB2YWx1ZS5jb3B5KG1zZywgMTMgKyBrZXkubGVuZ3RoKTtcbiAgICByZXR1cm4gbXNnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IGtleS5cbiAgICovXG4gIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5HRVQsIGtleSk7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVkFMVUUpIHtcbiAgICAgIC8vIElmIHBheWxvYWQgaXMgZW1wdHksIHRoZSBrZXkgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyLlxuICAgKi9cbiAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRW5jb2RlOiBrZXlfbGVuICg0IExFKSArIGtleSArIHZhbHVlXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg0ICsga2V5Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQzMkxFKGtleS5sZW5ndGgsIDApO1xuICAgIGtleS5jb3B5KHBheWxvYWQsIDQpO1xuICAgIHZhbHVlLmNvcHkocGF5bG9hZCwgNCArIGtleS5sZW5ndGgpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBVVCwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEga2V5LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkRFTEVURSwga2V5KTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWx1ZSBieSBwYXRoLlxuICAgKiBXaXJlIGZvcm1hdDogcGF0aF9jb3VudCgyIExFKSArIFtwYXRoX2xlbigyIExFKSArIHBhdGhfc2VnbWVudF0uLi5cbiAgICovXG4gIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgLy8gRW5jb2RlIHBhdGggYXMgc2luZ2xlIHNlZ21lbnQgZm9yIG5vdyAoY291bGQgc3BsaXQgb24gJy8nIGZvciBtdWx0aS1zZWdtZW50KVxuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMiArIDIgKyBwYXRoQnVmLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKDEsIDApOyAvLyBwYXRoX2NvdW50ID0gMVxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgMik7IC8vIHBhdGhfbGVuXG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIDQpOyAvLyBwYXRoXG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkdFVF9QQVRILCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZDogcmVzcG9uc2VQYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLlZBTFVFKSB7XG4gICAgICAvLyBJZiBwYXlsb2FkIGlzIGVtcHR5LCB0aGUga2V5IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmIChyZXNwb25zZVBheWxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlUGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgdmFsdWUgYXQgYSBwYXRoLlxuICAgKiBXaXJlIGZvcm1hdDogcGF0aF9jb3VudCgyIExFKSArIFtwYXRoX2xlbigyIExFKSArIHBhdGhfc2VnbWVudF0uLi4gKyB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRoQnVmID0gQnVmZmVyLmZyb20ocGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDIgKyAyICsgcGF0aEJ1Zi5sZW5ndGggKyB2YWx1ZS5sZW5ndGgpO1xuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRSgxLCAwKTsgLy8gcGF0aF9jb3VudCA9IDFcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUocGF0aEJ1Zi5sZW5ndGgsIDIpOyAvLyBwYXRoX2xlblxuICAgIHBhdGhCdWYuY29weShwYXlsb2FkLCA0KTsgLy8gcGF0aFxuICAgIHZhbHVlLmNvcHkocGF5bG9hZCwgNCArIHBhdGhCdWYubGVuZ3RoKTsgLy8gdmFsdWVcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5QVVRfUEFUSCwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHF1ZXJ5IGFuZCByZXR1cm4gVE9PTi1mb3JtYXR0ZWQgcmVzdWx0cy5cbiAgICogXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2xlbigyKSArIHBhdGggKyBsaW1pdCg0KSArIG9mZnNldCg0KSArIGNvbHNfY291bnQoMikgKyBbY29sX2xlbigyKSArIGNvbF0uLi5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIHBhdGhQcmVmaXg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyOyBjb2x1bW5zPzogc3RyaW5nW10gfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoUHJlZml4LCAndXRmOCcpO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBvcHRzLmNvbHVtbnMgfHwgW107XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHBheWxvYWQgc2l6ZVxuICAgIGxldCBzaXplID0gMiArIHBhdGhCdWYubGVuZ3RoICsgNCArIDQgKyAyO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIHNpemUgKz0gMiArIEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbCwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBcbiAgICAvLyBQYXRoOiBwYXRoX2xlbigyIExFKSArIHBhdGhcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUocGF0aEJ1Zi5sZW5ndGgsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDI7XG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHBhdGhCdWYubGVuZ3RoO1xuICAgIFxuICAgIC8vIExpbWl0ICg0IExFKSAtIDAgbWVhbnMgbm8gbGltaXRcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUob3B0cy5saW1pdCB8fCAwLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIFxuICAgIC8vIE9mZnNldCAoNCBMRSlcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUob3B0cy5vZmZzZXQgfHwgMCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcbiAgICBcbiAgICAvLyBDb2x1bW5zOiBjb3VudCgyIExFKSArIFtjb2xfbGVuKDIgTEUpICsgY29sXS4uLlxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShjb2x1bW5zLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMjtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xCdWYgPSBCdWZmZXIuZnJvbShjb2wsICd1dGY4Jyk7XG4gICAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoY29sQnVmLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSAyO1xuICAgICAgY29sQnVmLmNvcHkocGF5bG9hZCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSBjb2xCdWYubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5RVUVSWSwgcGF5bG9hZCk7XG4gICAgY29uc3QgeyBwYXlsb2FkOiByZXN1bHRQYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIHJldHVybiByZXN1bHRQYXlsb2FkLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2NhbiBmb3Iga2V5cyB3aXRoIGEgcHJlZml4LCByZXR1cm5pbmcga2V5LXZhbHVlIHBhaXJzLlxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBzaW1wbGUgcHJlZml4LWJhc2VkIGl0ZXJhdGlvbi5cbiAgICogXG4gICAqIFdpcmUgZm9ybWF0OiBwcmVmaXggc3RyaW5nXG4gICAqIFJlc3BvbnNlIGZvcm1hdDogY291bnQoNCBMRSkgKyBba2V5X2xlbigyIExFKSArIGtleSArIHZhbF9sZW4oNCBMRSkgKyB2YWxdLi4uXG4gICAqL1xuICBhc3luYyBzY2FuKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7IGtleTogQnVmZmVyOyB2YWx1ZTogQnVmZmVyIH0+PiB7XG4gICAgY29uc3QgcHJlZml4QnVmID0gQnVmZmVyLmZyb20ocHJlZml4LCAndXRmOCcpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5TQ0FOLCBwcmVmaXhCdWYpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgIT09IEludGVybmFsT3BDb2RlLlZBTFVFICYmIG9wY29kZSAhPT0gSW50ZXJuYWxPcENvZGUuT0spIHtcbiAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKGBVbmV4cGVjdGVkIHNjYW4gcmVzcG9uc2Ugb3Bjb2RlOiAweCR7b3Bjb2RlLnRvU3RyaW5nKDE2KX1gKTtcbiAgICB9XG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCA0KSB7XG4gICAgICByZXR1cm4gW107IC8vIEVtcHR5IHJlc3VsdFxuICAgIH1cblxuICAgIC8vIFBhcnNlIHJlc3BvbnNlOiBjb3VudCg0IExFKSArIFtrZXlfbGVuKDIgTEUpICsga2V5ICsgdmFsX2xlbig0IExFKSArIHZhbF0uLi5cbiAgICBjb25zdCBjb3VudCA9IHBheWxvYWQucmVhZFVJbnQzMkxFKDApO1xuICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gNDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgaWYgKG9mZnNldCArIDIgPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKGtleV9sZW4pJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlMZW4gPSBwYXlsb2FkLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgIGlmIChvZmZzZXQgKyBrZXlMZW4gKyA0ID4gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ1RydW5jYXRlZCBzY2FuIHJlc3BvbnNlIChrZXkrdmFsX2xlbiknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IHBheWxvYWQuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBrZXlMZW4pO1xuICAgICAgb2Zmc2V0ICs9IGtleUxlbjtcblxuICAgICAgY29uc3QgdmFsTGVuID0gcGF5bG9hZC5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICBpZiAob2Zmc2V0ICsgdmFsTGVuID4gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ1RydW5jYXRlZCBzY2FuIHJlc3BvbnNlICh2YWx1ZSknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gcGF5bG9hZC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHZhbExlbik7XG4gICAgICBvZmZzZXQgKz0gdmFsTGVuO1xuXG4gICAgICByZXN1bHRzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBxdWVyeUJ1aWxkZXIocGF0aFByZWZpeDogc3RyaW5nKTogUXVlcnkge1xuICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgcGF0aFByZWZpeCk7XG4gIH1cblxuICAvKipcbiAgICogQmVnaW4gYSBuZXcgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkJFR0lOX1RYTik7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVFhOX0lEKSB7XG4gICAgICByZXR1cm4gcGF5bG9hZC5yZWFkQmlnVUludDY0TEUoMCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkVycm9yKCdGYWlsZWQgdG8gYmVnaW4gdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHBheWxvYWQud3JpdGVCaWdVSW50NjRMRSh0eG5JZCwgMCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkNPTU1JVF9UWE4sIHBheWxvYWQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGEgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBhYm9ydFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHBheWxvYWQud3JpdGVCaWdVSW50NjRMRSh0eG5JZCwgMCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkFCT1JUX1RYTiwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYSBjaGVja3BvaW50LlxuICAgKi9cbiAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQ0hFQ0tQT0lOVCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgd2FsU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuU1RBVFMpO1xuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UocGF5bG9hZC50b1N0cmluZygndXRmOCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGpzb24ubWVtdGFibGVfc2l6ZV9ieXRlcyB8fCAwLFxuICAgICAgd2FsU2l6ZUJ5dGVzOiBqc29uLndhbF9zaXplX2J5dGVzIHx8IDAsXG4gICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IGpzb24uYWN0aXZlX3RyYW5zYWN0aW9ucyB8fCAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBJTkcpO1xuICAgICAgY29uc3QgeyBvcGNvZGUgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuUE9ORztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLl9zb2NrZXQhLmVuZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Consolidator for Memory System
|
|
4
|
+
*
|
|
5
|
+
* Event-sourced consolidation with append-only events and derived canonical facts.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.Consolidator = void 0;
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
/**
|
|
11
|
+
* Consolidator for managing facts
|
|
12
|
+
*/
|
|
13
|
+
class Consolidator {
|
|
14
|
+
constructor(db, namespace, config) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
this.namespace = namespace;
|
|
17
|
+
this.config = {
|
|
18
|
+
similarityThreshold: config?.similarityThreshold || 0.85,
|
|
19
|
+
useTemporalUpdates: config?.useTemporalUpdates !== false,
|
|
20
|
+
maxConflictAge: config?.maxConflictAge || 86400, // 24 hours default
|
|
21
|
+
};
|
|
22
|
+
this.prefix = Buffer.from(`consolidation:${namespace}:`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create consolidator from database
|
|
26
|
+
*/
|
|
27
|
+
static fromDatabase(db, namespace, config) {
|
|
28
|
+
return new Consolidator(db, namespace, config);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add a raw assertion (immutable event)
|
|
32
|
+
*/
|
|
33
|
+
async add(assertion) {
|
|
34
|
+
const id = assertion.id || this.generateAssertionId(assertion);
|
|
35
|
+
const timestamp = assertion.timestamp || Date.now();
|
|
36
|
+
const storedAssertion = {
|
|
37
|
+
...assertion,
|
|
38
|
+
id,
|
|
39
|
+
timestamp,
|
|
40
|
+
};
|
|
41
|
+
const key = Buffer.concat([this.prefix, Buffer.from(`assertion:${id}`)]);
|
|
42
|
+
await this.db.put(key, Buffer.from(JSON.stringify(storedAssertion)));
|
|
43
|
+
return id;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Add assertion with contradiction handling
|
|
47
|
+
*/
|
|
48
|
+
async addWithContradiction(newAssertion, contradicts) {
|
|
49
|
+
const id = await this.add(newAssertion);
|
|
50
|
+
// Mark contradicted assertions
|
|
51
|
+
for (const contradictedId of contradicts) {
|
|
52
|
+
const contradictionKey = Buffer.concat([
|
|
53
|
+
this.prefix,
|
|
54
|
+
Buffer.from(`contradiction:${contradictedId}:${id}`),
|
|
55
|
+
]);
|
|
56
|
+
await this.db.put(contradictionKey, Buffer.from(JSON.stringify({
|
|
57
|
+
from: contradictedId,
|
|
58
|
+
to: id,
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
})));
|
|
61
|
+
}
|
|
62
|
+
return id;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Run consolidation to update canonical view
|
|
66
|
+
*/
|
|
67
|
+
async consolidate() {
|
|
68
|
+
const assertions = await this.getAllAssertions();
|
|
69
|
+
const contradictions = await this.getContradictions();
|
|
70
|
+
// Group assertions by subject
|
|
71
|
+
const groups = new Map();
|
|
72
|
+
for (const assertion of assertions) {
|
|
73
|
+
const subject = JSON.stringify(assertion.fact);
|
|
74
|
+
const group = groups.get(subject) || [];
|
|
75
|
+
group.push(assertion);
|
|
76
|
+
groups.set(subject, group);
|
|
77
|
+
}
|
|
78
|
+
let updated = 0;
|
|
79
|
+
// Create canonical facts
|
|
80
|
+
for (const [subject, group] of groups) {
|
|
81
|
+
// Sort by confidence and timestamp
|
|
82
|
+
group.sort((a, b) => {
|
|
83
|
+
if (b.confidence !== a.confidence) {
|
|
84
|
+
return b.confidence - a.confidence;
|
|
85
|
+
}
|
|
86
|
+
return (b.timestamp || 0) - (a.timestamp || 0);
|
|
87
|
+
});
|
|
88
|
+
// Check for contradictions
|
|
89
|
+
const validAssertions = group.filter(a => {
|
|
90
|
+
const isContradicted = contradictions.some(c => c.from === a.id);
|
|
91
|
+
if (isContradicted && this.config.useTemporalUpdates) {
|
|
92
|
+
// Find the contradicting assertion
|
|
93
|
+
const contradiction = contradictions.find(c => c.from === a.id);
|
|
94
|
+
if (contradiction) {
|
|
95
|
+
const age = Date.now() - (contradiction.timestamp || 0);
|
|
96
|
+
return age > this.config.maxConflictAge;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return !isContradicted;
|
|
100
|
+
});
|
|
101
|
+
if (validAssertions.length > 0) {
|
|
102
|
+
const canonical = {
|
|
103
|
+
id: this.generateCanonicalId(validAssertions[0]),
|
|
104
|
+
mergedFact: validAssertions[0].fact,
|
|
105
|
+
confidence: this.mergeConfidence(validAssertions),
|
|
106
|
+
sources: validAssertions.map(a => a.source),
|
|
107
|
+
validFrom: Math.min(...validAssertions.map(a => a.timestamp || 0)),
|
|
108
|
+
validUntil: undefined,
|
|
109
|
+
};
|
|
110
|
+
const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${canonical.id}`)]);
|
|
111
|
+
await this.db.put(key, Buffer.from(JSON.stringify(canonical)));
|
|
112
|
+
updated++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return updated;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get canonical facts
|
|
119
|
+
*/
|
|
120
|
+
async getCanonicalFacts() {
|
|
121
|
+
const facts = [];
|
|
122
|
+
const canonicalPrefix = Buffer.concat([this.prefix, Buffer.from('canonical:')]);
|
|
123
|
+
for await (const [_, value] of this.db.scanPrefix(canonicalPrefix)) {
|
|
124
|
+
facts.push(JSON.parse(value.toString()));
|
|
125
|
+
}
|
|
126
|
+
return facts;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Explain provenance of a fact
|
|
130
|
+
*/
|
|
131
|
+
async explain(factId) {
|
|
132
|
+
const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${factId}`)]);
|
|
133
|
+
const value = await this.db.get(key);
|
|
134
|
+
if (!value) {
|
|
135
|
+
return { evidenceCount: 0, sources: [], confidence: 0 };
|
|
136
|
+
}
|
|
137
|
+
const fact = JSON.parse(value.toString());
|
|
138
|
+
return {
|
|
139
|
+
evidenceCount: fact.sources.length,
|
|
140
|
+
sources: fact.sources,
|
|
141
|
+
confidence: fact.confidence,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get all raw assertions
|
|
146
|
+
*/
|
|
147
|
+
async getAllAssertions() {
|
|
148
|
+
const assertions = [];
|
|
149
|
+
const assertionPrefix = Buffer.concat([this.prefix, Buffer.from('assertion:')]);
|
|
150
|
+
for await (const [_, value] of this.db.scanPrefix(assertionPrefix)) {
|
|
151
|
+
assertions.push(JSON.parse(value.toString()));
|
|
152
|
+
}
|
|
153
|
+
return assertions;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all contradictions
|
|
157
|
+
*/
|
|
158
|
+
async getContradictions() {
|
|
159
|
+
const contradictions = [];
|
|
160
|
+
const contradictionPrefix = Buffer.concat([this.prefix, Buffer.from('contradiction:')]);
|
|
161
|
+
for await (const [_, value] of this.db.scanPrefix(contradictionPrefix)) {
|
|
162
|
+
contradictions.push(JSON.parse(value.toString()));
|
|
163
|
+
}
|
|
164
|
+
return contradictions;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Merge confidence from multiple assertions
|
|
168
|
+
*/
|
|
169
|
+
mergeConfidence(assertions) {
|
|
170
|
+
if (assertions.length === 0)
|
|
171
|
+
return 0;
|
|
172
|
+
if (assertions.length === 1)
|
|
173
|
+
return assertions[0].confidence;
|
|
174
|
+
// Average with weight toward higher confidence
|
|
175
|
+
const sorted = [...assertions].sort((a, b) => b.confidence - a.confidence);
|
|
176
|
+
const weights = sorted.map((_, i) => 1 / (i + 1));
|
|
177
|
+
const totalWeight = weights.reduce((a, b) => a + b, 0);
|
|
178
|
+
return sorted.reduce((acc, assertion, i) => {
|
|
179
|
+
return acc + (assertion.confidence * weights[i]) / totalWeight;
|
|
180
|
+
}, 0);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate deterministic assertion ID
|
|
184
|
+
*/
|
|
185
|
+
generateAssertionId(assertion) {
|
|
186
|
+
return (0, crypto_1.createHash)('sha256')
|
|
187
|
+
.update(JSON.stringify(assertion.fact) + assertion.source)
|
|
188
|
+
.digest('hex')
|
|
189
|
+
.substring(0, 16);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Generate deterministic canonical fact ID
|
|
193
|
+
*/
|
|
194
|
+
generateCanonicalId(assertion) {
|
|
195
|
+
return (0, crypto_1.createHash)('sha256')
|
|
196
|
+
.update(JSON.stringify(assertion.fact))
|
|
197
|
+
.digest('hex')
|
|
198
|
+
.substring(0, 16);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.Consolidator = Consolidator;
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29saWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1vcnkvY29uc29saWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBUUgsbUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxZQUFZO0lBTXZCLFlBQVksRUFBb0IsRUFBRSxTQUFpQixFQUFFLE1BQTRCO1FBQy9FLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxtQkFBbUIsSUFBSSxJQUFJO1lBQ3hELGtCQUFrQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsS0FBSyxLQUFLO1lBQ3hELGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxJQUFJLEtBQUssRUFBRSxtQkFBbUI7U0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQW9CLEVBQUUsU0FBaUIsRUFBRSxNQUE0QjtRQUN2RixPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUF1QjtRQUMvQixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwRCxNQUFNLGVBQWUsR0FBaUI7WUFDcEMsR0FBRyxTQUFTO1lBQ1osRUFBRTtZQUNGLFNBQVM7U0FDVixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBMEIsRUFBRSxXQUFxQjtRQUMxRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsK0JBQStCO1FBQy9CLEtBQUssTUFBTSxjQUFjLElBQUksV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTTtnQkFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixjQUFjLElBQUksRUFBRSxFQUFFLENBQUM7YUFDckQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzdELElBQUksRUFBRSxjQUFjO2dCQUNwQixFQUFFLEVBQUUsRUFBRTtnQkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFdEQsOEJBQThCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO1FBQ2pELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLHlCQUF5QjtRQUN6QixLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdEMsbUNBQW1DO1lBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNyQyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztZQUVILDJCQUEyQjtZQUMzQixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2QyxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDckQsbUNBQW1DO29CQUNuQyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2hFLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3hELE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBZSxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxTQUFTLEdBQWtCO29CQUMvQixFQUFFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEQsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7b0JBQ2pELE9BQU8sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDM0MsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDbEUsVUFBVSxFQUFFLFNBQVM7aUJBQ3RCLENBQUM7Z0JBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkYsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRixJQUFJLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjO1FBQzFCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFFRCxNQUFNLElBQUksR0FBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPO1lBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCO1FBQzVCLE1BQU0sVUFBVSxHQUFtQixFQUFFLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEYsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ25FLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLE1BQU0sY0FBYyxHQUEyRCxFQUFFLENBQUM7UUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhGLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsVUFBMEI7UUFDaEQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUU3RCwrQ0FBK0M7UUFDL0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDakUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CLENBQUMsU0FBdUI7UUFDakQsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDO2FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQ3pELE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLFNBQXVCO1FBQ2pELE9BQU8sSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQzthQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBL05ELG9DQStOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc29saWRhdG9yIGZvciBNZW1vcnkgU3lzdGVtXG4gKiBcbiAqIEV2ZW50LXNvdXJjZWQgY29uc29saWRhdGlvbiB3aXRoIGFwcGVuZC1vbmx5IGV2ZW50cyBhbmQgZGVyaXZlZCBjYW5vbmljYWwgZmFjdHMuXG4gKi9cblxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJy4uL2VtYmVkZGVkJztcbmltcG9ydCB7XG4gIFJhd0Fzc2VydGlvbixcbiAgQ2Fub25pY2FsRmFjdCxcbiAgQ29uc29saWRhdGlvbkNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBDb25zb2xpZGF0b3IgZm9yIG1hbmFnaW5nIGZhY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xpZGF0b3Ige1xuICBwcml2YXRlIGRiOiBFbWJlZGRlZERhdGFiYXNlO1xuICBwcml2YXRlIG5hbWVzcGFjZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZzogQ29uc29saWRhdGlvbkNvbmZpZztcbiAgcHJpdmF0ZSBwcmVmaXg6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihkYjogRW1iZWRkZWREYXRhYmFzZSwgbmFtZXNwYWNlOiBzdHJpbmcsIGNvbmZpZz86IENvbnNvbGlkYXRpb25Db25maWcpIHtcbiAgICB0aGlzLmRiID0gZGI7XG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzaW1pbGFyaXR5VGhyZXNob2xkOiBjb25maWc/LnNpbWlsYXJpdHlUaHJlc2hvbGQgfHwgMC44NSxcbiAgICAgIHVzZVRlbXBvcmFsVXBkYXRlczogY29uZmlnPy51c2VUZW1wb3JhbFVwZGF0ZXMgIT09IGZhbHNlLFxuICAgICAgbWF4Q29uZmxpY3RBZ2U6IGNvbmZpZz8ubWF4Q29uZmxpY3RBZ2UgfHwgODY0MDAsIC8vIDI0IGhvdXJzIGRlZmF1bHRcbiAgICB9O1xuICAgIHRoaXMucHJlZml4ID0gQnVmZmVyLmZyb20oYGNvbnNvbGlkYXRpb246JHtuYW1lc3BhY2V9OmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjb25zb2xpZGF0b3IgZnJvbSBkYXRhYmFzZVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRhYmFzZShkYjogRW1iZWRkZWREYXRhYmFzZSwgbmFtZXNwYWNlOiBzdHJpbmcsIGNvbmZpZz86IENvbnNvbGlkYXRpb25Db25maWcpOiBDb25zb2xpZGF0b3Ige1xuICAgIHJldHVybiBuZXcgQ29uc29saWRhdG9yKGRiLCBuYW1lc3BhY2UsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmF3IGFzc2VydGlvbiAoaW1tdXRhYmxlIGV2ZW50KVxuICAgKi9cbiAgYXN5bmMgYWRkKGFzc2VydGlvbjogUmF3QXNzZXJ0aW9uKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpZCA9IGFzc2VydGlvbi5pZCB8fCB0aGlzLmdlbmVyYXRlQXNzZXJ0aW9uSWQoYXNzZXJ0aW9uKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBhc3NlcnRpb24udGltZXN0YW1wIHx8IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdG9yZWRBc3NlcnRpb246IFJhd0Fzc2VydGlvbiA9IHtcbiAgICAgIC4uLmFzc2VydGlvbixcbiAgICAgIGlkLFxuICAgICAgdGltZXN0YW1wLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXkgPSBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oYGFzc2VydGlvbjoke2lkfWApXSk7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShzdG9yZWRBc3NlcnRpb24pKSk7XG5cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFzc2VydGlvbiB3aXRoIGNvbnRyYWRpY3Rpb24gaGFuZGxpbmdcbiAgICovXG4gIGFzeW5jIGFkZFdpdGhDb250cmFkaWN0aW9uKG5ld0Fzc2VydGlvbjogUmF3QXNzZXJ0aW9uLCBjb250cmFkaWN0czogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5hZGQobmV3QXNzZXJ0aW9uKTtcblxuICAgIC8vIE1hcmsgY29udHJhZGljdGVkIGFzc2VydGlvbnNcbiAgICBmb3IgKGNvbnN0IGNvbnRyYWRpY3RlZElkIG9mIGNvbnRyYWRpY3RzKSB7XG4gICAgICBjb25zdCBjb250cmFkaWN0aW9uS2V5ID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIHRoaXMucHJlZml4LFxuICAgICAgICBCdWZmZXIuZnJvbShgY29udHJhZGljdGlvbjoke2NvbnRyYWRpY3RlZElkfToke2lkfWApLFxuICAgICAgXSk7XG4gICAgICBhd2FpdCB0aGlzLmRiLnB1dChjb250cmFkaWN0aW9uS2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGZyb206IGNvbnRyYWRpY3RlZElkLFxuICAgICAgICB0bzogaWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjb25zb2xpZGF0aW9uIHRvIHVwZGF0ZSBjYW5vbmljYWwgdmlld1xuICAgKi9cbiAgYXN5bmMgY29uc29saWRhdGUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBhc3NlcnRpb25zID0gYXdhaXQgdGhpcy5nZXRBbGxBc3NlcnRpb25zKCk7XG4gICAgY29uc3QgY29udHJhZGljdGlvbnMgPSBhd2FpdCB0aGlzLmdldENvbnRyYWRpY3Rpb25zKCk7XG4gICAgXG4gICAgLy8gR3JvdXAgYXNzZXJ0aW9ucyBieSBzdWJqZWN0XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFJhd0Fzc2VydGlvbltdPigpO1xuICAgIGZvciAoY29uc3QgYXNzZXJ0aW9uIG9mIGFzc2VydGlvbnMpIHtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZmFjdCk7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3Vwcy5nZXQoc3ViamVjdCkgfHwgW107XG4gICAgICBncm91cC5wdXNoKGFzc2VydGlvbik7XG4gICAgICBncm91cHMuc2V0KHN1YmplY3QsIGdyb3VwKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZCA9IDA7XG5cbiAgICAvLyBDcmVhdGUgY2Fub25pY2FsIGZhY3RzXG4gICAgZm9yIChjb25zdCBbc3ViamVjdCwgZ3JvdXBdIG9mIGdyb3Vwcykge1xuICAgICAgLy8gU29ydCBieSBjb25maWRlbmNlIGFuZCB0aW1lc3RhbXBcbiAgICAgIGdyb3VwLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIuY29uZmlkZW5jZSAhPT0gYS5jb25maWRlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIGIuY29uZmlkZW5jZSAtIGEuY29uZmlkZW5jZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIudGltZXN0YW1wIHx8IDApIC0gKGEudGltZXN0YW1wIHx8IDApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb250cmFkaWN0aW9uc1xuICAgICAgY29uc3QgdmFsaWRBc3NlcnRpb25zID0gZ3JvdXAuZmlsdGVyKGEgPT4ge1xuICAgICAgICBjb25zdCBpc0NvbnRyYWRpY3RlZCA9IGNvbnRyYWRpY3Rpb25zLnNvbWUoYyA9PiBjLmZyb20gPT09IGEuaWQpO1xuICAgICAgICBpZiAoaXNDb250cmFkaWN0ZWQgJiYgdGhpcy5jb25maWcudXNlVGVtcG9yYWxVcGRhdGVzKSB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgY29udHJhZGljdGluZyBhc3NlcnRpb25cbiAgICAgICAgICBjb25zdCBjb250cmFkaWN0aW9uID0gY29udHJhZGljdGlvbnMuZmluZChjID0+IGMuZnJvbSA9PT0gYS5pZCk7XG4gICAgICAgICAgaWYgKGNvbnRyYWRpY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoY29udHJhZGljdGlvbi50aW1lc3RhbXAgfHwgMCk7XG4gICAgICAgICAgICByZXR1cm4gYWdlID4gdGhpcy5jb25maWcubWF4Q29uZmxpY3RBZ2UhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzQ29udHJhZGljdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh2YWxpZEFzc2VydGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjYW5vbmljYWw6IENhbm9uaWNhbEZhY3QgPSB7XG4gICAgICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVDYW5vbmljYWxJZCh2YWxpZEFzc2VydGlvbnNbMF0pLFxuICAgICAgICAgIG1lcmdlZEZhY3Q6IHZhbGlkQXNzZXJ0aW9uc1swXS5mYWN0LFxuICAgICAgICAgIGNvbmZpZGVuY2U6IHRoaXMubWVyZ2VDb25maWRlbmNlKHZhbGlkQXNzZXJ0aW9ucyksXG4gICAgICAgICAgc291cmNlczogdmFsaWRBc3NlcnRpb25zLm1hcChhID0+IGEuc291cmNlKSxcbiAgICAgICAgICB2YWxpZEZyb206IE1hdGgubWluKC4uLnZhbGlkQXNzZXJ0aW9ucy5tYXAoYSA9PiBhLnRpbWVzdGFtcCB8fCAwKSksXG4gICAgICAgICAgdmFsaWRVbnRpbDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbShgY2Fub25pY2FsOiR7Y2Fub25pY2FsLmlkfWApXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsKSkpO1xuICAgICAgICB1cGRhdGVkKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhbm9uaWNhbCBmYWN0c1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2Fub25pY2FsRmFjdHMoKTogUHJvbWlzZTxDYW5vbmljYWxGYWN0W10+IHtcbiAgICBjb25zdCBmYWN0czogQ2Fub25pY2FsRmFjdFtdID0gW107XG4gICAgY29uc3QgY2Fub25pY2FsUHJlZml4ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKCdjYW5vbmljYWw6JyldKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgoY2Fub25pY2FsUHJlZml4KSkge1xuICAgICAgZmFjdHMucHVzaChKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFjdHM7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiBwcm92ZW5hbmNlIG9mIGEgZmFjdFxuICAgKi9cbiAgYXN5bmMgZXhwbGFpbihmYWN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBldmlkZW5jZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHN0cmluZ1tdOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbShgY2Fub25pY2FsOiR7ZmFjdElkfWApXSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmRiLmdldChrZXkpO1xuICAgIFxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGV2aWRlbmNlQ291bnQ6IDAsIHNvdXJjZXM6IFtdLCBjb25maWRlbmNlOiAwIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdDogQ2Fub25pY2FsRmFjdCA9IEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2aWRlbmNlQ291bnQ6IGZhY3Quc291cmNlcy5sZW5ndGgsXG4gICAgICBzb3VyY2VzOiBmYWN0LnNvdXJjZXMsXG4gICAgICBjb25maWRlbmNlOiBmYWN0LmNvbmZpZGVuY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJhdyBhc3NlcnRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFsbEFzc2VydGlvbnMoKTogUHJvbWlzZTxSYXdBc3NlcnRpb25bXT4ge1xuICAgIGNvbnN0IGFzc2VydGlvbnM6IFJhd0Fzc2VydGlvbltdID0gW107XG4gICAgY29uc3QgYXNzZXJ0aW9uUHJlZml4ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKCdhc3NlcnRpb246JyldKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgoYXNzZXJ0aW9uUHJlZml4KSkge1xuICAgICAgYXNzZXJ0aW9ucy5wdXNoKEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY29udHJhZGljdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29udHJhZGljdGlvbnMoKTogUHJvbWlzZTxBcnJheTx7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfT4+IHtcbiAgICBjb25zdCBjb250cmFkaWN0aW9uczogQXJyYXk8eyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3QgY29udHJhZGljdGlvblByZWZpeCA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbSgnY29udHJhZGljdGlvbjonKV0pO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVdIG9mIHRoaXMuZGIuc2NhblByZWZpeChjb250cmFkaWN0aW9uUHJlZml4KSkge1xuICAgICAgY29udHJhZGljdGlvbnMucHVzaChKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJhZGljdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgY29uZmlkZW5jZSBmcm9tIG11bHRpcGxlIGFzc2VydGlvbnNcbiAgICovXG4gIHByaXZhdGUgbWVyZ2VDb25maWRlbmNlKGFzc2VydGlvbnM6IFJhd0Fzc2VydGlvbltdKTogbnVtYmVyIHtcbiAgICBpZiAoYXNzZXJ0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIGlmIChhc3NlcnRpb25zLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGFzc2VydGlvbnNbMF0uY29uZmlkZW5jZTtcblxuICAgIC8vIEF2ZXJhZ2Ugd2l0aCB3ZWlnaHQgdG93YXJkIGhpZ2hlciBjb25maWRlbmNlXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmFzc2VydGlvbnNdLnNvcnQoKGEsIGIpID0+IGIuY29uZmlkZW5jZSAtIGEuY29uZmlkZW5jZSk7XG4gICAgY29uc3Qgd2VpZ2h0cyA9IHNvcnRlZC5tYXAoKF8sIGkpID0+IDEgLyAoaSArIDEpKTtcbiAgICBjb25zdCB0b3RhbFdlaWdodCA9IHdlaWdodHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgXG4gICAgcmV0dXJuIHNvcnRlZC5yZWR1Y2UoKGFjYywgYXNzZXJ0aW9uLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYWNjICsgKGFzc2VydGlvbi5jb25maWRlbmNlICogd2VpZ2h0c1tpXSkgLyB0b3RhbFdlaWdodDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGFzc2VydGlvbiBJRFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFzc2VydGlvbklkKGFzc2VydGlvbjogUmF3QXNzZXJ0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgIC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoYXNzZXJ0aW9uLmZhY3QpICsgYXNzZXJ0aW9uLnNvdXJjZSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAuc3Vic3RyaW5nKDAsIDE2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGNhbm9uaWNhbCBmYWN0IElEXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQ2Fub25pY2FsSWQoYXNzZXJ0aW9uOiBSYXdBc3NlcnRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgLnVwZGF0ZShKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZmFjdCkpXG4gICAgICAuZGlnZXN0KCdoZXgnKVxuICAgICAgLnN1YnN0cmluZygwLCAxNik7XG4gIH1cbn1cbiJdfQ==
|