ultipa 6.0.0
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/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/client.d.ts +194 -0
- package/dist/client.js +390 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +135 -0
- package/dist/connection.d.ts +30 -0
- package/dist/connection.js +190 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.js +237 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +88 -0
- package/dist/printers.d.ts +33 -0
- package/dist/printers.js +312 -0
- package/dist/proto/gqldb.proto +632 -0
- package/dist/response.d.ts +256 -0
- package/dist/response.js +723 -0
- package/dist/services/admin-service.d.ts +40 -0
- package/dist/services/admin-service.js +115 -0
- package/dist/services/bulk-import-service.d.ts +35 -0
- package/dist/services/bulk-import-service.js +108 -0
- package/dist/services/converters.d.ts +57 -0
- package/dist/services/converters.js +254 -0
- package/dist/services/data-service.d.ts +44 -0
- package/dist/services/data-service.js +206 -0
- package/dist/services/graph-service.d.ts +32 -0
- package/dist/services/graph-service.js +127 -0
- package/dist/services/health-service.d.ts +50 -0
- package/dist/services/health-service.js +78 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +30 -0
- package/dist/services/query-service.d.ts +39 -0
- package/dist/services/query-service.js +112 -0
- package/dist/services/service-context.d.ts +39 -0
- package/dist/services/service-context.js +73 -0
- package/dist/services/session-service.d.ts +24 -0
- package/dist/services/session-service.js +66 -0
- package/dist/services/transaction-service.d.ts +33 -0
- package/dist/services/transaction-service.js +100 -0
- package/dist/services.d.ts +28 -0
- package/dist/services.js +122 -0
- package/dist/session.d.ts +45 -0
- package/dist/session.js +75 -0
- package/dist/transaction.d.ts +42 -0
- package/dist/transaction.js +89 -0
- package/dist/types/bulk_import.d.ts +53 -0
- package/dist/types/bulk_import.js +6 -0
- package/dist/types/data_types.d.ts +116 -0
- package/dist/types/data_types.js +122 -0
- package/dist/types/enums.d.ts +59 -0
- package/dist/types/enums.js +67 -0
- package/dist/types/graph_models.d.ts +54 -0
- package/dist/types/graph_models.js +6 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.js +36 -0
- package/dist/types/metadata.d.ts +60 -0
- package/dist/types/metadata.js +6 -0
- package/dist/types/schema.d.ts +31 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/typed_value.d.ts +25 -0
- package/dist/types/typed_value.js +1176 -0
- package/dist/types/wrappers.d.ts +23 -0
- package/dist/types/wrappers.js +39 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +24 -0
- package/package.json +50 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main client for GQLDB Node.js driver.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.GqldbClient = void 0;
|
|
40
|
+
const grpc = __importStar(require("@grpc/grpc-js"));
|
|
41
|
+
const config_1 = require("./config");
|
|
42
|
+
const session_1 = require("./session");
|
|
43
|
+
const transaction_1 = require("./transaction");
|
|
44
|
+
const types_1 = require("./types");
|
|
45
|
+
const services_1 = require("./services");
|
|
46
|
+
const index_1 = require("./services/index");
|
|
47
|
+
/** Main client for interacting with GQLDB */
|
|
48
|
+
class GqldbClient {
|
|
49
|
+
config;
|
|
50
|
+
clients;
|
|
51
|
+
sessions;
|
|
52
|
+
txManager;
|
|
53
|
+
closed = false;
|
|
54
|
+
// Service instances
|
|
55
|
+
sessionService;
|
|
56
|
+
queryService;
|
|
57
|
+
graphService;
|
|
58
|
+
transactionService;
|
|
59
|
+
dataService;
|
|
60
|
+
healthService;
|
|
61
|
+
adminService;
|
|
62
|
+
bulkImportService;
|
|
63
|
+
/** Get session metadata for authenticated requests */
|
|
64
|
+
getSessionMetadata() {
|
|
65
|
+
const metadata = new grpc.Metadata();
|
|
66
|
+
const session = this.sessions.getSession();
|
|
67
|
+
metadata.add('session-id', session?.id?.toString() || '0');
|
|
68
|
+
return metadata;
|
|
69
|
+
}
|
|
70
|
+
constructor(config) {
|
|
71
|
+
(0, config_1.validateConfig)(config);
|
|
72
|
+
this.config = config;
|
|
73
|
+
this.sessions = new session_1.SessionManager();
|
|
74
|
+
this.txManager = new transaction_1.TransactionManager();
|
|
75
|
+
// Create gRPC credentials
|
|
76
|
+
let credentials;
|
|
77
|
+
if (config.tlsOptions) {
|
|
78
|
+
credentials = grpc.credentials.createSsl();
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
credentials = grpc.credentials.createInsecure();
|
|
82
|
+
}
|
|
83
|
+
// Channel options
|
|
84
|
+
const options = {
|
|
85
|
+
'grpc.max_receive_message_length': config.maxRecvSize ?? 4 * 1024 * 1024,
|
|
86
|
+
'grpc.keepalive_time_ms': 30000,
|
|
87
|
+
'grpc.keepalive_timeout_ms': 10000,
|
|
88
|
+
};
|
|
89
|
+
// Create service clients for the first host
|
|
90
|
+
const host = config.hosts[0];
|
|
91
|
+
this.clients = (0, services_1.createServiceClients)(host, credentials, options);
|
|
92
|
+
// Initialize service context
|
|
93
|
+
const ctx = new index_1.ServiceContext(this.config, this.sessions, this.txManager, this.clients);
|
|
94
|
+
// Initialize service instances
|
|
95
|
+
this.sessionService = new index_1.SessionService(ctx);
|
|
96
|
+
this.queryService = new index_1.QueryService(ctx);
|
|
97
|
+
this.graphService = new index_1.GraphService(ctx);
|
|
98
|
+
this.transactionService = new index_1.TransactionService(ctx);
|
|
99
|
+
this.dataService = new index_1.DataService(ctx);
|
|
100
|
+
this.healthService = new index_1.HealthService(ctx);
|
|
101
|
+
this.adminService = new index_1.AdminService(ctx);
|
|
102
|
+
this.bulkImportService = new index_1.BulkImportService(ctx);
|
|
103
|
+
}
|
|
104
|
+
/** Close the client and all connections */
|
|
105
|
+
async close() {
|
|
106
|
+
if (this.closed)
|
|
107
|
+
return;
|
|
108
|
+
this.closed = true;
|
|
109
|
+
if (this.sessions.isLoggedIn()) {
|
|
110
|
+
try {
|
|
111
|
+
await this.logout();
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
// Ignore logout errors during close
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Close all service clients
|
|
118
|
+
try {
|
|
119
|
+
this.clients.sessionService.close?.();
|
|
120
|
+
this.clients.queryService.close?.();
|
|
121
|
+
this.clients.graphService.close?.();
|
|
122
|
+
this.clients.transactionService.close?.();
|
|
123
|
+
this.clients.dataService.close?.();
|
|
124
|
+
this.clients.healthService.close?.();
|
|
125
|
+
this.clients.adminService.close?.();
|
|
126
|
+
this.clients.bulkImportService.close?.();
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
// Ignore close errors
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ===========================================================================
|
|
133
|
+
// Session Service
|
|
134
|
+
// ===========================================================================
|
|
135
|
+
/** Authenticate the user and create a session */
|
|
136
|
+
async login(username, password) {
|
|
137
|
+
return this.sessionService.login(username, password, this.config.defaultGraph || '');
|
|
138
|
+
}
|
|
139
|
+
/** Terminate the current session */
|
|
140
|
+
async logout() {
|
|
141
|
+
return this.sessionService.logout();
|
|
142
|
+
}
|
|
143
|
+
/** Check the connection and return the latency in nanoseconds */
|
|
144
|
+
async ping() {
|
|
145
|
+
return this.sessionService.ping();
|
|
146
|
+
}
|
|
147
|
+
// ===========================================================================
|
|
148
|
+
// Query Service
|
|
149
|
+
// ===========================================================================
|
|
150
|
+
/** Execute a GQL query and return the result */
|
|
151
|
+
async gql(query, config) {
|
|
152
|
+
return this.queryService.gql(query, config);
|
|
153
|
+
}
|
|
154
|
+
/** Execute a GQL query and stream the results */
|
|
155
|
+
async gqlStream(query, config, callback) {
|
|
156
|
+
return this.queryService.gqlStream(query, config, callback);
|
|
157
|
+
}
|
|
158
|
+
/** Return the execution plan for a query */
|
|
159
|
+
async explain(query, config) {
|
|
160
|
+
return this.queryService.explain(query, config);
|
|
161
|
+
}
|
|
162
|
+
/** Execute a query with profiling and return statistics */
|
|
163
|
+
async profile(query, config) {
|
|
164
|
+
return this.queryService.profile(query, config);
|
|
165
|
+
}
|
|
166
|
+
// ===========================================================================
|
|
167
|
+
// Graph Service
|
|
168
|
+
// ===========================================================================
|
|
169
|
+
/** Create a new graph */
|
|
170
|
+
async createGraph(name, graphType = types_1.GraphType.OPEN, description = '') {
|
|
171
|
+
return this.graphService.createGraph(name, graphType, description);
|
|
172
|
+
}
|
|
173
|
+
/** Delete a graph */
|
|
174
|
+
async dropGraph(name, ifExists = false) {
|
|
175
|
+
return this.graphService.dropGraph(name, ifExists);
|
|
176
|
+
}
|
|
177
|
+
/** Set the current graph for the session */
|
|
178
|
+
async useGraph(name) {
|
|
179
|
+
return this.graphService.useGraph(name);
|
|
180
|
+
}
|
|
181
|
+
/** Return all available graphs */
|
|
182
|
+
async listGraphs() {
|
|
183
|
+
return this.graphService.listGraphs();
|
|
184
|
+
}
|
|
185
|
+
/** Return information about a specific graph */
|
|
186
|
+
async getGraphInfo(name) {
|
|
187
|
+
return this.graphService.getGraphInfo(name);
|
|
188
|
+
}
|
|
189
|
+
// ===========================================================================
|
|
190
|
+
// Transaction Service
|
|
191
|
+
// ===========================================================================
|
|
192
|
+
/** Start a new transaction */
|
|
193
|
+
async beginTransaction(graphName, readOnly = false, timeout = 0) {
|
|
194
|
+
return this.transactionService.beginTransaction(graphName, readOnly, timeout);
|
|
195
|
+
}
|
|
196
|
+
/** Commit a transaction */
|
|
197
|
+
async commit(transactionId) {
|
|
198
|
+
return this.transactionService.commit(transactionId);
|
|
199
|
+
}
|
|
200
|
+
/** Rollback a transaction */
|
|
201
|
+
async rollback(transactionId) {
|
|
202
|
+
return this.transactionService.rollback(transactionId);
|
|
203
|
+
}
|
|
204
|
+
/** Return active transactions */
|
|
205
|
+
async listTransactions() {
|
|
206
|
+
return this.transactionService.listTransactions();
|
|
207
|
+
}
|
|
208
|
+
/** Execute a function within a transaction */
|
|
209
|
+
async withTransaction(graphName, fn, readOnly = false) {
|
|
210
|
+
return this.transactionService.withTransaction(graphName, fn, readOnly);
|
|
211
|
+
}
|
|
212
|
+
// ===========================================================================
|
|
213
|
+
// Data Service
|
|
214
|
+
// ===========================================================================
|
|
215
|
+
/** Insert multiple nodes into a graph */
|
|
216
|
+
async insertNodes(graphName, nodes, config) {
|
|
217
|
+
return this.dataService.insertNodes(graphName, nodes, config);
|
|
218
|
+
}
|
|
219
|
+
/** Insert multiple edges into a graph */
|
|
220
|
+
async insertEdges(graphName, edges, config) {
|
|
221
|
+
return this.dataService.insertEdges(graphName, edges, config);
|
|
222
|
+
}
|
|
223
|
+
/** Delete nodes from a graph */
|
|
224
|
+
async deleteNodes(graphName, nodeIds, labels, where) {
|
|
225
|
+
return this.dataService.deleteNodes(graphName, nodeIds, labels, where);
|
|
226
|
+
}
|
|
227
|
+
/** Delete edges from a graph */
|
|
228
|
+
async deleteEdges(graphName, edgeIds, label, where) {
|
|
229
|
+
return this.dataService.deleteEdges(graphName, edgeIds, label, where);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Export graph data in JSON Lines format (streaming).
|
|
233
|
+
* @param config Export configuration
|
|
234
|
+
* @param callback Callback for each exported chunk
|
|
235
|
+
*/
|
|
236
|
+
async export(config, callback) {
|
|
237
|
+
return this.dataService.export(config, callback);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Stream nodes from a graph
|
|
241
|
+
* @deprecated Use export() with ExportConfig instead
|
|
242
|
+
*/
|
|
243
|
+
async exportNodes(graphName, labels, limit = 0, callback) {
|
|
244
|
+
return this.dataService.exportNodes(graphName, labels, limit, callback);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Stream edges from a graph
|
|
248
|
+
* @deprecated Use export() with ExportConfig instead
|
|
249
|
+
*/
|
|
250
|
+
async exportEdges(graphName, labels, limit = 0, callback) {
|
|
251
|
+
return this.dataService.exportEdges(graphName, labels, limit, callback);
|
|
252
|
+
}
|
|
253
|
+
// ===========================================================================
|
|
254
|
+
// Health Service
|
|
255
|
+
// ===========================================================================
|
|
256
|
+
/** Check the health of a service */
|
|
257
|
+
async healthCheck(service = '') {
|
|
258
|
+
return this.healthService.healthCheck(service);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Watch health status changes via server-side streaming.
|
|
262
|
+
* Returns a HealthWatcher that emits 'status' events with HealthStatus values.
|
|
263
|
+
* Call stop() to cancel the stream.
|
|
264
|
+
*
|
|
265
|
+
* @param service - Optional service name to watch
|
|
266
|
+
* @returns HealthWatcher - EventEmitter with stop() method
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```typescript
|
|
270
|
+
* const watcher = client.watch();
|
|
271
|
+
* watcher.on('status', (status: HealthStatus) => {
|
|
272
|
+
* console.log('Health status:', status);
|
|
273
|
+
* });
|
|
274
|
+
* watcher.on('error', (err) => {
|
|
275
|
+
* console.error('Watch error:', err);
|
|
276
|
+
* });
|
|
277
|
+
* watcher.on('end', () => {
|
|
278
|
+
* console.log('Watch stream ended');
|
|
279
|
+
* });
|
|
280
|
+
* // Later, to stop watching:
|
|
281
|
+
* watcher.stop();
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
watch(service = '') {
|
|
285
|
+
return this.healthService.watch(service);
|
|
286
|
+
}
|
|
287
|
+
// ===========================================================================
|
|
288
|
+
// Admin Service
|
|
289
|
+
// ===========================================================================
|
|
290
|
+
/** Pre-allocate parser instances */
|
|
291
|
+
async warmupParser(count) {
|
|
292
|
+
return this.adminService.warmupParser(count);
|
|
293
|
+
}
|
|
294
|
+
/** Return cache statistics */
|
|
295
|
+
async getCacheStats(cacheType = types_1.CacheType.ALL) {
|
|
296
|
+
return this.adminService.getCacheStats(cacheType);
|
|
297
|
+
}
|
|
298
|
+
/** Clear the specified cache */
|
|
299
|
+
async clearCache(cacheType = types_1.CacheType.ALL) {
|
|
300
|
+
return this.adminService.clearCache(cacheType);
|
|
301
|
+
}
|
|
302
|
+
/** Return database statistics */
|
|
303
|
+
async getStatistics(graphName = '') {
|
|
304
|
+
return this.adminService.getStatistics(graphName);
|
|
305
|
+
}
|
|
306
|
+
/** Invalidate the RBAC permission cache */
|
|
307
|
+
async invalidatePermissionCache(username = '') {
|
|
308
|
+
return this.adminService.invalidatePermissionCache(username);
|
|
309
|
+
}
|
|
310
|
+
/** Trigger manual compaction of the database storage */
|
|
311
|
+
async compact() {
|
|
312
|
+
return this.adminService.compact();
|
|
313
|
+
}
|
|
314
|
+
/** Wait for the computing engine topology to be ready */
|
|
315
|
+
async waitForComputeTopology(graphName, timeoutMs = 0) {
|
|
316
|
+
return this.adminService.waitForComputeTopology(graphName, timeoutMs);
|
|
317
|
+
}
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
// Bulk Import Service
|
|
320
|
+
// ===========================================================================
|
|
321
|
+
/**
|
|
322
|
+
* Start a bulk import session for optimized high-throughput inserts.
|
|
323
|
+
* @param graphName Target graph name
|
|
324
|
+
* @param options Optional bulk import configuration
|
|
325
|
+
*/
|
|
326
|
+
async startBulkImport(graphName, options) {
|
|
327
|
+
return this.bulkImportService.startBulkImport(graphName, options);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* @deprecated Checkpoint is no longer needed. Use endBulkImport() which performs a final flush.
|
|
331
|
+
*/
|
|
332
|
+
async checkpoint(sessionId) {
|
|
333
|
+
return {
|
|
334
|
+
success: true,
|
|
335
|
+
recordCount: 0,
|
|
336
|
+
lastCheckpointCount: 0,
|
|
337
|
+
message: 'Checkpoint has been removed; use endBulkImport which performs a final flush',
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* End the bulk import session with a final checkpoint.
|
|
342
|
+
* @param sessionId Bulk import session ID
|
|
343
|
+
*/
|
|
344
|
+
async endBulkImport(sessionId) {
|
|
345
|
+
return this.bulkImportService.endBulkImport(sessionId);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Cancel the bulk import session without final sync.
|
|
349
|
+
* @param sessionId Bulk import session ID
|
|
350
|
+
*/
|
|
351
|
+
async abortBulkImport(sessionId) {
|
|
352
|
+
return this.bulkImportService.abortBulkImport(sessionId);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Return the current status of a bulk import session.
|
|
356
|
+
* @param sessionId Bulk import session ID
|
|
357
|
+
*/
|
|
358
|
+
async getBulkImportStatus(sessionId) {
|
|
359
|
+
return this.bulkImportService.getBulkImportStatus(sessionId);
|
|
360
|
+
}
|
|
361
|
+
// ===========================================================================
|
|
362
|
+
// Convenience Methods
|
|
363
|
+
// ===========================================================================
|
|
364
|
+
/** Get the current session */
|
|
365
|
+
getSession() {
|
|
366
|
+
return this.sessions.getSession();
|
|
367
|
+
}
|
|
368
|
+
/** Check if there is an active session */
|
|
369
|
+
isLoggedIn() {
|
|
370
|
+
return this.sessions.isLoggedIn();
|
|
371
|
+
}
|
|
372
|
+
/** Get the client configuration */
|
|
373
|
+
getConfig() {
|
|
374
|
+
return this.config;
|
|
375
|
+
}
|
|
376
|
+
/** Whether this client is connected to a cluster deployment */
|
|
377
|
+
get isCluster() {
|
|
378
|
+
return this.sessions.getSession()?.isCluster || false;
|
|
379
|
+
}
|
|
380
|
+
/** Get the cluster ID (empty string if not a cluster) */
|
|
381
|
+
get clusterId() {
|
|
382
|
+
return this.sessions.getSession()?.clusterId || '';
|
|
383
|
+
}
|
|
384
|
+
/** Get the partition count (0 if not a cluster) */
|
|
385
|
+
get partitionCount() {
|
|
386
|
+
return this.sessions.getSession()?.partitionCount || 0;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
exports.GqldbClient = GqldbClient;
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFjdkQsdUNBQW9EO0FBQ3BELCtDQUFnRTtBQUNoRSxtQ0FvQmlCO0FBQ2pCLHlDQUE0RjtBQUM1Riw0Q0FXMEI7QUFrQzFCLDZDQUE2QztBQUM3QyxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQWM7SUFDcEIsT0FBTyxDQUFpQjtJQUN4QixRQUFRLENBQWlCO0lBQ3pCLFNBQVMsQ0FBcUI7SUFDOUIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2QixvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFlBQVksTUFBbUI7UUFDN0IsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBYyxFQUFFLENBQUM7UUFD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QVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxzQkFBc0I7SUFDdEIsOEVBQThFO0lBRTlFLDhCQUE4QjtJQUM5QixVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQztJQUN4RCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQS9iRCxrQ0ErYkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogTWFpbiBjbGllbnQgZm9yIEdRTERCIE5vZGUuanMgZHJpdmVyLlxyXG4gKi9cclxuXHJcbmltcG9ydCAqIGFzIGdycGMgZnJvbSAnQGdycGMvZ3JwYy1qcyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgRW1wdHlRdWVyeUVycm9yLCBMb2dpbkZhaWxlZEVycm9yLCBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xyXG5pbXBvcnQge1xyXG4gIFJlc3BvbnNlLFxyXG4gIFJvdyxcclxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcclxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcclxuICBEZWxldGVSZXN1bHQsXHJcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXHJcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXHJcbiAgRXhwb3J0Q29uZmlnLFxyXG4gIEV4cG9ydENodW5rLFxyXG4gIEV4cG9ydFN0YXRzLFxyXG59IGZyb20gJy4vcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcclxuaW1wb3J0IHtcclxuICBHcmFwaEluZm8sXHJcbiAgR3JhcGhUeXBlLFxyXG4gIEhlYWx0aFN0YXR1cyxcclxuICBDYWNoZVN0YXRzLFxyXG4gIENhY2hlVHlwZSxcclxuICBTdGF0aXN0aWNzLFxyXG4gIENvbXBhY3RSZXN1bHQsXHJcbiAgQ29tcHV0ZVRvcG9sb2d5UmVzdWx0LFxyXG4gIE5vZGVEYXRhLFxyXG4gIEVkZ2VEYXRhLFxyXG4gIEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnMsXHJcbiAgQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucyxcclxuICBCdWxrSW1wb3J0T3B0aW9ucyxcclxuICBCdWxrSW1wb3J0U2Vzc2lvbixcclxuICBDaGVja3BvaW50UmVzdWx0LFxyXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXHJcbiAgQWJvcnRCdWxrSW1wb3J0UmVzdWx0LFxyXG4gIEJ1bGtJbXBvcnRTdGF0dXMsXHJcbiAgVHJhbnNhY3Rpb25JbmZvLFxyXG59IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBjcmVhdGVTZXJ2aWNlQ2xpZW50cywgcHJvbWlzaWZ5Q2FsbCwgcHJvbWlzaWZ5Q2FsbFdpdGhEZWFkbGluZSB9IGZyb20gJy4vc2VydmljZXMnO1xyXG5pbXBvcnQge1xyXG4gIFNlcnZpY2VDb250ZXh0LFxyXG4gIFNlcnZpY2VDbGllbnRzLFxyXG4gIFNlc3Npb25TZXJ2aWNlLFxyXG4gIFF1ZXJ5U2VydmljZSxcclxuICBHcmFwaFNlcnZpY2UsXHJcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxyXG4gIERhdGFTZXJ2aWNlLFxyXG4gIEhlYWx0aFNlcnZpY2UsXHJcbiAgQWRtaW5TZXJ2aWNlLFxyXG4gIEJ1bGtJbXBvcnRTZXJ2aWNlLFxyXG59IGZyb20gJy4vc2VydmljZXMvaW5kZXgnO1xyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGEgcXVlcnkgKi9cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XHJcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xyXG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gIHRyYW5zYWN0aW9uSWQ/OiBudW1iZXI7XHJcbiAgdGltZW91dD86IG51bWJlcjtcclxuICByZWFkT25seT86IGJvb2xlYW47XHJcbiAgLyoqIE1heCBwYXRocyB0byByZXR1cm4gZnJvbSBwYXRoIHF1ZXJpZXMgKDAgPSB1bmxpbWl0ZWQpICovXHJcbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJbnNlcnROb2Rlc0NvbmZpZyB7XHJcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XHJcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcclxufVxyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydEVkZ2VzQ29uZmlnIHtcclxuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcclxuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogSGVhbHRoIHdhdGNoZXIgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcgaGVhbHRoIHVwZGF0ZXMuXHJcbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cclxuICBzdG9wKCk6IHZvaWQ7XHJcbn1cclxuXHJcbi8qKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHUUxEQiAqL1xyXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xyXG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcclxuICBwcml2YXRlIGNsaWVudHM6IFNlcnZpY2VDbGllbnRzO1xyXG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xyXG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XHJcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gU2VydmljZSBpbnN0YW5jZXNcclxuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcclxuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xyXG4gIHByaXZhdGUgZ3JhcGhTZXJ2aWNlOiBHcmFwaFNlcnZpY2U7XHJcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcclxuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcclxuICBwcml2YXRlIGhlYWx0aFNlcnZpY2U6IEhlYWx0aFNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcclxuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcclxuXHJcbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBncnBjLk1ldGFkYXRhKCk7XHJcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XHJcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBHcWxkYkNvbmZpZykge1xyXG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgdGhpcy5zZXNzaW9ucyA9IG5ldyBTZXNzaW9uTWFuYWdlcigpO1xyXG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGdSUEMgY3JlZGVudGlhbHNcclxuICAgIGxldCBjcmVkZW50aWFsczogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XHJcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcclxuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXHJcbiAgICBjb25zdCBvcHRpb25zOiBncnBjLkNoYW5uZWxPcHRpb25zID0ge1xyXG4gICAgICAnZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA0ICogMTAyNCAqIDEwMjQsXHJcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lX21zJzogMzAwMDAsXHJcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lb3V0X21zJzogMTAwMDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGNsaWVudHMgZm9yIHRoZSBmaXJzdCBob3N0XHJcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xyXG4gICAgdGhpcy5jbGllbnRzID0gY3JlYXRlU2VydmljZUNsaWVudHMoaG9zdCwgY3JlZGVudGlhbHMsIG9wdGlvbnMpO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XHJcbiAgICBjb25zdCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQodGhpcy5jb25maWcsIHRoaXMuc2Vzc2lvbnMsIHRoaXMudHhNYW5hZ2VyLCB0aGlzLmNsaWVudHMpO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcclxuICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UgPSBuZXcgU2Vzc2lvblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMucXVlcnlTZXJ2aWNlID0gbmV3IFF1ZXJ5U2VydmljZShjdHgpO1xyXG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uU2VydmljZSA9IG5ldyBUcmFuc2FjdGlvblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XHJcbiAgICB0aGlzLmFkbWluU2VydmljZSA9IG5ldyBBZG1pblNlcnZpY2UoY3R4KTtcclxuICAgIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UgPSBuZXcgQnVsa0ltcG9ydFNlcnZpY2UoY3R4KTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZSB0aGUgY2xpZW50IGFuZCBhbGwgY29ubmVjdGlvbnMgKi9cclxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgbG9nb3V0IGVycm9ycyBkdXJpbmcgY2xvc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcclxuICAgIHRyeSB7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuc2Vzc2lvblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xyXG4gICAgICAodGhpcy5jbGllbnRzLmdyYXBoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcclxuICAgICAgKHRoaXMuY2xpZW50cy50cmFuc2FjdGlvblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuaGVhbHRoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcclxuICAgICAgKHRoaXMuY2xpZW50cy5hZG1pblNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIElnbm9yZSBjbG9zZSBlcnJvcnNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFNlc3Npb24gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQXV0aGVudGljYXRlIHRoZSB1c2VyIGFuZCBjcmVhdGUgYSBzZXNzaW9uICovXHJcbiAgYXN5bmMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzZXNzaW9uICovXHJcbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hlY2sgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xyXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIFF1ZXJ5IFNlcnZpY2VcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovXHJcbiAgYXN5bmMgZ3FsKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZXJ2aWNlLmdxbChxdWVyeSwgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cclxuICBhc3luYyBncWxTdHJlYW0oXHJcbiAgICBxdWVyeTogc3RyaW5nLFxyXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXHJcbiAgICBjYWxsYmFjaz86IChyZXNwb25zZTogUmVzcG9uc2UpID0+IHZvaWRcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5ncWxTdHJlYW0ocXVlcnksIGNvbmZpZywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cclxuICBhc3luYyBleHBsYWluKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV4ZWN1dGUgYSBxdWVyeSB3aXRoIHByb2ZpbGluZyBhbmQgcmV0dXJuIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gR3JhcGggU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQ3JlYXRlIGEgbmV3IGdyYXBoICovXHJcbiAgYXN5bmMgY3JlYXRlR3JhcGgoXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIGEgZ3JhcGggKi9cclxuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZHJvcEdyYXBoKG5hbWUsIGlmRXhpc3RzKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZXQgdGhlIGN1cnJlbnQgZ3JhcGggZm9yIHRoZSBzZXNzaW9uICovXHJcbiAgYXN5bmMgdXNlR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UudXNlR3JhcGgobmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGFsbCBhdmFpbGFibGUgZ3JhcGhzICovXHJcbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXHJcbiAgYXN5bmMgZ2V0R3JhcGhJbmZvKG5hbWU6IHN0cmluZyk6IFByb21pc2U8R3JhcGhJbmZvPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cclxuICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgdGltZW91dDogbnVtYmVyID0gMFxyXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5iZWdpblRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgcmVhZE9ubHksIHRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbW1pdCBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgcm9sbGJhY2sodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi9cclxuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5saXN0VHJhbnNhY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uICovXHJcbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBmbjogKHR4SWQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcclxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS53aXRoVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCBmbiwgcmVhZE9ubHkpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gRGF0YSBTZXJ2aWNlXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoICovXHJcbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxyXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcclxuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhncmFwaE5hbWUsIG5vZGVzLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGggKi9cclxuICBhc3luYyBpbnNlcnRFZGdlcyhcclxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxyXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXHJcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xyXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKGdyYXBoTmFtZSwgZWRnZXMsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIG5vZGVzIGZyb20gYSBncmFwaCAqL1xyXG4gIGFzeW5jIGRlbGV0ZU5vZGVzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXHJcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcclxuICAgIHdoZXJlPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZU5vZGVzKGdyYXBoTmFtZSwgbm9kZUlkcywgbGFiZWxzLCB3aGVyZSk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVsZXRlIGVkZ2VzIGZyb20gYSBncmFwaCAqL1xyXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBlZGdlSWRzPzogc3RyaW5nW10sXHJcbiAgICBsYWJlbD86IHN0cmluZyxcclxuICAgIHdoZXJlPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUVkZ2VzKGdyYXBoTmFtZSwgZWRnZUlkcywgbGFiZWwsIHdoZXJlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxyXG4gICAqIEBwYXJhbSBjb25maWcgRXhwb3J0IGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIGVhY2ggZXhwb3J0ZWQgY2h1bmtcclxuICAgKi9cclxuICBhc3luYyBleHBvcnQoXHJcbiAgICBjb25maWc6IEV4cG9ydENvbmZpZyxcclxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0KGNvbmZpZywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXHJcbiAgICovXHJcbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXHJcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcclxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxyXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXHJcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGhcclxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxyXG4gICAqL1xyXG4gIGFzeW5jIGV4cG9ydEVkZ2VzKFxyXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXHJcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcclxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxyXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnRFZGdlc1Jlc3VsdCkgPT4gdm9pZFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0RWRnZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBIZWFsdGggU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogQ2hlY2sgdGhlIGhlYWx0aCBvZiBhIHNlcnZpY2UgKi9cclxuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLmhlYWx0aENoZWNrKHNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggaGVhbHRoIHN0YXR1cyBjaGFuZ2VzIHZpYSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXHJcbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxyXG4gICAqIENhbGwgc3RvcCgpIHRvIGNhbmNlbCB0aGUgc3RyZWFtLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcclxuICAgKiBAcmV0dXJucyBIZWFsdGhXYXRjaGVyIC0gRXZlbnRFbWl0dGVyIHdpdGggc3RvcCgpIG1ldGhvZFxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogY29uc3Qgd2F0Y2hlciA9IGNsaWVudC53YXRjaCgpO1xyXG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xyXG4gICAqICAgY29uc29sZS5sb2coJ0hlYWx0aCBzdGF0dXM6Jywgc3RhdHVzKTtcclxuICAgKiB9KTtcclxuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1dhdGNoIGVycm9yOicsIGVycik7XHJcbiAgICogfSk7XHJcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xyXG4gICAqICAgY29uc29sZS5sb2coJ1dhdGNoIHN0cmVhbSBlbmRlZCcpO1xyXG4gICAqIH0pO1xyXG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxyXG4gICAqIHdhdGNoZXIuc3RvcCgpO1xyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIHdhdGNoKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogSGVhbHRoV2F0Y2hlciB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLndhdGNoKHNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQWRtaW4gU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cclxuICBhc3luYyB3YXJtdXBQYXJzZXIoY291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhcm11cFBhcnNlcihjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldENhY2hlU3RhdHMoY2FjaGVUeXBlKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciB0aGUgc3BlY2lmaWVkIGNhY2hlICovXHJcbiAgYXN5bmMgY2xlYXJDYWNoZShjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cclxuICBhc3luYyBnZXRTdGF0aXN0aWNzKGdyYXBoTmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPFN0YXRpc3RpY3M+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTdGF0aXN0aWNzKGdyYXBoTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogSW52YWxpZGF0ZSB0aGUgUkJBQyBwZXJtaXNzaW9uIGNhY2hlICovXHJcbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5pbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXHJcbiAgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPENvbXBhY3RSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jb21wYWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkgKi9cclxuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lLCB0aW1lb3V0TXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQnVsayBJbXBvcnQgU2VydmljZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cclxuICAgKiBAcGFyYW0gZ3JhcGhOYW1lIFRhcmdldCBncmFwaCBuYW1lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYnVsayBpbXBvcnQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEJ1bGtJbXBvcnRPcHRpb25zKTogUHJvbWlzZTxCdWxrSW1wb3J0U2Vzc2lvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2Uuc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cclxuICAgKi9cclxuICBhc3luYyBjaGVja3BvaW50KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja3BvaW50UmVzdWx0PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICByZWNvcmRDb3VudDogMCxcclxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcclxuICAgICAgbWVzc2FnZTogJ0NoZWNrcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIGVuZEJ1bGtJbXBvcnQgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaCcsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxyXG4gICAqL1xyXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRob3V0IGZpbmFsIHN5bmMuXHJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXHJcbiAgICovXHJcbiAgYXN5bmMgYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxBYm9ydEJ1bGtJbXBvcnRSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhIGJ1bGsgaW1wb3J0IHNlc3Npb24uXHJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa0ltcG9ydFN0YXR1cz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kc1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cclxuICBnZXRTZXNzaW9uKCk6IFNlc3Npb24gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgc2Vzc2lvbiAqL1xyXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCk7XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xyXG4gIGdldENvbmZpZygpOiBHcWxkYkNvbmZpZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cclxuICBnZXQgaXNDbHVzdGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5pc0NsdXN0ZXIgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRoZSBjbHVzdGVyIElEIChlbXB0eSBzdHJpbmcgaWYgbm90IGEgY2x1c3RlcikgKi9cclxuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmNsdXN0ZXJJZCB8fCAnJztcclxuICB9XHJcblxyXG4gIC8qKiBHZXQgdGhlIHBhcnRpdGlvbiBjb3VudCAoMCBpZiBub3QgYSBjbHVzdGVyKSAqL1xyXG4gIGdldCBwYXJ0aXRpb25Db3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xyXG4gIH1cclxufVxyXG4iXX0=
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for GQLDB Node.js driver.
|
|
3
|
+
*/
|
|
4
|
+
import * as tls from 'tls';
|
|
5
|
+
/** Configuration options for GqldbClient */
|
|
6
|
+
export interface GqldbConfig {
|
|
7
|
+
/** Server hosts in format "host:port" */
|
|
8
|
+
hosts: string[];
|
|
9
|
+
/** Username for authentication */
|
|
10
|
+
username?: string;
|
|
11
|
+
/** Password for authentication */
|
|
12
|
+
password?: string;
|
|
13
|
+
/** Default graph to use */
|
|
14
|
+
defaultGraph?: string;
|
|
15
|
+
/** Query timeout in milliseconds (default 30000ms = 30s) */
|
|
16
|
+
timeout?: number;
|
|
17
|
+
/** Maximum receive message size in bytes (default 64MB) */
|
|
18
|
+
maxRecvSize?: number;
|
|
19
|
+
/** TLS options for secure connections */
|
|
20
|
+
tlsOptions?: tls.ConnectionOptions;
|
|
21
|
+
/** Connection pool size per host */
|
|
22
|
+
poolSize?: number;
|
|
23
|
+
/** Health check interval in milliseconds (default 30000ms = 30s) */
|
|
24
|
+
healthCheckInterval?: number;
|
|
25
|
+
/** Number of retries for failed requests */
|
|
26
|
+
retryCount?: number;
|
|
27
|
+
/** Delay between retries in milliseconds (default 100ms) */
|
|
28
|
+
retryDelay?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Default configuration values */
|
|
31
|
+
export declare const DEFAULT_CONFIG: Required<Omit<GqldbConfig, 'username' | 'password' | 'defaultGraph' | 'tlsOptions'>>;
|
|
32
|
+
/** Builder for creating GqldbConfig */
|
|
33
|
+
export declare class ConfigBuilder {
|
|
34
|
+
private config;
|
|
35
|
+
/** Set the server hosts */
|
|
36
|
+
hosts(...hosts: string[]): this;
|
|
37
|
+
/** Set the username for authentication */
|
|
38
|
+
username(username: string): this;
|
|
39
|
+
/** Set the password for authentication */
|
|
40
|
+
password(password: string): this;
|
|
41
|
+
/** Set the default graph */
|
|
42
|
+
defaultGraph(graph: string): this;
|
|
43
|
+
/** Set the query timeout in milliseconds */
|
|
44
|
+
timeout(ms: number): this;
|
|
45
|
+
/** Set the query timeout in seconds (convenience method) */
|
|
46
|
+
timeoutSeconds(seconds: number): this;
|
|
47
|
+
/** Set the maximum receive message size */
|
|
48
|
+
maxRecvSize(bytes: number): this;
|
|
49
|
+
/** Set TLS options */
|
|
50
|
+
tls(options: tls.ConnectionOptions): this;
|
|
51
|
+
/** Set the connection pool size per host */
|
|
52
|
+
poolSize(size: number): this;
|
|
53
|
+
/** Set the health check interval in milliseconds */
|
|
54
|
+
healthCheckInterval(ms: number): this;
|
|
55
|
+
/** Set the number of retries */
|
|
56
|
+
retryCount(count: number): this;
|
|
57
|
+
/** Set the delay between retries in milliseconds */
|
|
58
|
+
retryDelay(ms: number): this;
|
|
59
|
+
/** Build and return the configuration */
|
|
60
|
+
build(): GqldbConfig;
|
|
61
|
+
}
|
|
62
|
+
/** Validate the configuration */
|
|
63
|
+
export declare function validateConfig(config: GqldbConfig): void;
|
|
64
|
+
/** Create a configuration with defaults */
|
|
65
|
+
export declare function createConfig(options?: Partial<GqldbConfig>): GqldbConfig;
|