@sockethub/client 5.0.0-alpha.4 → 5.0.0-alpha.5

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.
@@ -1,2606 +1,602 @@
1
- (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define([], factory);
6
- else {
7
- var a = factory();
8
- for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
9
- }
10
- })(self, () => {
11
- return /******/ (() => { // webpackBootstrap
12
- /******/ var __webpack_modules__ = ({
13
-
14
- /***/ 423:
15
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
16
-
17
- "use strict";
18
-
19
-
20
- var isValue = __webpack_require__(132)
21
- , isPlainFunction = __webpack_require__(421)
22
- , assign = __webpack_require__(240)
23
- , normalizeOpts = __webpack_require__(343)
24
- , contains = __webpack_require__(50);
25
-
26
- var d = (module.exports = function (dscr, value/*, options*/) {
27
- var c, e, w, options, desc;
28
- if (arguments.length < 2 || typeof dscr !== "string") {
29
- options = value;
30
- value = dscr;
31
- dscr = null;
32
- } else {
33
- options = arguments[2];
34
- }
35
- if (isValue(dscr)) {
36
- c = contains.call(dscr, "c");
37
- e = contains.call(dscr, "e");
38
- w = contains.call(dscr, "w");
39
- } else {
40
- c = w = true;
41
- e = false;
42
- }
43
-
44
- desc = { value: value, configurable: c, enumerable: e, writable: w };
45
- return !options ? desc : assign(normalizeOpts(options), desc);
46
- });
47
-
48
- d.gs = function (dscr, get, set/*, options*/) {
49
- var c, e, options, desc;
50
- if (typeof dscr !== "string") {
51
- options = set;
52
- set = get;
53
- get = dscr;
54
- dscr = null;
55
- } else {
56
- options = arguments[3];
57
- }
58
- if (!isValue(get)) {
59
- get = undefined;
60
- } else if (!isPlainFunction(get)) {
61
- options = get;
62
- get = set = undefined;
63
- } else if (!isValue(set)) {
64
- set = undefined;
65
- } else if (!isPlainFunction(set)) {
66
- options = set;
67
- set = undefined;
68
- }
69
- if (isValue(dscr)) {
70
- c = contains.call(dscr, "c");
71
- e = contains.call(dscr, "e");
72
- } else {
73
- c = true;
74
- e = false;
75
- }
76
-
77
- desc = { get: get, set: set, configurable: c, enumerable: e };
78
- return !options ? desc : assign(normalizeOpts(options), desc);
79
- };
80
-
81
-
82
- /***/ }),
83
-
84
- /***/ 91:
85
- /***/ ((module) => {
86
-
87
- "use strict";
88
-
89
-
90
- // eslint-disable-next-line no-empty-function
91
- module.exports = function () {};
92
-
93
-
94
- /***/ }),
95
-
96
- /***/ 240:
97
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
98
-
99
- "use strict";
100
-
101
-
102
- module.exports = __webpack_require__(229)() ? Object.assign : __webpack_require__(640);
103
-
104
-
105
- /***/ }),
106
-
107
- /***/ 229:
108
- /***/ ((module) => {
109
-
110
- "use strict";
111
-
112
-
113
- module.exports = function () {
114
- var assign = Object.assign, obj;
115
- if (typeof assign !== "function") return false;
116
- obj = { foo: "raz" };
117
- assign(obj, { bar: "dwa" }, { trzy: "trzy" });
118
- return obj.foo + obj.bar + obj.trzy === "razdwatrzy";
119
- };
120
-
121
-
122
- /***/ }),
123
-
124
- /***/ 640:
125
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
126
-
127
- "use strict";
128
-
129
-
130
- var keys = __webpack_require__(255)
131
- , value = __webpack_require__(110)
132
- , max = Math.max;
133
-
134
- module.exports = function (dest, src /*, …srcn*/) {
135
- var error, i, length = max(arguments.length, 2), assign;
136
- dest = Object(value(dest));
137
- assign = function (key) {
138
- try {
139
- dest[key] = src[key];
140
- } catch (e) {
141
- if (!error) error = e;
142
- }
143
- };
144
- for (i = 1; i < length; ++i) {
145
- src = arguments[i];
146
- keys(src).forEach(assign);
147
- }
148
- if (error !== undefined) throw error;
149
- return dest;
150
- };
151
-
152
-
153
- /***/ }),
154
-
155
- /***/ 515:
156
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
157
-
158
- "use strict";
159
-
160
-
161
- var _undefined = __webpack_require__(91)(); // Support ES3 engines
162
-
163
- module.exports = function (val) { return val !== _undefined && val !== null; };
164
-
165
-
166
- /***/ }),
167
-
168
- /***/ 255:
169
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
170
-
171
- "use strict";
172
-
173
-
174
- module.exports = __webpack_require__(291)() ? Object.keys : __webpack_require__(184);
175
-
176
-
177
- /***/ }),
178
-
179
- /***/ 291:
180
- /***/ ((module) => {
181
-
182
- "use strict";
183
-
184
-
185
- module.exports = function () {
186
- try {
187
- Object.keys("primitive");
188
- return true;
189
- } catch (e) {
190
- return false;
191
- }
192
- };
193
-
194
-
195
- /***/ }),
196
-
197
- /***/ 184:
198
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
199
-
200
- "use strict";
201
-
202
-
203
- var isValue = __webpack_require__(515);
204
-
205
- var keys = Object.keys;
206
-
207
- module.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };
208
-
209
-
210
- /***/ }),
211
-
212
- /***/ 343:
213
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
214
-
215
- "use strict";
216
-
217
-
218
- var isValue = __webpack_require__(515);
219
-
220
- var forEach = Array.prototype.forEach, create = Object.create;
221
-
222
- var process = function (src, obj) {
223
- var key;
224
- for (key in src) obj[key] = src[key];
225
- };
226
-
227
- // eslint-disable-next-line no-unused-vars
228
- module.exports = function (opts1 /*, …options*/) {
229
- var result = create(null);
230
- forEach.call(arguments, function (options) {
231
- if (!isValue(options)) return;
232
- process(Object(options), result);
233
- });
234
- return result;
235
- };
236
-
237
-
238
- /***/ }),
239
-
240
- /***/ 979:
241
- /***/ ((module) => {
242
-
243
- "use strict";
244
-
245
-
246
- module.exports = function (fn) {
247
- if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
248
- return fn;
249
- };
250
-
251
-
252
- /***/ }),
253
-
254
- /***/ 110:
255
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
256
-
257
- "use strict";
258
-
259
-
260
- var isValue = __webpack_require__(515);
261
-
262
- module.exports = function (value) {
263
- if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
264
- return value;
265
- };
266
-
267
-
268
- /***/ }),
269
-
270
- /***/ 50:
271
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
272
-
273
- "use strict";
274
-
275
-
276
- module.exports = __webpack_require__(459)() ? String.prototype.contains : __webpack_require__(131);
277
-
278
-
279
- /***/ }),
280
-
281
- /***/ 459:
282
- /***/ ((module) => {
283
-
284
- "use strict";
285
-
286
-
287
- var str = "razdwatrzy";
288
-
289
- module.exports = function () {
290
- if (typeof str.contains !== "function") return false;
291
- return str.contains("dwa") === true && str.contains("foo") === false;
292
- };
293
-
294
-
295
- /***/ }),
296
-
297
- /***/ 131:
298
- /***/ ((module) => {
299
-
300
- "use strict";
301
-
302
-
303
- var indexOf = String.prototype.indexOf;
304
-
305
- module.exports = function (searchString /*, position*/) {
306
- return indexOf.call(this, searchString, arguments[1]) > -1;
307
- };
308
-
309
-
310
- /***/ }),
311
-
312
- /***/ 360:
313
- /***/ ((module, exports, __webpack_require__) => {
314
-
315
- "use strict";
316
-
317
-
318
- var d = __webpack_require__(423)
319
- , callable = __webpack_require__(979)
320
-
321
- , apply = Function.prototype.apply, call = Function.prototype.call
322
- , create = Object.create, defineProperty = Object.defineProperty
323
- , defineProperties = Object.defineProperties
324
- , hasOwnProperty = Object.prototype.hasOwnProperty
325
- , descriptor = { configurable: true, enumerable: false, writable: true }
326
-
327
- , on, once, off, emit, methods, descriptors, base;
328
-
329
- on = function (type, listener) {
330
- var data;
331
-
332
- callable(listener);
333
-
334
- if (!hasOwnProperty.call(this, '__ee__')) {
335
- data = descriptor.value = create(null);
336
- defineProperty(this, '__ee__', descriptor);
337
- descriptor.value = null;
338
- } else {
339
- data = this.__ee__;
340
- }
341
- if (!data[type]) data[type] = listener;
342
- else if (typeof data[type] === 'object') data[type].push(listener);
343
- else data[type] = [data[type], listener];
344
-
345
- return this;
346
- };
347
-
348
- once = function (type, listener) {
349
- var once, self;
350
-
351
- callable(listener);
352
- self = this;
353
- on.call(this, type, once = function () {
354
- off.call(self, type, once);
355
- apply.call(listener, this, arguments);
356
- });
357
-
358
- once.__eeOnceListener__ = listener;
359
- return this;
360
- };
361
-
362
- off = function (type, listener) {
363
- var data, listeners, candidate, i;
364
-
365
- callable(listener);
366
-
367
- if (!hasOwnProperty.call(this, '__ee__')) return this;
368
- data = this.__ee__;
369
- if (!data[type]) return this;
370
- listeners = data[type];
371
-
372
- if (typeof listeners === 'object') {
373
- for (i = 0; (candidate = listeners[i]); ++i) {
374
- if ((candidate === listener) ||
375
- (candidate.__eeOnceListener__ === listener)) {
376
- if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
377
- else listeners.splice(i, 1);
378
- }
379
- }
380
- } else {
381
- if ((listeners === listener) ||
382
- (listeners.__eeOnceListener__ === listener)) {
383
- delete data[type];
384
- }
385
- }
386
-
387
- return this;
388
- };
389
-
390
- emit = function (type) {
391
- var i, l, listener, listeners, args;
392
-
393
- if (!hasOwnProperty.call(this, '__ee__')) return;
394
- listeners = this.__ee__[type];
395
- if (!listeners) return;
396
-
397
- if (typeof listeners === 'object') {
398
- l = arguments.length;
399
- args = new Array(l - 1);
400
- for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
401
-
402
- listeners = listeners.slice();
403
- for (i = 0; (listener = listeners[i]); ++i) {
404
- apply.call(listener, this, args);
405
- }
406
- } else {
407
- switch (arguments.length) {
408
- case 1:
409
- call.call(listeners, this);
410
- break;
411
- case 2:
412
- call.call(listeners, this, arguments[1]);
413
- break;
414
- case 3:
415
- call.call(listeners, this, arguments[1], arguments[2]);
416
- break;
417
- default:
418
- l = arguments.length;
419
- args = new Array(l - 1);
420
- for (i = 1; i < l; ++i) {
421
- args[i - 1] = arguments[i];
422
- }
423
- apply.call(listeners, this, args);
424
- }
425
- }
426
- };
427
-
428
- methods = {
429
- on: on,
430
- once: once,
431
- off: off,
432
- emit: emit
433
- };
434
-
435
- descriptors = {
436
- on: d(on),
437
- once: d(once),
438
- off: d(off),
439
- emit: d(emit)
440
- };
441
-
442
- base = defineProperties({}, descriptors);
443
-
444
- module.exports = exports = function (o) {
445
- return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
446
- };
447
- exports.methods = methods;
448
-
449
-
450
- /***/ }),
451
-
452
- /***/ 414:
453
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
454
-
455
- "use strict";
456
-
457
-
458
- var isPrototype = __webpack_require__(670);
459
-
460
- module.exports = function (value) {
461
- if (typeof value !== "function") return false;
462
-
463
- if (!hasOwnProperty.call(value, "length")) return false;
464
-
465
- try {
466
- if (typeof value.length !== "number") return false;
467
- if (typeof value.call !== "function") return false;
468
- if (typeof value.apply !== "function") return false;
469
- } catch (error) {
470
- return false;
471
- }
472
-
473
- return !isPrototype(value);
474
- };
475
-
476
-
477
- /***/ }),
478
-
479
- /***/ 783:
480
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
481
-
482
- "use strict";
483
-
484
-
485
- var isValue = __webpack_require__(132);
486
-
487
- // prettier-ignore
488
- var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ };
489
-
490
- module.exports = function (value) {
491
- if (!isValue(value)) return false;
492
- return hasOwnProperty.call(possibleTypes, typeof value);
493
- };
494
-
495
-
496
- /***/ }),
497
-
498
- /***/ 421:
499
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
500
-
501
- "use strict";
502
-
503
-
504
- var isFunction = __webpack_require__(414);
505
-
506
- var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString;
507
-
508
- module.exports = function (value) {
509
- if (!isFunction(value)) return false;
510
- if (classRe.test(functionToString.call(value))) return false;
511
- return true;
512
- };
513
-
514
-
515
- /***/ }),
516
-
517
- /***/ 670:
518
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
519
-
520
- "use strict";
521
-
522
-
523
- var isObject = __webpack_require__(783);
524
-
525
- module.exports = function (value) {
526
- if (!isObject(value)) return false;
527
- try {
528
- if (!value.constructor) return false;
529
- return value.constructor.prototype === value;
530
- } catch (error) {
531
- return false;
532
- }
533
- };
534
-
535
-
536
- /***/ }),
537
-
538
- /***/ 132:
539
- /***/ ((module) => {
540
-
541
- "use strict";
542
-
543
-
544
- // ES3 safe
545
- var _undefined = void 0;
546
-
547
- module.exports = function (value) { return value !== _undefined && value !== null; };
548
-
549
-
550
- /***/ }),
551
-
552
- /***/ 744:
553
- /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
554
-
555
- /*!
556
- * activity-streams
557
- * https://github.com/silverbucket/activity-streams
558
- *
559
- * Developed and Maintained by:
560
- * Nick Jennings <nick@silverbucket.net>
561
- *
562
- * activity-streams is released under the MIT (see LICENSE).
563
- *
564
- * You don't have to do anything special to choose one license or the other
565
- * and you don't have to notify anyone which license you are using.
566
- * Please see the corresponding license file for details of these licenses.
567
- * You are free to use, modify and distribute this software, but all copyright
568
- * information must remain.
569
- *
570
- */
571
-
572
-
573
- const EventEmitter = __webpack_require__(360);
574
-
575
- const ee = EventEmitter(),
576
- baseProps = {
577
- stream: [
578
- 'id', 'type', 'actor', 'target', 'object', 'context', 'context',
579
- 'published', 'error'
580
- ],
581
- object: [
582
- 'id', 'type', 'context',
583
- 'alias', 'attachedTo', 'attachment', 'attributedTo', 'attributedWith',
584
- 'content', 'contentMap', 'context', 'contextOf', 'name', 'endTime', 'generator',
585
- 'generatorOf', 'group', 'icon', 'image', 'inReplyTo', 'members', 'memberOf',
586
- 'message', 'location', 'locationOf', 'objectOf', 'originOf', 'presence',
587
- 'preview', 'previewOf', 'provider', 'providerOf', 'published', 'rating',
588
- 'relationship', 'resultOf', 'replies', 'role', 'scope', 'scopeOf', 'startTime',
589
- 'status', 'summary', 'topic', 'tag', 'tagOf', 'targetOf', 'title', 'titleMap',
590
- 'updated', 'url'
591
- ]
592
- },
593
- rename = {
594
- '@id': 'id',
595
- '@type': 'type',
596
- 'verb': 'type',
597
- 'displayName': 'name',
598
- 'objectType': 'type',
599
- 'platform': 'context'
600
- },
601
- expand = {
602
- 'actor' : {
603
- 'primary': 'id',
604
- 'props': baseProps
605
- },
606
- 'target': {
607
- 'primary': 'id',
608
- 'props': baseProps
609
- },
610
- 'object': {
611
- 'primary': 'content',
612
- 'props': baseProps
613
- }
614
- };
615
-
616
- let objs = new Map(),
617
- failOnUnknownObjectProperties = false,
618
- warnOnUnknownObjectProperties = true,
619
- specialObjs = [], // the objects don't get rejected for bad props
620
- customProps = {};
621
-
622
-
623
- function matchesCustomProp(type, key) {
624
- return !!((typeof customProps[type] === 'object') && (customProps[type].includes(key)));
625
- }
626
-
627
- function renameProp(obj, key) {
628
- obj[rename[key]] = obj[key];
629
- delete obj[key];
630
- return obj;
631
- }
632
-
633
- function validateObject(type, obj = {}) {
634
- const unknownKeys = Object.keys(obj).filter((key) => {
635
- if (! baseProps[type].includes(key)) {
636
- return key;
637
- }
638
- });
639
-
640
- for (let key of unknownKeys) {
641
- if (rename[key]) {
642
- // rename property instead of fail
643
- obj = renameProp(obj, key);
644
- continue;
645
- }
646
-
647
- if (matchesCustomProp(obj.type, key)) {
648
- // custom property matches, continue
649
- continue;
650
- }
651
-
652
- if (! specialObjs.includes(obj.type)) {
653
- // not defined as a special prop
654
- // don't know what to do with it, so throw error
655
- const err = `invalid property: "${key}"`;
656
- if (failOnUnknownObjectProperties) {
657
- throw new Error(err);
658
- } else if (warnOnUnknownObjectProperties) {
659
- console.warn(err);
660
- }
661
- }
662
- }
663
- }
664
-
665
-
666
- function ensureProps(obj) {
667
- // ensure the name property, which can general be inferred from the id
668
- // name = obj.match(/(?(?\w+):\/\/)(?:.+@)?(.+?)(?:\/|$)/)[1]
669
- return obj;
670
- }
671
-
672
- function expandStream(meta) {
673
- let stream = {};
674
- for (let key of Object.keys(meta)) {
675
- if (typeof meta[key] === 'string') {
676
- stream[key] = objs.get(meta[key]) || meta[key];
677
- } else if (Array.isArray(meta[key])) {
678
- stream[key] = [];
679
- for (let entry of meta[key]) {
680
- if (typeof entry === 'string') {
681
- stream[key].push(objs.get(entry) || entry);
682
- }
683
- }
684
- } else {
685
- stream[key] = meta[key];
686
- }
687
- }
688
-
689
- // only expand string into objects if they are in the expand list
690
- for (let key of Object.keys(expand)) {
691
- if (typeof stream[key] === 'string') {
692
- const idx = expand[key].primary;
693
- let obj = {};
694
- obj[idx] = stream[key];
695
- stream[key] = obj;
696
- }
697
- }
698
- return stream;
699
- }
700
-
701
- function Stream(meta) {
702
- validateObject('stream', meta);
703
- if (typeof meta.object === 'object') {
704
- validateObject('object', meta.object);
705
- }
706
- const stream = expandStream(meta);
707
- ee.emit('activity-stream', stream);
708
- return stream;
709
- }
710
-
711
-
712
- const _Object = {
713
- create: function (obj) {
714
- validateObject('object', obj);
715
- obj = ensureProps(obj);
716
- objs.set(obj.id, obj);
717
- ee.emit('activity-object-create', obj);
718
- return obj;
719
- },
720
-
721
- delete: function (id) {
722
- const result = objs.delete(id);
723
- if (result) {
724
- ee.emit('activity-object-delete', id);
725
- }
726
- return result;
727
- },
728
-
729
- get: function (id, expand) {
730
- let obj = objs.get(id);
731
- if (! obj) {
732
- if (! expand) {
733
- return id;
734
- }
735
- obj = {'id': id};
736
- }
737
- return ensureProps(obj);
738
- },
739
-
740
- list: function () {
741
- return objs.keys();
742
- }
743
- };
744
-
745
-
746
- function ASFactory(opts = {}) {
747
- specialObjs = opts.specialObjs || [];
748
- failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === 'boolean' ?
749
- opts.failOnUnknownObjectProperties : failOnUnknownObjectProperties;
750
- warnOnUnknownObjectProperties = typeof opts.warnOnUnknownObjectProperties === 'boolean' ?
751
- opts.warnOnUnknownObjectProperties : warnOnUnknownObjectProperties;
752
- for (let propName of Object.keys(opts.customProps || {})) {
753
- if (typeof opts.customProps[propName] === 'object') {
754
- customProps[propName] = opts.customProps[propName];
755
- }
756
- }
757
-
758
- return {
759
- Stream: Stream,
760
- Object: _Object,
761
- on: function (event, func) {
762
- return ee.on(event, func);
763
- },
764
- once: function (event, func) {
765
- return ee.once(event, func);
766
- },
767
- off: function (event, funcName) {
768
- return ee.off(event, funcName);
769
- }
770
- };
771
- }
772
-
773
- if ( true && module.exports) {
774
- module.exports = ASFactory;
775
- }
776
- if (typeof window === 'object') {
777
- window.ASFactory = ASFactory;
778
- }
779
-
780
-
781
- /***/ }),
782
-
783
- /***/ 650:
784
- /***/ (function(module, exports, __webpack_require__) {
785
-
786
- "use strict";
787
-
788
- var __importDefault = (this && this.__importDefault) || function (mod) {
789
- return (mod && mod.__esModule) ? mod : { "default": mod };
790
- };
791
- Object.defineProperty(exports, "__esModule", ({ value: true }));
792
- const eventemitter2_1 = __webpack_require__(387);
793
- const activity_streams_1 = __importDefault(__webpack_require__(744));
794
- class SockethubClient {
795
- constructor(socket) {
796
- this.events = {
797
- 'credentials': new Map(),
798
- 'activity-object': new Map(),
799
- 'connect': new Map(),
800
- 'join': new Map()
801
- };
802
- this.online = false;
803
- this.debug = true;
804
- if (!socket) {
805
- throw new Error('SockethubClient requires a socket.io instance');
806
- }
807
- this._socket = socket;
808
- this.ActivityStreams = (0, activity_streams_1.default)({ specialObjs: ['credentials'] });
809
- this.socket = this.createPublicEmitter();
810
- this.registerSocketIOHandlers();
811
- this.ActivityStreams.on('activity-object-create', (obj) => {
812
- socket.emit('activity-object', obj, (err) => {
813
- if (err) {
814
- console.error('failed to create activity-object ', err);
815
- }
816
- else {
817
- this.eventActivityObject(obj);
818
- }
819
- });
820
- });
821
- socket.on('activity-object', (obj) => {
822
- this.ActivityStreams.Object.create(obj);
823
- });
824
- }
825
- createPublicEmitter() {
826
- const socket = new eventemitter2_1.EventEmitter2({
827
- wildcard: true,
828
- verboseMemoryLeak: false
829
- });
830
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
831
- // @ts-ignore
832
- socket._emit = socket.emit;
833
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
834
- // @ts-ignore
835
- socket.emit = (event, content, callback) => {
836
- if (event === 'credentials') {
837
- this.eventCredentials(content);
838
- }
839
- else if (event === 'activity-object') {
840
- this.eventActivityObject(content);
841
- }
842
- else if (event === 'message') {
843
- this.eventMessage(content);
844
- }
845
- this._socket.emit(event, content, callback);
846
- };
847
- return socket;
848
- }
849
- eventActivityObject(content) {
850
- if (content.id) {
851
- this.events['activity-object'].set(content.id, content);
852
- }
853
- }
854
- eventCredentials(content) {
855
- if ((content.object) && (content.object.type === 'credentials')) {
856
- const key = content.actor.id || content.actor;
857
- this.events['credentials'].set(key, content);
858
- }
859
- }
860
- eventMessage(content) {
861
- if (!this.online) {
862
- return;
863
- }
864
- // either store or delete the specified content onto the storedJoins map,
865
- // for reply once we're back online.
866
- const key = SockethubClient.getKey(content);
867
- if (content.type === 'join' || content.type === 'connect') {
868
- this.events[content.type].set(key, content);
869
- }
870
- else if (content.type === 'leave') {
871
- this.events['join'].delete(key);
872
- }
873
- else if (content.type === 'disconnect') {
874
- this.events['connect'].delete(key);
875
- }
876
- }
877
- static getKey(content) {
878
- var _a;
879
- const actor = ((_a = content.actor) === null || _a === void 0 ? void 0 : _a.id) || content.actor;
880
- if (!actor) {
881
- throw new Error("actor property not present for message type: " + (content === null || content === void 0 ? void 0 : content.type));
882
- }
883
- const target = content.target ? content.target.id || content.target : '';
884
- return actor + '-' + target;
885
- }
886
- log(msg, obj) {
887
- if (this.debug) {
888
- // eslint-disable-next-line security-node/detect-crlf
889
- console.log(msg, obj);
890
- }
891
- }
892
- registerSocketIOHandlers() {
893
- // middleware for events which don't deal in AS objects
894
- const callHandler = (event) => {
895
- return (obj, cb) => {
896
- if (event === 'connect') {
897
- this.online = true;
898
- this.replay('activity-object', this.events['activity-object']);
899
- this.replay('credentials', this.events['credentials']);
900
- this.replay('message', this.events['connect']);
901
- this.replay('message', this.events['join']);
902
- }
903
- else if (event === 'disconnect') {
904
- this.online = false;
905
- }
906
- this.socket._emit(event, obj, cb);
907
- };
908
- };
909
- // register for events that give us information on connection status
910
- this._socket.on('connect', callHandler('connect'));
911
- this._socket.on('connect_error', callHandler('connect_error'));
912
- this._socket.on('disconnect', callHandler('disconnect'));
913
- // use as a middleware to receive incoming Sockethub messages and unpack them
914
- // using the ActivityStreams library before passing them along to the app.
915
- this._socket.on('message', (obj, cb) => {
916
- this.socket._emit('message', this.ActivityStreams.Stream(obj), cb);
917
- });
918
- }
919
- replay(name, asMap) {
920
- asMap.forEach((obj) => {
921
- this.log(`replaying ${name}`, obj);
922
- this._socket.emit(name, obj);
923
- });
924
- }
925
- }
926
- if ( true && module.exports) {
927
- module.exports = SockethubClient;
928
- }
929
- if (true) {
930
- exports = SockethubClient; // lgtm [js/useless-assignment-to-local]
931
- }
932
- if (typeof window === 'object') {
933
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
934
- // @ts-ignore
935
- window.SockethubClient = SockethubClient;
936
- }
937
- //# sourceMappingURL=/sockethub-client.js.map
938
-
939
- /***/ }),
940
-
941
- /***/ 387:
942
- /***/ ((module, exports, __webpack_require__) => {
943
-
944
- var __WEBPACK_AMD_DEFINE_RESULT__;/*!
945
- * EventEmitter2
946
- * https://github.com/hij1nx/EventEmitter2
947
- *
948
- * Copyright (c) 2013 hij1nx
949
- * Licensed under the MIT license.
950
- */
951
- ;!function(undefined) {
952
- var hasOwnProperty= Object.hasOwnProperty;
953
- var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {
954
- return Object.prototype.toString.call(obj) === "[object Array]";
955
- };
956
- var defaultMaxListeners = 10;
957
- var nextTickSupported= typeof process=='object' && typeof process.nextTick=='function';
958
- var symbolsSupported= typeof Symbol==='function';
959
- var reflectSupported= typeof Reflect === 'object';
960
- var setImmediateSupported= typeof setImmediate === 'function';
961
- var _setImmediate= setImmediateSupported ? setImmediate : setTimeout;
962
- var ownKeys= symbolsSupported? (reflectSupported && typeof Reflect.ownKeys==='function'? Reflect.ownKeys : function(obj){
963
- var arr= Object.getOwnPropertyNames(obj);
964
- arr.push.apply(arr, Object.getOwnPropertySymbols(obj));
965
- return arr;
966
- }) : Object.keys;
967
-
968
- function init() {
969
- this._events = {};
970
- if (this._conf) {
971
- configure.call(this, this._conf);
972
- }
973
- }
974
-
975
- function configure(conf) {
976
- if (conf) {
977
- this._conf = conf;
978
-
979
- conf.delimiter && (this.delimiter = conf.delimiter);
980
-
981
- if(conf.maxListeners!==undefined){
982
- this._maxListeners= conf.maxListeners;
983
- }
984
-
985
- conf.wildcard && (this.wildcard = conf.wildcard);
986
- conf.newListener && (this._newListener = conf.newListener);
987
- conf.removeListener && (this._removeListener = conf.removeListener);
988
- conf.verboseMemoryLeak && (this.verboseMemoryLeak = conf.verboseMemoryLeak);
989
- conf.ignoreErrors && (this.ignoreErrors = conf.ignoreErrors);
990
-
991
- if (this.wildcard) {
992
- this.listenerTree = {};
993
- }
994
- }
995
- }
996
-
997
- function logPossibleMemoryLeak(count, eventName) {
998
- var errorMsg = '(node) warning: possible EventEmitter memory ' +
999
- 'leak detected. ' + count + ' listeners added. ' +
1000
- 'Use emitter.setMaxListeners() to increase limit.';
1001
-
1002
- if(this.verboseMemoryLeak){
1003
- errorMsg += ' Event name: ' + eventName + '.';
1004
- }
1005
-
1006
- if(typeof process !== 'undefined' && process.emitWarning){
1007
- var e = new Error(errorMsg);
1008
- e.name = 'MaxListenersExceededWarning';
1009
- e.emitter = this;
1010
- e.count = count;
1011
- process.emitWarning(e);
1012
- } else {
1013
- console.error(errorMsg);
1014
-
1015
- if (console.trace){
1016
- console.trace();
1017
- }
1018
- }
1019
- }
1020
-
1021
- var toArray = function (a, b, c) {
1022
- var n = arguments.length;
1023
- switch (n) {
1024
- case 0:
1025
- return [];
1026
- case 1:
1027
- return [a];
1028
- case 2:
1029
- return [a, b];
1030
- case 3:
1031
- return [a, b, c];
1032
- default:
1033
- var arr = new Array(n);
1034
- while (n--) {
1035
- arr[n] = arguments[n];
1036
- }
1037
- return arr;
1038
- }
1039
- };
1040
-
1041
- function toObject(keys, values) {
1042
- var obj = {};
1043
- var key;
1044
- var len = keys.length;
1045
- var valuesCount = values ? values.length : 0;
1046
- for (var i = 0; i < len; i++) {
1047
- key = keys[i];
1048
- obj[key] = i < valuesCount ? values[i] : undefined;
1049
- }
1050
- return obj;
1051
- }
1052
-
1053
- function TargetObserver(emitter, target, options) {
1054
- this._emitter = emitter;
1055
- this._target = target;
1056
- this._listeners = {};
1057
- this._listenersCount = 0;
1058
-
1059
- var on, off;
1060
-
1061
- if (options.on || options.off) {
1062
- on = options.on;
1063
- off = options.off;
1064
- }
1065
-
1066
- if (target.addEventListener) {
1067
- on = target.addEventListener;
1068
- off = target.removeEventListener;
1069
- } else if (target.addListener) {
1070
- on = target.addListener;
1071
- off = target.removeListener;
1072
- } else if (target.on) {
1073
- on = target.on;
1074
- off = target.off;
1075
- }
1076
-
1077
- if (!on && !off) {
1078
- throw Error('target does not implement any known event API');
1079
- }
1080
-
1081
- if (typeof on !== 'function') {
1082
- throw TypeError('on method must be a function');
1083
- }
1084
-
1085
- if (typeof off !== 'function') {
1086
- throw TypeError('off method must be a function');
1087
- }
1088
-
1089
- this._on = on;
1090
- this._off = off;
1091
-
1092
- var _observers= emitter._observers;
1093
- if(_observers){
1094
- _observers.push(this);
1095
- }else{
1096
- emitter._observers= [this];
1097
- }
1098
- }
1099
-
1100
- Object.assign(TargetObserver.prototype, {
1101
- subscribe: function(event, localEvent, reducer){
1102
- var observer= this;
1103
- var target= this._target;
1104
- var emitter= this._emitter;
1105
- var listeners= this._listeners;
1106
- var handler= function(){
1107
- var args= toArray.apply(null, arguments);
1108
- var eventObj= {
1109
- data: args,
1110
- name: localEvent,
1111
- original: event
1112
- };
1113
- if(reducer){
1114
- var result= reducer.call(target, eventObj);
1115
- if(result!==false){
1116
- emitter.emit.apply(emitter, [eventObj.name].concat(args))
1117
- }
1118
- return;
1119
- }
1120
- emitter.emit.apply(emitter, [localEvent].concat(args));
1121
- };
1122
-
1123
-
1124
- if(listeners[event]){
1125
- throw Error('Event \'' + event + '\' is already listening');
1126
- }
1127
-
1128
- this._listenersCount++;
1129
-
1130
- if(emitter._newListener && emitter._removeListener && !observer._onNewListener){
1131
-
1132
- this._onNewListener = function (_event) {
1133
- if (_event === localEvent && listeners[event] === null) {
1134
- listeners[event] = handler;
1135
- observer._on.call(target, event, handler);
1136
- }
1137
- };
1138
-
1139
- emitter.on('newListener', this._onNewListener);
1140
-
1141
- this._onRemoveListener= function(_event){
1142
- if(_event === localEvent && !emitter.hasListeners(_event) && listeners[event]){
1143
- listeners[event]= null;
1144
- observer._off.call(target, event, handler);
1145
- }
1146
- };
1147
-
1148
- listeners[event]= null;
1149
-
1150
- emitter.on('removeListener', this._onRemoveListener);
1151
- }else{
1152
- listeners[event]= handler;
1153
- observer._on.call(target, event, handler);
1154
- }
1155
- },
1156
-
1157
- unsubscribe: function(event){
1158
- var observer= this;
1159
- var listeners= this._listeners;
1160
- var emitter= this._emitter;
1161
- var handler;
1162
- var events;
1163
- var off= this._off;
1164
- var target= this._target;
1165
- var i;
1166
-
1167
- if(event && typeof event!=='string'){
1168
- throw TypeError('event must be a string');
1169
- }
1170
-
1171
- function clearRefs(){
1172
- if(observer._onNewListener){
1173
- emitter.off('newListener', observer._onNewListener);
1174
- emitter.off('removeListener', observer._onRemoveListener);
1175
- observer._onNewListener= null;
1176
- observer._onRemoveListener= null;
1177
- }
1178
- var index= findTargetIndex.call(emitter, observer);
1179
- emitter._observers.splice(index, 1);
1180
- }
1181
-
1182
- if(event){
1183
- handler= listeners[event];
1184
- if(!handler) return;
1185
- off.call(target, event, handler);
1186
- delete listeners[event];
1187
- if(!--this._listenersCount){
1188
- clearRefs();
1189
- }
1190
- }else{
1191
- events= ownKeys(listeners);
1192
- i= events.length;
1193
- while(i-->0){
1194
- event= events[i];
1195
- off.call(target, event, listeners[event]);
1196
- }
1197
- this._listeners= {};
1198
- this._listenersCount= 0;
1199
- clearRefs();
1200
- }
1201
- }
1202
- });
1203
-
1204
- function resolveOptions(options, schema, reducers, allowUnknown) {
1205
- var computedOptions = Object.assign({}, schema);
1206
-
1207
- if (!options) return computedOptions;
1208
-
1209
- if (typeof options !== 'object') {
1210
- throw TypeError('options must be an object')
1211
- }
1212
-
1213
- var keys = Object.keys(options);
1214
- var length = keys.length;
1215
- var option, value;
1216
- var reducer;
1217
-
1218
- function reject(reason) {
1219
- throw Error('Invalid "' + option + '" option value' + (reason ? '. Reason: ' + reason : ''))
1220
- }
1221
-
1222
- for (var i = 0; i < length; i++) {
1223
- option = keys[i];
1224
- if (!allowUnknown && !hasOwnProperty.call(schema, option)) {
1225
- throw Error('Unknown "' + option + '" option');
1226
- }
1227
- value = options[option];
1228
- if (value !== undefined) {
1229
- reducer = reducers[option];
1230
- computedOptions[option] = reducer ? reducer(value, reject) : value;
1231
- }
1232
- }
1233
- return computedOptions;
1234
- }
1235
-
1236
- function constructorReducer(value, reject) {
1237
- if (typeof value !== 'function' || !value.hasOwnProperty('prototype')) {
1238
- reject('value must be a constructor');
1239
- }
1240
- return value;
1241
- }
1242
-
1243
- function makeTypeReducer(types) {
1244
- var message= 'value must be type of ' + types.join('|');
1245
- var len= types.length;
1246
- var firstType= types[0];
1247
- var secondType= types[1];
1248
-
1249
- if (len === 1) {
1250
- return function (v, reject) {
1251
- if (typeof v === firstType) {
1252
- return v;
1253
- }
1254
- reject(message);
1255
- }
1256
- }
1257
-
1258
- if (len === 2) {
1259
- return function (v, reject) {
1260
- var kind= typeof v;
1261
- if (kind === firstType || kind === secondType) return v;
1262
- reject(message);
1263
- }
1264
- }
1265
-
1266
- return function (v, reject) {
1267
- var kind = typeof v;
1268
- var i = len;
1269
- while (i-- > 0) {
1270
- if (kind === types[i]) return v;
1271
- }
1272
- reject(message);
1273
- }
1274
- }
1275
-
1276
- var functionReducer= makeTypeReducer(['function']);
1277
-
1278
- var objectFunctionReducer= makeTypeReducer(['object', 'function']);
1279
-
1280
- function makeCancelablePromise(Promise, executor, options) {
1281
- var isCancelable;
1282
- var callbacks;
1283
- var timer= 0;
1284
- var subscriptionClosed;
1285
-
1286
- var promise = new Promise(function (resolve, reject, onCancel) {
1287
- options= resolveOptions(options, {
1288
- timeout: 0,
1289
- overload: false
1290
- }, {
1291
- timeout: function(value, reject){
1292
- value*= 1;
1293
- if (typeof value !== 'number' || value < 0 || !Number.isFinite(value)) {
1294
- reject('timeout must be a positive number');
1295
- }
1296
- return value;
1297
- }
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __toESM = (mod, isNodeMode, target) => {
7
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
8
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
+ for (let key of __getOwnPropNames(mod))
10
+ if (!__hasOwnProp.call(to, key))
11
+ __defProp(to, key, {
12
+ get: () => mod[key],
13
+ enumerable: true
1298
14
  });
1299
-
1300
- isCancelable = !options.overload && typeof Promise.prototype.cancel === 'function' && typeof onCancel === 'function';
1301
-
1302
- function cleanup() {
1303
- if (callbacks) {
1304
- callbacks = null;
1305
- }
1306
- if (timer) {
1307
- clearTimeout(timer);
1308
- timer = 0;
1309
- }
1310
- }
1311
-
1312
- var _resolve= function(value){
1313
- cleanup();
1314
- resolve(value);
1315
- };
1316
-
1317
- var _reject= function(err){
1318
- cleanup();
1319
- reject(err);
1320
- };
1321
-
1322
- if (isCancelable) {
1323
- executor(_resolve, _reject, onCancel);
1324
- } else {
1325
- callbacks = [function(reason){
1326
- _reject(reason || Error('canceled'));
1327
- }];
1328
- executor(_resolve, _reject, function (cb) {
1329
- if (subscriptionClosed) {
1330
- throw Error('Unable to subscribe on cancel event asynchronously')
1331
- }
1332
- if (typeof cb !== 'function') {
1333
- throw TypeError('onCancel callback must be a function');
1334
- }
1335
- callbacks.push(cb);
1336
- });
1337
- subscriptionClosed= true;
1338
- }
1339
-
1340
- if (options.timeout > 0) {
1341
- timer= setTimeout(function(){
1342
- var reason= Error('timeout');
1343
- reason.code = 'ETIMEDOUT'
1344
- timer= 0;
1345
- promise.cancel(reason);
1346
- reject(reason);
1347
- }, options.timeout);
1348
- }
1349
- });
1350
-
1351
- if (!isCancelable) {
1352
- promise.cancel = function (reason) {
1353
- if (!callbacks) {
1354
- return;
1355
- }
1356
- var length = callbacks.length;
1357
- for (var i = 1; i < length; i++) {
1358
- callbacks[i](reason);
1359
- }
1360
- // internal callback to reject the promise
1361
- callbacks[0](reason);
1362
- callbacks = null;
1363
- };
1364
- }
1365
-
1366
- return promise;
1367
- }
1368
-
1369
- function findTargetIndex(observer) {
1370
- var observers = this._observers;
1371
- if(!observers){
1372
- return -1;
1373
- }
1374
- var len = observers.length;
1375
- for (var i = 0; i < len; i++) {
1376
- if (observers[i]._target === observer) return i;
1377
- }
1378
- return -1;
1379
- }
1380
-
1381
- // Attention, function return type now is array, always !
1382
- // It has zero elements if no any matches found and one or more
1383
- // elements (leafs) if there are matches
1384
- //
1385
- function searchListenerTree(handlers, type, tree, i, typeLength) {
1386
- if (!tree) {
1387
- return null;
1388
- }
1389
-
1390
- if (i === 0) {
1391
- var kind = typeof type;
1392
- if (kind === 'string') {
1393
- var ns, n, l = 0, j = 0, delimiter = this.delimiter, dl = delimiter.length;
1394
- if ((n = type.indexOf(delimiter)) !== -1) {
1395
- ns = new Array(5);
1396
- do {
1397
- ns[l++] = type.slice(j, n);
1398
- j = n + dl;
1399
- } while ((n = type.indexOf(delimiter, j)) !== -1);
1400
-
1401
- ns[l++] = type.slice(j);
1402
- type = ns;
1403
- typeLength = l;
1404
- } else {
1405
- type = [type];
1406
- typeLength = 1;
1407
- }
1408
- } else if (kind === 'object') {
1409
- typeLength = type.length;
1410
- } else {
1411
- type = [type];
1412
- typeLength = 1;
1413
- }
1414
- }
1415
-
1416
- var listeners= null, branch, xTree, xxTree, isolatedBranch, endReached, currentType = type[i],
1417
- nextType = type[i + 1], branches, _listeners;
1418
-
1419
- if (i === typeLength) {
1420
- //
1421
- // If at the end of the event(s) list and the tree has listeners
1422
- // invoke those listeners.
1423
- //
1424
-
1425
- if(tree._listeners) {
1426
- if (typeof tree._listeners === 'function') {
1427
- handlers && handlers.push(tree._listeners);
1428
- listeners = [tree];
1429
- } else {
1430
- handlers && handlers.push.apply(handlers, tree._listeners);
1431
- listeners = [tree];
1432
- }
1433
- }
1434
- } else {
1435
-
1436
- if (currentType === '*') {
1437
- //
1438
- // If the event emitted is '*' at this part
1439
- // or there is a concrete match at this patch
1440
- //
1441
- branches = ownKeys(tree);
1442
- n = branches.length;
1443
- while (n-- > 0) {
1444
- branch = branches[n];
1445
- if (branch !== '_listeners') {
1446
- _listeners = searchListenerTree(handlers, type, tree[branch], i + 1, typeLength);
1447
- if (_listeners) {
1448
- if (listeners) {
1449
- listeners.push.apply(listeners, _listeners);
1450
- } else {
1451
- listeners = _listeners;
1452
- }
1453
- }
1454
- }
1455
- }
1456
- return listeners;
1457
- } else if (currentType === '**') {
1458
- endReached = (i + 1 === typeLength || (i + 2 === typeLength && nextType === '*'));
1459
- if (endReached && tree._listeners) {
1460
- // The next element has a _listeners, add it to the handlers.
1461
- listeners = searchListenerTree(handlers, type, tree, typeLength, typeLength);
1462
- }
1463
-
1464
- branches = ownKeys(tree);
1465
- n = branches.length;
1466
- while (n-- > 0) {
1467
- branch = branches[n];
1468
- if (branch !== '_listeners') {
1469
- if (branch === '*' || branch === '**') {
1470
- if (tree[branch]._listeners && !endReached) {
1471
- _listeners = searchListenerTree(handlers, type, tree[branch], typeLength, typeLength);
1472
- if (_listeners) {
1473
- if (listeners) {
1474
- listeners.push.apply(listeners, _listeners);
1475
- } else {
1476
- listeners = _listeners;
1477
- }
1478
- }
1479
- }
1480
- _listeners = searchListenerTree(handlers, type, tree[branch], i, typeLength);
1481
- } else if (branch === nextType) {
1482
- _listeners = searchListenerTree(handlers, type, tree[branch], i + 2, typeLength);
1483
- } else {
1484
- // No match on this one, shift into the tree but not in the type array.
1485
- _listeners = searchListenerTree(handlers, type, tree[branch], i, typeLength);
1486
- }
1487
- if (_listeners) {
1488
- if (listeners) {
1489
- listeners.push.apply(listeners, _listeners);
1490
- } else {
1491
- listeners = _listeners;
1492
- }
1493
- }
1494
- }
1495
- }
1496
- return listeners;
1497
- } else if (tree[currentType]) {
1498
- listeners = searchListenerTree(handlers, type, tree[currentType], i + 1, typeLength);
1499
- }
1500
- }
1501
-
1502
- xTree = tree['*'];
1503
- if (xTree) {
1504
- //
1505
- // If the listener tree will allow any match for this part,
1506
- // then recursively explore all branches of the tree
1507
- //
1508
- searchListenerTree(handlers, type, xTree, i + 1, typeLength);
1509
- }
1510
-
1511
- xxTree = tree['**'];
1512
- if (xxTree) {
1513
- if (i < typeLength) {
1514
- if (xxTree._listeners) {
1515
- // If we have a listener on a '**', it will catch all, so add its handler.
1516
- searchListenerTree(handlers, type, xxTree, typeLength, typeLength);
1517
- }
1518
-
1519
- // Build arrays of matching next branches and others.
1520
- branches= ownKeys(xxTree);
1521
- n= branches.length;
1522
- while(n-->0){
1523
- branch= branches[n];
1524
- if (branch !== '_listeners') {
1525
- if (branch === nextType) {
1526
- // We know the next element will match, so jump twice.
1527
- searchListenerTree(handlers, type, xxTree[branch], i + 2, typeLength);
1528
- } else if (branch === currentType) {
1529
- // Current node matches, move into the tree.
1530
- searchListenerTree(handlers, type, xxTree[branch], i + 1, typeLength);
1531
- } else {
1532
- isolatedBranch = {};
1533
- isolatedBranch[branch] = xxTree[branch];
1534
- searchListenerTree(handlers, type, {'**': isolatedBranch}, i + 1, typeLength);
1535
- }
1536
- }
1537
- }
1538
- } else if (xxTree._listeners) {
1539
- // We have reached the end and still on a '**'
1540
- searchListenerTree(handlers, type, xxTree, typeLength, typeLength);
1541
- } else if (xxTree['*'] && xxTree['*']._listeners) {
1542
- searchListenerTree(handlers, type, xxTree['*'], typeLength, typeLength);
1543
- }
1544
- }
1545
-
1546
- return listeners;
1547
- }
1548
-
1549
- function growListenerTree(type, listener, prepend) {
1550
- var len = 0, j = 0, i, delimiter = this.delimiter, dl= delimiter.length, ns;
1551
-
1552
- if(typeof type==='string') {
1553
- if ((i = type.indexOf(delimiter)) !== -1) {
1554
- ns = new Array(5);
1555
- do {
1556
- ns[len++] = type.slice(j, i);
1557
- j = i + dl;
1558
- } while ((i = type.indexOf(delimiter, j)) !== -1);
1559
-
1560
- ns[len++] = type.slice(j);
1561
- }else{
1562
- ns= [type];
1563
- len= 1;
1564
- }
1565
- }else{
1566
- ns= type;
1567
- len= type.length;
1568
- }
1569
-
1570
- //
1571
- // Looks for two consecutive '**', if so, don't add the event at all.
1572
- //
1573
- if (len > 1) {
1574
- for (i = 0; i + 1 < len; i++) {
1575
- if (ns[i] === '**' && ns[i + 1] === '**') {
1576
- return;
1577
- }
1578
- }
1579
- }
1580
-
1581
-
1582
-
1583
- var tree = this.listenerTree, name;
1584
-
1585
- for (i = 0; i < len; i++) {
1586
- name = ns[i];
1587
-
1588
- tree = tree[name] || (tree[name] = {});
1589
-
1590
- if (i === len - 1) {
1591
- if (!tree._listeners) {
1592
- tree._listeners = listener;
1593
- } else {
1594
- if (typeof tree._listeners === 'function') {
1595
- tree._listeners = [tree._listeners];
1596
- }
1597
-
1598
- if (prepend) {
1599
- tree._listeners.unshift(listener);
1600
- } else {
1601
- tree._listeners.push(listener);
1602
- }
1603
-
1604
- if (
1605
- !tree._listeners.warned &&
1606
- this._maxListeners > 0 &&
1607
- tree._listeners.length > this._maxListeners
1608
- ) {
1609
- tree._listeners.warned = true;
1610
- logPossibleMemoryLeak.call(this, tree._listeners.length, name);
1611
- }
1612
- }
1613
- return true;
1614
- }
1615
- }
1616
-
1617
- return true;
1618
- }
1619
-
1620
- function collectTreeEvents(tree, events, root, asArray){
1621
- var branches= ownKeys(tree);
1622
- var i= branches.length;
1623
- var branch, branchName, path;
1624
- var hasListeners= tree['_listeners'];
1625
- var isArrayPath;
1626
-
1627
- while(i-->0){
1628
- branchName= branches[i];
1629
-
1630
- branch= tree[branchName];
1631
-
1632
- if(branchName==='_listeners'){
1633
- path= root;
1634
- }else {
1635
- path = root ? root.concat(branchName) : [branchName];
1636
- }
1637
-
1638
- isArrayPath= asArray || typeof branchName==='symbol';
1639
-
1640
- hasListeners && events.push(isArrayPath? path : path.join(this.delimiter));
1641
-
1642
- if(typeof branch==='object'){
1643
- collectTreeEvents.call(this, branch, events, path, isArrayPath);
1644
- }
1645
- }
1646
-
1647
- return events;
1648
- }
1649
-
1650
- function recursivelyGarbageCollect(root) {
1651
- var keys = ownKeys(root);
1652
- var i= keys.length;
1653
- var obj, key, flag;
1654
- while(i-->0){
1655
- key = keys[i];
1656
- obj = root[key];
1657
-
1658
- if(obj){
1659
- flag= true;
1660
- if(key !== '_listeners' && !recursivelyGarbageCollect(obj)){
1661
- delete root[key];
1662
- }
1663
- }
1664
- }
1665
-
1666
- return flag;
1667
- }
1668
-
1669
- function Listener(emitter, event, listener){
1670
- this.emitter= emitter;
1671
- this.event= event;
1672
- this.listener= listener;
1673
- }
1674
-
1675
- Listener.prototype.off= function(){
1676
- this.emitter.off(this.event, this.listener);
1677
- return this;
1678
- };
1679
-
1680
- function setupListener(event, listener, options){
1681
- if (options === true) {
1682
- promisify = true;
1683
- } else if (options === false) {
1684
- async = true;
1685
- } else {
1686
- if (!options || typeof options !== 'object') {
1687
- throw TypeError('options should be an object or true');
1688
- }
1689
- var async = options.async;
1690
- var promisify = options.promisify;
1691
- var nextTick = options.nextTick;
1692
- var objectify = options.objectify;
1693
- }
1694
-
1695
- if (async || nextTick || promisify) {
1696
- var _listener = listener;
1697
- var _origin = listener._origin || listener;
1698
-
1699
- if (nextTick && !nextTickSupported) {
1700
- throw Error('process.nextTick is not supported');
1701
- }
1702
-
1703
- if (promisify === undefined) {
1704
- promisify = listener.constructor.name === 'AsyncFunction';
1705
- }
1706
-
1707
- listener = function () {
1708
- var args = arguments;
1709
- var context = this;
1710
- var event = this.event;
1711
-
1712
- return promisify ? (nextTick ? Promise.resolve() : new Promise(function (resolve) {
1713
- _setImmediate(resolve);
1714
- }).then(function () {
1715
- context.event = event;
1716
- return _listener.apply(context, args)
1717
- })) : (nextTick ? process.nextTick : _setImmediate)(function () {
1718
- context.event = event;
1719
- _listener.apply(context, args)
1720
- });
1721
- };
1722
-
1723
- listener._async = true;
1724
- listener._origin = _origin;
1725
- }
1726
-
1727
- return [listener, objectify? new Listener(this, event, listener): this];
1728
- }
1729
-
1730
- function EventEmitter(conf) {
1731
- this._events = {};
1732
- this._newListener = false;
1733
- this._removeListener = false;
1734
- this.verboseMemoryLeak = false;
1735
- configure.call(this, conf);
15
+ return to;
16
+ };
17
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
+
19
+ // ../../node_modules/eventemitter3/index.js
20
+ var require_eventemitter3 = __commonJS((exports, module) => {
21
+ var has = Object.prototype.hasOwnProperty;
22
+ var prefix = "~";
23
+ function Events() {}
24
+ if (Object.create) {
25
+ Events.prototype = Object.create(null);
26
+ if (!new Events().__proto__)
27
+ prefix = false;
1736
28
  }
1737
-
1738
- EventEmitter.EventEmitter2 = EventEmitter; // backwards compatibility for exporting EventEmitter property
1739
-
1740
- EventEmitter.prototype.listenTo= function(target, events, options){
1741
- if(typeof target!=='object'){
1742
- throw TypeError('target musts be an object');
1743
- }
1744
-
1745
- var emitter= this;
1746
-
1747
- options = resolveOptions(options, {
1748
- on: undefined,
1749
- off: undefined,
1750
- reducers: undefined
1751
- }, {
1752
- on: functionReducer,
1753
- off: functionReducer,
1754
- reducers: objectFunctionReducer
1755
- });
1756
-
1757
- function listen(events){
1758
- if(typeof events!=='object'){
1759
- throw TypeError('events must be an object');
1760
- }
1761
-
1762
- var reducers= options.reducers;
1763
- var index= findTargetIndex.call(emitter, target);
1764
- var observer;
1765
-
1766
- if(index===-1){
1767
- observer= new TargetObserver(emitter, target, options);
1768
- }else{
1769
- observer= emitter._observers[index];
1770
- }
1771
-
1772
- var keys= ownKeys(events);
1773
- var len= keys.length;
1774
- var event;
1775
- var isSingleReducer= typeof reducers==='function';
1776
-
1777
- for(var i=0; i<len; i++){
1778
- event= keys[i];
1779
- observer.subscribe(
1780
- event,
1781
- events[event] || event,
1782
- isSingleReducer ? reducers : reducers && reducers[event]
1783
- );
1784
- }
1785
- }
1786
-
1787
- isArray(events)?
1788
- listen(toObject(events)) :
1789
- (typeof events==='string'? listen(toObject(events.split(/\s+/))): listen(events));
1790
-
1791
- return this;
1792
- };
1793
-
1794
- EventEmitter.prototype.stopListeningTo = function (target, event) {
1795
- var observers = this._observers;
1796
-
1797
- if(!observers){
1798
- return false;
1799
- }
1800
-
1801
- var i = observers.length;
1802
- var observer;
1803
- var matched= false;
1804
-
1805
- if(target && typeof target!=='object'){
1806
- throw TypeError('target should be an object');
1807
- }
1808
-
1809
- while (i-- > 0) {
1810
- observer = observers[i];
1811
- if (!target || observer._target === target) {
1812
- observer.unsubscribe(event);
1813
- matched= true;
1814
- }
1815
- }
1816
-
1817
- return matched;
1818
- };
1819
-
1820
- // By default EventEmitters will print a warning if more than
1821
- // 10 listeners are added to it. This is a useful default which
1822
- // helps finding memory leaks.
1823
- //
1824
- // Obviously not all Emitters should be limited to 10. This function allows
1825
- // that to be increased. Set to zero for unlimited.
1826
-
1827
- EventEmitter.prototype.delimiter = '.';
1828
-
1829
- EventEmitter.prototype.setMaxListeners = function(n) {
1830
- if (n !== undefined) {
1831
- this._maxListeners = n;
1832
- if (!this._conf) this._conf = {};
1833
- this._conf.maxListeners = n;
1834
- }
1835
- };
1836
-
1837
- EventEmitter.prototype.getMaxListeners = function() {
1838
- return this._maxListeners;
1839
- };
1840
-
1841
- EventEmitter.prototype.event = '';
1842
-
1843
- EventEmitter.prototype.once = function(event, fn, options) {
1844
- return this._once(event, fn, false, options);
1845
- };
1846
-
1847
- EventEmitter.prototype.prependOnceListener = function(event, fn, options) {
1848
- return this._once(event, fn, true, options);
1849
- };
1850
-
1851
- EventEmitter.prototype._once = function(event, fn, prepend, options) {
1852
- return this._many(event, 1, fn, prepend, options);
1853
- };
1854
-
1855
- EventEmitter.prototype.many = function(event, ttl, fn, options) {
1856
- return this._many(event, ttl, fn, false, options);
1857
- };
1858
-
1859
- EventEmitter.prototype.prependMany = function(event, ttl, fn, options) {
1860
- return this._many(event, ttl, fn, true, options);
1861
- };
1862
-
1863
- EventEmitter.prototype._many = function(event, ttl, fn, prepend, options) {
1864
- var self = this;
1865
-
1866
- if (typeof fn !== 'function') {
1867
- throw new Error('many only accepts instances of Function');
1868
- }
1869
-
1870
- function listener() {
1871
- if (--ttl === 0) {
1872
- self.off(event, listener);
1873
- }
1874
- return fn.apply(this, arguments);
1875
- }
1876
-
1877
- listener._origin = fn;
1878
-
1879
- return this._on(event, listener, prepend, options);
1880
- };
1881
-
1882
- EventEmitter.prototype.emit = function() {
1883
- if (!this._events && !this._all) {
1884
- return false;
1885
- }
1886
-
1887
- this._events || init.call(this);
1888
-
1889
- var type = arguments[0], ns, wildcard= this.wildcard;
1890
- var args,l,i,j, containsSymbol;
1891
-
1892
- if (type === 'newListener' && !this._newListener) {
1893
- if (!this._events.newListener) {
1894
- return false;
1895
- }
1896
- }
1897
-
1898
- if (wildcard) {
1899
- ns= type;
1900
- if(type!=='newListener' && type!=='removeListener'){
1901
- if (typeof type === 'object') {
1902
- l = type.length;
1903
- if (symbolsSupported) {
1904
- for (i = 0; i < l; i++) {
1905
- if (typeof type[i] === 'symbol') {
1906
- containsSymbol = true;
1907
- break;
1908
- }
1909
- }
1910
- }
1911
- if (!containsSymbol) {
1912
- type = type.join(this.delimiter);
1913
- }
1914
- }
1915
- }
1916
- }
1917
-
1918
- var al = arguments.length;
1919
- var handler;
1920
-
1921
- if (this._all && this._all.length) {
1922
- handler = this._all.slice();
1923
-
1924
- for (i = 0, l = handler.length; i < l; i++) {
1925
- this.event = type;
1926
- switch (al) {
1927
- case 1:
1928
- handler[i].call(this, type);
1929
- break;
1930
- case 2:
1931
- handler[i].call(this, type, arguments[1]);
1932
- break;
1933
- case 3:
1934
- handler[i].call(this, type, arguments[1], arguments[2]);
1935
- break;
1936
- default:
1937
- handler[i].apply(this, arguments);
1938
- }
1939
- }
1940
- }
1941
-
1942
- if (wildcard) {
1943
- handler = [];
1944
- searchListenerTree.call(this, handler, ns, this.listenerTree, 0, l);
1945
- } else {
1946
- handler = this._events[type];
1947
- if (typeof handler === 'function') {
1948
- this.event = type;
1949
- switch (al) {
1950
- case 1:
1951
- handler.call(this);
1952
- break;
1953
- case 2:
1954
- handler.call(this, arguments[1]);
1955
- break;
1956
- case 3:
1957
- handler.call(this, arguments[1], arguments[2]);
1958
- break;
1959
- default:
1960
- args = new Array(al - 1);
1961
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
1962
- handler.apply(this, args);
1963
- }
1964
- return true;
1965
- } else if (handler) {
1966
- // need to make copy of handlers because list can change in the middle
1967
- // of emit call
1968
- handler = handler.slice();
1969
- }
1970
- }
1971
-
1972
- if (handler && handler.length) {
1973
- if (al > 3) {
1974
- args = new Array(al - 1);
1975
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
1976
- }
1977
- for (i = 0, l = handler.length; i < l; i++) {
1978
- this.event = type;
1979
- switch (al) {
1980
- case 1:
1981
- handler[i].call(this);
1982
- break;
1983
- case 2:
1984
- handler[i].call(this, arguments[1]);
1985
- break;
1986
- case 3:
1987
- handler[i].call(this, arguments[1], arguments[2]);
1988
- break;
1989
- default:
1990
- handler[i].apply(this, args);
1991
- }
1992
- }
1993
- return true;
1994
- } else if (!this.ignoreErrors && !this._all && type === 'error') {
1995
- if (arguments[1] instanceof Error) {
1996
- throw arguments[1]; // Unhandled 'error' event
1997
- } else {
1998
- throw new Error("Uncaught, unspecified 'error' event.");
1999
- }
2000
- }
2001
-
2002
- return !!this._all;
2003
- };
2004
-
2005
- EventEmitter.prototype.emitAsync = function() {
2006
- if (!this._events && !this._all) {
2007
- return false;
2008
- }
2009
-
2010
- this._events || init.call(this);
2011
-
2012
- var type = arguments[0], wildcard= this.wildcard, ns, containsSymbol;
2013
- var args,l,i,j;
2014
-
2015
- if (type === 'newListener' && !this._newListener) {
2016
- if (!this._events.newListener) { return Promise.resolve([false]); }
2017
- }
2018
-
2019
- if (wildcard) {
2020
- ns= type;
2021
- if(type!=='newListener' && type!=='removeListener'){
2022
- if (typeof type === 'object') {
2023
- l = type.length;
2024
- if (symbolsSupported) {
2025
- for (i = 0; i < l; i++) {
2026
- if (typeof type[i] === 'symbol') {
2027
- containsSymbol = true;
2028
- break;
2029
- }
2030
- }
2031
- }
2032
- if (!containsSymbol) {
2033
- type = type.join(this.delimiter);
2034
- }
2035
- }
2036
- }
2037
- }
2038
-
2039
- var promises= [];
2040
-
2041
- var al = arguments.length;
2042
- var handler;
2043
-
2044
- if (this._all) {
2045
- for (i = 0, l = this._all.length; i < l; i++) {
2046
- this.event = type;
2047
- switch (al) {
2048
- case 1:
2049
- promises.push(this._all[i].call(this, type));
2050
- break;
2051
- case 2:
2052
- promises.push(this._all[i].call(this, type, arguments[1]));
2053
- break;
2054
- case 3:
2055
- promises.push(this._all[i].call(this, type, arguments[1], arguments[2]));
2056
- break;
2057
- default:
2058
- promises.push(this._all[i].apply(this, arguments));
2059
- }
2060
- }
2061
- }
2062
-
2063
- if (wildcard) {
2064
- handler = [];
2065
- searchListenerTree.call(this, handler, ns, this.listenerTree, 0);
2066
- } else {
2067
- handler = this._events[type];
29
+ function EE(fn, context, once) {
30
+ this.fn = fn;
31
+ this.context = context;
32
+ this.once = once || false;
33
+ }
34
+ function addListener(emitter, event, fn, context, once) {
35
+ if (typeof fn !== "function") {
36
+ throw new TypeError("The listener must be a function");
37
+ }
38
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
39
+ if (!emitter._events[evt])
40
+ emitter._events[evt] = listener, emitter._eventsCount++;
41
+ else if (!emitter._events[evt].fn)
42
+ emitter._events[evt].push(listener);
43
+ else
44
+ emitter._events[evt] = [emitter._events[evt], listener];
45
+ return emitter;
46
+ }
47
+ function clearEvent(emitter, evt) {
48
+ if (--emitter._eventsCount === 0)
49
+ emitter._events = new Events;
50
+ else
51
+ delete emitter._events[evt];
52
+ }
53
+ function EventEmitter() {
54
+ this._events = new Events;
55
+ this._eventsCount = 0;
56
+ }
57
+ EventEmitter.prototype.eventNames = function eventNames() {
58
+ var names = [], events, name;
59
+ if (this._eventsCount === 0)
60
+ return names;
61
+ for (name in events = this._events) {
62
+ if (has.call(events, name))
63
+ names.push(prefix ? name.slice(1) : name);
64
+ }
65
+ if (Object.getOwnPropertySymbols) {
66
+ return names.concat(Object.getOwnPropertySymbols(events));
67
+ }
68
+ return names;
69
+ };
70
+ EventEmitter.prototype.listeners = function listeners(event) {
71
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
72
+ if (!handlers)
73
+ return [];
74
+ if (handlers.fn)
75
+ return [handlers.fn];
76
+ for (var i = 0, l = handlers.length, ee = new Array(l);i < l; i++) {
77
+ ee[i] = handlers[i].fn;
2068
78
  }
2069
-
2070
- if (typeof handler === 'function') {
2071
- this.event = type;
2072
- switch (al) {
2073
- case 1:
2074
- promises.push(handler.call(this));
2075
- break;
2076
- case 2:
2077
- promises.push(handler.call(this, arguments[1]));
2078
- break;
2079
- case 3:
2080
- promises.push(handler.call(this, arguments[1], arguments[2]));
2081
- break;
2082
- default:
2083
- args = new Array(al - 1);
2084
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
2085
- promises.push(handler.apply(this, args));
2086
- }
2087
- } else if (handler && handler.length) {
2088
- handler = handler.slice();
2089
- if (al > 3) {
2090
- args = new Array(al - 1);
2091
- for (j = 1; j < al; j++) args[j - 1] = arguments[j];
2092
- }
2093
- for (i = 0, l = handler.length; i < l; i++) {
2094
- this.event = type;
2095
- switch (al) {
79
+ return ee;
80
+ };
81
+ EventEmitter.prototype.listenerCount = function listenerCount(event) {
82
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
83
+ if (!listeners)
84
+ return 0;
85
+ if (listeners.fn)
86
+ return 1;
87
+ return listeners.length;
88
+ };
89
+ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
90
+ var evt = prefix ? prefix + event : event;
91
+ if (!this._events[evt])
92
+ return false;
93
+ var listeners = this._events[evt], len = arguments.length, args, i;
94
+ if (listeners.fn) {
95
+ if (listeners.once)
96
+ this.removeListener(event, listeners.fn, undefined, true);
97
+ switch (len) {
2096
98
  case 1:
2097
- promises.push(handler[i].call(this));
2098
- break;
99
+ return listeners.fn.call(listeners.context), true;
2099
100
  case 2:
2100
- promises.push(handler[i].call(this, arguments[1]));
2101
- break;
101
+ return listeners.fn.call(listeners.context, a1), true;
2102
102
  case 3:
2103
- promises.push(handler[i].call(this, arguments[1], arguments[2]));
2104
- break;
2105
- default:
2106
- promises.push(handler[i].apply(this, args));
103
+ return listeners.fn.call(listeners.context, a1, a2), true;
104
+ case 4:
105
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
106
+ case 5:
107
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
108
+ case 6:
109
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
110
+ }
111
+ for (i = 1, args = new Array(len - 1);i < len; i++) {
112
+ args[i - 1] = arguments[i];
113
+ }
114
+ listeners.fn.apply(listeners.context, args);
115
+ } else {
116
+ var length = listeners.length, j;
117
+ for (i = 0;i < length; i++) {
118
+ if (listeners[i].once)
119
+ this.removeListener(event, listeners[i].fn, undefined, true);
120
+ switch (len) {
121
+ case 1:
122
+ listeners[i].fn.call(listeners[i].context);
123
+ break;
124
+ case 2:
125
+ listeners[i].fn.call(listeners[i].context, a1);
126
+ break;
127
+ case 3:
128
+ listeners[i].fn.call(listeners[i].context, a1, a2);
129
+ break;
130
+ case 4:
131
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
132
+ break;
133
+ default:
134
+ if (!args)
135
+ for (j = 1, args = new Array(len - 1);j < len; j++) {
136
+ args[j - 1] = arguments[j];
137
+ }
138
+ listeners[i].fn.apply(listeners[i].context, args);
2107
139
  }
2108
140
  }
2109
- } else if (!this.ignoreErrors && !this._all && type === 'error') {
2110
- if (arguments[1] instanceof Error) {
2111
- return Promise.reject(arguments[1]); // Unhandled 'error' event
2112
- } else {
2113
- return Promise.reject("Uncaught, unspecified 'error' event.");
2114
- }
2115
141
  }
2116
-
2117
- return Promise.all(promises);
2118
- };
2119
-
2120
- EventEmitter.prototype.on = function(type, listener, options) {
2121
- return this._on(type, listener, false, options);
2122
- };
2123
-
2124
- EventEmitter.prototype.prependListener = function(type, listener, options) {
2125
- return this._on(type, listener, true, options);
2126
- };
2127
-
2128
- EventEmitter.prototype.onAny = function(fn) {
2129
- return this._onAny(fn, false);
142
+ return true;
2130
143
  };
2131
-
2132
- EventEmitter.prototype.prependAny = function(fn) {
2133
- return this._onAny(fn, true);
144
+ EventEmitter.prototype.on = function on(event, fn, context) {
145
+ return addListener(this, event, fn, context, false);
2134
146
  };
2135
-
2136
- EventEmitter.prototype.addListener = EventEmitter.prototype.on;
2137
-
2138
- EventEmitter.prototype._onAny = function(fn, prepend){
2139
- if (typeof fn !== 'function') {
2140
- throw new Error('onAny only accepts instances of Function');
2141
- }
2142
-
2143
- if (!this._all) {
2144
- this._all = [];
2145
- }
2146
-
2147
- // Add the function to the event listener collection.
2148
- if(prepend){
2149
- this._all.unshift(fn);
2150
- }else{
2151
- this._all.push(fn);
2152
- }
2153
-
2154
- return this;
147
+ EventEmitter.prototype.once = function once(event, fn, context) {
148
+ return addListener(this, event, fn, context, true);
2155
149
  };
2156
-
2157
- EventEmitter.prototype._on = function(type, listener, prepend, options) {
2158
- if (typeof type === 'function') {
2159
- this._onAny(type, listener);
150
+ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
151
+ var evt = prefix ? prefix + event : event;
152
+ if (!this._events[evt])
153
+ return this;
154
+ if (!fn) {
155
+ clearEvent(this, evt);
2160
156
  return this;
2161
157
  }
2162
-
2163
- if (typeof listener !== 'function') {
2164
- throw new Error('on only accepts instances of Function');
2165
- }
2166
- this._events || init.call(this);
2167
-
2168
- var returnValue= this, temp;
2169
-
2170
- if (options !== undefined) {
2171
- temp = setupListener.call(this, type, listener, options);
2172
- listener = temp[0];
2173
- returnValue = temp[1];
2174
- }
2175
-
2176
- // To avoid recursion in the case that type == "newListeners"! Before
2177
- // adding it to the listeners, first emit "newListeners".
2178
- if (this._newListener) {
2179
- this.emit('newListener', type, listener);
2180
- }
2181
-
2182
- if (this.wildcard) {
2183
- growListenerTree.call(this, type, listener, prepend);
2184
- return returnValue;
2185
- }
2186
-
2187
- if (!this._events[type]) {
2188
- // Optimize the case of one listener. Don't need the extra array object.
2189
- this._events[type] = listener;
2190
- } else {
2191
- if (typeof this._events[type] === 'function') {
2192
- // Change to array.
2193
- this._events[type] = [this._events[type]];
2194
- }
2195
-
2196
- // If we've already got an array, just add
2197
- if(prepend){
2198
- this._events[type].unshift(listener);
2199
- }else{
2200
- this._events[type].push(listener);
2201
- }
2202
-
2203
- // Check for listener leak
2204
- if (
2205
- !this._events[type].warned &&
2206
- this._maxListeners > 0 &&
2207
- this._events[type].length > this._maxListeners
2208
- ) {
2209
- this._events[type].warned = true;
2210
- logPossibleMemoryLeak.call(this, this._events[type].length, type);
158
+ var listeners = this._events[evt];
159
+ if (listeners.fn) {
160
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
161
+ clearEvent(this, evt);
2211
162
  }
2212
- }
2213
-
2214
- return returnValue;
2215
- };
2216
-
2217
- EventEmitter.prototype.off = function(type, listener) {
2218
- if (typeof listener !== 'function') {
2219
- throw new Error('removeListener only takes instances of Function');
2220
- }
2221
-
2222
- var handlers,leafs=[];
2223
-
2224
- if(this.wildcard) {
2225
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2226
- leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);
2227
- if(!leafs) return this;
2228
163
  } else {
2229
- // does not use listeners(), so no side effect of creating _events[type]
2230
- if (!this._events[type]) return this;
2231
- handlers = this._events[type];
2232
- leafs.push({_listeners:handlers});
2233
- }
2234
-
2235
- for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {
2236
- var leaf = leafs[iLeaf];
2237
- handlers = leaf._listeners;
2238
- if (isArray(handlers)) {
2239
-
2240
- var position = -1;
2241
-
2242
- for (var i = 0, length = handlers.length; i < length; i++) {
2243
- if (handlers[i] === listener ||
2244
- (handlers[i].listener && handlers[i].listener === listener) ||
2245
- (handlers[i]._origin && handlers[i]._origin === listener)) {
2246
- position = i;
2247
- break;
2248
- }
2249
- }
2250
-
2251
- if (position < 0) {
2252
- continue;
2253
- }
2254
-
2255
- if(this.wildcard) {
2256
- leaf._listeners.splice(position, 1);
2257
- }
2258
- else {
2259
- this._events[type].splice(position, 1);
164
+ for (var i = 0, events = [], length = listeners.length;i < length; i++) {
165
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
166
+ events.push(listeners[i]);
2260
167
  }
2261
-
2262
- if (handlers.length === 0) {
2263
- if(this.wildcard) {
2264
- delete leaf._listeners;
2265
- }
2266
- else {
2267
- delete this._events[type];
2268
- }
2269
- }
2270
- if (this._removeListener)
2271
- this.emit("removeListener", type, listener);
2272
-
2273
- return this;
2274
- }
2275
- else if (handlers === listener ||
2276
- (handlers.listener && handlers.listener === listener) ||
2277
- (handlers._origin && handlers._origin === listener)) {
2278
- if(this.wildcard) {
2279
- delete leaf._listeners;
2280
- }
2281
- else {
2282
- delete this._events[type];
2283
- }
2284
- if (this._removeListener)
2285
- this.emit("removeListener", type, listener);
2286
168
  }
169
+ if (events.length)
170
+ this._events[evt] = events.length === 1 ? events[0] : events;
171
+ else
172
+ clearEvent(this, evt);
2287
173
  }
2288
-
2289
- this.listenerTree && recursivelyGarbageCollect(this.listenerTree);
2290
-
2291
174
  return this;
2292
175
  };
2293
-
2294
- EventEmitter.prototype.offAny = function(fn) {
2295
- var i = 0, l = 0, fns;
2296
- if (fn && this._all && this._all.length > 0) {
2297
- fns = this._all;
2298
- for(i = 0, l = fns.length; i < l; i++) {
2299
- if(fn === fns[i]) {
2300
- fns.splice(i, 1);
2301
- if (this._removeListener)
2302
- this.emit("removeListenerAny", fn);
2303
- return this;
2304
- }
2305
- }
176
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
177
+ var evt;
178
+ if (event) {
179
+ evt = prefix ? prefix + event : event;
180
+ if (this._events[evt])
181
+ clearEvent(this, evt);
2306
182
  } else {
2307
- fns = this._all;
2308
- if (this._removeListener) {
2309
- for(i = 0, l = fns.length; i < l; i++)
2310
- this.emit("removeListenerAny", fns[i]);
2311
- }
2312
- this._all = [];
183
+ this._events = new Events;
184
+ this._eventsCount = 0;
2313
185
  }
2314
186
  return this;
2315
187
  };
188
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
189
+ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
190
+ EventEmitter.prefixed = prefix;
191
+ EventEmitter.EventEmitter = EventEmitter;
192
+ if (typeof module !== "undefined") {
193
+ module.exports = EventEmitter;
194
+ }
195
+ });
2316
196
 
2317
- EventEmitter.prototype.removeListener = EventEmitter.prototype.off;
197
+ // ../../node_modules/eventemitter3/index.mjs
198
+ var import__ = __toESM(require_eventemitter3(), 1);
199
+ var eventemitter3_default = import__.default;
2318
200
 
2319
- EventEmitter.prototype.removeAllListeners = function (type) {
2320
- if (type === undefined) {
2321
- !this._events || init.call(this);
2322
- return this;
201
+ // ../activity-streams/src/activity-streams.ts
202
+ /*!
203
+ * activity-streams
204
+ * https://github.com/silverbucket/activity-streams
205
+ *
206
+ * Developed and Maintained by:
207
+ * Nick Jennings <nick@silverbucket.net>
208
+ *
209
+ * activity-streams is released under the MIT (see LICENSE).
210
+ *
211
+ * You don't have to do anything special to choose one license or the other
212
+ * and you don't have to notify anyone which license you are using.
213
+ * Please see the corresponding license file for details of these licenses.
214
+ * You are free to use, modify and distribute this software, but all copyright
215
+ * information must remain.
216
+ *
217
+ */
218
+ var ee = new eventemitter3_default;
219
+ var baseProps = {
220
+ stream: [
221
+ "id",
222
+ "type",
223
+ "actor",
224
+ "target",
225
+ "object",
226
+ "context",
227
+ "context",
228
+ "published",
229
+ "error"
230
+ ],
231
+ object: [
232
+ "id",
233
+ "type",
234
+ "context",
235
+ "alias",
236
+ "attachedTo",
237
+ "attachment",
238
+ "attributedTo",
239
+ "attributedWith",
240
+ "condition",
241
+ "content",
242
+ "contentMap",
243
+ "context",
244
+ "contextOf",
245
+ "name",
246
+ "endTime",
247
+ "generator",
248
+ "generatorOf",
249
+ "group",
250
+ "icon",
251
+ "image",
252
+ "inReplyTo",
253
+ "members",
254
+ "memberOf",
255
+ "message",
256
+ "location",
257
+ "locationOf",
258
+ "objectOf",
259
+ "originOf",
260
+ "presence",
261
+ "preview",
262
+ "previewOf",
263
+ "provider",
264
+ "providerOf",
265
+ "published",
266
+ "rating",
267
+ "relationship",
268
+ "resultOf",
269
+ "replies",
270
+ "role",
271
+ "scope",
272
+ "scopeOf",
273
+ "startTime",
274
+ "status",
275
+ "summary",
276
+ "topic",
277
+ "tag",
278
+ "tagOf",
279
+ "targetOf",
280
+ "title",
281
+ "titleMap",
282
+ "updated",
283
+ "url",
284
+ "xmpp:stanza-id"
285
+ ]
286
+ };
287
+ var rename = {
288
+ "@id": "id",
289
+ "@type": "type",
290
+ verb: "type",
291
+ displayName: "name",
292
+ objectType: "type",
293
+ platform: "context"
294
+ };
295
+ var expand = {
296
+ actor: {
297
+ primary: "id",
298
+ props: baseProps
299
+ },
300
+ target: {
301
+ primary: "id",
302
+ props: baseProps
303
+ },
304
+ object: {
305
+ primary: "content",
306
+ props: baseProps
307
+ }
308
+ };
309
+ var objs = new Map;
310
+ var customProps = {};
311
+ var failOnUnknownObjectProperties = false;
312
+ var warnOnUnknownObjectProperties = true;
313
+ var specialObjs = [];
314
+ function matchesCustomProp(type, key) {
315
+ if (customProps[type] instanceof Object) {
316
+ const obj = customProps[type];
317
+ if (obj.includes(key)) {
318
+ return true;
2323
319
  }
2324
-
2325
- if (this.wildcard) {
2326
- var leafs = searchListenerTree.call(this, null, type, this.listenerTree, 0), leaf, i;
2327
- if (!leafs) return this;
2328
- for (i = 0; i < leafs.length; i++) {
2329
- leaf = leafs[i];
2330
- leaf._listeners = null;
2331
- }
2332
- this.listenerTree && recursivelyGarbageCollect(this.listenerTree);
2333
- } else if (this._events) {
2334
- this._events[type] = null;
320
+ }
321
+ return false;
322
+ }
323
+ function renameProp(obj, key) {
324
+ obj[rename[key]] = obj[key];
325
+ delete obj[key];
326
+ return obj;
327
+ }
328
+ function validateObject(type, incomingObj, requireId = false) {
329
+ if (incomingObj === null) {
330
+ throw new Error(`ActivityStreams validation failed: the "${type}" property is null. Example: { id: "user@example.com", type: "person" }`);
331
+ }
332
+ if (incomingObj === undefined) {
333
+ throw new Error(`ActivityStreams validation failed: the "${type}" property is undefined. Example: { id: "user@example.com", type: "person" }`);
334
+ }
335
+ if (typeof incomingObj === "string") {
336
+ throw new Error(`ActivityStreams validation failed: the "${type}" property received string "${incomingObj}" but expected an object. Use: { id: "${incomingObj}", type: "person" }`);
337
+ }
338
+ if (typeof incomingObj !== "object" || Array.isArray(incomingObj)) {
339
+ const receivedType = Array.isArray(incomingObj) ? "array" : typeof incomingObj;
340
+ const receivedValue = String(incomingObj);
341
+ throw new Error(`ActivityStreams validation failed: the "${type}" property must be an object, received ${receivedType} (${receivedValue}). Example: { id: "user@example.com", type: "person" }`);
342
+ }
343
+ const obj = incomingObj;
344
+ if (requireId && !obj.id) {
345
+ throw new Error(`ActivityStreams validation failed: the "${type}" property requires an 'id' property. Example: { id: "user@example.com", type: "person" }`);
346
+ }
347
+ const unknownKeys = Object.keys(incomingObj).filter((key) => {
348
+ return !baseProps[type].includes(key);
349
+ });
350
+ for (const key of unknownKeys) {
351
+ let ao = incomingObj;
352
+ if (rename[key]) {
353
+ ao = renameProp(ao, key);
354
+ continue;
2335
355
  }
2336
- return this;
2337
- };
2338
-
2339
- EventEmitter.prototype.listeners = function (type) {
2340
- var _events = this._events;
2341
- var keys, listeners, allListeners;
2342
- var i;
2343
- var listenerTree;
2344
-
2345
- if (type === undefined) {
2346
- if (this.wildcard) {
2347
- throw Error('event name required for wildcard emitter');
356
+ if (matchesCustomProp(ao.type, key)) {
357
+ continue;
358
+ }
359
+ if (!specialObjs.includes(ao.type)) {
360
+ console.log(ao);
361
+ const receivedValue = typeof ao[key] === "string" ? `"${ao[key]}"` : String(ao[key]);
362
+ const err = `ActivityStreams validation failed: property "${key}" with value ${receivedValue} is not allowed on the "${type}" object of type "${ao.type}".`;
363
+ if (failOnUnknownObjectProperties) {
364
+ throw new Error(err);
2348
365
  }
2349
-
2350
- if (!_events) {
2351
- return [];
366
+ if (warnOnUnknownObjectProperties) {
367
+ console.warn(err);
2352
368
  }
2353
-
2354
- keys = ownKeys(_events);
2355
- i = keys.length;
2356
- allListeners = [];
2357
- while (i-- > 0) {
2358
- listeners = _events[keys[i]];
2359
- if (typeof listeners === 'function') {
2360
- allListeners.push(listeners);
2361
- } else {
2362
- allListeners.push.apply(allListeners, listeners);
369
+ }
370
+ }
371
+ }
372
+ function ensureProps(obj) {
373
+ return obj;
374
+ }
375
+ function expandStream(meta) {
376
+ const stream = {};
377
+ for (const key of Object.keys(meta)) {
378
+ if (typeof meta[key] === "string") {
379
+ stream[key] = objs.get(meta[key]) || meta[key];
380
+ } else if (Array.isArray(meta[key])) {
381
+ stream[key] = [];
382
+ for (const entry of meta[key]) {
383
+ if (typeof entry === "string") {
384
+ stream[key].push(objs.get(entry) || entry);
2363
385
  }
2364
386
  }
2365
- return allListeners;
2366
387
  } else {
2367
- if (this.wildcard) {
2368
- listenerTree= this.listenerTree;
2369
- if(!listenerTree) return [];
2370
- var handlers = [];
2371
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2372
- searchListenerTree.call(this, handlers, ns, listenerTree, 0);
2373
- return handlers;
2374
- }
2375
-
2376
- if (!_events) {
2377
- return [];
2378
- }
2379
-
2380
- listeners = _events[type];
2381
-
2382
- if (!listeners) {
2383
- return [];
2384
- }
2385
- return typeof listeners === 'function' ? [listeners] : listeners;
388
+ stream[key] = meta[key];
2386
389
  }
2387
- };
2388
-
2389
- EventEmitter.prototype.eventNames = function(nsAsArray){
2390
- var _events= this._events;
2391
- return this.wildcard? collectTreeEvents.call(this, this.listenerTree, [], null, nsAsArray) : (_events? ownKeys(_events) : []);
2392
- };
2393
-
2394
- EventEmitter.prototype.listenerCount = function(type) {
2395
- return this.listeners(type).length;
2396
- };
2397
-
2398
- EventEmitter.prototype.hasListeners = function (type) {
2399
- if (this.wildcard) {
2400
- var handlers = [];
2401
- var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
2402
- searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);
2403
- return handlers.length > 0;
390
+ }
391
+ for (const key of Object.keys(expand)) {
392
+ if (typeof stream[key] === "string") {
393
+ const idx = expand[key].primary;
394
+ const obj = {};
395
+ obj[idx] = stream[key];
396
+ stream[key] = obj;
2404
397
  }
2405
-
2406
- var _events = this._events;
2407
- var _all = this._all;
2408
-
2409
- return !!(_all && _all.length || _events && (type === undefined ? ownKeys(_events).length : _events[type]));
2410
- };
2411
-
2412
- EventEmitter.prototype.listenersAny = function() {
2413
-
2414
- if(this._all) {
2415
- return this._all;
398
+ }
399
+ return stream;
400
+ }
401
+ function Stream(meta) {
402
+ validateObject("stream", meta);
403
+ if (typeof meta.object === "object") {
404
+ validateObject("object", meta.object);
405
+ }
406
+ const stream = expandStream(meta);
407
+ ee.emit("activity-stream", stream);
408
+ return stream;
409
+ }
410
+ var _Object = {
411
+ create: (obj) => {
412
+ validateObject("object", obj, true);
413
+ const ao = ensureProps(obj);
414
+ objs.set(ao.id, ao);
415
+ ee.emit("activity-object-create", ao);
416
+ return ao;
417
+ },
418
+ delete: (id) => {
419
+ const result = objs.delete(id);
420
+ if (result) {
421
+ ee.emit("activity-object-delete", id);
2416
422
  }
2417
- else {
2418
- return [];
423
+ return result;
424
+ },
425
+ get: (id, expand2) => {
426
+ let obj = objs.get(id);
427
+ if (!obj) {
428
+ if (!expand2) {
429
+ return id;
430
+ }
431
+ obj = { id };
2419
432
  }
2420
-
2421
- };
2422
-
2423
- EventEmitter.prototype.waitFor = function (event, options) {
2424
- var self = this;
2425
- var type = typeof options;
2426
- if (type === 'number') {
2427
- options = {timeout: options};
2428
- } else if (type === 'function') {
2429
- options = {filter: options};
433
+ return ensureProps(obj);
434
+ },
435
+ list: () => objs.keys()
436
+ };
437
+ function ASFactory(opts = {}) {
438
+ specialObjs = opts?.specialObjs || [];
439
+ failOnUnknownObjectProperties = typeof opts.failOnUnknownObjectProperties === "boolean" ? opts.failOnUnknownObjectProperties : failOnUnknownObjectProperties;
440
+ warnOnUnknownObjectProperties = typeof opts.warnOnUnknownObjectProperties === "boolean" ? opts.warnOnUnknownObjectProperties : warnOnUnknownObjectProperties;
441
+ for (const propName of Object.keys(opts.customProps || {})) {
442
+ if (typeof opts.customProps[propName] === "object") {
443
+ customProps[propName] = opts.customProps[propName];
2430
444
  }
445
+ }
446
+ return {
447
+ Stream,
448
+ Object: _Object,
449
+ on: (event, func) => ee.on(event, func),
450
+ once: (event, func) => ee.once(event, func),
451
+ off: (event, funcName) => ee.off(event, funcName)
452
+ };
453
+ }
454
+ ((global) => {
455
+ global.ASFactor = ASFactory;
456
+ })(typeof window === "object" ? window : {});
2431
457
 
2432
- options= resolveOptions(options, {
2433
- timeout: 0,
2434
- filter: undefined,
2435
- handleError: false,
2436
- Promise: Promise,
2437
- overload: false
2438
- }, {
2439
- filter: functionReducer,
2440
- Promise: constructorReducer
2441
- });
2442
-
2443
- return makeCancelablePromise(options.Promise, function (resolve, reject, onCancel) {
2444
- function listener() {
2445
- var filter= options.filter;
2446
- if (filter && !filter.apply(self, arguments)) {
2447
- return;
2448
- }
2449
- self.off(event, listener);
2450
- if (options.handleError) {
2451
- var err = arguments[0];
2452
- err ? reject(err) : resolve(toArray.apply(null, arguments).slice(1));
458
+ // src/sockethub-client.ts
459
+ class SockethubClient {
460
+ events = {
461
+ credentials: new Map,
462
+ "activity-object": new Map,
463
+ connect: new Map,
464
+ join: new Map
465
+ };
466
+ _socket;
467
+ ActivityStreams;
468
+ socket;
469
+ debug = true;
470
+ constructor(socket) {
471
+ if (!socket) {
472
+ throw new Error("SockethubClient requires a socket.io instance");
473
+ }
474
+ this._socket = socket;
475
+ this.socket = this.createPublicEmitter();
476
+ this.registerSocketIOHandlers();
477
+ this.initActivityStreams();
478
+ this.ActivityStreams.on("activity-object-create", (obj) => {
479
+ socket.emit("activity-object", obj, (err) => {
480
+ if (err) {
481
+ console.error("failed to create activity-object ", err);
2453
482
  } else {
2454
- resolve(toArray.apply(null, arguments));
483
+ this.eventActivityObject(obj);
2455
484
  }
2456
- }
2457
-
2458
- onCancel(function(){
2459
- self.off(event, listener);
2460
485
  });
2461
-
2462
- self._on(event, listener, false);
2463
- }, {
2464
- timeout: options.timeout,
2465
- overload: options.overload
2466
- })
2467
- };
2468
-
2469
- function once(emitter, name, options) {
2470
- options= resolveOptions(options, {
2471
- Promise: Promise,
2472
- timeout: 0,
2473
- overload: false
2474
- }, {
2475
- Promise: constructorReducer
2476
486
  });
2477
-
2478
- var _Promise= options.Promise;
2479
-
2480
- return makeCancelablePromise(_Promise, function(resolve, reject, onCancel){
2481
- var handler;
2482
- if (typeof emitter.addEventListener === 'function') {
2483
- handler= function () {
2484
- resolve(toArray.apply(null, arguments));
2485
- };
2486
-
2487
- onCancel(function(){
2488
- emitter.removeEventListener(name, handler);
2489
- });
2490
-
2491
- emitter.addEventListener(
2492
- name,
2493
- handler,
2494
- {once: true}
2495
- );
2496
- return;
2497
- }
2498
-
2499
- var eventListener = function(){
2500
- errorListener && emitter.removeListener('error', errorListener);
2501
- resolve(toArray.apply(null, arguments));
487
+ socket.on("activity-object", (obj) => {
488
+ this.ActivityStreams.Object.create(obj);
489
+ });
490
+ }
491
+ initActivityStreams() {
492
+ this.ActivityStreams = ASFactory({ specialObjs: ["credentials"] });
493
+ }
494
+ clearCredentials() {
495
+ this.events.credentials.clear();
496
+ }
497
+ createPublicEmitter() {
498
+ const socket = new eventemitter3_default;
499
+ socket._emit = socket.emit;
500
+ socket.emit = (event, content, callback) => {
501
+ if (event === "credentials") {
502
+ this.eventCredentials(content);
503
+ } else if (event === "activity-object") {
504
+ this.eventActivityObject(content);
505
+ } else if (event === "message") {
506
+ this.eventMessage(content);
507
+ }
508
+ this._socket.emit(event, content, callback);
509
+ };
510
+ socket.connected = false;
511
+ socket.disconnect = () => {
512
+ this._socket.disconnect();
513
+ };
514
+ socket.connect = () => {
515
+ this._socket.connect();
516
+ };
517
+ return socket;
518
+ }
519
+ eventActivityObject(content) {
520
+ if (content.id) {
521
+ this.events["activity-object"].set(content.id, content);
522
+ }
523
+ }
524
+ eventCredentials(content) {
525
+ if (content.object && content.object.type === "credentials") {
526
+ const key = content.actor.id || content.actor;
527
+ this.events.credentials.set(key, content);
528
+ }
529
+ }
530
+ eventMessage(content) {
531
+ if (!this._socket.connected) {
532
+ return;
533
+ }
534
+ const key = SockethubClient.getKey(content);
535
+ if (content.type === "join" || content.type === "connect") {
536
+ this.events[content.type].set(key, content);
537
+ } else if (content.type === "leave") {
538
+ this.events.join.delete(key);
539
+ } else if (content.type === "disconnect") {
540
+ this.events.connect.delete(key);
541
+ }
542
+ }
543
+ static getKey(content) {
544
+ const actor = content.actor?.id || content.actor;
545
+ if (!actor) {
546
+ throw new Error(`actor property not present for message type: ${content?.type}`);
547
+ }
548
+ const target = content.target ? content.target.id || content.target : "";
549
+ return `${actor}-${target}`;
550
+ }
551
+ log(msg, obj) {
552
+ if (this.debug) {
553
+ console.log(msg, obj);
554
+ }
555
+ }
556
+ registerSocketIOHandlers() {
557
+ const callHandler = (event) => {
558
+ return async (obj) => {
559
+ if (event === "connect") {
560
+ this.socket.id = this._socket.id;
561
+ this.socket.connected = true;
562
+ this.replay("activity-object", this.events["activity-object"]);
563
+ this.replay("credentials", this.events.credentials);
564
+ this.replay("message", this.events.connect);
565
+ this.replay("message", this.events.join);
566
+ } else if (event === "disconnect") {
567
+ this.socket.connected = false;
568
+ }
569
+ this.socket._emit(event, obj);
2502
570
  };
2503
-
2504
- var errorListener;
2505
-
2506
- if (name !== 'error') {
2507
- errorListener = function (err){
2508
- emitter.removeListener(name, eventListener);
2509
- reject(err);
2510
- };
2511
-
2512
- emitter.once('error', errorListener);
2513
- }
2514
-
2515
- onCancel(function(){
2516
- errorListener && emitter.removeListener('error', errorListener);
2517
- emitter.removeListener(name, eventListener);
2518
- });
2519
-
2520
- emitter.once(name, eventListener);
2521
- }, {
2522
- timeout: options.timeout,
2523
- overload: options.overload
571
+ };
572
+ this._socket.on("connect", callHandler("connect"));
573
+ this._socket.on("connect_error", callHandler("connect_error"));
574
+ this._socket.on("disconnect", callHandler("disconnect"));
575
+ this._socket.on("message", (obj) => {
576
+ this.socket._emit("message", this.ActivityStreams.Stream(obj));
2524
577
  });
2525
578
  }
2526
-
2527
- var prototype= EventEmitter.prototype;
2528
-
2529
- Object.defineProperties(EventEmitter, {
2530
- defaultMaxListeners: {
2531
- get: function () {
2532
- return prototype._maxListeners;
2533
- },
2534
- set: function (n) {
2535
- if (typeof n !== 'number' || n < 0 || Number.isNaN(n)) {
2536
- throw TypeError('n must be a non-negative number')
2537
- }
2538
- prototype._maxListeners = n;
2539
- },
2540
- enumerable: true
2541
- },
2542
- once: {
2543
- value: once,
2544
- writable: true,
2545
- configurable: true
579
+ hasActorId(obj) {
580
+ return "actor" in obj && obj.actor !== null && typeof obj.actor === "object" && "id" in obj.actor && typeof obj.actor.id === "string";
581
+ }
582
+ replay(name, asMap) {
583
+ for (const obj of asMap.values()) {
584
+ const expandedObj = this.ActivityStreams.Stream(obj);
585
+ let id = expandedObj?.id;
586
+ if (this.hasActorId(expandedObj)) {
587
+ id = expandedObj.actor.id;
588
+ }
589
+ this.log(`replaying ${name} for ${id}`);
590
+ this._socket.emit(name, expandedObj);
2546
591
  }
2547
- });
2548
-
2549
- Object.defineProperties(prototype, {
2550
- _maxListeners: {
2551
- value: defaultMaxListeners,
2552
- writable: true,
2553
- configurable: true
2554
- },
2555
- _observers: {value: null, writable: true, configurable: true}
2556
- });
2557
-
2558
- if (true) {
2559
- // AMD. Register as an anonymous module.
2560
- !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
2561
- return EventEmitter;
2562
- }).call(exports, __webpack_require__, exports, module),
2563
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2564
- } else { var _global; }
2565
- }();
2566
-
2567
-
2568
- /***/ })
592
+ }
593
+ }
594
+ ((global) => {
595
+ global.SockethubClient = SockethubClient;
596
+ })(typeof window === "object" ? window : {});
597
+ export {
598
+ SockethubClient as default
599
+ };
2569
600
 
2570
- /******/ });
2571
- /************************************************************************/
2572
- /******/ // The module cache
2573
- /******/ var __webpack_module_cache__ = {};
2574
- /******/
2575
- /******/ // The require function
2576
- /******/ function __webpack_require__(moduleId) {
2577
- /******/ // Check if module is in cache
2578
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
2579
- /******/ if (cachedModule !== undefined) {
2580
- /******/ return cachedModule.exports;
2581
- /******/ }
2582
- /******/ // Create a new module (and put it into the cache)
2583
- /******/ var module = __webpack_module_cache__[moduleId] = {
2584
- /******/ // no module.id needed
2585
- /******/ // no module.loaded needed
2586
- /******/ exports: {}
2587
- /******/ };
2588
- /******/
2589
- /******/ // Execute the module function
2590
- /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2591
- /******/
2592
- /******/ // Return the exports of the module
2593
- /******/ return module.exports;
2594
- /******/ }
2595
- /******/
2596
- /************************************************************************/
2597
- /******/
2598
- /******/ // startup
2599
- /******/ // Load entry module and return exports
2600
- /******/ // This entry module is referenced by other modules so it can't be inlined
2601
- /******/ var __webpack_exports__ = __webpack_require__(650);
2602
- /******/
2603
- /******/ return __webpack_exports__;
2604
- /******/ })()
2605
- ;
2606
- });
601
+ //# debugId=1230AAC3408D79F264756E2164756E21
602
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXgubWpzIiwgIi4uLy4uL2FjdGl2aXR5LXN0cmVhbXMvc3JjL2FjdGl2aXR5LXN0cmVhbXMudHMiLCAiLi4vc3JjL3NvY2tldGh1Yi1jbGllbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIHByZWZpeCA9ICd+JztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBzdG9yYWdlIGZvciBvdXIgYEVFYCBvYmplY3RzLlxuICogQW4gYEV2ZW50c2AgaW5zdGFuY2UgaXMgYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFdmVudHMoKSB7fVxuXG4vL1xuLy8gV2UgdHJ5IHRvIG5vdCBpbmhlcml0IGZyb20gYE9iamVjdC5wcm90b3R5cGVgLiBJbiBzb21lIGVuZ2luZXMgY3JlYXRpbmcgYW5cbi8vIGluc3RhbmNlIGluIHRoaXMgd2F5IGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIGRpcmVjdGx5LlxuLy8gSWYgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIG5vdCBzdXBwb3J0ZWQgd2UgcHJlZml4IHRoZSBldmVudCBuYW1lcyB3aXRoIGFcbi8vIGNoYXJhY3RlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHQtaW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIG5vdFxuLy8gb3ZlcnJpZGRlbiBvciB1c2VkIGFzIGFuIGF0dGFjayB2ZWN0b3IuXG4vL1xuaWYgKE9iamVjdC5jcmVhdGUpIHtcbiAgRXZlbnRzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy9cbiAgLy8gVGhpcyBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBgX19wcm90b19fYCBwcm9wZXJ0eSBpcyBzdGlsbCBpbmhlcml0ZWQgaW5cbiAgLy8gc29tZSBvbGQgYnJvd3NlcnMgbGlrZSBBbmRyb2lkIDQsIGlQaG9uZSA1LjEsIE9wZXJhIDExIGFuZCBTYWZhcmkgNS5cbiAgLy9cbiAgaWYgKCFuZXcgRXZlbnRzKCkuX19wcm90b19fKSBwcmVmaXggPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBbb25jZT1mYWxzZV0gU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRUUoZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdGhpcy5mbiA9IGZuO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLm9uY2UgPSBvbmNlIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBuZXcgRUUoZm4sIGNvbnRleHQgfHwgZW1pdHRlciwgb25jZSlcbiAgICAsIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XSkgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBsaXN0ZW5lciwgZW1pdHRlci5fZXZlbnRzQ291bnQrKztcbiAgZWxzZSBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdLmZuKSBlbWl0dGVyLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IFtlbWl0dGVyLl9ldmVudHNbZXZ0XSwgbGlzdGVuZXJdO1xuXG4gIHJldHVybiBlbWl0dGVyO1xufVxuXG4vKipcbiAqIENsZWFyIGV2ZW50IGJ5IG5hbWUuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldnQgVGhlIEV2ZW50IG5hbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGVhckV2ZW50KGVtaXR0ZXIsIGV2dCkge1xuICBpZiAoLS1lbWl0dGVyLl9ldmVudHNDb3VudCA9PT0gMCkgZW1pdHRlci5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICBlbHNlIGRlbGV0ZSBlbWl0dGVyLl9ldmVudHNbZXZ0XTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZSB0aGF0IGlzIG1vbGRlZCBhZ2FpbnN0IHRoZSBOb2RlLmpzXG4gKiBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG59XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IGxpc3RpbmcgdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGVtaXR0ZXIgaGFzIHJlZ2lzdGVyZWRcbiAqIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHZhciBuYW1lcyA9IFtdXG4gICAgLCBldmVudHNcbiAgICAsIG5hbWU7XG5cbiAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gbmFtZXM7XG5cbiAgZm9yIChuYW1lIGluIChldmVudHMgPSB0aGlzLl9ldmVudHMpKSB7XG4gICAgaWYgKGhhcy5jYWxsKGV2ZW50cywgbmFtZSkpIG5hbWVzLnB1c2gocHJlZml4ID8gbmFtZS5zbGljZSgxKSA6IG5hbWUpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICByZXR1cm4gbmFtZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXZlbnRzKSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghaGFuZGxlcnMpIHJldHVybiBbXTtcbiAgaWYgKGhhbmRsZXJzLmZuKSByZXR1cm4gW2hhbmRsZXJzLmZuXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aCwgZWUgPSBuZXcgQXJyYXkobCk7IGkgPCBsOyBpKyspIHtcbiAgICBlZVtpXSA9IGhhbmRsZXJzW2ldLmZuO1xuICB9XG5cbiAgcmV0dXJuIGVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghbGlzdGVuZXJzKSByZXR1cm4gMDtcbiAgaWYgKGxpc3RlbmVycy5mbikgcmV0dXJuIDE7XG4gIHJldHVybiBsaXN0ZW5lcnMubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDYWxscyBlYWNoIG9mIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBlbHNlIGBmYWxzZWAuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdXG4gICAgLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBhcmdzXG4gICAgLCBpO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAobGlzdGVuZXJzLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVycy5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCksIHRydWU7XG4gICAgICBjYXNlIDI6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEpLCB0cnVlO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiksIHRydWU7XG4gICAgICBjYXNlIDQ6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMyksIHRydWU7XG4gICAgICBjYXNlIDU6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQpLCB0cnVlO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0LCBhNSksIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5mbi5hcHBseShsaXN0ZW5lcnMuY29udGV4dCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGhcbiAgICAgICwgajtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpc3RlbmVyc1tpXS5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnNbaV0uZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgIGNhc2UgMTogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQpOyBicmVhaztcbiAgICAgICAgY2FzZSAyOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEpOyBicmVhaztcbiAgICAgICAgY2FzZSAzOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgNDogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMiwgYTMpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWFyZ3MpIGZvciAoaiA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBhcmdzW2ogLSAxXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2ldLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG9uZS10aW1lIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb2YgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgT25seSByZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiB0aGlzO1xuICBpZiAoIWZuKSB7XG4gICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAoXG4gICAgICBsaXN0ZW5lcnMuZm4gPT09IGZuICYmXG4gICAgICAoIW9uY2UgfHwgbGlzdGVuZXJzLm9uY2UpICYmXG4gICAgICAoIWNvbnRleHQgfHwgbGlzdGVuZXJzLmNvbnRleHQgPT09IGNvbnRleHQpXG4gICAgKSB7XG4gICAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBldmVudHMgPSBbXSwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxpc3RlbmVyc1tpXS5mbiAhPT0gZm4gfHxcbiAgICAgICAgKG9uY2UgJiYgIWxpc3RlbmVyc1tpXS5vbmNlKSB8fFxuICAgICAgICAoY29udGV4dCAmJiBsaXN0ZW5lcnNbaV0uY29udGV4dCAhPT0gY29udGV4dClcbiAgICAgICkge1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUmVzZXQgdGhlIGFycmF5LCBvciByZW1vdmUgaXQgY29tcGxldGVseSBpZiB3ZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLlxuICAgIC8vXG4gICAgaWYgKGV2ZW50cy5sZW5ndGgpIHRoaXMuX2V2ZW50c1tldnRdID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/IGV2ZW50c1swXSA6IGV2ZW50cztcbiAgICBlbHNlIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxsIGxpc3RlbmVycywgb3IgdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gW2V2ZW50XSBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dDtcblxuICBpZiAoZXZlbnQpIHtcbiAgICBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuICAgIGlmICh0aGlzLl9ldmVudHNbZXZ0XSkgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBBbGlhcyBtZXRob2RzIG5hbWVzIGJlY2F1c2UgcGVvcGxlIHJvbGwgbGlrZSB0aGF0LlxuLy9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBwcmVmaXguXG4vL1xuRXZlbnRFbWl0dGVyLnByZWZpeGVkID0gcHJlZml4O1xuXG4vL1xuLy8gQWxsb3cgYEV2ZW50RW1pdHRlcmAgdG8gYmUgaW1wb3J0ZWQgYXMgbW9kdWxlIG5hbWVzcGFjZS5cbi8vXG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBtb2R1bGUuXG4vL1xuaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbW9kdWxlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xufVxuIiwKICAgICJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJy4vaW5kZXguanMnXG5cbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9XG5leHBvcnQgZGVmYXVsdCBFdmVudEVtaXR0ZXJcbiIsCiAgICAiLyohXG4gKiBhY3Rpdml0eS1zdHJlYW1zXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWx2ZXJidWNrZXQvYWN0aXZpdHktc3RyZWFtc1xuICpcbiAqIERldmVsb3BlZCBhbmQgTWFpbnRhaW5lZCBieTpcbiAqICAgTmljayBKZW5uaW5ncyA8bmlja0BzaWx2ZXJidWNrZXQubmV0PlxuICpcbiAqIGFjdGl2aXR5LXN0cmVhbXMgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCAoc2VlIExJQ0VOU0UpLlxuICpcbiAqIFlvdSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgdG8gY2hvb3NlIG9uZSBsaWNlbnNlIG9yIHRoZSBvdGhlclxuICogYW5kIHlvdSBkb24ndCBoYXZlIHRvIG5vdGlmeSBhbnlvbmUgd2hpY2ggbGljZW5zZSB5b3UgYXJlIHVzaW5nLlxuICogUGxlYXNlIHNlZSB0aGUgY29ycmVzcG9uZGluZyBsaWNlbnNlIGZpbGUgZm9yIGRldGFpbHMgb2YgdGhlc2UgbGljZW5zZXMuXG4gKiBZb3UgYXJlIGZyZWUgdG8gdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgYnV0IGFsbCBjb3B5cmlnaHRcbiAqIGluZm9ybWF0aW9uIG11c3QgcmVtYWluLlxuICpcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFjdGl2aXR5T2JqZWN0LCBBY3Rpdml0eVN0cmVhbSB9IGZyb20gXCJAc29ja2V0aHViL3NjaGVtYXNcIjtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcblxuY29uc3QgZWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5jb25zdCBiYXNlUHJvcHMgPSB7XG4gICAgc3RyZWFtOiBbXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiYWN0b3JcIixcbiAgICAgICAgXCJ0YXJnZXRcIixcbiAgICAgICAgXCJvYmplY3RcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiY29udGV4dFwiLFxuICAgICAgICBcInB1Ymxpc2hlZFwiLFxuICAgICAgICBcImVycm9yXCIsXG4gICAgXSxcbiAgICBvYmplY3Q6IFtcbiAgICAgICAgXCJpZFwiLFxuICAgICAgICBcInR5cGVcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiYWxpYXNcIixcbiAgICAgICAgXCJhdHRhY2hlZFRvXCIsXG4gICAgICAgIFwiYXR0YWNobWVudFwiLFxuICAgICAgICBcImF0dHJpYnV0ZWRUb1wiLFxuICAgICAgICBcImF0dHJpYnV0ZWRXaXRoXCIsXG4gICAgICAgIFwiY29uZGl0aW9uXCIsXG4gICAgICAgIFwiY29udGVudFwiLFxuICAgICAgICBcImNvbnRlbnRNYXBcIixcbiAgICAgICAgXCJjb250ZXh0XCIsXG4gICAgICAgIFwiY29udGV4dE9mXCIsXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcImVuZFRpbWVcIixcbiAgICAgICAgXCJnZW5lcmF0b3JcIixcbiAgICAgICAgXCJnZW5lcmF0b3JPZlwiLFxuICAgICAgICBcImdyb3VwXCIsXG4gICAgICAgIFwiaWNvblwiLFxuICAgICAgICBcImltYWdlXCIsXG4gICAgICAgIFwiaW5SZXBseVRvXCIsXG4gICAgICAgIFwibWVtYmVyc1wiLFxuICAgICAgICBcIm1lbWJlck9mXCIsXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBcImxvY2F0aW9uXCIsXG4gICAgICAgIFwibG9jYXRpb25PZlwiLFxuICAgICAgICBcIm9iamVjdE9mXCIsXG4gICAgICAgIFwib3JpZ2luT2ZcIixcbiAgICAgICAgXCJwcmVzZW5jZVwiLFxuICAgICAgICBcInByZXZpZXdcIixcbiAgICAgICAgXCJwcmV2aWV3T2ZcIixcbiAgICAgICAgXCJwcm92aWRlclwiLFxuICAgICAgICBcInByb3ZpZGVyT2ZcIixcbiAgICAgICAgXCJwdWJsaXNoZWRcIixcbiAgICAgICAgXCJyYXRpbmdcIixcbiAgICAgICAgXCJyZWxhdGlvbnNoaXBcIixcbiAgICAgICAgXCJyZXN1bHRPZlwiLFxuICAgICAgICBcInJlcGxpZXNcIixcbiAgICAgICAgXCJyb2xlXCIsXG4gICAgICAgIFwic2NvcGVcIixcbiAgICAgICAgXCJzY29wZU9mXCIsXG4gICAgICAgIFwic3RhcnRUaW1lXCIsXG4gICAgICAgIFwic3RhdHVzXCIsXG4gICAgICAgIFwic3VtbWFyeVwiLFxuICAgICAgICBcInRvcGljXCIsXG4gICAgICAgIFwidGFnXCIsXG4gICAgICAgIFwidGFnT2ZcIixcbiAgICAgICAgXCJ0YXJnZXRPZlwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwidGl0bGVNYXBcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwieG1wcDpzdGFuemEtaWRcIixcbiAgICBdLFxufTtcbmNvbnN0IHJlbmFtZSA9IHtcbiAgICBcIkBpZFwiOiBcImlkXCIsXG4gICAgXCJAdHlwZVwiOiBcInR5cGVcIixcbiAgICB2ZXJiOiBcInR5cGVcIixcbiAgICBkaXNwbGF5TmFtZTogXCJuYW1lXCIsXG4gICAgb2JqZWN0VHlwZTogXCJ0eXBlXCIsXG4gICAgcGxhdGZvcm06IFwiY29udGV4dFwiLFxufTtcbmNvbnN0IGV4cGFuZCA9IHtcbiAgICBhY3Rvcjoge1xuICAgICAgICBwcmltYXJ5OiBcImlkXCIsXG4gICAgICAgIHByb3BzOiBiYXNlUHJvcHMsXG4gICAgfSxcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgcHJpbWFyeTogXCJpZFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG4gICAgb2JqZWN0OiB7XG4gICAgICAgIHByaW1hcnk6IFwiY29udGVudFwiLFxuICAgICAgICBwcm9wczogYmFzZVByb3BzLFxuICAgIH0sXG59O1xuXG50eXBlIEN1c3RvbVByb3BzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IG9ianMgPSBuZXcgTWFwKCk7XG5jb25zdCBjdXN0b21Qcm9wczogQ3VzdG9tUHJvcHMgPSB7fTtcblxubGV0IGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID0gZmFsc2U7XG5sZXQgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPSB0cnVlO1xubGV0IHNwZWNpYWxPYmpzID0gW107IC8vIHRoZSBvYmplY3RzIGRvbid0IGdldCByZWplY3RlZCBmb3IgYmFkIHByb3BzXG5cbmZ1bmN0aW9uIG1hdGNoZXNDdXN0b21Qcm9wKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoY3VzdG9tUHJvcHNbdHlwZV0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gY3VzdG9tUHJvcHNbdHlwZV0gYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChvYmouaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW5hbWVQcm9wPFQ+KG9iajogVCwga2V5OiBzdHJpbmcpOiBUIHtcbiAgICBvYmpbcmVuYW1lW2tleV1dID0gb2JqW2tleV07XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0PFQ+KHR5cGU6IHN0cmluZywgaW5jb21pbmdPYmo6IFQsIHJlcXVpcmVJZCA9IGZhbHNlKSB7XG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvbiB3aXRoIGNsZWFyIGVycm9yIG1lc3NhZ2VzXG4gICAgaWYgKGluY29taW5nT2JqID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBpcyBudWxsLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5jb21pbmdPYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWN0aXZpdHlTdHJlYW1zIHZhbGlkYXRpb24gZmFpbGVkOiB0aGUgXCIke3R5cGV9XCIgcHJvcGVydHkgaXMgdW5kZWZpbmVkLiBFeGFtcGxlOiB7IGlkOiBcInVzZXJAZXhhbXBsZS5jb21cIiwgdHlwZTogXCJwZXJzb25cIiB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluY29taW5nT2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSByZWNlaXZlZCBzdHJpbmcgXCIke2luY29taW5nT2JqfVwiIGJ1dCBleHBlY3RlZCBhbiBvYmplY3QuIFVzZTogeyBpZDogXCIke2luY29taW5nT2JqfVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5jb21pbmdPYmogIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShpbmNvbWluZ09iaikpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRUeXBlID0gQXJyYXkuaXNBcnJheShpbmNvbWluZ09iailcbiAgICAgICAgICAgID8gXCJhcnJheVwiXG4gICAgICAgICAgICA6IHR5cGVvZiBpbmNvbWluZ09iajtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IFN0cmluZyhpbmNvbWluZ09iaik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHRoZSBcIiR7dHlwZX1cIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCwgcmVjZWl2ZWQgJHtyZWNlaXZlZFR5cGV9ICgke3JlY2VpdmVkVmFsdWV9KS4gRXhhbXBsZTogeyBpZDogXCJ1c2VyQGV4YW1wbGUuY29tXCIsIHR5cGU6IFwicGVyc29uXCIgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZSAnaWQnIHByb3BlcnR5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgKGUuZy4sIE9iamVjdC5jcmVhdGUoKSlcbiAgICBjb25zdCBvYmogPSBpbmNvbWluZ09iaiBhcyBBY3Rpdml0eU9iamVjdDtcbiAgICBpZiAocmVxdWlyZUlkICYmICFvYmouaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFjdGl2aXR5U3RyZWFtcyB2YWxpZGF0aW9uIGZhaWxlZDogdGhlIFwiJHt0eXBlfVwiIHByb3BlcnR5IHJlcXVpcmVzIGFuICdpZCcgcHJvcGVydHkuIEV4YW1wbGU6IHsgaWQ6IFwidXNlckBleGFtcGxlLmNvbVwiLCB0eXBlOiBcInBlcnNvblwiIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoaW5jb21pbmdPYmopLmZpbHRlcihcbiAgICAgICAgKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWJhc2VQcm9wc1t0eXBlXS5pbmNsdWRlcyhrZXkpO1xuICAgICAgICB9LFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmtub3duS2V5cykge1xuICAgICAgICBsZXQgYW86IEFjdGl2aXR5T2JqZWN0ID0gaW5jb21pbmdPYmogYXMgQWN0aXZpdHlPYmplY3Q7XG4gICAgICAgIGlmIChyZW5hbWVba2V5XSkge1xuICAgICAgICAgICAgLy8gcmVuYW1lIHByb3BlcnR5IGluc3RlYWQgb2YgZmFpbFxuICAgICAgICAgICAgYW8gPSByZW5hbWVQcm9wKGFvLCBrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlc0N1c3RvbVByb3AoYW8udHlwZSwga2V5KSkge1xuICAgICAgICAgICAgLy8gY3VzdG9tIHByb3BlcnR5IG1hdGNoZXMsIGNvbnRpbnVlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3BlY2lhbE9ianMuaW5jbHVkZXMoYW8udHlwZSkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBkZWZpbmVkIGFzIGEgc3BlY2lhbCBwcm9wXG4gICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCwgc28gdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFvKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVkVmFsdWUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBhb1trZXldID09PSBcInN0cmluZ1wiID8gYFwiJHthb1trZXldfVwiYCA6IFN0cmluZyhhb1trZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGBBY3Rpdml0eVN0cmVhbXMgdmFsaWRhdGlvbiBmYWlsZWQ6IHByb3BlcnR5IFwiJHtrZXl9XCIgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9IGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBcIiR7dHlwZX1cIiBvYmplY3Qgb2YgdHlwZSBcIiR7YW8udHlwZX1cIi5gO1xuICAgICAgICAgICAgaWYgKGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlUHJvcHMob2JqOiBBY3Rpdml0eU9iamVjdCk6IEFjdGl2aXR5T2JqZWN0IHtcbiAgICAvLyBlbnN1cmUgdGhlIG5hbWUgcHJvcGVydHksIHdoaWNoIGNhbiBnZW5lcmFsbHkgYmUgaW5mZXJyZWQgZnJvbSB0aGUgaWRcbiAgICAvLyBuYW1lID0gb2JqLm1hdGNoKC8oPyg/XFx3Kyk6XFwvXFwvKSg/Oi4rQCk/KC4rPykoPzpcXC98JCkvKVsxXVxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN0cmVhbShtZXRhOiBBY3Rpdml0eVN0cmVhbSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1ldGEpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWV0YVtrZXldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzdHJlYW1ba2V5XSA9IG9ianMuZ2V0KG1ldGFba2V5XSkgfHwgbWV0YVtrZXldO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWV0YVtrZXldKSkge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWV0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1ba2V5XS5wdXNoKG9ianMuZ2V0KGVudHJ5KSB8fCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyZWFtW2tleV0gPSBtZXRhW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbmx5IGV4cGFuZCBzdHJpbmcgaW50byBvYmplY3RzIGlmIHRoZXkgYXJlIGluIHRoZSBleHBhbmQgbGlzdFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGV4cGFuZCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHJlYW1ba2V5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZXhwYW5kW2tleV0ucHJpbWFyeTtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICAgICAgb2JqW2lkeF0gPSBzdHJlYW1ba2V5XTtcbiAgICAgICAgICAgIHN0cmVhbVtrZXldID0gb2JqO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG59XG5cbmZ1bmN0aW9uIFN0cmVhbShcbiAgICBtZXRhOiBBY3Rpdml0eVN0cmVhbSxcbik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3QgfCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4ge1xuICAgIHZhbGlkYXRlT2JqZWN0KFwic3RyZWFtXCIsIG1ldGEpO1xuICAgIGlmICh0eXBlb2YgbWV0YS5vYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgbWV0YS5vYmplY3QpO1xuICAgIH1cbiAgICBjb25zdCBzdHJlYW0gPSBleHBhbmRTdHJlYW0obWV0YSk7XG4gICAgZWUuZW1pdChcImFjdGl2aXR5LXN0cmVhbVwiLCBzdHJlYW0pO1xuICAgIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPYmplY3RNYW5hZ2VyIHtcbiAgICBjcmVhdGUob2JqOiB1bmtub3duKTogdW5rbm93bjtcbiAgICBkZWxldGUoaWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgbGlzdCgpOiBJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+O1xuICAgIGdldChpZDogc3RyaW5nLCBleHBhbmQ/OiBib29sZWFuKTogdW5rbm93bjtcbn1cblxuY29uc3QgX09iamVjdDogQWN0aXZpdHlPYmplY3RNYW5hZ2VyID0ge1xuICAgIGNyZWF0ZTogKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QoXCJvYmplY3RcIiwgb2JqLCB0cnVlKTsgLy8gcmVxdWlyZSBJRCBmb3IgT2JqZWN0LmNyZWF0ZSgpXG4gICAgICAgIGNvbnN0IGFvID0gZW5zdXJlUHJvcHMob2JqKTtcbiAgICAgICAgb2Jqcy5zZXQoYW8uaWQsIGFvKTtcbiAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1jcmVhdGVcIiwgYW8pO1xuICAgICAgICByZXR1cm4gYW87XG4gICAgfSxcblxuICAgIGRlbGV0ZTogKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9ianMuZGVsZXRlKGlkKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZWUuZW1pdChcImFjdGl2aXR5LW9iamVjdC1kZWxldGVcIiwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGdldDogKGlkLCBleHBhbmQpID0+IHtcbiAgICAgICAgbGV0IG9iaiA9IG9ianMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGlmICghZXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqID0geyBpZDogaWQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5zdXJlUHJvcHMob2JqKTtcbiAgICB9LFxuXG4gICAgbGlzdDogKCk6IEl0ZXJhYmxlSXRlcmF0b3I8dW5rbm93bj4gPT4gb2Jqcy5rZXlzKCksXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFTRmFjdG9yeU9wdGlvbnMge1xuICAgIHNwZWNpYWxPYmpzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBmYWlsT25Vbmtub3duT2JqZWN0UHJvcGVydGllcz86IGJvb2xlYW47XG4gICAgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM/OiBib29sZWFuO1xuICAgIGN1c3RvbVByb3BzPzogQ3VzdG9tUHJvcHM7XG59XG5cbnR5cGUgRXZlbnRDYWxsYmFjayA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVNNYW5hZ2VyIHtcbiAgICBTdHJlYW0obWV0YTogdW5rbm93bik6IEFjdGl2aXR5U3RyZWFtIHwgQWN0aXZpdHlPYmplY3Q7XG4gICAgT2JqZWN0OiBBY3Rpdml0eU9iamVjdE1hbmFnZXI7XG4gICAgb24oZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gICAgb25jZShldmVudDogc3RyaW5nLCBmdW5jOiBFdmVudENhbGxiYWNrKTogdm9pZDtcbiAgICBvZmYoZXZlbnQ6IHN0cmluZywgZnVuYzogRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBU0ZhY3Rvcnkob3B0czogQVNGYWN0b3J5T3B0aW9ucyA9IHt9KTogQVNNYW5hZ2VyIHtcbiAgICBzcGVjaWFsT2JqcyA9IG9wdHM/LnNwZWNpYWxPYmpzIHx8IFtdO1xuICAgIGZhaWxPblVua25vd25PYmplY3RQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIG9wdHMuZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IG9wdHMuZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXNcbiAgICAgICAgICAgIDogZmFpbE9uVW5rbm93bk9iamVjdFByb3BlcnRpZXM7XG4gICAgd2Fybk9uVW5rbm93bk9iamVjdFByb3BlcnRpZXMgPVxuICAgICAgICB0eXBlb2Ygb3B0cy53YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcyA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gb3B0cy53YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllc1xuICAgICAgICAgICAgOiB3YXJuT25Vbmtub3duT2JqZWN0UHJvcGVydGllcztcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKG9wdHMuY3VzdG9tUHJvcHMgfHwge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5jdXN0b21Qcm9wc1twcm9wTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGN1c3RvbVByb3BzW3Byb3BOYW1lXSA9IG9wdHMuY3VzdG9tUHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgU3RyZWFtOiBTdHJlYW0sXG4gICAgICAgIE9iamVjdDogX09iamVjdCxcbiAgICAgICAgb246IChldmVudCwgZnVuYykgPT4gZWUub24oZXZlbnQsIGZ1bmMpLFxuICAgICAgICBvbmNlOiAoZXZlbnQsIGZ1bmMpID0+IGVlLm9uY2UoZXZlbnQsIGZ1bmMpLFxuICAgICAgICBvZmY6IChldmVudCwgZnVuY05hbWUpID0+IGVlLm9mZihldmVudCwgZnVuY05hbWUpLFxuICAgIH0gYXMgQVNNYW5hZ2VyO1xufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbigoZ2xvYmFsOiBhbnkpID0+IHtcbiAgICBnbG9iYWwuQVNGYWN0b3IgPSBBU0ZhY3Rvcnk7XG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDoge30pO1xuIiwKICAgICJpbXBvcnQgeyBBU0ZhY3RvcnksIHR5cGUgQVNNYW5hZ2VyIH0gZnJvbSBcIkBzb2NrZXRodWIvYWN0aXZpdHktc3RyZWFtc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgIEFjdGl2aXR5T2JqZWN0LFxuICAgIEFjdGl2aXR5U3RyZWFtLFxuICAgIEJhc2VBY3Rpdml0eU9iamVjdCxcbn0gZnJvbSBcIkBzb2NrZXRodWIvc2NoZW1hc1wiO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiO1xuaW1wb3J0IHR5cGUgeyBTb2NrZXQgfSBmcm9tIFwic29ja2V0LmlvLWNsaWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50TWFwcGluZyB7XG4gICAgY3JlZGVudGlhbHM6IE1hcDxzdHJpbmcsIEFjdGl2aXR5U3RyZWFtPjtcbiAgICBcImFjdGl2aXR5LW9iamVjdFwiOiBNYXA8c3RyaW5nLCBCYXNlQWN0aXZpdHlPYmplY3Q+O1xuICAgIGNvbm5lY3Q6IE1hcDxzdHJpbmcsIEFjdGl2aXR5U3RyZWFtPjtcbiAgICBqb2luOiBNYXA8c3RyaW5nLCBBY3Rpdml0eVN0cmVhbT47XG59XG5cbmludGVyZmFjZSBDdXN0b21FbWl0dGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfZW1pdChzOiBzdHJpbmcsIG86IHVua25vd24sIGM/OiB1bmtub3duKTogdm9pZDtcbiAgICBjb25uZWN0KCk6IHZvaWQ7XG4gICAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICAgIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNvY2tldGh1YkNsaWVudCAtIENsaWVudCBsaWJyYXJ5IGZvciBTb2NrZXRodWIgcHJvdG9jb2wgZ2F0ZXdheVxuICpcbiAqIEEgSmF2YVNjcmlwdCBjbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gU29ja2V0aHViIHNlcnZlcnMuIFByb3ZpZGVzIGEgaGlnaC1sZXZlbFxuICogQVBJIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgQWN0aXZpdHlTdHJlYW1zIG1lc3NhZ2VzIG92ZXIgU29ja2V0LklPLCB3aXRoXG4gKiBhdXRvbWF0aWMgc3RhdGUgbWFuYWdlbWVudCBhbmQgcmVjb25uZWN0aW9uIGhhbmRsaW5nLlxuICpcbiAqIFNvY2tldGh1YiBhY3RzIGFzIGEgcHJvdG9jb2wgZ2F0ZXdheSwgdHJhbnNsYXRpbmcgQWN0aXZpdHlTdHJlYW1zIG1lc3NhZ2VzIGludG9cbiAqIHZhcmlvdXMgcHJvdG9jb2xzIChYTVBQLCBJUkMsIFJTUywgZXRjLikuIFRoaXMgY2xpZW50IGhhbmRsZXMgdGhlIGNvbW11bmljYXRpb25cbiAqIHdpdGggdGhlIFNvY2tldGh1YiBzZXJ2ZXIsIGluY2x1ZGluZyBjcmVkZW50aWFsIG1hbmFnZW1lbnQsIGNvbm5lY3Rpb24gc3RhdGUsXG4gKiBhbmQgYXV0b21hdGljIHJlY29ubmVjdGlvbi5cbiAqXG4gKiAjIyBBdXRvbWF0aWMgUmVjb25uZWN0aW9uICYgU3RhdGUgUmVwbGF5XG4gKlxuICogVGhpcyBjbGllbnQgYXV0b21hdGljYWxseSBoYW5kbGVzIHRyYW5zaWVudCBuZXR3b3JrIGRpc2Nvbm5lY3Rpb25zIGJ5IHN0b3JpbmdcbiAqIGNvbm5lY3Rpb24gc3RhdGUgaW4gbWVtb3J5IGFuZCByZXBsYXlpbmcgaXQgd2hlbiB0aGUgc29ja2V0IHJlY29ubmVjdHMuXG4gKlxuICogIyMjIFNlY3VyaXR5IE1vZGVsXG4gKlxuICogKipTdG9yYWdlIExvY2F0aW9uOioqXG4gKiAtIEFsbCBjcmVkZW50aWFscyBhbmQgc3RhdGUgYXJlIHN0b3JlZCBPTkxZIGluIEphdmFTY3JpcHQgbWVtb3J5IChoZWFwKVxuICogLSBOb3RoaW5nIGlzIHBlcnNpc3RlZCB0byBsb2NhbFN0b3JhZ2UsIHNlc3Npb25TdG9yYWdlLCBjb29raWVzLCBvciBkaXNrXG4gKiAtIE1lbW9yeSBpcyBjbGVhcmVkIHdoZW4gdGhlIGJyb3dzZXIgdGFiIGNsb3NlcyBvciBwYWdlIHJlZnJlc2hlc1xuICpcbiAqICoqUmVwbGF5IFRyaWdnZXJzOioqXG4gKiAtIEF1dG9tYXRpYyByZXBsYXkgb2NjdXJzIG9uIFNvY2tldC5JTyByZWNvbm5lY3Rpb24gZXZlbnRzXG4gKiAtIFR5cGljYWxseSB0cmlnZ2VyZWQgYnkgYnJpZWYgbmV0d29yayBpbnRlcnJ1cHRpb25zIChXaUZpIHN3aXRjaGluZywgbW9iaWxlIG5ldHdvcmsgYmxpcHMpXG4gKiAtIERvZXMgTk9UIG9jY3VyIG9uIHBhZ2UgcmVmcmVzaCAobmV3IFNvY2tldGh1YkNsaWVudCBpbnN0YW5jZSA9IGVtcHR5IHN0YXRlKVxuICpcbiAqICoqU2VydmVyIFJlc3RhcnQgQmVoYXZpb3I6KipcbiAqIC0gSWYgc2VydmVyIHJlc3RhcnRzLCBjbGllbnQgc29ja2V0IHdpbGwgcmVjb25uZWN0IGFuZCByZXBsYXkgY3JlZGVudGlhbHNcbiAqIC0gU2VydmVyIG11c3QgaGFuZGxlIHJlcGxheWVkIGNyZWRlbnRpYWxzIGFwcHJvcHJpYXRlbHkgKHZhbGlkYXRlLCByZWplY3Qgc3RhbGUgc2Vzc2lvbnMsIGV0Yy4pXG4gKiAtIEFwcGxpY2F0aW9ucyBzaG91bGQgaW1wbGVtZW50IHByb3BlciBzZXNzaW9uIHZhbGlkYXRpb24gc2VydmVyLXNpZGVcbiAqXG4gKiAqKkxpZmV0aW1lOioqXG4gKiAtIENyZWRlbnRpYWxzIGV4aXN0IG9ubHkgZHVyaW5nIHRoZSBicm93c2VyIHRhYidzIGxpZmV0aW1lXG4gKiAtIENsZWFyZWQgb24gcGFnZSByZWxvYWQsIHRhYiBjbG9zZSwgb3IgbWFudWFsIGRpc2Nvbm5lY3RcbiAqIC0gTm90IGFjY2Vzc2libGUgYWNyb3NzIHRhYnMgb3IgYWZ0ZXIgYnJvd3NlciByZXN0YXJ0XG4gKlxuICogKipXaGF0IEdldHMgUmVwbGF5ZWQ6KipcbiAqIC0gQ3JlZGVudGlhbHMgKHVzZXJuYW1lL3Bhc3N3b3JkL3Rva2VucyBzZW50IHZpYSBjcmVkZW50aWFscyBldmVudClcbiAqIC0gQWN0aXZpdHkgT2JqZWN0cyAoYWN0b3IgZGVmaW5pdGlvbnMpXG4gKiAtIENvbm5lY3QgY29tbWFuZHMgKHBsYXRmb3JtIGNvbm5lY3Rpb25zKVxuICogLSBKb2luIGNvbW1hbmRzIChyb29tL2NoYW5uZWwgam9pbnMpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBjbGllbnRcbiAqIGNvbnN0IHNvY2tldCA9IGlvKCdodHRwOi8vbG9jYWxob3N0OjEwNTUwJyk7XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgU29ja2V0aHViQ2xpZW50KHNvY2tldCk7XG4gKlxuICogLy8gU2VuZCBjcmVkZW50aWFscyAtIHRoZXNlIHdpbGwgYmUgcmVwbGF5ZWQgb24gcmVjb25uZWN0aW9uXG4gKiBjbGllbnQuc29ja2V0LmVtaXQoJ2NyZWRlbnRpYWxzJywge1xuICogICBhY3RvcjogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICogICBvYmplY3Q6IHsgdXNlcm5hbWU6ICd1c2VyJywgcGFzc3dvcmQ6ICdwYXNzJyB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJZiBuZXR3b3JrIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzLCBjcmVkZW50aWFscyBhcmUgYXV0b21hdGljYWxseSByZXBsYXllZFxuICogLy8gSWYgcGFnZSByZWZyZXNoZXMsIGNyZWRlbnRpYWxzIGFyZSBsb3N0IGFuZCBtdXN0IGJlIHJlc2VudFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldGh1YkNsaWVudCB7XG4gICAgLyoqXG4gICAgICogSW4tbWVtb3J5IHN0b3JhZ2UgZm9yIGNsaWVudCBzdGF0ZSB0aGF0IHNob3VsZCBiZSByZXBsYXllZCBvbiByZWNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWN1cml0eTogU3RvcmVkIE9OTFkgaW4gSmF2YVNjcmlwdCBoZWFwIG1lbW9yeS4gTmV2ZXIgcGVyc2lzdGVkIHRvIGRpc2ssXG4gICAgICogbG9jYWxTdG9yYWdlLCBvciBhbnkgcGVybWFuZW50IHN0b3JhZ2UuIENsZWFyZWQgb24gcGFnZSByZWxvYWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBldmVudHM6IEV2ZW50TWFwcGluZyA9IHtcbiAgICAgICAgY3JlZGVudGlhbHM6IG5ldyBNYXAoKSxcbiAgICAgICAgXCJhY3Rpdml0eS1vYmplY3RcIjogbmV3IE1hcCgpLFxuICAgICAgICBjb25uZWN0OiBuZXcgTWFwKCksXG4gICAgICAgIGpvaW46IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHByaXZhdGUgX3NvY2tldDogU29ja2V0O1xuICAgIHB1YmxpYyBBY3Rpdml0eVN0cmVhbXM6IEFTTWFuYWdlcjtcbiAgICBwdWJsaWMgc29ja2V0OiBDdXN0b21FbWl0dGVyO1xuICAgIHB1YmxpYyBkZWJ1ZyA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IFNvY2tldCkge1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29ja2V0aHViQ2xpZW50IHJlcXVpcmVzIGEgc29ja2V0LmlvIGluc3RhbmNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgICAgICB0aGlzLnNvY2tldCA9IHRoaXMuY3JlYXRlUHVibGljRW1pdHRlcigpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU29ja2V0SU9IYW5kbGVycygpO1xuICAgICAgICB0aGlzLmluaXRBY3Rpdml0eVN0cmVhbXMoKTtcblxuICAgICAgICB0aGlzLkFjdGl2aXR5U3RyZWFtcy5vbihcbiAgICAgICAgICAgIFwiYWN0aXZpdHktb2JqZWN0LWNyZWF0ZVwiLFxuICAgICAgICAgICAgKG9iajogQWN0aXZpdHlPYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZW1pdChcImFjdGl2aXR5LW9iamVjdFwiLCBvYmosIChlcnI6IG5ldmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIGFjdGl2aXR5LW9iamVjdCBcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRBY3Rpdml0eU9iamVjdChvYmopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHNvY2tldC5vbihcImFjdGl2aXR5LW9iamVjdFwiLCAob2JqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkFjdGl2aXR5U3RyZWFtcy5PYmplY3QuY3JlYXRlKG9iaik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRBY3Rpdml0eVN0cmVhbXMoKSB7XG4gICAgICAgIHRoaXMuQWN0aXZpdHlTdHJlYW1zID0gQVNGYWN0b3J5KHsgc3BlY2lhbE9ianM6IFtcImNyZWRlbnRpYWxzXCJdIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHN0b3JlZCBjcmVkZW50aWFscyB0byBwcmV2ZW50IGF1dG9tYXRpYyByZXBsYXkgb24gcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgc3RvcmVkIGNyZWRlbnRpYWxzIGZyb20gbWVtb3J5LiBVc2VmdWwgZm9yXG4gICAgICogc2VjdXJpdHktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJldmVudCBhdXRvbWF0aWMgY3JlZGVudGlhbFxuICAgICAqIHJlcGxheSB3aGVuIHRoZSBzb2NrZXQgcmVjb25uZWN0cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIENsZWFyIGNyZWRlbnRpYWxzIG9uIGRpc2Nvbm5lY3RcbiAgICAgKiBzYy5zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICogICBzYy5jbGVhckNyZWRlbnRpYWxzKCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQ3JlZGVudGlhbHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmNyZWRlbnRpYWxzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQdWJsaWNFbWl0dGVyKCk6IEN1c3RvbUVtaXR0ZXIge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCkgYXMgQ3VzdG9tRW1pdHRlcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNvY2tldC5fZW1pdCA9IHNvY2tldC5lbWl0O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc29ja2V0LmVtaXQgPSAoZXZlbnQsIGNvbnRlbnQsIGNhbGxiYWNrKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQgPT09IFwiY3JlZGVudGlhbHNcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRDcmVkZW50aWFscyhjb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiYWN0aXZpdHktb2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50QWN0aXZpdHlPYmplY3QoY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNZXNzYWdlKGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0LmVtaXQoZXZlbnQgYXMgc3RyaW5nLCBjb250ZW50LCBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICAgIHNvY2tldC5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgc29ja2V0LmRpc2Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQuY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5jb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmVudEFjdGl2aXR5T2JqZWN0KGNvbnRlbnQ6IEFjdGl2aXR5T2JqZWN0KSB7XG4gICAgICAgIGlmIChjb250ZW50LmlkKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tcImFjdGl2aXR5LW9iamVjdFwiXS5zZXQoY29udGVudC5pZCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50Q3JlZGVudGlhbHMoY29udGVudDogQWN0aXZpdHlTdHJlYW0pIHtcbiAgICAgICAgaWYgKGNvbnRlbnQub2JqZWN0ICYmIGNvbnRlbnQub2JqZWN0LnR5cGUgPT09IFwiY3JlZGVudGlhbHNcIikge1xuICAgICAgICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgIGNvbnRlbnQuYWN0b3IuaWQgfHwgKGNvbnRlbnQuYWN0b3IgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuY3JlZGVudGlhbHMuc2V0KGtleSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50TWVzc2FnZShjb250ZW50OiBCYXNlQWN0aXZpdHlPYmplY3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zb2NrZXQuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWl0aGVyIHN0b3JlcyBvciBkZWxldGUgdGhlIHNwZWNpZmllZCBjb250ZW50IG9udG8gdGhlIHN0b3JlZEpvaW5zIG1hcCxcbiAgICAgICAgLy8gZm9yIHJlcGx5IG9uY2Ugd2UncmUgYmFjayBvbmxpbmUuXG4gICAgICAgIGNvbnN0IGtleSA9IFNvY2tldGh1YkNsaWVudC5nZXRLZXkoY29udGVudCBhcyBBY3Rpdml0eVN0cmVhbSk7XG4gICAgICAgIGlmIChjb250ZW50LnR5cGUgPT09IFwiam9pblwiIHx8IGNvbnRlbnQudHlwZSA9PT0gXCJjb25uZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2NvbnRlbnQudHlwZV0uc2V0KGtleSwgY29udGVudCBhcyBBY3Rpdml0eVN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudC50eXBlID09PSBcImxlYXZlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmpvaW4uZGVsZXRlKGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudC50eXBlID09PSBcImRpc2Nvbm5lY3RcIikge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuY29ubmVjdC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEtleShjb250ZW50OiBBY3Rpdml0eVN0cmVhbSkge1xuICAgICAgICBjb25zdCBhY3RvciA9IGNvbnRlbnQuYWN0b3I/LmlkIHx8IGNvbnRlbnQuYWN0b3I7XG4gICAgICAgIGlmICghYWN0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgYWN0b3IgcHJvcGVydHkgbm90IHByZXNlbnQgZm9yIG1lc3NhZ2UgdHlwZTogJHtjb250ZW50Py50eXBlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGNvbnRlbnQudGFyZ2V0XG4gICAgICAgICAgICA/IGNvbnRlbnQudGFyZ2V0LmlkIHx8IGNvbnRlbnQudGFyZ2V0XG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIHJldHVybiBgJHthY3Rvcn0tJHt0YXJnZXR9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZyhtc2c6IHN0cmluZywgb2JqPzogdW5rbm93bikge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnLCBvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNvY2tldElPSGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIG1pZGRsZXdhcmUgZm9yIGV2ZW50cyB3aGljaCBkb24ndCBkZWFsIGluIEFTIG9iamVjdHNcbiAgICAgICAgY29uc3QgY2FsbEhhbmRsZXIgPSAoZXZlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzeW5jIChvYmo/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5pZCA9IHRoaXMuX3NvY2tldC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQXV0b21hdGljIHN0YXRlIHJlcGxheSBvbiByZWNvbm5lY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIFdoZW4gU29ja2V0LklPIHJlY29ubmVjdHMgYWZ0ZXIgYSBuZXR3b3JrIGludGVycnVwdGlvbiwgd2UgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgKiByZXBsYXkgYWxsIHN0b3JlZCBzdGF0ZSB0byByZXN0b3JlIHRoZSBzZXNzaW9uIHNlYW1sZXNzbHk6XG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIDEuIEFjdGl2aXR5IE9iamVjdHMgKGFjdG9yIGRlZmluaXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgKiAyLiBDcmVkZW50aWFscyAoYXV0aGVudGljYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAqIDMuIENvbm5lY3QgY29tbWFuZHMgKHBsYXRmb3JtIGNvbm5lY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICAgKiA0LiBKb2luIGNvbW1hbmRzIChyb29tL2NoYW5uZWwgbWVtYmVyc2hpcHMpXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIFRoaXMgYWxsb3dzIHRoZSBjbGllbnQgdG8gc3Vydml2ZSBicmllZiBuZXR3b3JrIGJsaXBzIHdpdGhvdXQgcmVxdWlyaW5nXG4gICAgICAgICAgICAgICAgICAgICAqIHVzZXIgaW50ZXJ2ZW50aW9uLiBIb3dldmVyLCB0aGUgc2VydmVyIG11c3QgcHJvcGVybHkgdmFsaWRhdGUgcmVwbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICogY3JlZGVudGlhbHMgYXMgdGhleSBtYXkgYmUgc3RhbGUgb3IgcmV2b2tlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGF5KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpdml0eS1vYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW1wiYWN0aXZpdHktb2JqZWN0XCJdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxheShcImNyZWRlbnRpYWxzXCIsIHRoaXMuZXZlbnRzLmNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYXkoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRzLmNvbm5lY3QpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxheShcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudHMuam9pbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJkaXNjb25uZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9lbWl0KGV2ZW50LCBvYmopO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyByZWdpc3RlciBmb3IgZXZlbnRzIHRoYXQgZ2l2ZSB1cyBpbmZvcm1hdGlvbiBvbiBjb25uZWN0aW9uIHN0YXR1c1xuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJjb25uZWN0XCIsIGNhbGxIYW5kbGVyKFwiY29ubmVjdFwiKSk7XG4gICAgICAgIHRoaXMuX3NvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgY2FsbEhhbmRsZXIoXCJjb25uZWN0X2Vycm9yXCIpKTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCBjYWxsSGFuZGxlcihcImRpc2Nvbm5lY3RcIikpO1xuXG4gICAgICAgIC8vIHVzZSBhcyBtaWRkbGV3YXJlIHRvIHJlY2VpdmUgaW5jb21pbmcgU29ja2V0aHViIG1lc3NhZ2VzIGFuZCB1bnBhY2sgdGhlbVxuICAgICAgICAvLyB1c2luZyB0aGUgQWN0aXZpdHlTdHJlYW1zIGxpYnJhcnkgYmVmb3JlIHBhc3NpbmcgdGhlbSBhbG9uZyB0byB0aGUgYXBwLlxuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJtZXNzYWdlXCIsIChvYmopID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9lbWl0KFwibWVzc2FnZVwiLCB0aGlzLkFjdGl2aXR5U3RyZWFtcy5TdHJlYW0ob2JqKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGFuIEFjdGl2aXR5U3RyZWFtIHdpdGggYSB2YWxpZCBhY3Rvci5pZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc0FjdG9ySWQoXG4gICAgICAgIG9iajogQWN0aXZpdHlTdHJlYW0gfCBBY3Rpdml0eU9iamVjdCxcbiAgICApOiBvYmogaXMgQWN0aXZpdHlTdHJlYW0ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXCJhY3RvclwiIGluIG9iaiAmJlxuICAgICAgICAgICAgb2JqLmFjdG9yICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLmFjdG9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImlkXCIgaW4gb2JqLmFjdG9yICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLmFjdG9yLmlkID09PSBcInN0cmluZ1wiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGF5cyBwcmV2aW91c2x5IHNlbnQgZXZlbnRzIHRvIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgU29ja2V0LklPIGNvbm5lY3Rpb24gaXNcbiAgICAgKiByZS1lc3RhYmxpc2hlZCBhZnRlciBhIHRyYW5zaWVudCBuZXR3b3JrIGludGVycnVwdGlvbi4gSXQgcmVzZW5kc1xuICAgICAqIGNyZWRlbnRpYWxzIGFuZCBjb25uZWN0aW9uIHN0YXRlIHNvIHRoZSB1c2VyIGRvZXNuJ3QgbmVlZCB0byBtYW51YWxseVxuICAgICAqIHJlLWF1dGhlbnRpY2F0ZSBvciByZWpvaW4gY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBTZWN1cml0eSBjb25zaWRlcmF0aW9uczpcbiAgICAgKiAtIE9ubHkgcmVwbGF5cyBldmVudHMgc3RvcmVkIGluIG1lbW9yeSBkdXJpbmcgdGhpcyBzZXNzaW9uXG4gICAgICogLSBEb2VzIG5vdCByZXBsYXkgYWZ0ZXIgcGFnZSByZWZyZXNoIChtZW1vcnkgY2xlYXJlZClcbiAgICAgKiAtIFNlcnZlciBzaG91bGQgdmFsaWRhdGUgcmVwbGF5ZWQgY3JlZGVudGlhbHMgKG1heSBiZSBzdGFsZS9yZXZva2VkKVxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBFdmVudCBuYW1lIHRvIGVtaXQgKFwiY3JlZGVudGlhbHNcIiwgXCJhY3Rpdml0eS1vYmplY3RcIiwgXCJtZXNzYWdlXCIpXG4gICAgICogQHBhcmFtIGFzTWFwIC0gTWFwIG9mIGV2ZW50cyB0byByZXBsYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlcGxheShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBhc01hcDogTWFwPHN0cmluZywgQWN0aXZpdHlTdHJlYW0gfCBCYXNlQWN0aXZpdHlPYmplY3Q+LFxuICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBhc01hcC52YWx1ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRPYmogPSB0aGlzLkFjdGl2aXR5U3RyZWFtcy5TdHJlYW0ob2JqKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGV4cGFuZGVkT2JqPy5pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0FjdG9ySWQoZXhwYW5kZWRPYmopKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBleHBhbmRlZE9iai5hY3Rvci5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGByZXBsYXlpbmcgJHtuYW1lfSBmb3IgJHtpZH1gKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5lbWl0KG5hbWUsIGV4cGFuZGVkT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4oKGdsb2JhbDogYW55KSA9PiB7XG4gICAgZ2xvYmFsLlNvY2tldGh1YkNsaWVudCA9IFNvY2tldGh1YkNsaWVudDtcbiAgICAvLyBAdHMtaWdub3JlXG59KSh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDoge30pO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJLE1BQU0sT0FBTyxVQUFVO0FBQUEsRUFBM0IsSUFDSSxTQUFTO0FBQUEsRUFTYixTQUFTLE1BQU0sR0FBRztBQUFBLEVBU2xCLElBQUksT0FBTyxRQUFRO0FBQUEsSUFDakIsT0FBTyxZQUFZLE9BQU8sT0FBTyxJQUFJO0FBQUEsSUFNckMsSUFBSSxDQUFDLElBQUksT0FBTyxFQUFFO0FBQUEsTUFBVyxTQUFTO0FBQUEsRUFDeEM7QUFBQSxFQVdBLFNBQVMsRUFBRSxDQUFDLElBQUksU0FBUyxNQUFNO0FBQUEsSUFDN0IsS0FBSyxL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SyxHQUFHO0FBQUEsSUFDeEI7QUFBQTtBQUFBLEVBR0ksd0JBQXdCLEdBQUc7QUFBQSxJQUUvQixNQUFNLGNBQWMsQ0FBQyxVQUFrQjtBQUFBLE1BQ25DLE9BQU8sT0FBTyxRQUFrQjtBQUFBLFFBQzVCLElBQUksVUFBVSxXQUFXO0FBQUEsVUFDckIsS0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRO0FBQUEsVUFDOUIsS0FBSyxPQUFPLFlBQVk7QUFBQSxVQWlCeEIsS0FBSyxPQUNELG1CQUNBLEtBQUssT0FBTyxrQkFDaEI7QUFBQSxVQUNBLEtBQUssT0FBTyxlQUFlLEtBQUssT0FBTyxXQUFXO0FBQUEsVUFDbEQsS0FBSyxPQUFPLFdBQVcsS0FBSyxPQUFPLE9BQU87QUFBQSxVQUMxQyxLQUFLLE9BQU8sV0FBVyxLQUFLLE9BQU8sSUFBSTtBQUFBLFFBQzNDLEVBQU8sU0FBSSxVQUFVLGNBQWM7QUFBQSxVQUMvQixLQUFLLE9BQU8sWUFBWTtBQUFBLFFBQzVCO0FBQUEsUUFDQSxLQUFLLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFBQTtBQUFBO0FBQUEsSUFLcEMsS0FBSyxRQUFRLEdBQUcsV0FBVyxZQUFZLFNBQVMsQ0FBQztBQUFBLElBQ2pELEtBQUssUUFBUSxHQUFHLGlCQUFpQixZQUFZLGVBQWUsQ0FBQztBQUFBLElBQzdELEtBQUssUUFBUSxHQUFHLGNBQWMsWUFBWSxZQUFZLENBQUM7QUFBQSxJQUl2RCxLQUFLLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUTtBQUFBLE1BQ2hDLEtBQUssT0FBTyxNQUFNLFdBQVcsS0FBSyxnQkFBZ0IsT0FBTyxHQUFHLENBQUM7QUFBQSxLQUNoRTtBQUFBO0FBQUEsRUFNRyxVQUFVLENBQ2QsS0FDcUI7QUFBQSxJQUNyQixPQUNJLFdBQVcsT0FDWCxJQUFJLFVBQVUsUUFDZCxPQUFPLElBQUksVUFBVSxZQUNyQixRQUFRLElBQUksU0FDWixPQUFPLElBQUksTUFBTSxPQUFPO0FBQUE7QUFBQSxFQW9CeEIsTUFBTSxDQUNWLE1BQ0EsT0FDRjtBQUFBLElBQ0UsV0FBVyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUEsTUFDOUIsTUFBTSxjQUFjLEtBQUssZ0JBQWdCLE9BQU8sR0FBRztBQUFBLE1BQ25ELElBQUksS0FBSyxhQUFhO0FBQUEsTUFDdEIsSUFBSSxLQUFLLFdBQVcsV0FBVyxHQUFHO0FBQUEsUUFDOUIsS0FBSyxZQUFZLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0EsS0FBSyxJQUFJLGFBQWEsWUFBWSxJQUFJO0FBQUEsTUFDdEMsS0FBSyxRQUFRLEtBQUssTUFBTSxXQUFXO0FBQUEsSUFDdkM7QUFBQTtBQUVSO0FBQUEsQ0FHQyxDQUFDLFdBQWdCO0FBQUEsRUFDZCxPQUFPLGtCQUFrQjtBQUFBLEdBRTFCLE9BQU8sV0FBVyxXQUFXLFNBQVMsQ0FBQyxDQUFDOyIsCiAgImRlYnVnSWQiOiAiMTIzMEFBQzM0MDhENzlGMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=