db-wrapper 0.0.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +24 -24
  3. package/esm2020/db-wrapper.mjs +5 -0
  4. package/esm2020/lib/db-wrapper.models.mjs +45 -0
  5. package/esm2020/lib/db-wrapper.module.mjs +22 -0
  6. package/esm2020/lib/db-wrapper.service.mjs +405 -0
  7. package/esm2020/lib/window.service.mjs +17 -0
  8. package/esm2020/public-api.mjs +7 -0
  9. package/fesm2015/db-wrapper.mjs +498 -0
  10. package/fesm2015/db-wrapper.mjs.map +1 -0
  11. package/fesm2020/db-wrapper.mjs +495 -0
  12. package/fesm2020/db-wrapper.mjs.map +1 -0
  13. package/{db-wrapper.d.ts → index.d.ts} +5 -4
  14. package/lib/db-wrapper.models.d.ts +119 -119
  15. package/lib/db-wrapper.module.d.ts +9 -5
  16. package/lib/db-wrapper.service.d.ts +39 -37
  17. package/lib/window.service.d.ts +6 -3
  18. package/package.json +26 -16
  19. package/public-api.d.ts +3 -3
  20. package/bundles/db-wrapper.umd.js +0 -1063
  21. package/bundles/db-wrapper.umd.js.map +0 -1
  22. package/bundles/db-wrapper.umd.min.js +0 -2
  23. package/bundles/db-wrapper.umd.min.js.map +0 -1
  24. package/db-wrapper.metadata.json +0 -1
  25. package/esm2015/db-wrapper.js +0 -9
  26. package/esm2015/lib/db-wrapper.models.js +0 -206
  27. package/esm2015/lib/db-wrapper.module.js +0 -27
  28. package/esm2015/lib/db-wrapper.service.js +0 -779
  29. package/esm2015/lib/window.service.js +0 -24
  30. package/esm2015/public-api.js +0 -11
  31. package/esm5/db-wrapper.js +0 -9
  32. package/esm5/lib/db-wrapper.models.js +0 -206
  33. package/esm5/lib/db-wrapper.module.js +0 -36
  34. package/esm5/lib/db-wrapper.service.js +0 -895
  35. package/esm5/lib/window.service.js +0 -32
  36. package/esm5/public-api.js +0 -11
  37. package/fesm2015/db-wrapper.js +0 -863
  38. package/fesm2015/db-wrapper.js.map +0 -1
  39. package/fesm5/db-wrapper.js +0 -993
  40. package/fesm5/db-wrapper.js.map +0 -1
@@ -1,895 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { InjectionToken } from '@angular/core';
7
- import { WindowService } from './window.service';
8
- var DbWrapperService = /** @class */ (function () {
9
- function DbWrapperService(dbConfig, dbSchema) {
10
- var _this = this;
11
- this._dbName = dbConfig.dbName;
12
- this._location = dbConfig.location || 'default';
13
- this._iosDatabaseLocation = dbConfig.iosDatabaseLocation || 'Library';
14
- /** @type {?} */
15
- var window = (new WindowService()).nativeWindow;
16
- if (dbSchema) {
17
- this.schema = dbSchema;
18
- }
19
- this._readyPromise = new Promise((/**
20
- * @param {?} resolve
21
- * @param {?} reject
22
- * @return {?}
23
- */
24
- function (resolve, reject) {
25
- if (typeof window.cordova === 'undefined') {
26
- setTimeout((/**
27
- * @return {?}
28
- */
29
- function () {
30
- _this.init(dbSchema).then((/**
31
- * @return {?}
32
- */
33
- function () {
34
- resolve();
35
- }))
36
- .catch((/**
37
- * @param {?} err
38
- * @return {?}
39
- */
40
- function (err) {
41
- reject(err);
42
- }));
43
- }), 500);
44
- }
45
- else {
46
- document.addEventListener('deviceready', (/**
47
- * @return {?}
48
- */
49
- function () {
50
- console.log('dbWrapper: device ready.');
51
- _this.initDevice(dbSchema).then((/**
52
- * @return {?}
53
- */
54
- function () { return resolve(); })).catch((/**
55
- * @param {?} err
56
- * @return {?}
57
- */
58
- function (err) { return reject(err); }));
59
- }));
60
- }
61
- }));
62
- }
63
- /**
64
- * @return {?}
65
- */
66
- DbWrapperService.prototype.ready = /**
67
- * @return {?}
68
- */
69
- function () {
70
- return this._readyPromise;
71
- };
72
- /**
73
- * @param {?} dbSchema
74
- * @return {?}
75
- */
76
- DbWrapperService.prototype.initDevice = /**
77
- * @param {?} dbSchema
78
- * @return {?}
79
- */
80
- function (dbSchema) {
81
- var _this = this;
82
- /** @type {?} */
83
- var window = (new WindowService()).nativeWindow;
84
- return new Promise((/**
85
- * @param {?} resolve
86
- * @param {?} reject
87
- * @return {?}
88
- */
89
- function (resolve, reject) {
90
- _this.db = window.sqlitePlugin.openDatabase({
91
- name: _this._dbName,
92
- location: _this._location,
93
- androidLockWorkaround: 1
94
- });
95
- if (dbSchema) {
96
- _this.generate(dbSchema).catch((/**
97
- * @param {?} err
98
- * @return {?}
99
- */
100
- function (err) {
101
- reject(err);
102
- })).then((/**
103
- * @return {?}
104
- */
105
- function () { resolve(); }));
106
- }
107
- else {
108
- resolve();
109
- }
110
- }));
111
- };
112
- /**
113
- * @param {?} dbSchema
114
- * @return {?}
115
- */
116
- DbWrapperService.prototype.init = /**
117
- * @param {?} dbSchema
118
- * @return {?}
119
- */
120
- function (dbSchema) {
121
- var _this = this;
122
- /** @type {?} */
123
- var window = (new WindowService()).nativeWindow;
124
- return new Promise((/**
125
- * @param {?} resolve
126
- * @param {?} reject
127
- * @return {?}
128
- */
129
- function (resolve, reject) {
130
- _this.db = window.openDatabase(_this._dbName, '1.0', 'database', -1);
131
- if (dbSchema) {
132
- _this.generate(dbSchema).catch((/**
133
- * @param {?} err
134
- * @return {?}
135
- */
136
- function (err) {
137
- reject(err);
138
- })).then((/**
139
- * @return {?}
140
- */
141
- function () {
142
- resolve();
143
- }));
144
- }
145
- else {
146
- resolve();
147
- }
148
- }));
149
- };
150
- /**
151
- * @param {?} schema
152
- * @return {?}
153
- */
154
- DbWrapperService.prototype.generate = /**
155
- * @param {?} schema
156
- * @return {?}
157
- */
158
- function (schema) {
159
- var _this = this;
160
- /** @type {?} */
161
- var sentences = [];
162
- this.schema = schema;
163
- if (schema.tables) {
164
- schema.tables.forEach((/**
165
- * @param {?} table
166
- * @return {?}
167
- */
168
- function (table) {
169
- sentences.push(_this.createTable(table));
170
- }));
171
- }
172
- if (schema.views) {
173
- schema.views.forEach((/**
174
- * @param {?} view
175
- * @return {?}
176
- */
177
- function (view) {
178
- sentences.push(_this.createView(view));
179
- }));
180
- }
181
- if (sentences.length === 0) {
182
- throw new Error('Esquema de la base de datos vacia.');
183
- }
184
- return Promise.all(sentences);
185
- };
186
- /**
187
- * @param {?} table
188
- * @return {?}
189
- */
190
- DbWrapperService.prototype.createTable = /**
191
- * @param {?} table
192
- * @return {?}
193
- */
194
- function (table) {
195
- return tslib_1.__awaiter(this, void 0, void 0, function () {
196
- var sql, onConflictPrimary, sentences, newColumns, tableDDL;
197
- var _this = this;
198
- return tslib_1.__generator(this, function (_a) {
199
- switch (_a.label) {
200
- case 0:
201
- sql = '';
202
- sentences = [];
203
- newColumns = [];
204
- return [4 /*yield*/, this.tableExists(table.name)];
205
- case 1:
206
- tableDDL = _a.sent();
207
- if (tableDDL) {
208
- table.columns.forEach((/**
209
- * @param {?} col
210
- * @return {?}
211
- */
212
- function (col) {
213
- if (!_this.columnExists((/** @type {?} */ (tableDDL)), col.name)) {
214
- newColumns.push(_this.addColumn(table.name, col));
215
- }
216
- }));
217
- }
218
- else {
219
- table.columns.forEach((/**
220
- * @param {?} col
221
- * @return {?}
222
- */
223
- function (col) {
224
- sentences.push(_this.defColumn(col));
225
- }));
226
- }
227
- onConflictPrimary = 'on conflict fail';
228
- if (Array.isArray(table.primary)) {
229
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary.join(',') + ') ' + onConflictPrimary);
230
- }
231
- if (typeof table.primary === 'string') {
232
- sentences.push(' CONSTRAINT identificador PRIMARY KEY (' + table.primary + ') ' + onConflictPrimary);
233
- }
234
- if (table.uniques) {
235
- table.uniques.forEach((/**
236
- * @param {?} uniq
237
- * @return {?}
238
- */
239
- function (uniq) {
240
- sentences.push(_this.defUnique(uniq));
241
- }));
242
- }
243
- if (table.foreigns) {
244
- table.foreigns.forEach((/**
245
- * @param {?} fore
246
- * @return {?}
247
- */
248
- function (fore) {
249
- sentences.push(_this.defForeign(fore));
250
- }));
251
- }
252
- if (tableDDL && newColumns.length !== 0) {
253
- return [2 /*return*/, Promise.all(newColumns)
254
- .then((/**
255
- * @return {?}
256
- */
257
- function () { console.log("Table " + table.name + " altered."); }))
258
- .catch((/**
259
- * @param {?} err
260
- * @return {?}
261
- */
262
- function (err) {
263
- console.error("Table " + table.name + ": " + err.message);
264
- throw new Error("Table " + table.name + ": " + err.message);
265
- }))];
266
- }
267
- else if (!tableDDL) {
268
- sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + sentences.join(',') + ')';
269
- return [2 /*return*/, this.query(sql)
270
- .then((/**
271
- * @return {?}
272
- */
273
- function () { console.log("Table " + table.name + " created."); }))
274
- .catch((/**
275
- * @param {?} err
276
- * @return {?}
277
- */
278
- function (err) {
279
- console.error("Table " + table.name + ": " + err.message);
280
- throw new Error("Table " + table.name + ": " + err.message);
281
- }))];
282
- }
283
- else {
284
- return [2 /*return*/, Promise.resolve().then((/**
285
- * @return {?}
286
- */
287
- function () { console.log("Table " + table.name + " initialized."); }))];
288
- }
289
- return [2 /*return*/];
290
- }
291
- });
292
- });
293
- };
294
- /**
295
- * @param {?} view
296
- * @return {?}
297
- */
298
- DbWrapperService.prototype.createView = /**
299
- * @param {?} view
300
- * @return {?}
301
- */
302
- function (view) {
303
- /** @type {?} */
304
- var sql;
305
- sql = 'CREATE VIEW IF NOT EXISTS ' + view.name
306
- + ' AS ' + view.sql;
307
- return this.query(sql);
308
- };
309
- /**
310
- * @param {?} tableName
311
- * @return {?}
312
- */
313
- DbWrapperService.prototype.getSchemaTable = /**
314
- * @param {?} tableName
315
- * @return {?}
316
- */
317
- function (tableName) {
318
- /** @type {?} */
319
- var res;
320
- this.schema.tables.forEach((/**
321
- * @param {?} table
322
- * @return {?}
323
- */
324
- function (table) {
325
- if (table.name === tableName) {
326
- res = table;
327
- }
328
- }));
329
- return res;
330
- };
331
- /**
332
- * @param {?} table
333
- * @return {?}
334
- */
335
- DbWrapperService.prototype.getUniquesTable = /**
336
- * @param {?} table
337
- * @return {?}
338
- */
339
- function (table) {
340
- /** @type {?} */
341
- var res;
342
- table.uniques.forEach((/**
343
- * @param {?} uniq
344
- * @return {?}
345
- */
346
- function (uniq) {
347
- res[uniq.name] = uniq;
348
- }));
349
- return res;
350
- };
351
- /**
352
- * @param {?} query
353
- * @param {?=} bindings
354
- * @return {?}
355
- */
356
- DbWrapperService.prototype.query = /**
357
- * @param {?} query
358
- * @param {?=} bindings
359
- * @return {?}
360
- */
361
- function (query, bindings) {
362
- var _this = this;
363
- if (bindings === void 0) { bindings = []; }
364
- return new Promise((/**
365
- * @param {?} resolve
366
- * @param {?} reject
367
- * @return {?}
368
- */
369
- function (resolve, reject) {
370
- if (query.indexOf('select') === 0) {
371
- _this.db.readTransaction((/**
372
- * @param {?} transaction
373
- * @return {?}
374
- */
375
- function (transaction) {
376
- transaction.executeSql(query, bindings, (/**
377
- * @param {?} transaction
378
- * @param {?} result
379
- * @return {?}
380
- */
381
- function (transaction, result) {
382
- resolve(result);
383
- }), (/**
384
- * @param {?} transaction
385
- * @param {?} error
386
- * @return {?}
387
- */
388
- function (transaction, error) {
389
- reject(error);
390
- }));
391
- }), (/**
392
- * @param {?} err
393
- * @return {?}
394
- */
395
- function (err) { return reject(err); }));
396
- }
397
- else {
398
- _this.db.transaction((/**
399
- * @param {?} transaction
400
- * @return {?}
401
- */
402
- function (transaction) {
403
- transaction.executeSql(query, bindings, (/**
404
- * @param {?} transaction
405
- * @param {?} result
406
- * @return {?}
407
- */
408
- function (transaction, result) {
409
- resolve(result);
410
- }), (/**
411
- * @param {?} transaction
412
- * @param {?} error
413
- * @return {?}
414
- */
415
- function (transaction, error) {
416
- reject(error);
417
- }));
418
- }), (/**
419
- * @param {?} err
420
- * @return {?}
421
- */
422
- function (err) { return reject(err); }));
423
- }
424
- }));
425
- };
426
- /**
427
- * @param {?} query
428
- * @param {?=} bindings
429
- * @return {?}
430
- */
431
- DbWrapperService.prototype.Count = /**
432
- * @param {?} query
433
- * @param {?=} bindings
434
- * @return {?}
435
- */
436
- function (query, bindings) {
437
- var _this = this;
438
- if (bindings === void 0) { bindings = []; }
439
- return this.query(query, bindings).then((/**
440
- * @param {?} rows
441
- * @return {?}
442
- */
443
- function (rows) {
444
- return _this.rowsCount(rows);
445
- }));
446
- };
447
- /**
448
- * @param {?} table
449
- * @param {?} bindings
450
- * @return {?}
451
- */
452
- DbWrapperService.prototype.insert = /**
453
- * @param {?} table
454
- * @param {?} bindings
455
- * @return {?}
456
- */
457
- function (table, bindings) {
458
- var _this = this;
459
- /** @type {?} */
460
- var sql = '';
461
- /** @type {?} */
462
- var sqlBinds = [];
463
- /** @type {?} */
464
- var sqlKeys = [];
465
- /** @type {?} */
466
- var sqlValues = [];
467
- sql = sql + 'insert into ' + table + ' ';
468
- for (var index in bindings) {
469
- if (bindings.hasOwnProperty(index)) {
470
- sqlKeys.push(index);
471
- sqlValues.push(bindings[index]);
472
- sqlBinds.push('?');
473
- }
474
- }
475
- sql = sql + '(' + sqlKeys.join(',') + ') values (' + sqlBinds.join(',') + ')';
476
- return new Promise((/**
477
- * @param {?} resolve
478
- * @param {?} reject
479
- * @return {?}
480
- */
481
- function (resolve, reject) {
482
- _this.db.transaction((/**
483
- * @param {?} transaction
484
- * @return {?}
485
- */
486
- function (transaction) {
487
- transaction.executeSql(sql, sqlValues, (/**
488
- * @param {?} transaction
489
- * @param {?} result
490
- * @return {?}
491
- */
492
- function (transaction, result) {
493
- resolve(result);
494
- }), (/**
495
- * @param {?} transaction
496
- * @param {?} error
497
- * @return {?}
498
- */
499
- function (transaction, error) {
500
- reject(error);
501
- }));
502
- }));
503
- }));
504
- };
505
- /**
506
- * @param {?} table
507
- * @param {?} bindings
508
- * @param {?} where
509
- * @return {?}
510
- */
511
- DbWrapperService.prototype.update = /**
512
- * @param {?} table
513
- * @param {?} bindings
514
- * @param {?} where
515
- * @return {?}
516
- */
517
- function (table, bindings, where) {
518
- var _this = this;
519
- /** @type {?} */
520
- var sql = '';
521
- /** @type {?} */
522
- var sqlBinds = [];
523
- /** @type {?} */
524
- var sqlKeys = [];
525
- /** @type {?} */
526
- var sqlValues = [];
527
- sql = sql + 'update ' + table + ' set ';
528
- for (var index in bindings) {
529
- if (bindings.hasOwnProperty(index)) {
530
- /** @type {?} */
531
- var newObj = bindings[index];
532
- if (typeof newObj === 'object' && newObj !== null) {
533
- sqlValues.push(newObj.value);
534
- if (newObj.ifnull) {
535
- sqlBinds.push(index + ' = ifnull( ' + index + ',0) + ?');
536
- }
537
- else if (newObj.operator) {
538
- sqlBinds.push(index + ' = ' + index + newObj.operator + ' ?');
539
- }
540
- else {
541
- sqlBinds.push(index + ' = ?');
542
- }
543
- }
544
- else {
545
- sqlBinds.push(index + ' = ?');
546
- sqlValues.push(bindings[index]);
547
- }
548
- }
549
- }
550
- for (var index in where) {
551
- if (where.hasOwnProperty(index)) {
552
- if (typeof where[index] === 'object' && where[index] !== null) {
553
- sqlKeys.push(index + ' ' + where[index].operator + ' ?');
554
- sqlValues.push(where[index].value);
555
- }
556
- else {
557
- sqlKeys.push(index + ' = ?');
558
- sqlValues.push(where[index]);
559
- }
560
- }
561
- }
562
- sql = sql + sqlBinds.join(',') + ' where ' + sqlKeys.join(' and ');
563
- return new Promise((/**
564
- * @param {?} resolve
565
- * @param {?} reject
566
- * @return {?}
567
- */
568
- function (resolve, reject) {
569
- _this.db.transaction((/**
570
- * @param {?} transaction
571
- * @return {?}
572
- */
573
- function (transaction) {
574
- transaction.executeSql(sql, sqlValues, (/**
575
- * @param {?} transaction
576
- * @param {?} result
577
- * @return {?}
578
- */
579
- function (transaction, result) {
580
- resolve(result);
581
- }), (/**
582
- * @param {?} transaction
583
- * @param {?} error
584
- * @return {?}
585
- */
586
- function (transaction, error) {
587
- reject(error);
588
- }));
589
- }));
590
- }));
591
- };
592
- /**
593
- * @param {?} tables
594
- * @return {?}
595
- */
596
- DbWrapperService.prototype.dropTable = /**
597
- * @param {?} tables
598
- * @return {?}
599
- */
600
- function (tables) {
601
- var _this = this;
602
- /** @type {?} */
603
- var cont = 1;
604
- cont = tables.length;
605
- return new Promise((/**
606
- * @param {?} resolve
607
- * @param {?} reject
608
- * @return {?}
609
- */
610
- function (resolve, reject) {
611
- tables.some((/**
612
- * @param {?} table
613
- * @return {?}
614
- */
615
- function (table) {
616
- if (cont !== 0) {
617
- _this.query('DROP TABLE ' + table)
618
- .then((/**
619
- * @return {?}
620
- */
621
- function () {
622
- if (cont === 1) {
623
- resolve();
624
- }
625
- else {
626
- cont--;
627
- }
628
- }), (/**
629
- * @param {?} err
630
- * @return {?}
631
- */
632
- function (err) {
633
- cont = 0;
634
- reject(err);
635
- return true;
636
- }));
637
- return false;
638
- }
639
- }));
640
- }));
641
- };
642
- /**
643
- * @param {?} result
644
- * @return {?}
645
- */
646
- DbWrapperService.prototype.fetchAll = /**
647
- * @param {?} result
648
- * @return {?}
649
- */
650
- function (result) {
651
- /** @type {?} */
652
- var output = [];
653
- for (var i = 0; i < result.rows.length; i++) {
654
- output.push(result.rows.item(i));
655
- }
656
- return output;
657
- };
658
- /**
659
- * @param {?} result
660
- * @return {?}
661
- */
662
- DbWrapperService.prototype.fetch = /**
663
- * @param {?} result
664
- * @return {?}
665
- */
666
- function (result) {
667
- /** @type {?} */
668
- var objeto = undefined;
669
- /** @type {?} */
670
- var newObj = undefined;
671
- if (result.rows.length !== 0) {
672
- objeto = result.rows.item(0);
673
- newObj = {};
674
- /** @type {?} */
675
- var keys = Object.keys(objeto);
676
- for (var key in keys) {
677
- newObj[keys[key]] = objeto[keys[key]];
678
- }
679
- }
680
- return newObj;
681
- };
682
- /**
683
- * @param {?} result
684
- * @return {?}
685
- */
686
- DbWrapperService.prototype.rowsCount = /**
687
- * @param {?} result
688
- * @return {?}
689
- */
690
- function (result) {
691
- return result.rows.length;
692
- };
693
- /* Private */
694
- /* Private */
695
- /**
696
- * @private
697
- * @param {?} col
698
- * @return {?}
699
- */
700
- DbWrapperService.prototype.defColumn = /* Private */
701
- /**
702
- * @private
703
- * @param {?} col
704
- * @return {?}
705
- */
706
- function (col) {
707
- /** @type {?} */
708
- var colSql;
709
- colSql = col.name + ' ' + col.type;
710
- if (!col.isNullable) {
711
- colSql += ' NOT NULL ';
712
- }
713
- if (col.default) {
714
- colSql += ' DEFAULT ' + col.default + ' ';
715
- }
716
- if (col.type === 'text' && col.length) {
717
- colSql += " CONSTRAINT " + col.name + "_length CHECK ( ";
718
- if (col.isNullable) {
719
- colSql += col.name + " is null OR ";
720
- }
721
- colSql += "length(" + col.name + ") <= " + col.length + " )";
722
- }
723
- return colSql;
724
- };
725
- /**
726
- * @private
727
- * @param {?} unique
728
- * @return {?}
729
- */
730
- DbWrapperService.prototype.defUnique = /**
731
- * @private
732
- * @param {?} unique
733
- * @return {?}
734
- */
735
- function (unique) {
736
- /** @type {?} */
737
- var uniqSql;
738
- // depende del entorno, producción o desarrollo
739
- /** @type {?} */
740
- var onConflictUnique = 'on conflict fail';
741
- if (Array.isArray(unique.fields)) {
742
- uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields.join(',') + " ) " + onConflictUnique + " ";
743
- }
744
- if (typeof unique.fields === 'string') {
745
- uniqSql = " CONSTRAINT " + unique.name + " UNIQUE ( " + unique.fields + " ) " + onConflictUnique + " ";
746
- }
747
- return uniqSql;
748
- };
749
- /**
750
- * @private
751
- * @param {?} fore
752
- * @return {?}
753
- */
754
- DbWrapperService.prototype.defForeign = /**
755
- * @private
756
- * @param {?} fore
757
- * @return {?}
758
- */
759
- function (fore) {
760
- /** @type {?} */
761
- var foreSql;
762
- if (Array.isArray(fore.foreignKey)) {
763
- foreSql = " FOREIGN KEY ( " + fore.foreignKey.join(',') + " ) ";
764
- }
765
- if (typeof fore.foreignKey === 'string') {
766
- foreSql = " FOREIGN KEY ( " + fore.foreignKey + " ) ";
767
- }
768
- if (Array.isArray(fore.primaryKey)) {
769
- foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey.join(',') + " ) ";
770
- }
771
- if (typeof fore.primaryKey === 'string') {
772
- foreSql = " REFERENCES " + fore.referenceTable + " ( " + fore.primaryKey + " ) ";
773
- }
774
- return foreSql;
775
- };
776
- /**
777
- * @private
778
- * @param {?} table
779
- * @return {?}
780
- */
781
- DbWrapperService.prototype.tableExists = /**
782
- * @private
783
- * @param {?} table
784
- * @return {?}
785
- */
786
- function (table) {
787
- var _this = this;
788
- return this.query('select sql from sqlite_master ' +
789
- 'where type=\'table\' and name=\'' + table + '\'')
790
- .then((/**
791
- * @param {?} result
792
- * @return {?}
793
- */
794
- function (result) {
795
- if (_this.rowsCount(result) === 1) {
796
- return (/** @type {?} */ (((/** @type {?} */ (_this.fetch(result)))).sql));
797
- }
798
- else {
799
- return false;
800
- }
801
- }));
802
- };
803
- /**
804
- * @private
805
- * @param {?} tableDDL
806
- * @param {?} column
807
- * @return {?}
808
- */
809
- DbWrapperService.prototype.columnExists = /**
810
- * @private
811
- * @param {?} tableDDL
812
- * @param {?} column
813
- * @return {?}
814
- */
815
- function (tableDDL, column) {
816
- if (tableDDL.indexOf(column) === -1) {
817
- return false;
818
- }
819
- else {
820
- return true;
821
- }
822
- };
823
- /**
824
- * @private
825
- * @param {?} table
826
- * @param {?} col
827
- * @return {?}
828
- */
829
- DbWrapperService.prototype.addColumn = /**
830
- * @private
831
- * @param {?} table
832
- * @param {?} col
833
- * @return {?}
834
- */
835
- function (table, col) {
836
- /** @type {?} */
837
- var colSql = this.defColumn(col);
838
- /** @type {?} */
839
- var query = 'alter TABLE ' + table + ' add COLUMN ' + colSql;
840
- return this.query(query);
841
- };
842
- return DbWrapperService;
843
- }());
844
- export { DbWrapperService };
845
- if (false) {
846
- /**
847
- * @type {?}
848
- * @private
849
- */
850
- DbWrapperService.prototype._dbName;
851
- /**
852
- * @type {?}
853
- * @private
854
- */
855
- DbWrapperService.prototype._location;
856
- /**
857
- * @type {?}
858
- * @private
859
- */
860
- DbWrapperService.prototype._iosDatabaseLocation;
861
- /**
862
- * @type {?}
863
- * @private
864
- */
865
- DbWrapperService.prototype._readyPromise;
866
- /** @type {?} */
867
- DbWrapperService.prototype.schema;
868
- /** @type {?} */
869
- DbWrapperService.prototype.db;
870
- }
871
- /** @type {?} */
872
- export var DB_CONFIG = new InjectionToken('dbWrapperConfig');
873
- /** @type {?} */
874
- export var DB_SCHEMA = new InjectionToken('dbWrapperSchema');
875
- /**
876
- * @return {?}
877
- */
878
- export function getDefaultDbConfig() {
879
- return {
880
- dbName: 'db.sqlite',
881
- location: 'default',
882
- iosDatabaseLocation: 'Library'
883
- };
884
- }
885
- /**
886
- * @param {?} dbConfig
887
- * @param {?=} dbSchema
888
- * @return {?}
889
- */
890
- export function provideDbWrapper(dbConfig, dbSchema) {
891
- /** @type {?} */
892
- var config = !!dbConfig ? dbConfig : getDefaultDbConfig();
893
- return new DbWrapperService(config, dbSchema);
894
- }
895
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItd3JhcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGItd3JhcHBlci8iLCJzb3VyY2VzIjpbImxpYi9kYi13cmFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlqRDtJQVFFLDBCQUFZLFFBQWtCLEVBQUUsUUFBbUI7UUFBbkQsaUJBeUJDO1FBdkJDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDOztZQUNoRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLENBQUMsWUFBWTtRQUNqRCxJQUFJLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLE9BQU87Ozs7O1FBQUcsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqRCxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0JBQ3pDLFVBQVU7OztnQkFBRTtvQkFDVixLQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUk7OztvQkFDdEI7d0JBQ0UsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQyxFQUFFO3lCQUNGLEtBQUs7Ozs7b0JBQUcsVUFBQyxHQUFHO3dCQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDLEVBQUUsQ0FBQztnQkFDUixDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtpQkFBTTtnQkFD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Ozs7OztJQUMxQixnREFBcUM7Ozs7O0lBQ3JDLHlDQUFxQzs7SUFDckMsa0NBQWlCOztJQUNqQiw4QkFBUTs7O0FBZ2FWLE1BQU0sS0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7O0FBQ3hFLE1BQU0sS0FBTyxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsaUJBQWlCLENBQUM7Ozs7QUFFeEUsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVc7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsbUJBQW1CLEVBQUUsU0FBUztLQUMvQixDQUFDO0FBQ0osQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBbUI7O1FBQ2hFLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO0lBQzNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgREJUYWJsZSwgRGJDb25maWcsIERCU2NoZW1hLCBEQlZpZXcsXHJcbiAgREJDb2x1bW4sIERCVW5pcXVlLCBEQkZvcmVpZ24sIFNxbFRyYW5zYWN0aW9uLCBTcWxSZXN1bHRTZXQsIFNxbEVycm9yLCBEZWZhdWx0VHlwZSB9IGZyb20gJy4vZGItd3JhcHBlci5tb2RlbHMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIERiV3JhcHBlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2RiTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2xvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfaW9zRGF0YWJhc2VMb2NhdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlYWR5UHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBzY2hlbWE6IERCU2NoZW1hO1xyXG4gIGRiOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRiQ29uZmlnOiBEYkNvbmZpZywgZGJTY2hlbWE/OiBEQlNjaGVtYSkge1xyXG5cclxuICAgIHRoaXMuX2RiTmFtZSA9IGRiQ29uZmlnLmRiTmFtZTtcclxuICAgIHRoaXMuX2xvY2F0aW9uID0gZGJDb25maWcubG9jYXRpb24gfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5faW9zRGF0YWJhc2VMb2NhdGlvbiA9IGRiQ29uZmlnLmlvc0RhdGFiYXNlTG9jYXRpb24gfHwgJ0xpYnJhcnknO1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIGlmIChkYlNjaGVtYSkgeyB0aGlzLnNjaGVtYSA9IGRiU2NoZW1hOyB9XHJcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSAoIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuY29yZG92YSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoZGJTY2hlbWEpLnRoZW4gKFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9IClcclxuICAgICAgICAgICAgLmNhdGNoICggKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdkYldyYXBwZXI6IGRldmljZSByZWFkeS4nKTtcclxuICAgICAgICAgIHRoaXMuaW5pdERldmljZShkYlNjaGVtYSkudGhlbiAoICgpID0+IHJlc29sdmUoKSApLmNhdGNoICggKGVycikgPT4gcmVqZWN0KGVycikgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVByb21pc2U7XHJcbiAgfVxyXG5cclxuICBpbml0RGV2aWNlKGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSggKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiID0gd2luZG93LnNxbGl0ZVBsdWdpbi5vcGVuRGF0YWJhc2Uoe1xyXG4gICAgICAgIG5hbWU6IHRoaXMuX2RiTmFtZSxcclxuICAgICAgICBsb2NhdGlvbjogdGhpcy5fbG9jYXRpb24sXHJcbiAgICAgICAgYW5kcm9pZExvY2tXb3JrYXJvdW5kOiAxXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0KGRiU2NoZW1hOiBEQlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2luZG93ID0gKG5ldyBXaW5kb3dTZXJ2aWNlKCkpLm5hdGl2ZVdpbmRvdztcclxuICAgIHJldHVybiAgbmV3IFByb21pc2UgKCAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIgPSB3aW5kb3cub3BlbkRhdGFiYXNlKHRoaXMuX2RiTmFtZSwgJzEuMCcsICdkYXRhYmFzZScsIC0xKTtcclxuICAgICAgaWYgKGRiU2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZShkYlNjaGVtYSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSkudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZShzY2hlbWE6IERCU2NoZW1hKTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBzZW50ZW5jZXMgPSBbXTtcclxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xyXG5cclxuICAgIGlmIChzY2hlbWEudGFibGVzKSB7XHJcbiAgICAgIHNjaGVtYS50YWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVUYWJsZSh0YWJsZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzY2hlbWEudmlld3MpIHtcclxuICAgICAgc2NoZW1hLnZpZXdzLmZvckVhY2goIHZpZXcgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuY3JlYXRlVmlldyh2aWV3KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlbnRlbmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFc3F1ZW1hIGRlIGxhIGJhc2UgZGUgZGF0b3MgdmFjaWEuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc2VudGVuY2VzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlOiBEQlRhYmxlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGxldCBzcWwgPSAnJywgIG9uQ29uZmxpY3RQcmltYXJ5O1xyXG4gICAgY29uc3Qgc2VudGVuY2VzID0gW10sICBuZXdDb2x1bW5zID0gW11cclxuXHJcbiAgICBjb25zdCB0YWJsZURETCA9IGF3YWl0IHRoaXMudGFibGVFeGlzdHModGFibGUubmFtZSk7XHJcbiAgICBpZiAodGFibGVEREwpIHtcclxuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uRXhpc3RzKHRhYmxlRERMIGFzIHN0cmluZywgY29sLm5hbWUpICkge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5zLnB1c2godGhpcy5hZGRDb2x1bW4odGFibGUubmFtZSwgY29sKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goIGNvbCA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZDb2x1bW4oY29sKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgb25Db25mbGljdFByaW1hcnkgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFibGUucHJpbWFyeSkgKSAge1xyXG4gICAgICBzZW50ZW5jZXMucHVzaCAoJyBDT05TVFJBSU5UIGlkZW50aWZpY2Fkb3IgUFJJTUFSWSBLRVkgKCcgKyB0YWJsZS5wcmltYXJ5LmpvaW4oJywnKSArICcpICcgKyBvbkNvbmZsaWN0UHJpbWFyeSApO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB0YWJsZS5wcmltYXJ5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHNlbnRlbmNlcy5wdXNoICgnIENPTlNUUkFJTlQgaWRlbnRpZmljYWRvciBQUklNQVJZIEtFWSAoJyArIHRhYmxlLnByaW1hcnkgKyAnKSAnICsgb25Db25mbGljdFByaW1hcnkgKTtcclxuICAgIH1cclxuICAgIGlmICh0YWJsZS51bmlxdWVzKSB7XHJcbiAgICAgIHRhYmxlLnVuaXF1ZXMuZm9yRWFjaCggdW5pcSA9PiB7XHJcbiAgICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5kZWZVbmlxdWUodW5pcSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFibGUuZm9yZWlnbnMpIHtcclxuICAgICAgdGFibGUuZm9yZWlnbnMuZm9yRWFjaCAoIGZvcmUgPT4ge1xyXG4gICAgICAgIHNlbnRlbmNlcy5wdXNoKHRoaXMuZGVmRm9yZWlnbihmb3JlKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0YWJsZURETCAmJiBuZXdDb2x1bW5zLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3Q29sdW1ucylcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gYWx0ZXJlZC5gKTsgfSApXHJcbiAgICAgIC5jYXRjaCggKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZS5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmICghdGFibGVEREwpIHtcclxuICAgICAgc3FsID0gJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICcgKyB0YWJsZS5uYW1lICsgJyAoJyArIHNlbnRlbmNlcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbClcclxuICAgICAgLnRoZW4oICgpID0+IHsgY29uc29sZS5sb2coYFRhYmxlICR7dGFibGUubmFtZX0gY3JlYXRlZC5gKTsgfSlcclxuICAgICAgLmNhdGNoKCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvciAoYFRhYmxlICR7dGFibGUubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlLm5hbWV9OiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCAoKSA9PiB7IGNvbnNvbGUubG9nKGBUYWJsZSAke3RhYmxlLm5hbWV9IGluaXRpYWxpemVkLmApOyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVWaWV3KHZpZXc6IERCVmlldyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgc3FsOiBzdHJpbmc7XHJcblxyXG4gICAgc3FsID0gJ0NSRUFURSBWSUVXIElGIE5PVCBFWElTVFMgJyArIHZpZXcubmFtZVxyXG4gICAgICArICcgQVMgJyArIHZpZXcuc3FsO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNxbCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0U2NoZW1hVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBEQlRhYmxlIHtcclxuICAgIGxldCByZXM6IERCVGFibGU7XHJcblxyXG4gICAgdGhpcy5zY2hlbWEudGFibGVzLmZvckVhY2goIHRhYmxlID0+IHtcclxuICAgICAgaWYgKHRhYmxlLm5hbWUgPT09IHRhYmxlTmFtZSkge1xyXG4gICAgICAgIHJlcyA9IHRhYmxlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0VW5pcXVlc1RhYmxlKHRhYmxlOiBEQlRhYmxlKTogb2JqZWN0IHtcclxuICAgIGxldCByZXM6IHt9O1xyXG4gICAgdGFibGUudW5pcXVlcy5mb3JFYWNoKHVuaXEgPT4ge1xyXG4gICAgICByZXNbdW5pcS5uYW1lXSA9IHVuaXE7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBxdWVyeShxdWVyeTogc3RyaW5nLCBiaW5kaW5nczogYW55W109IFtdKTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChxdWVyeS5pbmRleE9mKCdzZWxlY3QnKSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuZGIucmVhZFRyYW5zYWN0aW9uKCh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgdHJhbnNhY3Rpb24uZXhlY3V0ZVNxbChxdWVyeSwgYmluZGluZ3MsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0sICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIGVycm9yOiBTcWxFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgKGVycjogU3FsRXJyb3IpID0+IHJlamVjdChlcnIpICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYi50cmFuc2FjdGlvbigodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIGJpbmRpbmdzLCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCByZXN1bHQ6IFNxbFJlc3VsdFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIChlcnI6IFNxbEVycm9yKSA9PiByZWplY3QoZXJyKSApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIENvdW50KHF1ZXJ5OiBzdHJpbmcsIGJpbmRpbmdzOiBhbnlbXT0gW10pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnkocXVlcnksIGJpbmRpbmdzKS50aGVuKHJvd3MgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NDb3VudChyb3dzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0KHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSk6IFByb21pc2U8U3FsUmVzdWx0U2V0PiB7XHJcbiAgICBsZXQgc3FsID0gJycsIHNxbEJpbmRzID0gW10sIHNxbEtleXMgPSBbXSwgc3FsVmFsdWVzID0gW10gO1xyXG5cclxuICAgIHNxbCA9IHNxbCArICdpbnNlcnQgaW50byAnICsgdGFibGUgKyAnICc7XHJcblxyXG4gICAgZm9yIChjb25zdCBpbmRleCBpbiBiaW5kaW5ncykge1xyXG4gICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgICAgICBzcWxWYWx1ZXMucHVzaChiaW5kaW5nc1tpbmRleF0pO1xyXG4gICAgICAgICAgICBzcWxCaW5kcy5wdXNoKCc/Jyk7XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3FsID0gc3FsICsgJygnICsgc3FsS2V5cy5qb2luKCcsJykgKyAnKSB2YWx1ZXMgKCcgKyBzcWxCaW5kcy5qb2luKCcsJykgKyAnKSc7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRiLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uID0+IHtcclxuICAgICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgfSwgKHRyYW5zYWN0aW9uOiBTcWxUcmFuc2FjdGlvbiwgZXJyb3I6IFNxbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKHRhYmxlOiBzdHJpbmcsIGJpbmRpbmdzOiB7fSwgd2hlcmU6IHt9KTogUHJvbWlzZTxTcWxSZXN1bHRTZXQ+IHtcclxuICAgIGxldCBzcWwgPSAnJywgc3FsQmluZHMgPSBbXSwgc3FsS2V5cyA9W10sIHNxbFZhbHVlcyA9IFtdIDtcclxuXHJcbiAgICBzcWwgPSBzcWwgKyAndXBkYXRlICcgKyB0YWJsZSArICcgc2V0ICc7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggaW4gYmluZGluZ3MpIHtcclxuICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcclxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IGJpbmRpbmdzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdPYmogPT09ICdvYmplY3QnICYmIG5ld09iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2gobmV3T2JqLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdPYmouaWZudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3FsQmluZHMucHVzaChpbmRleCArICcgPSBpZm51bGwoICcgKyBpbmRleCArICcsMCkgKyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld09iai5vcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gJyArIGluZGV4ICsgbmV3T2JqLm9wZXJhdG9yICsgJyA/Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNxbEJpbmRzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2goYmluZGluZ3NbaW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCBpbiB3aGVyZSkge1xyXG4gICAgICAgaWYgKHdoZXJlLmhhc093blByb3BlcnR5KGluZGV4KSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdoZXJlW2luZGV4XSA9PT0gJ29iamVjdCcgICYmIHdoZXJlW2luZGV4XSAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnICcgKyB3aGVyZVtpbmRleF0ub3BlcmF0b3IgKyAnID8nKTtcclxuICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5wdXNoKHdoZXJlW2luZGV4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzcWxLZXlzLnB1c2goaW5kZXggKyAnID0gPycpO1xyXG4gICAgICAgICAgICAgICAgc3FsVmFsdWVzLnB1c2god2hlcmVbaW5kZXhdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNxbCA9IHNxbCArIHNxbEJpbmRzLmpvaW4oJywnKSArICcgd2hlcmUgJyArIHNxbEtleXMuam9pbignIGFuZCAnKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIudHJhbnNhY3Rpb24odHJhbnNhY3Rpb24gPT4ge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwoc3FsLCBzcWxWYWx1ZXMsICh0cmFuc2FjdGlvbjogU3FsVHJhbnNhY3Rpb24sIHJlc3VsdDogU3FsUmVzdWx0U2V0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9LCAodHJhbnNhY3Rpb246IFNxbFRyYW5zYWN0aW9uLCBlcnJvcjogU3FsRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BUYWJsZSAodGFibGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbnQgPSAxO1xyXG5cclxuICAgIGNvbnQgPSB0YWJsZXMubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGFibGVzLnNvbWUoIHRhYmxlID0+IHtcclxuICAgICAgICBpZiAoY29udCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5xdWVyeSgnRFJPUCBUQUJMRSAnICsgdGFibGUpXHJcbiAgICAgICAgICAudGhlbiggKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChjb250ID09PSAxICkgeyByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHsgY29udC0tOyB9XHJcbiAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb250ID0gMDtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmZXRjaEFsbChyZXN1bHQ6IFNxbFJlc3VsdFNldCk6IG9iamVjdFtdIHtcclxuICAgIGxldCBvdXRwdXQgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0LnJvd3MuaXRlbShpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIGZldGNoKHJlc3VsdDogU3FsUmVzdWx0U2V0KTogb2JqZWN0IHtcclxuICAgICAgbGV0IG9iamV0byA9IHVuZGVmaW5lZCwgbmV3T2JqPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgIG9iamV0byA9IHJlc3VsdC5yb3dzLml0ZW0oMCk7XHJcbiAgICAgICAgICBuZXdPYmogPSB7fTtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmpldG8pO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcclxuICAgICAgICAgICAgICBuZXdPYmpba2V5c1trZXldXSA9IG9iamV0b1trZXlzW2tleV1dO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdPYmo7XHJcbiAgfVxyXG5cclxuXHJcbiAgcm93c0NvdW50KHJlc3VsdDogU3FsUmVzdWx0U2V0KTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aDtcclxuICB9XHJcblxyXG4vKiBQcml2YXRlICovXHJcblxyXG4gIHByaXZhdGUgZGVmQ29sdW1uKGNvbDogREJDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbFNxbDogc3RyaW5nO1xyXG5cclxuICAgIGNvbFNxbCA9IGNvbC5uYW1lICsgJyAnICsgY29sLnR5cGU7XHJcbiAgICBpZiAoIWNvbC5pc051bGxhYmxlKSB7XHJcbiAgICAgIGNvbFNxbCArPSAgJyBOT1QgTlVMTCAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC5kZWZhdWx0KSB7XHJcbiAgICAgIGNvbFNxbCArPSAnIERFRkFVTFQgJyArIGNvbC5kZWZhdWx0ICsgJyAnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbC50eXBlID09PSAndGV4dCcgJiYgY29sLmxlbmd0aCkge1xyXG4gICAgICBjb2xTcWwgKz0gYCBDT05TVFJBSU5UICR7Y29sLm5hbWV9X2xlbmd0aCBDSEVDSyAoIGA7XHJcbiAgICAgIGlmIChjb2wuaXNOdWxsYWJsZSkge1xyXG4gICAgICAgIGNvbFNxbCArPSBgJHtjb2wubmFtZX0gaXMgbnVsbCBPUiBgO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbFNxbCArPSBgbGVuZ3RoKCR7Y29sLm5hbWV9KSA8PSAke2NvbC5sZW5ndGh9IClgO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sU3FsO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmVW5pcXVlKHVuaXF1ZTogREJVbmlxdWUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVuaXFTcWw6IHN0cmluZztcclxuXHJcbiAgICAvLyBkZXBlbmRlIGRlbCBlbnRvcm5vLCBwcm9kdWNjacOzbiBvIGRlc2Fycm9sbG9cclxuICAgIGNvbnN0IG9uQ29uZmxpY3RVbmlxdWUgPSAnb24gY29uZmxpY3QgZmFpbCc7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodW5pcXVlLmZpZWxkcykgKSAge1xyXG4gICAgICB1bmlxU3FsID0gYCBDT05TVFJBSU5UICR7dW5pcXVlLm5hbWV9IFVOSVFVRSAoICR7dW5pcXVlLmZpZWxkcy5qb2luKCcsJyl9ICkgJHtvbkNvbmZsaWN0VW5pcXVlfSBgO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB1bmlxdWUuZmllbGRzID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIHVuaXFTcWwgPSBgIENPTlNUUkFJTlQgJHt1bmlxdWUubmFtZX0gVU5JUVVFICggJHt1bmlxdWUuZmllbGRzfSApICR7b25Db25mbGljdFVuaXF1ZX0gYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5pcVNxbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmRm9yZWlnbihmb3JlOiBEQkZvcmVpZ24pOiBzdHJpbmcge1xyXG4gICAgbGV0IGZvcmVTcWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLmZvcmVpZ25LZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXkuam9pbignLCcpfSApIGA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmb3JlLmZvcmVpZ25LZXkgPT09ICdzdHJpbmcnKSAgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgRk9SRUlHTiBLRVkgKCAgJHtmb3JlLmZvcmVpZ25LZXl9ICkgYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JlLnByaW1hcnlLZXkpICkgIHtcclxuICAgICAgZm9yZVNxbCA9IGAgUkVGRVJFTkNFUyAke2ZvcmUucmVmZXJlbmNlVGFibGV9ICggICR7Zm9yZS5wcmltYXJ5S2V5LmpvaW4oJywnKX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZm9yZS5wcmltYXJ5S2V5ID09PSAnc3RyaW5nJykgICB7XHJcbiAgICAgIGZvcmVTcWwgPSBgIFJFRkVSRU5DRVMgJHtmb3JlLnJlZmVyZW5jZVRhYmxlfSAoICAke2ZvcmUucHJpbWFyeUtleX0gKSBgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JlU3FsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0YWJsZUV4aXN0cyh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgnc2VsZWN0ICBzcWwgZnJvbSBzcWxpdGVfbWFzdGVyICcgK1xyXG4gICAgICAgICd3aGVyZSB0eXBlPVxcJ3RhYmxlXFwnIGFuZCBuYW1lPVxcJycgKyB0YWJsZSArICdcXCcnKVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5yb3dzQ291bnQocmVzdWx0KSA9PT0gMSkgeyByZXR1cm4gKHRoaXMuZmV0Y2gocmVzdWx0KSBhcyBhbnkpLnNxbCBhcyBzdHJpbmc7IH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbHVtbkV4aXN0cyh0YWJsZURETDogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0YWJsZURETC5pbmRleE9mKGNvbHVtbikgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfSBlbHNlIHsgIHJldHVybiB0cnVlOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbHVtbih0YWJsZTogc3RyaW5nLCBjb2w6IERCQ29sdW1uKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbFNxbCA9IHRoaXMuZGVmQ29sdW1uKGNvbCk7XHJcbiAgICBjb25zdCBxdWVyeSA9ICdhbHRlciBUQUJMRSAnICsgdGFibGUgKyAnIGFkZCBDT0xVTU4gJyArIGNvbFNxbDtcclxuICAgIHJldHVybiB0aGlzLnF1ZXJ5KHF1ZXJ5KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBEQl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGJDb25maWc+KCdkYldyYXBwZXJDb25maWcnKTtcclxuZXhwb3J0IGNvbnN0IERCX1NDSEVNQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEQlNjaGVtYT4oJ2RiV3JhcHBlclNjaGVtYScpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHREYkNvbmZpZygpOiBEYkNvbmZpZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRiTmFtZTogJ2RiLnNxbGl0ZScsXHJcbiAgICBsb2NhdGlvbjogJ2RlZmF1bHQnLFxyXG4gICAgaW9zRGF0YWJhc2VMb2NhdGlvbjogJ0xpYnJhcnknXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYldyYXBwZXIoZGJDb25maWc6IERiQ29uZmlnLCBkYlNjaGVtYT86IERCU2NoZW1hKTogRGJXcmFwcGVyU2VydmljZSB7XHJcbiAgY29uc3QgY29uZmlnID0gISFkYkNvbmZpZyA/IGRiQ29uZmlnIDogZ2V0RGVmYXVsdERiQ29uZmlnKCk7XHJcbiAgcmV0dXJuIG5ldyBEYldyYXBwZXJTZXJ2aWNlKGNvbmZpZywgZGJTY2hlbWEpO1xyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==