@sochdb/sochdb 0.4.2 → 0.4.3

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 CHANGED
@@ -1,8 +1,212 @@
1
1
  # SochDB Node.js SDK
2
2
 
3
- **Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)**
3
+ **LLM-Optimized Embedded Database with Native Vector Search**
4
+
5
+ ---
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @sochdb/sochdb
11
+ ```
12
+
13
+ Or from source:
14
+ ```bash
15
+ cd sochdb-typescript-sdk
16
+ npm install
17
+ ```
18
+
19
+ ---
20
+
21
+ ## Architecture: Flexible Deployment
22
+
23
+ **Tri-mode architecture: Embedded + Concurrent + Server (gRPC/IPC)**
4
24
  Choose the deployment mode that fits your needs.
5
25
 
26
+ ---
27
+
28
+ # SochDB Node.js SDK Documentation
29
+
30
+ **LLM-Optimized Embedded Database with Native Vector Search**
31
+
32
+ ---
33
+
34
+ ## Table of Contents
35
+
36
+ 1. [Quick Start](#1-quick-start)
37
+ 2. [Installation](#2-installation)
38
+ 3. [Features](#3-features)
39
+ - [Namespace API](#namespace-api---multi-tenant-isolation)
40
+ - [Priority Queue API](#priority-queue-api---task-processing)
41
+ 4. [Architecture Overview](#4-architecture-overview)
42
+ 5. [Core Key-Value Operations](#5-core-key-value-operations)
43
+ 6. [Transactions (ACID with SSI)](#6-transactions-acid-with-ssi)
44
+ 7. [Query Builder](#7-query-builder)
45
+ 8. [Prefix Scanning](#8-prefix-scanning)
46
+ 9. [SQL Operations](#9-sql-operations)
47
+ 10. [Table Management & Index Policies](#10-table-management--index-policies)
48
+ 11. [Namespaces & Collections](#11-namespaces--collections)
49
+ 12. [Priority Queues](#12-priority-queues)
50
+ 13. [Vector Search](#13-vector-search)
51
+ 14. [Hybrid Search (Vector + BM25)](#14-hybrid-search-vector--bm25)
52
+ 15. [Graph Operations](#15-graph-operations)
53
+ 16. [Temporal Graph (Time-Travel)](#16-temporal-graph-time-travel)
54
+ 17. [Semantic Cache](#17-semantic-cache)
55
+ 18. [Memory System](#18-memory-system)
56
+ 19. [Session Management](#19-session-management)
57
+ 20. [Context Query Builder (LLM Optimization)](#20-context-query-builder-llm-optimization)
58
+ 21. [Atomic Multi-Index Writes](#21-atomic-multi-index-writes)
59
+ 22. [Recovery & WAL Management](#22-recovery--wal-management)
60
+ 23. [Checkpoints & Snapshots](#23-checkpoints--snapshots)
61
+ 24. [Compression & Storage](#24-compression--storage)
62
+ 25. [Statistics & Monitoring](#25-statistics--monitoring)
63
+ 26. [Distributed Tracing](#26-distributed-tracing)
64
+ 27. [Workflow & Run Tracking](#27-workflow--run-tracking)
65
+ 28. [Server Mode (gRPC Client)](#28-server-mode-grpc-client)
66
+ 29. [IPC Client (Unix Sockets)](#29-ipc-client-unix-sockets)
67
+ 30. [Standalone VectorIndex](#30-standalone-vectorindex)
68
+ 31. [Vector Utilities](#31-vector-utilities)
69
+ 32. [Data Formats (TOON/JSON/Columnar)](#32-data-formats-toonjsoncolumnar)
70
+ 33. [Policy Service](#33-policy-service)
71
+ 34. [MCP (Model Context Protocol)](#34-mcp-model-context-protocol)
72
+ 35. [Configuration Reference](#35-configuration-reference)
73
+ 36. [Error Handling](#36-error-handling)
74
+ 37. [Async Support](#37-async-support)
75
+ 38. [Building & Development](#38-building--development)
76
+ 39. [Complete Examples](#39-complete-examples)
77
+ 40. [Migration Guide](#40-migration-guide)
78
+
79
+ ---
80
+
81
+ ## 1. Quick Start
82
+
83
+ ### Concurrent Embedded Mode
84
+
85
+ For web applications with multiple Node.js processes (PM2 cluster, multiple workers):
86
+
87
+ ```typescript
88
+ import { EmbeddedDatabase } from '@sochdb/sochdb';
89
+ import express from 'express';
90
+
91
+ // Open in concurrent mode - multiple processes can access simultaneously
92
+ const db = EmbeddedDatabase.openConcurrent('./web_db');
93
+
94
+ const app = express();
95
+
96
+ app.get('/user/:id', async (req, res) => {
97
+ // Multiple concurrent requests can read simultaneously (~100ns)
98
+ const data = await db.get(Buffer.from(`user:${req.params.id}`));
99
+ if (!data) {
100
+ res.status(404).json({ error: 'not found' });
101
+ return;
102
+ }
103
+ res.send(data);
104
+ });
105
+
106
+ app.post('/user/:id', async (req, res) => {
107
+ // Writes are automatically coordinated (~60µs amortized)
108
+ await db.put(Buffer.from(`user:${req.params.id}`), req.body);
109
+ res.json({ status: 'ok' });
110
+ });
111
+
112
+ // Check concurrent mode status
113
+ console.log(`Concurrent mode: ${db.isConcurrent}`); // true
114
+
115
+ // Start with PM2 cluster mode (multiple workers can access DB)
116
+ // pm2 start app.js -i max
117
+ app.listen(3000);
118
+ ```
119
+
120
+ ### Performance
121
+
122
+ | Operation | Standard Mode | Concurrent Mode |
123
+ |-----------|---------------|-----------------|
124
+ | Read (single process) | ~100ns | ~100ns |
125
+ | Read (multi-process) | **Blocked** ❌ | ~100ns ✅ |
126
+ | Write | ~5ms (fsync) | ~60µs (amortized) |
127
+ | Max concurrent readers | 1 | 1024 |
128
+
129
+ ### PM2 Cluster Example
130
+
131
+ ```bash
132
+ # Install PM2
133
+ npm install -g pm2
134
+
135
+ # Start with automatic worker scaling
136
+ pm2 start server.js -i max
137
+
138
+ # All workers can access the same database concurrently!
139
+ pm2 logs
140
+ ```
141
+
142
+ ### PM2 Ecosystem File
143
+
144
+ ```javascript
145
+ // ecosystem.config.js
146
+ module.exports = {
147
+ apps: [{
148
+ name: 'api-server',
149
+ script: './server.js',
150
+ instances: 'max', // Scale across all CPU cores
151
+ exec_mode: 'cluster',
152
+ env: {
153
+ NODE_ENV: 'production',
154
+ DB_PATH: './shared_db' // All workers use same DB
155
+ }
156
+ }]
157
+ };
158
+ ```
159
+
160
+ ```bash
161
+ # Deploy with ecosystem file
162
+ pm2 start ecosystem.config.js
163
+
164
+ # Monitor all workers
165
+ pm2 monit
166
+ ```
167
+
168
+ ### Docker Compose with PM2
169
+
170
+ ```yaml
171
+ version: '3.8'
172
+ services:
173
+ app:
174
+ build: .
175
+ environment:
176
+ - NODE_ENV=production
177
+ - INSTANCES=4 # 4 PM2 workers
178
+ volumes:
179
+ - ./data:/app/data # Shared database volume
180
+ ports:
181
+ - "3000:3000"
182
+ command: pm2-runtime start ecosystem.config.js
183
+ ```
184
+
185
+ ### Kubernetes Deployment
186
+
187
+ ```yaml
188
+ apiVersion: apps/v1
189
+ kind: Deployment
190
+ metadata:
191
+ name: sochdb-app
192
+ spec:
193
+ replicas: 4 # 4 pods share the database
194
+ template:
195
+ spec:
196
+ containers:
197
+ - name: app
198
+ image: myapp:latest
199
+ volumeMounts:
200
+ - name: db-storage
201
+ mountPath: /app/data
202
+ volumes:
203
+ - name: db-storage
204
+ persistentVolumeClaim:
205
+ claimName: sochdb-pvc # Shared PVC with ReadWriteMany
206
+ ```
207
+
208
+ ---
209
+
6
210
  ## Features
7
211
 
8
212
  ### Memory System - LLM-Native Memory for AI Agents
@@ -239,21 +443,161 @@ console.log(`Pending: ${stats.pending}, Completed: ${stats.completed}`);
239
443
 
240
444
  ---
241
445
 
242
- ## Installation
446
+ ---
447
+
448
+ ## System Requirements
449
+
450
+ ### For Concurrent Mode
451
+
452
+ - **SochDB Core**: Latest version
453
+ - **Node.js**: 14.0+ (18.0+ recommended)
454
+ - **Native Library**: `libsochdb_storage.{dylib,so}`
455
+ - **FFI**: Koffi (automatically installed)
456
+
457
+ **Operating Systems:**
458
+ - ✅ Linux (Ubuntu 20.04+, RHEL 8+)
459
+ - ✅ macOS (10.15+, both Intel and Apple Silicon)
460
+ - ⚠️ Windows (requires native builds)
461
+
462
+ **File Descriptors:**
463
+ - Default limit: 1024 (sufficient for most workloads)
464
+ - For high concurrency with PM2: `ulimit -n 4096`
465
+
466
+ **Memory:**
467
+ - Standard mode: ~50MB base + data
468
+ - Concurrent mode: +4KB per concurrent reader slot (1024 slots = ~4MB overhead)
469
+ - PM2 cluster: Each worker has independent memory
470
+
471
+ ---
472
+
473
+ ## Troubleshooting
474
+
475
+ ### "Database is locked" Error (Standard Mode)
476
+
477
+ ```
478
+ Error: SQLITE_BUSY: database is locked
479
+ ```
480
+
481
+ **Solution**: Use concurrent mode for multi-process access:
482
+
483
+ ```typescript
484
+ // ❌ Standard mode - PM2 cluster will fail
485
+ const db = new EmbeddedDatabase('./data.db');
243
486
 
487
+ // ✅ Concurrent mode - PM2 cluster works!
488
+ const db = EmbeddedDatabase.openConcurrent('./data.db');
489
+ ```
490
+
491
+ ### Library Not Found Error
492
+
493
+ ```
494
+ Error: Dynamic library 'libsochdb_storage.dylib' not found
495
+ ```
496
+
497
+ **macOS**:
244
498
  ```bash
245
- npm install @sochdb/sochdb
499
+ # Build and install library
500
+ cd /path/to/sochdb
501
+ cargo build --release
502
+ sudo cp target/release/libsochdb_storage.dylib /usr/local/lib/
246
503
  ```
247
504
 
248
- Or from source:
505
+ **Linux**:
249
506
  ```bash
250
- cd sochdb-typescript-sdk
251
- npm install
507
+ cd /path/to/sochdb
508
+ cargo build --release
509
+ sudo cp target/release/libsochdb_storage.so /usr/local/lib/
510
+ sudo ldconfig
511
+ ```
512
+
513
+ **Development Mode** (no install):
514
+ ```bash
515
+ export DYLD_LIBRARY_PATH=/path/to/sochdb/target/release # macOS
516
+ export LD_LIBRARY_PATH=/path/to/sochdb/target/release # Linux
517
+ ```
518
+
519
+ ### PM2 Cluster Issues
520
+
521
+ **Symptom**: Workers crash with "database locked"
522
+
523
+ **Solution**: Ensure concurrent mode is used:
524
+ ```javascript
525
+ // ecosystem.config.js
526
+ module.exports = {
527
+ apps: [{
528
+ name: 'api',
529
+ script: './server.js',
530
+ instances: 4,
531
+ exec_mode: 'cluster',
532
+ env: {
533
+ USE_CONCURRENT_MODE: 'true' // Flag to use openConcurrent()
534
+ }
535
+ }]
536
+ };
537
+ ```
538
+
539
+ ```typescript
540
+ // server.ts
541
+ const db = process.env.USE_CONCURRENT_MODE
542
+ ? EmbeddedDatabase.openConcurrent('./db')
543
+ : new EmbeddedDatabase('./db');
544
+
545
+ console.log('Concurrent mode:', db.isConcurrent); // Should be true
546
+ ```
547
+
548
+ ### Docker Volume Permissions
549
+
550
+ **Symptom**: `EACCES: permission denied` when opening database
551
+
552
+ **Solution**: Fix volume ownership:
553
+ ```dockerfile
554
+ FROM node:18
555
+ WORKDIR /app
556
+
557
+ # Create data directory with correct permissions
558
+ RUN mkdir -p /app/data && chown -R node:node /app
559
+
560
+ # Switch to non-root user
561
+ USER node
562
+
563
+ COPY --chown=node:node . .
564
+ RUN npm install
565
+
566
+ CMD ["npm", "start"]
567
+ ```
568
+
569
+ ### Performance Issues
570
+
571
+ **Symptom**: Concurrent reads slower than expected
572
+
573
+ **Check 1** - Verify concurrent mode:
574
+ ```typescript
575
+ if (!db.isConcurrent) {
576
+ console.error('Database is not in concurrent mode!');
577
+ process.exit(1);
578
+ }
579
+ ```
580
+
581
+ **Check 2** - Monitor PM2 workers:
582
+ ```bash
583
+ pm2 monit # Real-time monitoring
584
+ pm2 logs --lines 200 # Check for errors
585
+ ```
586
+
587
+ **Check 3** - Batch writes:
588
+ ```typescript
589
+ // ❌ Slow - individual writes
590
+ for (const item of items) {
591
+ await collection.insert(item);
592
+ }
593
+
594
+ // ✅ Fast - batch write
595
+ await collection.insertBatch(items);
252
596
  ```
253
597
 
254
598
  ---
255
599
 
256
- ## 🆕 Vector Search - Native HNSW (v0.4.2)
600
+ ## 🆕 Vector Search - Native HNSW
257
601
 
258
602
  SochDB now includes **native HNSW (Hierarchical Navigable Small World)** vector search for sub-millisecond similarity search across millions of vectors.
259
603
 
@@ -337,8 +681,6 @@ const results = await collection.search({ queryVector: [...], k: 10 });
337
681
  - Direct HNSW API (above), OR
338
682
  - gRPC Server Mode (see below)
339
683
 
340
- **✅ Coming in v0.4.3:** Collection API will automatically use native HNSW
341
-
342
684
  #### 3. gRPC Server Mode (Production-Ready)
343
685
 
344
686
  For distributed systems, multi-language support:
@@ -440,15 +782,15 @@ class HnswIndex {
440
782
 
441
783
  ### Roadmap
442
784
 
443
- - **v0.4.2** (current): Direct HNSW FFI bindings
444
- - **v0.4.3** (next): Collection API auto-uses HNSW in embedded mode
445
- - **v0.5.0**: Persistent HNSW indexes with disk storage
785
+ - **Current**: Direct HNSW FFI bindings
786
+ - **Next**: Collection API auto-uses HNSW in embedded mode
787
+ - **Future**: Persistent HNSW indexes with disk storage
446
788
 
447
789
  ---
448
790
 
449
791
  # SochDB Node.js SDK Documentation
450
792
 
451
- **Version 0.4.2** | LLM-Optimized Embedded Database with Native Vector Search
793
+ **LLM-Optimized Embedded Database with Native Vector Search**
452
794
 
453
795
  ---
454
796
 
@@ -3679,7 +4021,7 @@ A:
3679
4021
  A: Yes! Both modes have the same API. Change `Database.open()` to `SochDBClient()` and vice versa.
3680
4022
 
3681
4023
  **Q: Do temporal graphs work in embedded mode?**
3682
- A: Yes! As of v0.4.0, temporal graphs work in both embedded and server modes with identical APIs.
4024
+ A: Yes! Temporal graphs work in both embedded and server modes with identical APIs.
3683
4025
 
3684
4026
  **Q: Is embedded mode slower than server mode?**
3685
4027
  A: Embedded mode is faster for single-process use (no network overhead). Server mode is better for distributed deployments.
@@ -24,14 +24,18 @@ const transaction_1 = require("./transaction");
24
24
  * ```
25
25
  */
26
26
  class EmbeddedDatabase {
27
- constructor(path, handle) {
27
+ constructor(path, handle, concurrent = false) {
28
28
  this.closed = false;
29
+ this.concurrent = false;
29
30
  this.path = path;
30
31
  this.handle = handle;
32
+ this.concurrent = concurrent;
31
33
  this.bindings = bindings_1.NativeBindings.getInstance();
32
34
  }
33
35
  /**
34
- * Open a database at the specified path
36
+ * Open a database at the specified path in standard mode
37
+ *
38
+ * For web applications with multiple processes, use `openConcurrent()` instead.
35
39
  *
36
40
  * @param path - Path to database directory
37
41
  * @param config - Optional configuration
@@ -60,7 +64,70 @@ class EmbeddedDatabase {
60
64
  if (!handle) {
61
65
  throw new errors_1.DatabaseError(`Failed to open database at ${path}`);
62
66
  }
63
- return new EmbeddedDatabase(path, handle);
67
+ return new EmbeddedDatabase(path, handle, false);
68
+ }
69
+ /**
70
+ * Open a database in concurrent mode for multi-process web applications
71
+ *
72
+ * This mode allows multiple Node.js processes (e.g., PM2 cluster workers,
73
+ * multiple Express instances) to access the database simultaneously.
74
+ *
75
+ * Features:
76
+ * - Lock-free reads with ~100ns latency
77
+ * - Multi-reader, single-writer coordination
78
+ * - Automatic write serialization
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * import { EmbeddedDatabase } from '@sochdb/sochdb';
83
+ * import express from 'express';
84
+ *
85
+ * // Open in concurrent mode - multiple workers can access
86
+ * const db = EmbeddedDatabase.openConcurrent('./web_db');
87
+ *
88
+ * const app = express();
89
+ *
90
+ * app.get('/user/:id', async (req, res) => {
91
+ * // Multiple concurrent requests can read simultaneously
92
+ * const data = await db.get(Buffer.from(`user:${req.params.id}`));
93
+ * if (!data) {
94
+ * res.status(404).json({ error: 'not found' });
95
+ * return;
96
+ * }
97
+ * res.send(data);
98
+ * });
99
+ *
100
+ * app.post('/user/:id', async (req, res) => {
101
+ * // Writes are serialized automatically
102
+ * await db.put(Buffer.from(`user:${req.params.id}`), req.body);
103
+ * res.json({ status: 'ok' });
104
+ * });
105
+ *
106
+ * // Start with PM2 cluster mode:
107
+ * // pm2 start app.js -i max
108
+ * app.listen(3000);
109
+ * ```
110
+ *
111
+ * @param path - Path to database directory
112
+ * @returns EmbeddedDatabase instance in concurrent mode
113
+ */
114
+ static openConcurrent(path) {
115
+ const bindings = bindings_1.NativeBindings.getInstance();
116
+ if (!bindings.sochdb_open_concurrent) {
117
+ throw new errors_1.DatabaseError('Concurrent mode not supported. Please upgrade the SochDB native library to v0.4.4+');
118
+ }
119
+ const handle = bindings.sochdb_open_concurrent(path);
120
+ if (!handle) {
121
+ throw new errors_1.DatabaseError(`Failed to open database in concurrent mode at ${path}`);
122
+ }
123
+ const isConcurrent = bindings.sochdb_is_concurrent(handle) === 1;
124
+ return new EmbeddedDatabase(path, handle, isConcurrent);
125
+ }
126
+ /**
127
+ * Check if database is opened in concurrent mode
128
+ */
129
+ get isConcurrent() {
130
+ return this.concurrent;
64
131
  }
65
132
  /**
66
133
  * Put a key-value pair (auto-transaction)
@@ -233,4 +300,4 @@ class EmbeddedDatabase {
233
300
  }
234
301
  }
235
302
  exports.EmbeddedDatabase = EmbeddedDatabase;
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQU16QixZQUFvQixJQUFZLEVBQUUsTUFBVztRQUhyQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBSW5CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFZLEVBQUUsTUFBK0I7UUFDckQsTUFBTSxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sR0FBRztnQkFDWixXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN2QyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTO2dCQUNoRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVM7Z0JBQzVDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUks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QUFDO1lBQzFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDN0MsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3ZELENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQTlPRCw0Q0E4T0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBoYW5kbGU6IGFueSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbiBhIGRhdGFiYXNlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdmFsdWUgYnkga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXQoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0UGF0aChwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FuIGtleXMgd2l0aCBwcmVmaXhcbiAgICAgKi9cbiAgICBhc3luYyAqc2NhblByZWZpeChwcmVmaXg6IEJ1ZmZlcik6IEFzeW5jR2VuZXJhdG9yPFtCdWZmZXIsIEJ1ZmZlcl0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiB0eG4uc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW4gYSB0cmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCk6IEVtYmVkZGVkVHJhbnNhY3Rpb24ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG5IYW5kbGUgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9iZWdpbl90eG4odGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkVHJhbnNhY3Rpb24odGhpcywgdGhpcy5oYW5kbGUsIHR4bkhhbmRsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBvcGVyYXRpb25zIHdpdGhpbiBhIHRyYW5zYWN0aW9uICh3aXRoIGF1dG8tY29tbWl0L2Fib3J0KVxuICAgICAqL1xuICAgIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihmbjogKHR4bjogRW1iZWRkZWRUcmFuc2FjdGlvbikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eG4pO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBhIGNoZWNrcG9pbnRcbiAgICAgKi9cbiAgICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBsc24gPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jaGVja3BvaW50KHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIEJpZ0ludChsc24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdG9yYWdlIHN0YXRpc3RpY3NcbiAgICAgKi9cbiAgICBhc3luYyBzdGF0cygpOiBQcm9taXNlPHtcbiAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgd2FsU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogYmlnaW50O1xuICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogYmlnaW50O1xuICAgIH0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBzdHJ1Y3QgYnkgdmFsdWUgKGF1dG9tYXRpY2FsbHkgZGVjb2RlZClcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9zdGF0cyh0aGlzLmhhbmRsZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy5tZW10YWJsZV9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIHdhbFNpemVCeXRlczogQmlnSW50KHN0YXRzLndhbF9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogc3RhdHMuYWN0aXZlX3RyYW5zYWN0aW9ucyxcbiAgICAgICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBCaWdJbnQoc3RhdHMubWluX2FjdGl2ZV9zbmFwc2hvdCksXG4gICAgICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogQmlnSW50KHN0YXRzLmxhc3RfY2hlY2twb2ludF9sc24pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGRhdGFiYXNlXG4gICAgICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3Muc29jaGRiX2Nsb3NlKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgaXMgY2xvc2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW50ZXJuYWwgaGFuZGxlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEhhbmRsZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJpbmRpbmdzIGluc3RhbmNlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEJpbmRpbmdzKCk6IE5hdGl2ZUJpbmRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3M7XG4gICAgfVxufVxuIl19
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQU96QixZQUFvQixJQUFZLEVBQUUsTUFBVyxFQUFFLFVBQVUsR0FBRyxLQUFLO1FBSnpELFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBR3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7Z0JBQ3ZDLGVBQWUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEYsYUFB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QUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksc0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUF0VEQsNENBc1RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSAtIEZGSSBNb2RlXG4gKiBcbiAqIERpcmVjdCBGRkkgYWNjZXNzIHRvIFNvY2hEQiBuYXRpdmUgbGlicmFyeS5cbiAqIE5vIHNlcnZlciByZXF1aXJlZCAtIHNpbWlsYXIgdG8gUHl0aG9uIFNESydzIERhdGFiYXNlIGNsYXNzLlxuICovXG5cbmltcG9ydCB7IERhdGFiYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTmF0aXZlQmluZGluZ3MgfSBmcm9tICcuL2ZmaS9iaW5kaW5ncyc7XG5pbXBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB7XG4gICAgd2FsRW5hYmxlZD86IGJvb2xlYW47XG4gICAgc3luY01vZGU/OiAnZnVsbCcgfCAnbm9ybWFsJyB8ICdvZmYnO1xuICAgIG1lbXRhYmxlU2l6ZUJ5dGVzPzogbnVtYmVyO1xuICAgIGdyb3VwQ29tbWl0PzogYm9vbGVhbjtcbiAgICBpbmRleFBvbGljeT86ICd3cml0ZV9vcHRpbWl6ZWQnIHwgJ2JhbGFuY2VkJyB8ICdzY2FuX29wdGltaXplZCcgfCAnYXBwZW5kX29ubHknO1xufVxuXG4vKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIHVzaW5nIGRpcmVjdCBGRklcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIGNvbnN0IGRiID0gYXdhaXQgRW1iZWRkZWREYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGNvbnN0IHZhbHVlID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICBwcml2YXRlIGhhbmRsZTogYW55O1xuICAgIHByaXZhdGUgYmluZGluZ3M6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjb25jdXJyZW50ID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnksIGNvbmN1cnJlbnQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbiBhIGRhdGFiYXNlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiBzdGFuZGFyZCBtb2RlXG4gICAgICogXG4gICAgICogRm9yIHdlYiBhcHBsaWNhdGlvbnMgd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMsIHVzZSBgb3BlbkNvbmN1cnJlbnQoKWAgaW5zdGVhZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcGF0aCAtIFBhdGggdG8gZGF0YWJhc2UgZGlyZWN0b3J5XG4gICAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcmV0dXJucyBFbWJlZGRlZERhdGFiYXNlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW4ocGF0aDogc3RyaW5nLCBjb25maWc/OiBFbWJlZGRlZERhdGFiYXNlQ29uZmlnKTogRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgbGV0IGhhbmRsZTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCBjQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkOiBjb25maWcud2FsRW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZF9zZXQ6IGNvbmZpZy53YWxFbmFibGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3luY19tb2RlOiBjb25maWcuc3luY01vZGUgPT09ICdmdWxsJyA/IDIgOiAoY29uZmlnLnN5bmNNb2RlID09PSAnbm9ybWFsJyA/IDEgOiAwKSxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGVfc2V0OiBjb25maWcuc3luY01vZGUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtZW10YWJsZV9zaXplX2J5dGVzOiBCaWdJbnQoY29uZmlnLm1lbXRhYmxlU2l6ZUJ5dGVzID8/IDApLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdDogY29uZmlnLmdyb3VwQ29tbWl0ID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdyb3VwX2NvbW1pdF9zZXQ6IGNvbmZpZy5ncm91cENvbW1pdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAxLCAvLyBEZWZhdWx0IHRvIEJhbGFuY2VkXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnKHBhdGgsIGNDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW4ocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGZvciBtdWx0aS1wcm9jZXNzIHdlYiBhcHBsaWNhdGlvbnNcbiAgICAgKiBcbiAgICAgKiBUaGlzIG1vZGUgYWxsb3dzIG11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIChlLmcuLCBQTTIgY2x1c3RlciB3b3JrZXJzLFxuICAgICAqIG11bHRpcGxlIEV4cHJlc3MgaW5zdGFuY2VzKSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHNpbXVsdGFuZW91c2x5LlxuICAgICAqIFxuICAgICAqIEZlYXR1cmVzOlxuICAgICAqIC0gTG9jay1mcmVlIHJlYWRzIHdpdGggfjEwMG5zIGxhdGVuY3lcbiAgICAgKiAtIE11bHRpLXJlYWRlciwgc2luZ2xlLXdyaXRlciBjb29yZGluYXRpb25cbiAgICAgKiAtIEF1dG9tYXRpYyB3cml0ZSBzZXJpYWxpemF0aW9uXG4gICAgICogXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAgICAgKiBpbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbiAgICAgKiBcbiAgICAgKiAvLyBPcGVuIGluIGNvbmN1cnJlbnQgbW9kZSAtIG11bHRpcGxlIHdvcmtlcnMgY2FuIGFjY2Vzc1xuICAgICAqIGNvbnN0IGRiID0gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi93ZWJfZGInKTtcbiAgICAgKiBcbiAgICAgKiBjb25zdCBhcHAgPSBleHByZXNzKCk7XG4gICAgICogXG4gICAgICogYXBwLmdldCgnL3VzZXIvOmlkJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICogICAvLyBNdWx0aXBsZSBjb25jdXJyZW50IHJlcXVlc3RzIGNhbiByZWFkIHNpbXVsdGFuZW91c2x5XG4gICAgICogICBjb25zdCBkYXRhID0gYXdhaXQgZGIuZ2V0KEJ1ZmZlci5mcm9tKGB1c2VyOiR7cmVxLnBhcmFtcy5pZH1gKSk7XG4gICAgICogICBpZiAoIWRhdGEpIHtcbiAgICAgKiAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogJ25vdCBmb3VuZCcgfSk7XG4gICAgICogICAgIHJldHVybjtcbiAgICAgKiAgIH1cbiAgICAgKiAgIHJlcy5zZW5kKGRhdGEpO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIGFwcC5wb3N0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIFdyaXRlcyBhcmUgc2VyaWFsaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICogICBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApLCByZXEuYm9keSk7XG4gICAgICogICByZXMuanNvbih7IHN0YXR1czogJ29rJyB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBcbiAgICAgKiAvLyBTdGFydCB3aXRoIFBNMiBjbHVzdGVyIG1vZGU6XG4gICAgICogLy8gcG0yIHN0YXJ0IGFwcC5qcyAtaSBtYXhcbiAgICAgKiBhcHAubGlzdGVuKDMwMDApO1xuICAgICAqIGBgYFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcmV0dXJucyBFbWJlZGRlZERhdGFiYXNlIGluc3RhbmNlIGluIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIHN0YXRpYyBvcGVuQ29uY3VycmVudChwYXRoOiBzdHJpbmcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFiaW5kaW5ncy5zb2NoZGJfb3Blbl9jb25jdXJyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignQ29uY3VycmVudCBtb2RlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1cGdyYWRlIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkgdG8gdjAuNC40KycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fY29uY3VycmVudChwYXRoKTtcbiAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25jdXJyZW50ID0gYmluZGluZ3Muc29jaGRiX2lzX2NvbmN1cnJlbnQoaGFuZGxlKSA9PT0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgaXNDb25jdXJyZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBkYXRhYmFzZSBpcyBvcGVuZWQgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgZ2V0IGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uY3VycmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldChrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXRQYXRoKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjYW4ga2V5cyB3aXRoIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jICpzY2FuUHJlZml4KHByZWZpeDogQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHR4bi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbiBhIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKTogRW1iZWRkZWRUcmFuc2FjdGlvbiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4bkhhbmRsZSA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2JlZ2luX3R4bih0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmhhbmRsZSwgdHhuSGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24gKHdpdGggYXV0by1jb21taXQvYWJvcnQpXG4gICAgICovXG4gICAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KGZuOiAodHhuOiBFbWJlZGRlZFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHR4bik7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGEgY2hlY2twb2ludFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGxzbiA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2NoZWNrcG9pbnQodGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGxzbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljc1xuICAgICAqL1xuICAgIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgICAgICBtZW10YWJsZVNpemVCeXRlczogYmlnaW50O1xuICAgICAgICB3YWxTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBiaWdpbnQ7XG4gICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBiaWdpbnQ7XG4gICAgfT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICAvLyBSZXR1cm5zIHN0cnVjdCBieSB2YWx1ZSAoYXV0b21hdGljYWxseSBkZWNvZGVkKVxuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuYmluZGluZ3Muc29jaGRiX3N0YXRzKHRoaXMuaGFuZGxlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBtZW10YWJsZVNpemVCeXRlczogQmlnSW50KHN0YXRzLm1lbXRhYmxlX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgd2FsU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMud2FsX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBzdGF0cy5hY3RpdmVfdHJhbnNhY3Rpb25zLFxuICAgICAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IEJpZ0ludChzdGF0cy5taW5fYWN0aXZlX3NuYXBzaG90KSxcbiAgICAgICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBCaWdJbnQoc3RhdHMubGFzdF9jaGVja3BvaW50X2xzbiksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgZGF0YWJhc2VcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2xvc2UodGhpcy5oYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBpcyBjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnRlcm5hbCBoYW5kbGUgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0SGFuZGxlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmluZGluZ3MgaW5zdGFuY2UgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QmluZGluZ3MoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9XG59XG4iXX0=
@@ -80,6 +80,16 @@ class NativeBindings {
80
80
  // DB Management
81
81
  this.sochdb_open = this.lib.func('sochdb_open', DatabaseHandle, ['string']);
82
82
  this.sochdb_open_with_config = this.lib.func('sochdb_open_with_config', DatabaseHandle, ['string', DatabaseConfig]);
83
+ // Concurrent mode (v0.4.8+)
84
+ try {
85
+ this.sochdb_open_concurrent = this.lib.func('sochdb_open_concurrent', DatabaseHandle, ['string']);
86
+ this.sochdb_is_concurrent = this.lib.func('sochdb_is_concurrent', 'int', [DatabaseHandle]);
87
+ }
88
+ catch (error) {
89
+ // Older library versions don't have concurrent mode
90
+ this.sochdb_open_concurrent = null;
91
+ this.sochdb_is_concurrent = null;
92
+ }
83
93
  this.sochdb_close = this.lib.func('sochdb_close', 'void', [DatabaseHandle]);
84
94
  // Transactions
85
95
  this.sochdb_begin_txn = this.lib.func('sochdb_begin_txn', TxnHandle, [DatabaseHandle]);
@@ -110,4 +120,4 @@ class NativeBindings {
110
120
  }
111
121
  }
112
122
  exports.NativeBindings = NativeBindings;
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIs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YyxFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFckYsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVc7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0NBQ0o7QUF2RkQsd0NBdUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuaW1wb3J0IHsgZmluZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jbG9zZTogYW55O1xuXG4gICAgLy8gVHJhbnNhY3Rpb25hbCBPcGVyYXRpb25zIChtYXBwZWQgdG8gYmFzZSBmdW5jdGlvbnMpXG4gICAgcHVibGljIHNvY2hkYl9iZWdpbl90eG46IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2NvbW1pdDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfYWJvcnQ6IGFueTtcblxuICAgIC8vIEtWIE9wZXJhdGlvbnMgKEFsbCB0YWtlIERhdGFiYXNlSGFuZGxlIEFORCBUeG5IYW5kbGUpXG4gICAgLy8gcHV0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWwsIHZsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfcHV0OiBhbnk7XG4gICAgLy8gZ2V0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWxfb3V0KiwgbGVuX291dCopIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZ2V0OiBhbnk7XG4gICAgLy8gZGVsZXRlOiAoZGIsIHR4biwga2V5LCBrbGVuKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX2RlbGV0ZTogYW55O1xuXG4gICAgLy8gUGF0aCBPcGVyYXRpb25zXG4gICAgcHVibGljIHNvY2hkYl9wdXRfcGF0aDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfZ2V0X3BhdGg6IGFueTtcblxuICAgIC8vIFNjYW5uaW5nXG4gICAgcHVibGljIHNvY2hkYl9zY2FuX3ByZWZpeDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfbmV4dDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfY2xvc2U6IGFueTtcblxuICAgIC8vIFN0YXRzXG4gICAgcHVibGljIHNvY2hkYl9zdGF0czogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY2hlY2twb2ludDogYW55O1xuXG4gICAgLy8gTWVtb3J5XG4gICAgcHVibGljIHNvY2hkYl9mcmVlX2J5dGVzOiBhbnk7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gZmluZExpYnJhcnkoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubGliID0ga29mZmkubG9hZChsaWJQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU29jaERCIGxpYnJhcnkgZnJvbSAke2xpYlBhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBiaW5kaW5nc1xuXG4gICAgICAgIC8vIERCIE1hbmFnZW1lbnRcbiAgICAgICAgdGhpcy5zb2NoZGJfb3BlbiA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuJywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW5fd2l0aF9jb25maWcnLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnLCBEYXRhYmFzZUNvbmZpZ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIs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ZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2lzX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2Nsb3NlOiBhbnk7XG5cbiAgICAvLyBUcmFuc2FjdGlvbmFsIE9wZXJhdGlvbnMgKG1hcHBlZCB0byBiYXNlIGZ1bmN0aW9ucylcbiAgICBwdWJsaWMgc29jaGRiX2JlZ2luX3R4bjogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY29tbWl0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9hYm9ydDogYW55O1xuXG4gICAgLy8gS1YgT3BlcmF0aW9ucyAoQWxsIHRha2UgRGF0YWJhc2VIYW5kbGUgQU5EIFR4bkhhbmRsZSlcbiAgICAvLyBwdXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbCwgdmxlbikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9wdXQ6IGFueTtcbiAgICAvLyBnZXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbF9vdXQqLCBsZW5fb3V0KikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9nZXQ6IGFueTtcbiAgICAvLyBkZWxldGU6IChkYiwgdHhuLCBrZXksIGtsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZGVsZXRlOiBhbnk7XG5cbiAgICAvLyBQYXRoIE9wZXJhdGlvbnNcbiAgICBwdWJsaWMgc29jaGRiX3B1dF9wYXRoOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9nZXRfcGF0aDogYW55O1xuXG4gICAgLy8gU2Nhbm5pbmdcbiAgICBwdWJsaWMgc29jaGRiX3NjYW5fcHJlZml4OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9uZXh0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9jbG9zZTogYW55O1xuXG4gICAgLy8gU3RhdHNcbiAgICBwdWJsaWMgc29jaGRiX3N0YXRzOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jaGVja3BvaW50OiBhbnk7XG5cbiAgICAvLyBNZW1vcnlcbiAgICBwdWJsaWMgc29jaGRiX2ZyZWVfYnl0ZXM6IGFueTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGxpYlBhdGggPSBmaW5kTGlicmFyeSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5saWIgPSBrb2ZmaS5sb2FkKGxpYlBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTb2NoREIgbGlicmFyeSBmcm9tICR7bGliUGF0aH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGJpbmRpbmdzXG5cbiAgICAgICAgLy8gREIgTWFuYWdlbWVudFxuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW4nLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX29wZW5fd2l0aF9jb25maWcgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl93aXRoX2NvbmZpZycsIERhdGFiYXNlSGFuZGxlLCBbJ3N0cmluZycsIERhdGFiYXNlQ29uZmlnXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25jdXJyZW50IG1vZGUgKHYwLjQuOCspXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl9jb25jdXJyZW50JywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgdGhpcy5zb2NoZGJfaXNfY29uY3VycmVudCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9pc19jb25jdXJyZW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gT2xkZXIgbGlicmFyeSB2ZXJzaW9ucyBkb24ndCBoYXZlIGNvbmN1cnJlbnQgbW9kZVxuICAgICAgICAgICAgdGhpcy5zb2NoZGJfb3Blbl9jb25jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc29jaGRiX2lzX2NvbmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
@@ -28,13 +28,17 @@ class EmbeddedDatabase {
28
28
  bindings;
29
29
  closed = false;
30
30
  path;
31
- constructor(path, handle) {
31
+ concurrent = false;
32
+ constructor(path, handle, concurrent = false) {
32
33
  this.path = path;
33
34
  this.handle = handle;
35
+ this.concurrent = concurrent;
34
36
  this.bindings = bindings_1.NativeBindings.getInstance();
35
37
  }
36
38
  /**
37
- * Open a database at the specified path
39
+ * Open a database at the specified path in standard mode
40
+ *
41
+ * For web applications with multiple processes, use `openConcurrent()` instead.
38
42
  *
39
43
  * @param path - Path to database directory
40
44
  * @param config - Optional configuration
@@ -63,7 +67,70 @@ class EmbeddedDatabase {
63
67
  if (!handle) {
64
68
  throw new errors_1.DatabaseError(`Failed to open database at ${path}`);
65
69
  }
66
- return new EmbeddedDatabase(path, handle);
70
+ return new EmbeddedDatabase(path, handle, false);
71
+ }
72
+ /**
73
+ * Open a database in concurrent mode for multi-process web applications
74
+ *
75
+ * This mode allows multiple Node.js processes (e.g., PM2 cluster workers,
76
+ * multiple Express instances) to access the database simultaneously.
77
+ *
78
+ * Features:
79
+ * - Lock-free reads with ~100ns latency
80
+ * - Multi-reader, single-writer coordination
81
+ * - Automatic write serialization
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * import { EmbeddedDatabase } from '@sochdb/sochdb';
86
+ * import express from 'express';
87
+ *
88
+ * // Open in concurrent mode - multiple workers can access
89
+ * const db = EmbeddedDatabase.openConcurrent('./web_db');
90
+ *
91
+ * const app = express();
92
+ *
93
+ * app.get('/user/:id', async (req, res) => {
94
+ * // Multiple concurrent requests can read simultaneously
95
+ * const data = await db.get(Buffer.from(`user:${req.params.id}`));
96
+ * if (!data) {
97
+ * res.status(404).json({ error: 'not found' });
98
+ * return;
99
+ * }
100
+ * res.send(data);
101
+ * });
102
+ *
103
+ * app.post('/user/:id', async (req, res) => {
104
+ * // Writes are serialized automatically
105
+ * await db.put(Buffer.from(`user:${req.params.id}`), req.body);
106
+ * res.json({ status: 'ok' });
107
+ * });
108
+ *
109
+ * // Start with PM2 cluster mode:
110
+ * // pm2 start app.js -i max
111
+ * app.listen(3000);
112
+ * ```
113
+ *
114
+ * @param path - Path to database directory
115
+ * @returns EmbeddedDatabase instance in concurrent mode
116
+ */
117
+ static openConcurrent(path) {
118
+ const bindings = bindings_1.NativeBindings.getInstance();
119
+ if (!bindings.sochdb_open_concurrent) {
120
+ throw new errors_1.DatabaseError('Concurrent mode not supported. Please upgrade the SochDB native library to v0.4.4+');
121
+ }
122
+ const handle = bindings.sochdb_open_concurrent(path);
123
+ if (!handle) {
124
+ throw new errors_1.DatabaseError(`Failed to open database in concurrent mode at ${path}`);
125
+ }
126
+ const isConcurrent = bindings.sochdb_is_concurrent(handle) === 1;
127
+ return new EmbeddedDatabase(path, handle, isConcurrent);
128
+ }
129
+ /**
130
+ * Check if database is opened in concurrent mode
131
+ */
132
+ get isConcurrent() {
133
+ return this.concurrent;
67
134
  }
68
135
  /**
69
136
  * Put a key-value pair (auto-transaction)
@@ -236,4 +303,4 @@ class EmbeddedDatabase {
236
303
  }
237
304
  }
238
305
  exports.EmbeddedDatabase = EmbeddedDatabase;
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFFckIsWUFBb0IsSUFBWSxFQUFFLE1BQVc7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sT0FBTyxHQUFHO2dCQUNaLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUs7Z0JBQ3ZDLGVBQWUsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVM7Z0JBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUztnQkFD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Q0FBQztZQUNwRCxZQUFZLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM3QyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7U0FDdkQsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHNCQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBOU9ELDRDQThPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgLSBGRkkgTW9kZVxuICogXG4gKiBEaXJlY3QgRkZJIGFjY2VzcyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBzaW1pbGFyIHRvIFB5dGhvbiBTREsncyBEYXRhYmFzZSBjbGFzcy5cbiAqL1xuXG5pbXBvcnQgeyBEYXRhYmFzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IE5hdGl2ZUJpbmRpbmdzIH0gZnJvbSAnLi9mZmkvYmluZGluZ3MnO1xuaW1wb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGVkRGF0YWJhc2VDb25maWcge1xuICAgIHdhbEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgICBncm91cENvbW1pdD86IGJvb2xlYW47XG4gICAgaW5kZXhQb2xpY3k/OiAnd3JpdGVfb3B0aW1pemVkJyB8ICdiYWxhbmNlZCcgfCAnc2Nhbl9vcHRpbWl6ZWQnIHwgJ2FwcGVuZF9vbmx5Jztcbn1cblxuLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSB1c2luZyBkaXJlY3QgRkZJXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IGF3YWl0IEVtYmVkZGVkRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGRiLmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgcHJpdmF0ZSBoYW5kbGU6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBOYXRpdmVCaW5kaW5ncztcbiAgICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcsIGhhbmRsZTogYW55KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBvcGVuKHBhdGg6IHN0cmluZywgY29uZmlnPzogRW1iZWRkZWREYXRhYmFzZUNvbmZpZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGxldCBoYW5kbGU7XG5cbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgY29uc3QgY0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICB3YWxfZW5hYmxlZDogY29uZmlnLndhbEVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWRfc2V0OiBjb25maWcud2FsRW5hYmxlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZTogY29uZmlnLnN5bmNNb2RlID09PSAnZnVsbCcgPyAyIDogKGNvbmZpZy5zeW5jTW9kZSA9PT0gJ25vcm1hbCcgPyAxIDogMCksXG4gICAgICAgICAgICAgICAgc3luY19tb2RlX3NldDogY29uZmlnLnN5bmNNb2RlICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWVtdGFibGVfc2l6ZV9ieXRlczogQmlnSW50KGNvbmZpZy5tZW10YWJsZVNpemVCeXRlcyA/PyAwKSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXQ6IGNvbmZpZy5ncm91cENvbW1pdCA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBncm91cF9jb21taXRfc2V0OiBjb25maWcuZ3JvdXBDb21taXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeTogMSwgLy8gRGVmYXVsdCB0byBCYWxhbmNlZFxuICAgICAgICAgICAgICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5X3NldDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl93aXRoX2NvbmZpZyhwYXRoLCBjQ29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpciAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldChrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXRQYXRoKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXRQYXRoKHBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjYW4ga2V5cyB3aXRoIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jICpzY2FuUHJlZml4KHByZWZpeDogQnVmZmVyKTogQXN5bmNHZW5lcmF0b3I8W0J1ZmZlciwgQnVmZmVyXT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHR4bi5zY2FuUHJlZml4KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbiBhIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKTogRW1iZWRkZWRUcmFuc2FjdGlvbiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4bkhhbmRsZSA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2JlZ2luX3R4bih0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWRUcmFuc2FjdGlvbih0aGlzLCB0aGlzLmhhbmRsZSwgdHhuSGFuZGxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgdHJhbnNhY3Rpb24gKHdpdGggYXV0by1jb21taXQvYWJvcnQpXG4gICAgICovXG4gICAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KGZuOiAodHhuOiBFbWJlZGRlZFRyYW5zYWN0aW9uKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHR4bik7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGEgY2hlY2twb2ludFxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGxzbiA9IHRoaXMuYmluZGluZ3Muc29jaGRiX2NoZWNrcG9pbnQodGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGxzbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljc1xuICAgICAqL1xuICAgIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgICAgICBtZW10YWJsZVNpemVCeXRlczogYmlnaW50O1xuICAgICAgICB3YWxTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBiaWdpbnQ7XG4gICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBiaWdpbnQ7XG4gICAgfT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICAvLyBSZXR1cm5zIHN0cnVjdCBieSB2YWx1ZSAoYXV0b21hdGljYWxseSBkZWNvZGVkKVxuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuYmluZGluZ3Muc29jaGRiX3N0YXRzKHRoaXMuaGFuZGxlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBtZW10YWJsZVNpemVCeXRlczogQmlnSW50KHN0YXRzLm1lbXRhYmxlX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgd2FsU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMud2FsX3NpemVfYnl0ZXMpLFxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBzdGF0cy5hY3RpdmVfdHJhbnNhY3Rpb25zLFxuICAgICAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IEJpZ0ludChzdGF0cy5taW5fYWN0aXZlX3NuYXBzaG90KSxcbiAgICAgICAgICAgIGxhc3RDaGVja3BvaW50THNuOiBCaWdJbnQoc3RhdHMubGFzdF9jaGVja3BvaW50X2xzbiksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgZGF0YWJhc2VcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2xvc2UodGhpcy5oYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBpcyBjbG9zZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnRlcm5hbCBoYW5kbGUgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0SGFuZGxlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmluZGluZ3MgaW5zdGFuY2UgKGZvciB0cmFuc2FjdGlvbnMpXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QmluZGluZ3MoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9XG59XG4iXX0=
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFDYixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCLFlBQW9CLElBQVksRUFBRSxNQUFXLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDN0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBWSxFQUFFLE1BQStCO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxPQUFPLEdBQUc7Z0JBQ1osV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSztnQkFDdkMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztnQkFDaEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FB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QUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQXRURCw0Q0FzVEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBoYW5kbGU6IGFueSwgY29uY3VycmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2UgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW5Db25jdXJyZW50KHBhdGg6IHN0cmluZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWJpbmRpbmdzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdDb25jdXJyZW50IG1vZGUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSB0byB2MC40LjQrJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl9jb25jdXJyZW50KHBhdGgpO1xuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGluIGNvbmN1cnJlbnQgbW9kZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbmN1cnJlbnQgPSBiaW5kaW5ncy5zb2NoZGJfaXNfY29uY3VycmVudChoYW5kbGUpID09PSAxO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlLCBpc0NvbmN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBnZXQgaXNDb25jdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGJ5IGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0KGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dFBhdGgocGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldFBhdGgocGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbiBrZXlzIHdpdGggcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgKnNjYW5QcmVmaXgocHJlZml4OiBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgdHhuLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGEgdHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbigpOiBFbWJlZGRlZFRyYW5zYWN0aW9uIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuSGFuZGxlID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfYmVnaW5fdHhuKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuaGFuZGxlLCB0eG5IYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyB3aXRoaW4gYSB0cmFuc2FjdGlvbiAod2l0aCBhdXRvLWNvbW1pdC9hYm9ydClcbiAgICAgKi9cbiAgICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IEVtYmVkZGVkVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgYSBjaGVja3BvaW50XG4gICAgICovXG4gICAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbHNuID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2hlY2twb2ludCh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQobHNuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIHdhbFNpemVCeXRlczogYmlnaW50O1xuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IGJpZ2ludDtcbiAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IGJpZ2ludDtcbiAgICB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIC8vIFJldHVybnMgc3RydWN0IGJ5IHZhbHVlIChhdXRvbWF0aWNhbGx5IGRlY29kZWQpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfc3RhdHModGhpcy5oYW5kbGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMubWVtdGFibGVfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICB3YWxTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy53YWxfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IHN0YXRzLmFjdGl2ZV90cmFuc2FjdGlvbnMsXG4gICAgICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogQmlnSW50KHN0YXRzLm1pbl9hY3RpdmVfc25hcHNob3QpLFxuICAgICAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IEJpZ0ludChzdGF0cy5sYXN0X2NoZWNrcG9pbnRfbHNuKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jbG9zZSh0aGlzLmhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGludGVybmFsIGhhbmRsZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRIYW5kbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiaW5kaW5ncyBpbnN0YW5jZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRCaW5kaW5ncygpOiBOYXRpdmVCaW5kaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH1cbn1cbiJdfQ==
@@ -72,6 +72,8 @@ class NativeBindings {
72
72
  // FFIs
73
73
  sochdb_open;
74
74
  sochdb_open_with_config;
75
+ sochdb_open_concurrent;
76
+ sochdb_is_concurrent;
75
77
  sochdb_close;
76
78
  // Transactional Operations (mapped to base functions)
77
79
  sochdb_begin_txn;
@@ -109,6 +111,16 @@ class NativeBindings {
109
111
  // DB Management
110
112
  this.sochdb_open = this.lib.func('sochdb_open', DatabaseHandle, ['string']);
111
113
  this.sochdb_open_with_config = this.lib.func('sochdb_open_with_config', DatabaseHandle, ['string', DatabaseConfig]);
114
+ // Concurrent mode (v0.4.8+)
115
+ try {
116
+ this.sochdb_open_concurrent = this.lib.func('sochdb_open_concurrent', DatabaseHandle, ['string']);
117
+ this.sochdb_is_concurrent = this.lib.func('sochdb_is_concurrent', 'int', [DatabaseHandle]);
118
+ }
119
+ catch (error) {
120
+ // Older library versions don't have concurrent mode
121
+ this.sochdb_open_concurrent = null;
122
+ this.sochdb_is_concurrent = null;
123
+ }
112
124
  this.sochdb_close = this.lib.func('sochdb_close', 'void', [DatabaseHandle]);
113
125
  // Transactions
114
126
  this.sochdb_begin_txn = this.lib.func('sochdb_begin_txn', TxnHandle, [DatabaseHandle]);
@@ -139,4 +151,4 @@ class NativeBindings {
139
151
  }
140
152
  }
141
153
  exports.NativeBindings = NativeBindings;
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIs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d0NBdUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuaW1wb3J0IHsgZmluZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jbG9zZTogYW55O1xuXG4gICAgLy8gVHJhbnNhY3Rpb25hbCBPcGVyYXRpb25zIChtYXBwZWQgdG8gYmFzZSBmdW5jdGlvbnMpXG4gICAgcHVibGljIHNvY2hkYl9iZWdpbl90eG46IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2NvbW1pdDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfYWJvcnQ6IGFueTtcblxuICAgIC8vIEtWIE9wZXJhdGlvbnMgKEFsbCB0YWtlIERhdGFiYXNlSGFuZGxlIEFORCBUeG5IYW5kbGUpXG4gICAgLy8gcHV0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWwsIHZsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfcHV0OiBhbnk7XG4gICAgLy8gZ2V0OiAoZGIsIHR4biwga2V5LCBrbGVuLCB2YWxfb3V0KiwgbGVuX291dCopIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZ2V0OiBhbnk7XG4gICAgLy8gZGVsZXRlOiAoZGIsIHR4biwga2V5LCBrbGVuKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX2RlbGV0ZTogYW55O1xuXG4gICAgLy8gUGF0aCBPcGVyYXRpb25zXG4gICAgcHVibGljIHNvY2hkYl9wdXRfcGF0aDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfZ2V0X3BhdGg6IGFueTtcblxuICAgIC8vIFNjYW5uaW5nXG4gICAgcHVibGljIHNvY2hkYl9zY2FuX3ByZWZpeDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfbmV4dDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXRlcmF0b3JfY2xvc2U6IGFueTtcblxuICAgIC8vIFN0YXRzXG4gICAgcHVibGljIHNvY2hkYl9zdGF0czogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY2hlY2twb2ludDogYW55O1xuXG4gICAgLy8gTWVtb3J5XG4gICAgcHVibGljIHNvY2hkYl9mcmVlX2J5dGVzOiBhbnk7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gZmluZExpYnJhcnkoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMubGliID0ga29mZmkubG9hZChsaWJQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU29jaERCIGxpYnJhcnkgZnJvbSAke2xpYlBhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBiaW5kaW5nc1xuXG4gICAgICAgIC8vIERCIE1hbmFnZW1lbnRcbiAgICAgICAgdGhpcy5zb2NoZGJfb3BlbiA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuJywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX3dpdGhfY29uZmlnID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW5fd2l0aF9jb25maWcnLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnLCBEYXRhYmFzZUNvbmZpZ10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIs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SUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFckYsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVc7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0NBQ0o7QUFwR0Qsd0NBb0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuaW1wb3J0IHsgZmluZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2lzX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2Nsb3NlOiBhbnk7XG5cbiAgICAvLyBUcmFuc2FjdGlvbmFsIE9wZXJhdGlvbnMgKG1hcHBlZCB0byBiYXNlIGZ1bmN0aW9ucylcbiAgICBwdWJsaWMgc29jaGRiX2JlZ2luX3R4bjogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY29tbWl0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9hYm9ydDogYW55O1xuXG4gICAgLy8gS1YgT3BlcmF0aW9ucyAoQWxsIHRha2UgRGF0YWJhc2VIYW5kbGUgQU5EIFR4bkhhbmRsZSlcbiAgICAvLyBwdXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbCwgdmxlbikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9wdXQ6IGFueTtcbiAgICAvLyBnZXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbF9vdXQqLCBsZW5fb3V0KikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9nZXQ6IGFueTtcbiAgICAvLyBkZWxldGU6IChkYiwgdHhuLCBrZXksIGtsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZGVsZXRlOiBhbnk7XG5cbiAgICAvLyBQYXRoIE9wZXJhdGlvbnNcbiAgICBwdWJsaWMgc29jaGRiX3B1dF9wYXRoOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9nZXRfcGF0aDogYW55O1xuXG4gICAgLy8gU2Nhbm5pbmdcbiAgICBwdWJsaWMgc29jaGRiX3NjYW5fcHJlZml4OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9uZXh0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9jbG9zZTogYW55O1xuXG4gICAgLy8gU3RhdHNcbiAgICBwdWJsaWMgc29jaGRiX3N0YXRzOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jaGVja3BvaW50OiBhbnk7XG5cbiAgICAvLyBNZW1vcnlcbiAgICBwdWJsaWMgc29jaGRiX2ZyZWVfYnl0ZXM6IGFueTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGxpYlBhdGggPSBmaW5kTGlicmFyeSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5saWIgPSBrb2ZmaS5sb2FkKGxpYlBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTb2NoREIgbGlicmFyeSBmcm9tICR7bGliUGF0aH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGJpbmRpbmdzXG5cbiAgICAgICAgLy8gREIgTWFuYWdlbWVudFxuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW4nLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX29wZW5fd2l0aF9jb25maWcgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl93aXRoX2NvbmZpZycsIERhdGFiYXNlSGFuZGxlLCBbJ3N0cmluZycsIERhdGFiYXNlQ29uZmlnXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25jdXJyZW50IG1vZGUgKHYwLjQuOCspXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl9jb25jdXJyZW50JywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgdGhpcy5zb2NoZGJfaXNfY29uY3VycmVudCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9pc19jb25jdXJyZW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gT2xkZXIgbGlicmFyeSB2ZXJzaW9ucyBkb24ndCBoYXZlIGNvbmN1cnJlbnQgbW9kZVxuICAgICAgICAgICAgdGhpcy5zb2NoZGJfb3Blbl9jb25jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc29jaGRiX2lzX2NvbmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
@@ -31,15 +31,68 @@ export declare class EmbeddedDatabase {
31
31
  private bindings;
32
32
  private closed;
33
33
  private path;
34
+ private concurrent;
34
35
  private constructor();
35
36
  /**
36
- * Open a database at the specified path
37
+ * Open a database at the specified path in standard mode
38
+ *
39
+ * For web applications with multiple processes, use `openConcurrent()` instead.
37
40
  *
38
41
  * @param path - Path to database directory
39
42
  * @param config - Optional configuration
40
43
  * @returns EmbeddedDatabase instance
41
44
  */
42
45
  static open(path: string, config?: EmbeddedDatabaseConfig): EmbeddedDatabase;
46
+ /**
47
+ * Open a database in concurrent mode for multi-process web applications
48
+ *
49
+ * This mode allows multiple Node.js processes (e.g., PM2 cluster workers,
50
+ * multiple Express instances) to access the database simultaneously.
51
+ *
52
+ * Features:
53
+ * - Lock-free reads with ~100ns latency
54
+ * - Multi-reader, single-writer coordination
55
+ * - Automatic write serialization
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * import { EmbeddedDatabase } from '@sochdb/sochdb';
60
+ * import express from 'express';
61
+ *
62
+ * // Open in concurrent mode - multiple workers can access
63
+ * const db = EmbeddedDatabase.openConcurrent('./web_db');
64
+ *
65
+ * const app = express();
66
+ *
67
+ * app.get('/user/:id', async (req, res) => {
68
+ * // Multiple concurrent requests can read simultaneously
69
+ * const data = await db.get(Buffer.from(`user:${req.params.id}`));
70
+ * if (!data) {
71
+ * res.status(404).json({ error: 'not found' });
72
+ * return;
73
+ * }
74
+ * res.send(data);
75
+ * });
76
+ *
77
+ * app.post('/user/:id', async (req, res) => {
78
+ * // Writes are serialized automatically
79
+ * await db.put(Buffer.from(`user:${req.params.id}`), req.body);
80
+ * res.json({ status: 'ok' });
81
+ * });
82
+ *
83
+ * // Start with PM2 cluster mode:
84
+ * // pm2 start app.js -i max
85
+ * app.listen(3000);
86
+ * ```
87
+ *
88
+ * @param path - Path to database directory
89
+ * @returns EmbeddedDatabase instance in concurrent mode
90
+ */
91
+ static openConcurrent(path: string): EmbeddedDatabase;
92
+ /**
93
+ * Check if database is opened in concurrent mode
94
+ */
95
+ get isConcurrent(): boolean;
43
96
  /**
44
97
  * Put a key-value pair (auto-transaction)
45
98
  */
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/embedded/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,sBAAsB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;CACnF;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO;IAMP;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,gBAAgB;IA4B5E;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc9C;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcnD;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAenE;;OAEG;IACH,WAAW,IAAI,mBAAmB;IAOlC;;OAEG;IACG,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYlF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC7B,CAAC;IAiBF;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,SAAS,IAAI,GAAG;IAIhB;;;OAGG;IACH,WAAW,IAAI,cAAc;CAGhC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/embedded/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,sBAAsB;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,gBAAgB,GAAG,aAAa,CAAC;CACnF;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAOP;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,gBAAgB;IA4B5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAgBrD;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc9C;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcnD;;OAEG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAenE;;OAEG;IACH,WAAW,IAAI,mBAAmB;IAOlC;;OAEG;IACG,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYlF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAMnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC7B,CAAC;IAiBF;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,SAAS,IAAI,GAAG;IAIhB;;;OAGG;IACH,WAAW,IAAI,cAAc;CAGhC"}
@@ -3,6 +3,8 @@ export declare class NativeBindings {
3
3
  private lib;
4
4
  sochdb_open: any;
5
5
  sochdb_open_with_config: any;
6
+ sochdb_open_concurrent: any;
7
+ sochdb_is_concurrent: any;
6
8
  sochdb_close: any;
7
9
  sochdb_begin_txn: any;
8
10
  sochdb_commit: any;
@@ -1 +1 @@
1
- {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/bindings.ts"],"names":[],"mappings":"AAsCA,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAM;IAGV,WAAW,EAAE,GAAG,CAAC;IACjB,uBAAuB,EAAE,GAAG,CAAC;IAC7B,YAAY,EAAE,GAAG,CAAC;IAGlB,gBAAgB,EAAE,GAAG,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAIlB,UAAU,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,GAAG,CAAC;IAEhB,aAAa,EAAE,GAAG,CAAC;IAGnB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC;IAGrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,qBAAqB,EAAE,GAAG,CAAC;IAG3B,YAAY,EAAE,GAAG,CAAC;IAClB,iBAAiB,EAAE,GAAG,CAAC;IAGvB,iBAAiB,EAAE,GAAG,CAAC;IAE9B,OAAO;WA2CO,WAAW,IAAI,cAAc;CAM9C"}
1
+ {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/bindings.ts"],"names":[],"mappings":"AAsCA,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAM;IAGV,WAAW,EAAE,GAAG,CAAC;IACjB,uBAAuB,EAAE,GAAG,CAAC;IAC7B,sBAAsB,EAAE,GAAG,CAAC;IAC5B,oBAAoB,EAAE,GAAG,CAAC;IAC1B,YAAY,EAAE,GAAG,CAAC;IAGlB,gBAAgB,EAAE,GAAG,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAIlB,UAAU,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,GAAG,CAAC;IAEhB,aAAa,EAAE,GAAG,CAAC;IAGnB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC;IAGrB,kBAAkB,EAAE,GAAG,CAAC;IACxB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,qBAAqB,EAAE,GAAG,CAAC;IAG3B,YAAY,EAAE,GAAG,CAAC;IAClB,iBAAiB,EAAE,GAAG,CAAC;IAGvB,iBAAiB,EAAE,GAAG,CAAC;IAE9B,OAAO;WAsDO,WAAW,IAAI,cAAc;CAM9C"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sochdb/sochdb",
3
- "version": "0.4.2",
4
- "description": "SochDB is an AI-native database with token-optimized output, O(|path|) lookups, built-in vector search, and durable transactions.",
3
+ "version": "0.4.3",
4
+ "description": "SochDB Node.js SDK - AI-native embedded database with concurrent multi-process support",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
7
7
  "types": "dist/types/index.d.ts",