occam-directed-graphs 3.0.37 → 3.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/vertex.js CHANGED
@@ -8,7 +8,9 @@ Object.defineProperty(exports, "default", {
8
8
  return Vertex;
9
9
  }
10
10
  });
11
+ var _necessary = require("necessary");
11
12
  var _vertex = require("./utilities/vertex");
13
+ var _search = require("./utilities/search");
12
14
  function _class_call_check(instance, Constructor) {
13
15
  if (!(instance instanceof Constructor)) {
14
16
  throw new TypeError("Cannot call a class as a function");
@@ -28,14 +30,14 @@ function _create_class(Constructor, protoProps, staticProps) {
28
30
  if (staticProps) _defineProperties(Constructor, staticProps);
29
31
  return Constructor;
30
32
  }
33
+ var last = _necessary.arrayUtilities.last, tail = _necessary.arrayUtilities.tail;
31
34
  var Vertex = /*#__PURE__*/ function() {
32
- function Vertex(name, index, visited, immediatePredecessorVertices, immediateSuccessorVertices) {
35
+ function Vertex(name, index, immediateSuccessorVertexes, immediatePredecessorVertexes) {
33
36
  _class_call_check(this, Vertex);
34
37
  this.name = name;
35
38
  this.index = index;
36
- this.visited = visited;
37
- this.immediatePredecessorVertices = immediatePredecessorVertices;
38
- this.immediateSuccessorVertices = immediateSuccessorVertices;
39
+ this.immediateSuccessorVertexes = immediateSuccessorVertexes;
40
+ this.immediatePredecessorVertexes = immediatePredecessorVertexes;
39
41
  }
40
42
  _create_class(Vertex, [
41
43
  {
@@ -51,173 +53,111 @@ var Vertex = /*#__PURE__*/ function() {
51
53
  }
52
54
  },
53
55
  {
54
- key: "isVisited",
55
- value: function isVisited() {
56
- return this.visited;
56
+ key: "getImmediateSuccessorVertexes",
57
+ value: function getImmediateSuccessorVertexes() {
58
+ return this.immediateSuccessorVertexes;
57
59
  }
58
60
  },
59
61
  {
60
- key: "isStranded",
61
- value: function isStranded() {
62
- var immediatePredecessorVerticesLength = this.immediatePredecessorVertices.length, immediateSuccessorVerticesLength = this.immediateSuccessorVertices.length, stranded = immediatePredecessorVerticesLength === 0 && immediateSuccessorVerticesLength === 0;
63
- return stranded;
64
- }
65
- },
66
- {
67
- key: "getImmediatePredecessorVertexNames",
68
- value: function getImmediatePredecessorVertexNames() {
69
- var immediatePredecessorVertexNames = this.immediatePredecessorVertices.map(function(immediatePredecessorVertex) {
70
- var immediatePredecessorVertexName = immediatePredecessorVertex.getName();
71
- return immediatePredecessorVertexName;
72
- });
73
- return immediatePredecessorVertexNames;
74
- }
75
- },
76
- {
77
- key: "getImmediateSuccessorVertexNames",
78
- value: function getImmediateSuccessorVertexNames() {
79
- var immediateSuccessorVertexNames = this.immediateSuccessorVertices.map(function(immediateSuccessorVertex) {
80
- var immediateSuccessorVertexName = immediateSuccessorVertex.getName();
81
- return immediateSuccessorVertexName;
82
- });
83
- return immediateSuccessorVertexNames;
84
- }
85
- },
86
- {
87
- key: "getImmediatePredecessorVertices",
88
- value: function getImmediatePredecessorVertices() {
89
- return this.immediatePredecessorVertices;
62
+ key: "getImmediatePredecessorVertexes",
63
+ value: function getImmediatePredecessorVertexes() {
64
+ return this.immediatePredecessorVertexes;
90
65
  }
91
66
  },
92
67
  {
93
- key: "getImmediateSuccessorVertices",
94
- value: function getImmediateSuccessorVertices() {
95
- return this.immediateSuccessorVertices;
68
+ key: "isStranded",
69
+ value: function isStranded() {
70
+ var immediateSuccessorVertexesLength = this.immediateSuccessorVertexes.length, immediatePredecessorVertexesLength = this.immediatePredecessorVertexes.length, stranded = immediateSuccessorVertexesLength === 0 && immediatePredecessorVertexesLength === 0;
71
+ return stranded;
96
72
  }
97
73
  },
98
74
  {
99
- key: "getPredecessorVertexMap",
100
- value: function getPredecessorVertexMap() {
101
- var predecessorVertexMap = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
102
- this.forEachImmediatePredecessorVertex(function(immediatePredecessorVertex) {
103
- var predecessorVertex = immediatePredecessorVertex, predecessorVertexName = predecessorVertex.getName();
104
- predecessorVertexMap[predecessorVertexName] = predecessorVertex;
105
- predecessorVertex.getPredecessorVertexMap(predecessorVertexMap);
106
- });
107
- return predecessorVertexMap;
75
+ key: "isVertexReachable",
76
+ value: function isVertexReachable(vertex) {
77
+ var forwardsVisitedVertices = this.retrieveForwardsVisitedVertexes(vertex), lastForwardsVisitedVertex = last(forwardsVisitedVertices), vertexReachable = vertex === lastForwardsVisitedVertex;
78
+ return vertexReachable;
108
79
  }
109
80
  },
110
81
  {
111
- key: "getSuccessorVertexMap",
112
- value: function getSuccessorVertexMap() {
113
- var successorVertexMap = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
114
- this.forEachImmediateSuccessorVertex(function(immediateSuccessorVertex) {
115
- var successorVertex = immediateSuccessorVertex, successorVertexName = successorVertex.getName();
116
- successorVertexMap[successorVertexName] = successorVertex;
117
- successorVertex.getSuccessorVertexMap(successorVertexMap);
118
- });
119
- return successorVertexMap;
82
+ key: "isEdgePresentBySourceVertex",
83
+ value: function isEdgePresentBySourceVertex(sourceVertex) {
84
+ var sourceVertexImmediatePredecessorVertex = this.isVertexImmediatePredecessorVertex(sourceVertex), edgePresent = sourceVertexImmediatePredecessorVertex; ///
85
+ return edgePresent;
120
86
  }
121
87
  },
122
88
  {
123
- key: "getPredecessorVertexNames",
124
- value: function getPredecessorVertexNames() {
125
- var predecessorVertices = this.getPredecessorVertices(), predecessorVertexNames = predecessorVertices.map(function(predecessorVertex) {
126
- var predecessorVertexName = predecessorVertex.getName();
127
- return predecessorVertexName;
128
- });
129
- return predecessorVertexNames;
89
+ key: "isEdgePresentByTargetVertex",
90
+ value: function isEdgePresentByTargetVertex(targetVertex) {
91
+ var targetVertexImmediateSuccessorVertex = this.isVertexImmediateSuccessorVertex(targetVertex), edgePresent = targetVertexImmediateSuccessorVertex; ///
92
+ return edgePresent;
130
93
  }
131
94
  },
132
95
  {
133
- key: "getSuccessorVertexNames",
134
- value: function getSuccessorVertexNames() {
135
- var successorVertices = this.getSuccessorVertices(), successorVertexNames = successorVertices.map(function(successorVertex) {
136
- var successorVertexName = successorVertex.getName();
137
- return successorVertexName;
138
- });
96
+ key: "retrieveSuccessorVertexNames",
97
+ value: function retrieveSuccessorVertexNames() {
98
+ var forwardsVisitedVertexes = this.retrieveForwardsVisitedVertexes(), forwardsVisitedVertexesTail = tail(forwardsVisitedVertexes), successorVertexes = forwardsVisitedVertexesTail, successorVertexNames = (0, _vertex.vertexNamesFromVertexes)(successorVertexes);
139
99
  return successorVertexNames;
140
100
  }
141
101
  },
142
102
  {
143
- key: "getPredecessorVertices",
144
- value: function getPredecessorVertices() {
145
- var predecessorVertexMap = this.getPredecessorVertexMap(), predecessorVertexNames = Object.keys(predecessorVertexMap), predecessorVertices = predecessorVertexNames.map(function(predecessorVertexName) {
146
- var predecessorVertex = predecessorVertexMap[predecessorVertexName];
147
- return predecessorVertex;
148
- });
149
- return predecessorVertices;
150
- }
151
- },
152
- {
153
- key: "getSuccessorVertices",
154
- value: function getSuccessorVertices() {
155
- var successorVertexMap = this.getSuccessorVertexMap(), successorVertexNames = Object.keys(successorVertexMap), successorVertices = successorVertexNames.map(function(successorVertexName) {
156
- var successorVertex = successorVertexMap[successorVertexName];
157
- return successorVertex;
158
- });
159
- return successorVertices;
160
- }
161
- },
162
- {
163
- key: "getOrderedPredecessorVertexNames",
164
- value: function getOrderedPredecessorVertexNames() {
165
- var predecessorVertices = this.getPredecessorVertices();
166
- (0, _vertex.orderVertices)(predecessorVertices);
167
- var orderedPredecessorVertices = predecessorVertices, orderedPredecessorVertexNames = (0, _vertex.vertexNamesFromVertices)(orderedPredecessorVertices);
168
- return orderedPredecessorVertexNames;
103
+ key: "retrievePredecessorVertexNames",
104
+ value: function retrievePredecessorVertexNames() {
105
+ var backwardsVisitedVertexes = this.retrieveBackwardsVisitedVertexes(), backwardsVisitedVertexesTail = tail(backwardsVisitedVertexes), predecessorVertexes = backwardsVisitedVertexesTail, predecessorVertexNames = (0, _vertex.vertexNamesFromVertexes)(predecessorVertexes);
106
+ return predecessorVertexNames;
169
107
  }
170
108
  },
171
109
  {
172
- key: "retrieveForwardsAffectedVertices",
173
- value: function retrieveForwardsAffectedVertices(sourceVertex) {
174
- var forwardsAffectedVertices = this.forwardsDepthFirstSearch(function(visitedVertex) {
175
- var terminate = visitedVertex === sourceVertex;
110
+ key: "retrieveForwardsVisitedVertexes",
111
+ value: function retrieveForwardsVisitedVertexes() {
112
+ var vertex = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
113
+ var vertexA = vertex, visitedVertexes = this.forwardsDepthFirstSearch(function(vertex) {
114
+ var vertexB = vertex, terminate = vertexA === vertexB;
176
115
  if (terminate) {
177
116
  return true;
178
117
  }
179
- });
180
- return forwardsAffectedVertices;
118
+ }), forwardsVisitedVertexes = visitedVertexes; ///
119
+ return forwardsVisitedVertexes;
181
120
  }
182
121
  },
183
122
  {
184
- key: "retrieveBackwardsAffectedVertices",
185
- value: function retrieveBackwardsAffectedVertices() {
186
- var backwardsAffectedVertices = this.backwardsDepthFirstSearch(function(visitedVertex) {
187
- var terminate = false;
123
+ key: "retrieveBackwardsVisitedVertexes",
124
+ value: function retrieveBackwardsVisitedVertexes() {
125
+ var vertex = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
126
+ var vertexA = vertex, visitedVertexes = this.backwardsDepthFirstSearch(function(vertex) {
127
+ var vertexB = vertex, terminate = vertexA === vertexB;
188
128
  if (terminate) {
189
129
  return true;
190
130
  }
191
- });
192
- return backwardsAffectedVertices;
193
- }
194
- },
195
- {
196
- key: "isVertexImmediatePredecessorVertex",
197
- value: function isVertexImmediatePredecessorVertex(vertex) {
198
- var vertexImmediatePredecessorVertex = this.immediatePredecessorVertices.includes(vertex);
199
- return vertexImmediatePredecessorVertex;
131
+ }), backwardsVisitedVertexes = visitedVertexes; ///
132
+ return backwardsVisitedVertexes;
200
133
  }
201
134
  },
202
135
  {
203
136
  key: "isVertexImmediateSuccessorVertex",
204
137
  value: function isVertexImmediateSuccessorVertex(vertex) {
205
- var vertexImmediateSuccessorVertex = this.immediateSuccessorVertices.includes(vertex);
138
+ var vertexImmediateSuccessorVertex = this.immediateSuccessorVertexes.includes(vertex);
206
139
  return vertexImmediateSuccessorVertex;
207
140
  }
208
141
  },
209
142
  {
210
- key: "isEdgePresentBySourceVertex",
211
- value: function isEdgePresentBySourceVertex(sourceVertex) {
212
- var sourceVertexImmediatePredecessorVertex = this.isVertexImmediatePredecessorVertex(sourceVertex), edgePresent = sourceVertexImmediatePredecessorVertex; ///
213
- return edgePresent;
143
+ key: "isVertexImmediatePredecessorVertex",
144
+ value: function isVertexImmediatePredecessorVertex(vertex) {
145
+ var vertexImmediatePredecessorVertex = this.immediatePredecessorVertexes.includes(vertex);
146
+ return vertexImmediatePredecessorVertex;
214
147
  }
215
148
  },
216
149
  {
217
- key: "isEdgePresentByTargetVertex",
218
- value: function isEdgePresentByTargetVertex(targetVertex) {
219
- var targetVertexImmediateSuccessorVertex = this.isVertexImmediateSuccessorVertex(targetVertex), edgePresent = targetVertexImmediateSuccessorVertex; ///
220
- return edgePresent;
150
+ key: "getImmediateSuccessorVertexNames",
151
+ value: function getImmediateSuccessorVertexNames() {
152
+ var immediateSuccessorVertexNames = (0, _vertex.vertexNamesFromVertexes)(this.immediateSuccessorVertexes);
153
+ return immediateSuccessorVertexNames;
154
+ }
155
+ },
156
+ {
157
+ key: "getImmediatePredecessorVertexNames",
158
+ value: function getImmediatePredecessorVertexNames() {
159
+ var immediatePredecessorVertexNames = (0, _vertex.vertexNamesFromVertexes)(this.immediatePredecessorVertexes);
160
+ return immediatePredecessorVertexNames;
221
161
  }
222
162
  },
223
163
  {
@@ -233,168 +173,94 @@ var Vertex = /*#__PURE__*/ function() {
233
173
  }
234
174
  },
235
175
  {
236
- key: "setVisited",
237
- value: function setVisited(visited) {
238
- this.visited = visited;
176
+ key: "setImmediateSuccessorVertexes",
177
+ value: function setImmediateSuccessorVertexes(immediateSuccessorVertexes) {
178
+ this.immediateSuccessorVertexes = immediateSuccessorVertexes;
239
179
  }
240
180
  },
241
181
  {
242
- key: "decrementIndex",
243
- value: function decrementIndex() {
244
- this.index--;
245
- }
246
- },
247
- {
248
- key: "removeImmediatePredecessorVertex",
249
- value: function removeImmediatePredecessorVertex(immediatePredecessorVertex) {
250
- var index = this.immediatePredecessorVertices.indexOf(immediatePredecessorVertex), start = index, deleteCount = 1;
251
- this.immediatePredecessorVertices.splice(start, deleteCount);
182
+ key: "setImmediatePredecessorVertexes",
183
+ value: function setImmediatePredecessorVertexes(immediatePredecessorVertexes) {
184
+ this.immediatePredecessorVertexes = immediatePredecessorVertexes;
252
185
  }
253
186
  },
254
187
  {
255
- key: "removeImmediateSuccessorVertex",
256
- value: function removeImmediateSuccessorVertex(immediateSuccessorVertex) {
257
- var index = this.immediateSuccessorVertices.indexOf(immediateSuccessorVertex), start = index, deleteCount = 1;
258
- this.immediateSuccessorVertices.splice(start, deleteCount);
188
+ key: "decrementIndex",
189
+ value: function decrementIndex() {
190
+ this.index--;
259
191
  }
260
192
  },
261
193
  {
262
- key: "removeIncomingEdges",
263
- value: function removeIncomingEdges() {
264
- var immediateSuccessorVertex = this; ///
265
- this.immediatePredecessorVertices.forEach(function(immediatePredecessorVertex) {
266
- return immediatePredecessorVertex.removeImmediateSuccessorVertex(immediateSuccessorVertex);
267
- });
268
- this.immediatePredecessorVertices = [];
194
+ key: "addImmediateSuccessorVertex",
195
+ value: function addImmediateSuccessorVertex(immediateSuccessorVertex) {
196
+ this.immediateSuccessorVertexes.push(immediateSuccessorVertex);
269
197
  }
270
198
  },
271
199
  {
272
- key: "removeOutgoingEdges",
273
- value: function removeOutgoingEdges() {
274
- var immediatePredecessorVertex = this; ///
275
- this.immediateSuccessorVertices.forEach(function(immediateSuccessorVertex) {
276
- return immediateSuccessorVertex.removeImmediateSuccessorVertex(immediatePredecessorVertex);
277
- });
278
- this.immediateSuccessorVertices = [];
200
+ key: "addImmediatePredecessorVertex",
201
+ value: function addImmediatePredecessorVertex(immediatePredecessorVertex) {
202
+ this.immediatePredecessorVertexes.push(immediatePredecessorVertex);
279
203
  }
280
204
  },
281
205
  {
282
- key: "addImmediatePredecessorVertex",
283
- value: function addImmediatePredecessorVertex(immediatePredecessorVertex) {
284
- this.immediatePredecessorVertices.push(immediatePredecessorVertex);
206
+ key: "removeImmediateSuccessorVertex",
207
+ value: function removeImmediateSuccessorVertex(immediateSuccessorVertex) {
208
+ var index = this.immediateSuccessorVertexes.indexOf(immediateSuccessorVertex), start = index, deleteCount = 1;
209
+ this.immediateSuccessorVertexes.splice(start, deleteCount);
285
210
  }
286
211
  },
287
212
  {
288
- key: "addImmediateSuccessorVertex",
289
- value: function addImmediateSuccessorVertex(immediateSuccessorVertex) {
290
- this.immediateSuccessorVertices.push(immediateSuccessorVertex);
213
+ key: "removeImmediatePredecessorVertex",
214
+ value: function removeImmediatePredecessorVertex(immediatePredecessorVertex) {
215
+ var index = this.immediatePredecessorVertexes.indexOf(immediatePredecessorVertex), start = index, deleteCount = 1;
216
+ this.immediatePredecessorVertexes.splice(start, deleteCount);
291
217
  }
292
218
  },
293
219
  {
294
220
  key: "forwardsDepthFirstSearch",
295
221
  value: function forwardsDepthFirstSearch(callback) {
296
- var visitedVertices = [];
297
- this.retrieveForwardsVisitedVertices(function(visitedVertex) {
298
- var terminate = callback(visitedVertex); ///
299
- visitedVertices.push(visitedVertex);
300
- return terminate;
301
- });
302
- visitedVertices.forEach(function(visitedVertex) {
303
- return visitedVertex.resetVisited();
304
- });
305
- return visitedVertices;
222
+ var vertex = this, visitedVertexes = [];
223
+ (0, _search.forwardsDepthFirstSearch)(vertex, callback, visitedVertexes);
224
+ return visitedVertexes;
306
225
  }
307
226
  },
308
227
  {
309
228
  key: "backwardsDepthFirstSearch",
310
229
  value: function backwardsDepthFirstSearch(callback) {
311
- var visitedVertices = [];
312
- this.retrieveBackwardsVisitedVertices(function(visitedVertex) {
313
- var terminate = callback(visitedVertex); ///
314
- visitedVertices.push(visitedVertex);
315
- return terminate;
316
- });
317
- visitedVertices.forEach(function(visitedVertex) {
318
- return visitedVertex.resetVisited();
319
- });
320
- return visitedVertices;
321
- }
322
- },
323
- {
324
- key: "retrieveForwardsVisitedVertices",
325
- value: function retrieveForwardsVisitedVertices(callback) {
326
- var terminate = false;
327
- if (this.visited === false) {
328
- this.visited = true;
329
- var visitedVertex = this; ///
330
- terminate = callback(visitedVertex);
331
- if (terminate !== true) {
332
- visitedVertex.someImmediateSuccessorVertex(function(immediateSuccessorVertex) {
333
- terminate = immediateSuccessorVertex.retrieveForwardsVisitedVertices(callback);
334
- if (terminate) {
335
- return true;
336
- }
337
- });
338
- }
339
- }
340
- return terminate;
230
+ var vertex = this, visitedVertexes = [];
231
+ (0, _search.backwardsDepthFirstSearch)(vertex, callback, visitedVertexes);
232
+ return visitedVertexes;
341
233
  }
342
234
  },
343
235
  {
344
- key: "retrieveBackwardsVisitedVertices",
345
- value: function retrieveBackwardsVisitedVertices(callback) {
346
- var terminate = false;
347
- if (this.visited === false) {
348
- this.visited = true;
349
- var visitedVertex = this; ///
350
- terminate = callback(visitedVertex);
351
- if (terminate !== true) {
352
- visitedVertex.someImmediatePredecessorVertex(function(immediatePredecessorVertex) {
353
- terminate = immediatePredecessorVertex.retrieveBackwardsVisitedVertices(callback);
354
- if (terminate) {
355
- return true;
356
- }
357
- });
358
- }
359
- }
360
- return terminate;
361
- }
362
- },
363
- {
364
- key: "forEachImmediatePredecessorVertex",
365
- value: function forEachImmediatePredecessorVertex(callback) {
366
- this.immediatePredecessorVertices.forEach(callback);
367
- }
368
- },
369
- {
370
- key: "forEachImmediateSuccessorVertex",
371
- value: function forEachImmediateSuccessorVertex(callback) {
372
- this.immediateSuccessorVertices.forEach(callback);
236
+ key: "someImmediateSuccessorVertex",
237
+ value: function someImmediateSuccessorVertex(callback) {
238
+ return this.immediateSuccessorVertexes.some(callback);
373
239
  }
374
240
  },
375
241
  {
376
242
  key: "someImmediatePredecessorVertex",
377
243
  value: function someImmediatePredecessorVertex(callback) {
378
- this.immediatePredecessorVertices.some(callback);
244
+ return this.immediatePredecessorVertexes.some(callback);
379
245
  }
380
246
  },
381
247
  {
382
- key: "someImmediateSuccessorVertex",
383
- value: function someImmediateSuccessorVertex(callback) {
384
- this.immediateSuccessorVertices.some(callback);
248
+ key: "forEachImmediateSuccessorVertex",
249
+ value: function forEachImmediateSuccessorVertex(callback) {
250
+ this.immediateSuccessorVertexes.forEach(callback);
385
251
  }
386
252
  },
387
253
  {
388
- key: "resetVisited",
389
- value: function resetVisited() {
390
- this.visited = false;
254
+ key: "forEachImmediatePredecessorVertex",
255
+ value: function forEachImmediatePredecessorVertex(callback) {
256
+ this.immediatePredecessorVertexes.forEach(callback);
391
257
  }
392
258
  }
393
259
  ], [
394
260
  {
395
261
  key: "fromNameAndIndex",
396
262
  value: function fromNameAndIndex(name, index) {
397
- var visited = false, immediatePredecessorVertices = [], immediateSuccessorVertices = [], dependencyVertex = new Vertex(name, index, visited, immediatePredecessorVertices, immediateSuccessorVertices);
263
+ var immediateSuccessorVertexes = [], immediatePredecessorVertexes = [], dependencyVertex = new Vertex(name, index, immediateSuccessorVertexes, immediatePredecessorVertexes);
398
264
  return dependencyVertex;
399
265
  }
400
266
  }
@@ -402,4 +268,4 @@ var Vertex = /*#__PURE__*/ function() {
402
268
  return Vertex;
403
269
  }();
404
270
 
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJ0ZXguanMiLCI8PGpzeC1jb25maWctcHJhZ21hLmpzPj4iXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzLCBvcmRlclZlcnRpY2VzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXgge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBpbmRleCwgdmlzaXRlZCwgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcywgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnZpc2l0ZWQgPSB2aXNpdGVkO1xuICAgIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcyA9IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXM7XG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcyA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzO1xuICB9XG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gIH1cblxuICBpc1Zpc2l0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRlZDtcbiAgfVxuXG4gIGlzU3RyYW5kZWQoKSB7XG4gICAgY29uc3QgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlc0xlbmd0aCA9IHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcy5sZW5ndGgsXG4gICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXNMZW5ndGggPSB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzLmxlbmd0aCxcbiAgICAgICAgICBzdHJhbmRlZCA9ICgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlc0xlbmd0aCA9PT0gMCkgJiYgKGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzTGVuZ3RoID09PSAwKSk7XG5cbiAgICByZXR1cm4gc3RyYW5kZWQ7XG4gIH1cblxuICBnZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzKCkge1xuICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMubWFwKChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCkgPT4ge1xuICAgICAgY29uc3QgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXguZ2V0TmFtZSgpO1xuXG4gICAgICByZXR1cm4gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcygpIHtcbiAgICBjb25zdCBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHRoaXMuaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMubWFwKChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWUgPSBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXguZ2V0TmFtZSgpO1xuXG4gICAgICByZXR1cm4gaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcztcbiAgfVxuXG4gIGdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzO1xuICB9XG5cbiAgZ2V0UHJlZGVjZXNzb3JWZXJ0ZXhNYXAocHJlZGVjZXNzb3JWZXJ0ZXhNYXAgPSB7fSkge1xuICAgIHRoaXMuZm9yRWFjaEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCkgPT4ge1xuICAgICAgY29uc3QgcHJlZGVjZXNzb3JWZXJ0ZXggPSBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCwgLy8vXG4gICAgICAgICAgICBwcmVkZWNlc3NvclZlcnRleE5hbWUgPSBwcmVkZWNlc3NvclZlcnRleC5nZXROYW1lKCk7XG5cbiAgICAgIHByZWRlY2Vzc29yVmVydGV4TWFwW3ByZWRlY2Vzc29yVmVydGV4TmFtZV0gPSBwcmVkZWNlc3NvclZlcnRleDtcblxuICAgICAgcHJlZGVjZXNzb3JWZXJ0ZXguZ2V0UHJlZGVjZXNzb3JWZXJ0ZXhNYXAocHJlZGVjZXNzb3JWZXJ0ZXhNYXApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZWRlY2Vzc29yVmVydGV4TWFwO1xuICB9XG5cbiAgZ2V0U3VjY2Vzc29yVmVydGV4TWFwKHN1Y2Nlc3NvclZlcnRleE1hcCA9IHt9KSB7XG4gICAgdGhpcy5mb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NvclZlcnRleCA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCwgLy8vXG4gICAgICAgICAgICBzdWNjZXNzb3JWZXJ0ZXhOYW1lID0gc3VjY2Vzc29yVmVydGV4LmdldE5hbWUoKTtcblxuICAgICAgc3VjY2Vzc29yVmVydGV4TWFwW3N1Y2Nlc3NvclZlcnRleE5hbWVdID0gc3VjY2Vzc29yVmVydGV4O1xuXG4gICAgICBzdWNjZXNzb3JWZXJ0ZXguZ2V0U3VjY2Vzc29yVmVydGV4TWFwKHN1Y2Nlc3NvclZlcnRleE1hcCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3VjY2Vzc29yVmVydGV4TWFwO1xuICB9XG5cbiAgZ2V0UHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcygpIHtcbiAgICBjb25zdCBwcmVkZWNlc3NvclZlcnRpY2VzID0gdGhpcy5nZXRQcmVkZWNlc3NvclZlcnRpY2VzKCksXG4gICAgICAgICAgcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyA9IHByZWRlY2Vzc29yVmVydGljZXMubWFwKChwcmVkZWNlc3NvclZlcnRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lID0gcHJlZGVjZXNzb3JWZXJ0ZXguZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lO1xuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lcygpIHtcbiAgICBjb25zdCBzdWNjZXNzb3JWZXJ0aWNlcyA9IHRoaXMuZ2V0U3VjY2Vzc29yVmVydGljZXMoKSxcbiAgICAgICAgICBzdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHN1Y2Nlc3NvclZlcnRpY2VzLm1hcCgoc3VjY2Vzc29yVmVydGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JWZXJ0ZXhOYW1lID0gc3VjY2Vzc29yVmVydGV4LmdldE5hbWUoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclZlcnRleE5hbWU7XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gc3VjY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRQcmVkZWNlc3NvclZlcnRpY2VzKCkge1xuICAgIGNvbnN0IHByZWRlY2Vzc29yVmVydGV4TWFwID0gdGhpcy5nZXRQcmVkZWNlc3NvclZlcnRleE1hcCgpLFxuICAgICAgICAgIHByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSBPYmplY3Qua2V5cyhwcmVkZWNlc3NvclZlcnRleE1hcCksXG4gICAgICAgICAgcHJlZGVjZXNzb3JWZXJ0aWNlcyA9IHByZWRlY2Vzc29yVmVydGV4TmFtZXMubWFwKChwcmVkZWNlc3NvclZlcnRleE5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWRlY2Vzc29yVmVydGV4ID0gcHJlZGVjZXNzb3JWZXJ0ZXhNYXBbcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lXTtcblxuICAgICAgICAgICAgcmV0dXJuIHByZWRlY2Vzc29yVmVydGV4O1xuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZWRlY2Vzc29yVmVydGljZXM7XG4gIH1cblxuICBnZXRTdWNjZXNzb3JWZXJ0aWNlcygpIHtcbiAgICBjb25zdCBzdWNjZXNzb3JWZXJ0ZXhNYXAgPSB0aGlzLmdldFN1Y2Nlc3NvclZlcnRleE1hcCgpLFxuICAgICAgICAgIHN1Y2Nlc3NvclZlcnRleE5hbWVzID0gT2JqZWN0LmtleXMoc3VjY2Vzc29yVmVydGV4TWFwKSxcbiAgICAgICAgICBzdWNjZXNzb3JWZXJ0aWNlcyA9IHN1Y2Nlc3NvclZlcnRleE5hbWVzLm1hcCgoc3VjY2Vzc29yVmVydGV4TmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc29yVmVydGV4ID0gc3VjY2Vzc29yVmVydGV4TWFwW3N1Y2Nlc3NvclZlcnRleE5hbWVdO1xuICBcbiAgICAgICAgICAgIHJldHVybiBzdWNjZXNzb3JWZXJ0ZXg7XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gc3VjY2Vzc29yVmVydGljZXM7XG4gIH1cblxuICBnZXRPcmRlcmVkUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcygpIHtcbiAgICBjb25zdCBwcmVkZWNlc3NvclZlcnRpY2VzID0gdGhpcy5nZXRQcmVkZWNlc3NvclZlcnRpY2VzKCk7XG5cbiAgICBvcmRlclZlcnRpY2VzKHByZWRlY2Vzc29yVmVydGljZXMpO1xuXG4gICAgY29uc3Qgb3JkZXJlZFByZWRlY2Vzc29yVmVydGljZXMgPSBwcmVkZWNlc3NvclZlcnRpY2VzLCAgLy8vXG4gICAgICAgICAgb3JkZXJlZFByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0aWNlcyhvcmRlcmVkUHJlZGVjZXNzb3JWZXJ0aWNlcyk7XG5cbiAgICByZXR1cm4gb3JkZXJlZFByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cbiAgXG4gIHJldHJpZXZlRm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzKHNvdXJjZVZlcnRleCkge1xuICAgIGNvbnN0IGZvcndhcmRzQWZmZWN0ZWRWZXJ0aWNlcyA9IHRoaXMuZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoKCh2aXNpdGVkVmVydGV4KSA9PiB7XG4gICAgICBjb25zdCB0ZXJtaW5hdGUgPSAodmlzaXRlZFZlcnRleCA9PT0gc291cmNlVmVydGV4KTtcbiAgICAgIFxuICAgICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gZm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzO1xuICB9XG5cbiAgcmV0cmlldmVCYWNrd2FyZHNBZmZlY3RlZFZlcnRpY2VzKCkge1xuICAgIGNvbnN0IGJhY2t3YXJkc0FmZmVjdGVkVmVydGljZXMgPSB0aGlzLmJhY2t3YXJkc0RlcHRoRmlyc3RTZWFyY2goKHZpc2l0ZWRWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBiYWNrd2FyZHNBZmZlY3RlZFZlcnRpY2VzO1xuICB9XG4gIFxuICBpc1ZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KHZlcnRleCkge1xuICAgIGNvbnN0IHZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRpY2VzLmluY2x1ZGVzKHZlcnRleCk7XG5cbiAgICByZXR1cm4gdmVydGV4SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXg7XG4gIH1cblxuICBpc1ZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCh2ZXJ0ZXgpIHtcbiAgICBjb25zdCB2ZXJ0ZXhJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXggPSB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzLmluY2x1ZGVzKHZlcnRleCk7XG5cbiAgICByZXR1cm4gdmVydGV4SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4O1xuICB9XG5cbiAgaXNFZGdlUHJlc2VudEJ5U291cmNlVmVydGV4KHNvdXJjZVZlcnRleCkge1xuICAgIGNvbnN0IHNvdXJjZVZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdGhpcy5pc1ZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KHNvdXJjZVZlcnRleCksXG4gICAgICAgICAgZWRnZVByZXNlbnQgPSBzb3VyY2VWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleDsgLy8vXG5cbiAgICByZXR1cm4gZWRnZVByZXNlbnQ7XG4gIH1cblxuICBpc0VkZ2VQcmVzZW50QnlUYXJnZXRWZXJ0ZXgodGFyZ2V0VmVydGV4KSB7XG4gICAgY29uc3QgdGFyZ2V0VmVydGV4SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ID0gdGhpcy5pc1ZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCh0YXJnZXRWZXJ0ZXgpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gdGFyZ2V0VmVydGV4SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4OyAvLy9cblxuICAgIHJldHVybiBlZGdlUHJlc2VudDtcbiAgfVxuXG4gIHNldE5hbWUobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cblxuICBzZXRJbmRleChpbmRleCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHNldFZpc2l0ZWQodmlzaXRlZCkge1xuICAgIHRoaXMudmlzaXRlZCA9IHZpc2l0ZWQ7XG4gIH1cblxuICBkZWNyZW1lbnRJbmRleCgpIHtcbiAgICB0aGlzLmluZGV4LS07XG4gIH1cblxuICByZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRpY2VzLmluZGV4T2YoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpLFxuICAgICAgICAgIHN0YXJ0ID0gaW5kZXgsICAvLy9cbiAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCk7XG4gIH1cblxuICByZW1vdmVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzLmluZGV4T2YoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KSxcbiAgICAgICAgICBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgZGVsZXRlQ291bnQgPSAxO1xuXG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcy5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KTtcbiAgfVxuICBcbiAgcmVtb3ZlSW5jb21pbmdFZGdlcygpIHtcbiAgICBjb25zdCBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXggPSB0aGlzOyAvLy9cbiAgICBcbiAgICB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMuZm9yRWFjaCgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpID0+IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4LnJlbW92ZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpKTtcblxuICAgIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcyA9IFtdO1xuICB9XG5cbiAgcmVtb3ZlT3V0Z29pbmdFZGdlcygpIHtcbiAgICBjb25zdCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCA9IHRoaXM7IC8vL1xuXG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcy5mb3JFYWNoKChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleC5yZW1vdmVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpKTtcblxuICAgIHRoaXMuaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMgPSBbXTtcbiAgfVxuXG4gIGFkZEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KSB7XG4gICAgdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRpY2VzLnB1c2goaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICB9XG5cbiAgYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCkge1xuICAgIHRoaXMuaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMucHVzaChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpO1xuICB9XG5cbiAgZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmlzaXRlZFZlcnRpY2VzID0gW107XG5cbiAgICB0aGlzLnJldHJpZXZlRm9yd2FyZHNWaXNpdGVkVmVydGljZXMoKHZpc2l0ZWRWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZSA9IGNhbGxiYWNrKHZpc2l0ZWRWZXJ0ZXgpOyAgLy8vXG5cbiAgICAgIHZpc2l0ZWRWZXJ0aWNlcy5wdXNoKHZpc2l0ZWRWZXJ0ZXgpO1xuXG4gICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgIH0pO1xuXG4gICAgdmlzaXRlZFZlcnRpY2VzLmZvckVhY2goKHZpc2l0ZWRWZXJ0ZXgpID0+IHZpc2l0ZWRWZXJ0ZXgucmVzZXRWaXNpdGVkKCkpO1xuXG4gICAgcmV0dXJuIHZpc2l0ZWRWZXJ0aWNlcztcbiAgfVxuXG4gIGJhY2t3YXJkc0RlcHRoRmlyc3RTZWFyY2goY2FsbGJhY2spIHtcbiAgICBjb25zdCB2aXNpdGVkVmVydGljZXMgPSBbXTtcblxuICAgIHRoaXMucmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGljZXMoKHZpc2l0ZWRWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZSA9IGNhbGxiYWNrKHZpc2l0ZWRWZXJ0ZXgpOyAgLy8vXG5cbiAgICAgIHZpc2l0ZWRWZXJ0aWNlcy5wdXNoKHZpc2l0ZWRWZXJ0ZXgpO1xuXG4gICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgIH0pO1xuXG4gICAgdmlzaXRlZFZlcnRpY2VzLmZvckVhY2goKHZpc2l0ZWRWZXJ0ZXgpID0+IHZpc2l0ZWRWZXJ0ZXgucmVzZXRWaXNpdGVkKCkpO1xuXG4gICAgcmV0dXJuIHZpc2l0ZWRWZXJ0aWNlcztcbiAgfVxuXG4gIHJldHJpZXZlRm9yd2FyZHNWaXNpdGVkVmVydGljZXMoY2FsbGJhY2spIHtcbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy52aXNpdGVkID09PSBmYWxzZSkge1xuICAgICAgdGhpcy52aXNpdGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgdmlzaXRlZFZlcnRleCA9IHRoaXM7ICAvLy9cblxuICAgICAgdGVybWluYXRlID0gY2FsbGJhY2sodmlzaXRlZFZlcnRleCk7XG5cbiAgICAgIGlmICh0ZXJtaW5hdGUgIT09IHRydWUpIHtcbiAgICAgICAgdmlzaXRlZFZlcnRleC5zb21lSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgICAgICB0ZXJtaW5hdGUgPSBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgucmV0cmlldmVGb3J3YXJkc1Zpc2l0ZWRWZXJ0aWNlcyhjYWxsYmFjayk7XG5cbiAgICAgICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0ZXJtaW5hdGU7XG4gIH1cblxuICByZXRyaWV2ZUJhY2t3YXJkc1Zpc2l0ZWRWZXJ0aWNlcyhjYWxsYmFjaykge1xuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnZpc2l0ZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnZpc2l0ZWQgPSB0cnVlO1xuXG4gICAgICBjb25zdCB2aXNpdGVkVmVydGV4ID0gdGhpczsgIC8vL1xuXG4gICAgICB0ZXJtaW5hdGUgPSBjYWxsYmFjayh2aXNpdGVkVmVydGV4KTtcblxuICAgICAgaWYgKHRlcm1pbmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICB2aXNpdGVkVmVydGV4LnNvbWVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgICAgICB0ZXJtaW5hdGUgPSBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleC5yZXRyaWV2ZUJhY2t3YXJkc1Zpc2l0ZWRWZXJ0aWNlcyhjYWxsYmFjayk7XG5cbiAgICAgICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0ZXJtaW5hdGU7XG4gIH1cblxuICBmb3JFYWNoSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoY2FsbGJhY2spIHtcbiAgICB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMuZm9yRWFjaChjYWxsYmFjayk7XG4gIH1cblxuICBmb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNvbWVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChjYWxsYmFjaykge1xuICAgIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcy5zb21lKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNvbWVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoY2FsbGJhY2spIHtcbiAgICB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRpY2VzLnNvbWUoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVzZXRWaXNpdGVkKCkge1xuICAgIHRoaXMudmlzaXRlZCA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGZyb21OYW1lQW5kSW5kZXgobmFtZSwgaW5kZXgpIHtcbiAgICBjb25zdCB2aXNpdGVkID0gZmFsc2UsICAvLy9cbiAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRpY2VzID0gW10sXG4gICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMgPSBbXSxcbiAgICAgICAgICBkZXBlbmRlbmN5VmVydGV4ID0gbmV3IFZlcnRleChuYW1lLCBpbmRleCwgdmlzaXRlZCwgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0aWNlcywgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXMpO1xuXG4gICAgcmV0dXJuIGRlcGVuZGVuY3lWZXJ0ZXg7XG4gIH1cbn1cbiIsIlJlYWN0LmNyZWF0ZUVsZW1lbnQiXSwibmFtZXMiOlsiVmVydGV4IiwibmFtZSIsImluZGV4IiwidmlzaXRlZCIsImltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcyIsImdldE5hbWUiLCJnZXRJbmRleCIsImlzVmlzaXRlZCIsImlzU3RyYW5kZWQiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRpY2VzTGVuZ3RoIiwibGVuZ3RoIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGljZXNMZW5ndGgiLCJzdHJhbmRlZCIsImdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwibWFwIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWUiLCJnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyIsImltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZSIsImdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGljZXMiLCJnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0aWNlcyIsImdldFByZWRlY2Vzc29yVmVydGV4TWFwIiwicHJlZGVjZXNzb3JWZXJ0ZXhNYXAiLCJmb3JFYWNoSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJwcmVkZWNlc3NvclZlcnRleCIsInByZWRlY2Vzc29yVmVydGV4TmFtZSIsImdldFN1Y2Nlc3NvclZlcnRleE1hcCIsInN1Y2Nlc3NvclZlcnRleE1hcCIsImZvckVhY2hJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJzdWNjZXNzb3JWZXJ0ZXgiLCJzdWNjZXNzb3JWZXJ0ZXhOYW1lIiwiZ2V0UHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsInByZWRlY2Vzc29yVmVydGljZXMiLCJnZXRQcmVkZWNlc3NvclZlcnRpY2VzIiwicHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsImdldFN1Y2Nlc3NvclZlcnRleE5hbWVzIiwic3VjY2Vzc29yVmVydGljZXMiLCJnZXRTdWNjZXNzb3JWZXJ0aWNlcyIsInN1Y2Nlc3NvclZlcnRleE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImdldE9yZGVyZWRQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwib3JkZXJWZXJ0aWNlcyIsIm9yZGVyZWRQcmVkZWNlc3NvclZlcnRpY2VzIiwib3JkZXJlZFByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhOYW1lc0Zyb21WZXJ0aWNlcyIsInJldHJpZXZlRm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzIiwic291cmNlVmVydGV4IiwiZm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzIiwiZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoIiwidmlzaXRlZFZlcnRleCIsInRlcm1pbmF0ZSIsInJldHJpZXZlQmFja3dhcmRzQWZmZWN0ZWRWZXJ0aWNlcyIsImJhY2t3YXJkc0FmZmVjdGVkVmVydGljZXMiLCJiYWNrd2FyZHNEZXB0aEZpcnN0U2VhcmNoIiwiaXNWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsInZlcnRleCIsInZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4IiwiaW5jbHVkZXMiLCJpc1ZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsInZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImlzRWRnZVByZXNlbnRCeVNvdXJjZVZlcnRleCIsInNvdXJjZVZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4IiwiZWRnZVByZXNlbnQiLCJpc0VkZ2VQcmVzZW50QnlUYXJnZXRWZXJ0ZXgiLCJ0YXJnZXRWZXJ0ZXgiLCJ0YXJnZXRWZXJ0ZXhJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJzZXROYW1lIiwic2V0SW5kZXgiLCJzZXRWaXNpdGVkIiwiZGVjcmVtZW50SW5kZXgiLCJyZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImluZGV4T2YiLCJzdGFydCIsImRlbGV0ZUNvdW50Iiwic3BsaWNlIiwicmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwicmVtb3ZlSW5jb21pbmdFZGdlcyIsImZvckVhY2giLCJyZW1vdmVPdXRnb2luZ0VkZ2VzIiwiYWRkSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJwdXNoIiwiYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwiY2FsbGJhY2siLCJ2aXNpdGVkVmVydGljZXMiLCJyZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRpY2VzIiwicmVzZXRWaXNpdGVkIiwicmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGljZXMiLCJzb21lSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4Iiwic29tZUltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4Iiwic29tZSIsImZyb21OYW1lQW5kSW5kZXgiLCJkZXBlbmRlbmN5VmVydGV4Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQUlxQkE7OztzQkFGa0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhDLElBQUEsQUFBTUEsdUJBQU47YUFBTUEsT0FDUEMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsNEJBQTRCLEVBQUVDLDBCQUEwQjtnQ0FEdkVMO1FBRWpCLElBQUksQ0FBQ0MsT0FBT0E7UUFDWixJQUFJLENBQUNDLFFBQVFBO1FBQ2IsSUFBSSxDQUFDQyxVQUFVQTtRQUNmLElBQUksQ0FBQ0MsK0JBQStCQTtRQUNwQyxJQUFJLENBQUNDLDZCQUE2QkE7O2tCQU5qQkw7O1lBU25CTSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNMO1lBQ2Q7OztZQUVBTSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNMO1lBQ2Q7OztZQUVBTSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNMO1lBQ2Q7OztZQUVBTSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTUMscUNBQXFDLElBQUksQ0FBQ04sNkJBQTZCTyxRQUN2RUMsbUNBQW1DLElBQUksQ0FBQ1AsMkJBQTJCTSxRQUNuRUUsV0FBWSxBQUFDSCx1Q0FBdUMsS0FBT0UscUNBQXFDO2dCQUV0RyxPQUFPQztZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNF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
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJ0ZXguanMiLCI8PGpzeC1jb25maWctcHJhZ21hLmpzPj4iXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgeyB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyB9IGZyb20gXCIuL3V0aWxpdGllcy92ZXJ0ZXhcIjtcbmltcG9ydCB7IGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCwgYmFja3dhcmRzRGVwdGhGaXJzdFNlYXJjaCB9IGZyb20gXCIuL3V0aWxpdGllcy9zZWFyY2hcIjtcblxuY29uc3QgeyBsYXN0LCB0YWlsIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4IHtcbiAgY29uc3RydWN0b3IobmFtZSwgaW5kZXgsIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzLCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzO1xuICAgIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcyA9IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXM7XG4gIH1cblxuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBnZXRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleDtcbiAgfVxuXG4gIGdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzKCkge1xuICAgIHJldHVybiB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzO1xuICB9XG5cbiAgZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcygpIHtcbiAgICByZXR1cm4gdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzO1xuICB9XG5cbiAgaXNTdHJhbmRlZCgpIHtcbiAgICBjb25zdCBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlc0xlbmd0aCA9IHRoaXMuaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMubGVuZ3RoLFxuICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXNMZW5ndGggPSB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMubGVuZ3RoLFxuICAgICAgICAgIHN0cmFuZGVkID0gKChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlc0xlbmd0aCA9PT0gMCkgJiYgKGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXNMZW5ndGggPT09IDApKTtcblxuICAgIHJldHVybiBzdHJhbmRlZDtcbiAgfVxuXG4gIGlzVmVydGV4UmVhY2hhYmxlKHZlcnRleCkge1xuICAgIGNvbnN0IGZvcndhcmRzVmlzaXRlZFZlcnRpY2VzID0gdGhpcy5yZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRleGVzKHZlcnRleCksXG4gICAgICAgICAgbGFzdEZvcndhcmRzVmlzaXRlZFZlcnRleCA9IGxhc3QoZm9yd2FyZHNWaXNpdGVkVmVydGljZXMpLFxuICAgICAgICAgIHZlcnRleFJlYWNoYWJsZSA9ICh2ZXJ0ZXggPT09IGxhc3RGb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXgpO1xuXG4gICAgcmV0dXJuIHZlcnRleFJlYWNoYWJsZTtcbiAgfVxuXG4gIGlzRWRnZVByZXNlbnRCeVNvdXJjZVZlcnRleChzb3VyY2VWZXJ0ZXgpIHtcbiAgICBjb25zdCBzb3VyY2VWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCA9IHRoaXMuaXNWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChzb3VyY2VWZXJ0ZXgpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXg7IC8vL1xuXG4gICAgcmV0dXJuIGVkZ2VQcmVzZW50O1xuICB9XG5cbiAgaXNFZGdlUHJlc2VudEJ5VGFyZ2V0VmVydGV4KHRhcmdldFZlcnRleCkge1xuICAgIGNvbnN0IHRhcmdldFZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCA9IHRoaXMuaXNWZXJ0ZXhJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgodGFyZ2V0VmVydGV4KSxcbiAgICAgICAgICBlZGdlUHJlc2VudCA9IHRhcmdldFZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleDsgLy8vXG5cbiAgICByZXR1cm4gZWRnZVByZXNlbnQ7XG4gIH1cblxuICByZXRyaWV2ZVN1Y2Nlc3NvclZlcnRleE5hbWVzKCkge1xuICAgIGNvbnN0IGZvcndhcmRzVmlzaXRlZFZlcnRleGVzID0gdGhpcy5yZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRleGVzKCksXG4gICAgICAgICAgZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXNUYWlsID0gdGFpbChmb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyksXG4gICAgICAgICAgc3VjY2Vzc29yVmVydGV4ZXMgPSBmb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlc1RhaWwsXG4gICAgICAgICAgc3VjY2Vzc29yVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyhzdWNjZXNzb3JWZXJ0ZXhlcyk7XG5cbiAgICByZXR1cm4gc3VjY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICByZXRyaWV2ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgYmFja3dhcmRzVmlzaXRlZFZlcnRleGVzID0gdGhpcy5yZXRyaWV2ZUJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcygpLFxuICAgICAgICAgIGJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlc1RhaWwgPSB0YWlsKGJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyksXG4gICAgICAgICAgcHJlZGVjZXNzb3JWZXJ0ZXhlcyA9IGJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlc1RhaWwsXG4gICAgICAgICAgcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleE5hbWVzRnJvbVZlcnRleGVzKHByZWRlY2Vzc29yVmVydGV4ZXMpO1xuXG4gICAgcmV0dXJuIHByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICByZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRleGVzKHZlcnRleCA9IG51bGwpIHtcbiAgICBjb25zdCB2ZXJ0ZXhBID0gdmVydGV4LCAvLy9cbiAgICAgICAgICB2aXNpdGVkVmVydGV4ZXMgPSB0aGlzLmZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCgodmVydGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0ZXhCID0gdmVydGV4LCAvLy9cbiAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSA9ICh2ZXJ0ZXhBID09PSB2ZXJ0ZXhCKTtcblxuICAgICAgICAgICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyA9IHZpc2l0ZWRWZXJ0ZXhlczsgIC8vL1xuXG4gICAgcmV0dXJuIGZvcndhcmRzVmlzaXRlZFZlcnRleGVzO1xuICB9XG5cbiAgcmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXModmVydGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IHZlcnRleEEgPSB2ZXJ0ZXgsIC8vL1xuICAgICAgICAgIHZpc2l0ZWRWZXJ0ZXhlcyA9IHRoaXMuYmFja3dhcmRzRGVwdGhGaXJzdFNlYXJjaCgodmVydGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0ZXhCID0gdmVydGV4LCAvLy9cbiAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSA9ICh2ZXJ0ZXhBID09PSB2ZXJ0ZXhCKTtcblxuICAgICAgICAgICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBiYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMgPSB2aXNpdGVkVmVydGV4ZXM7ICAvLy9cblxuICAgIHJldHVybiBiYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXM7XG4gIH1cblxuICBpc1ZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCh2ZXJ0ZXgpIHtcbiAgICBjb25zdCB2ZXJ0ZXhJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXggPSB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzLmluY2x1ZGVzKHZlcnRleCk7XG5cbiAgICByZXR1cm4gdmVydGV4SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4O1xuICB9XG5cbiAgaXNWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCh2ZXJ0ZXgpIHtcbiAgICBjb25zdCB2ZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCA9IHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcy5pbmNsdWRlcyh2ZXJ0ZXgpO1xuXG4gICAgcmV0dXJuIHZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4O1xuICB9XG5cbiAgZ2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyh0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzKTtcblxuICAgIHJldHVybiBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleE5hbWVzRnJvbVZlcnRleGVzKHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcyk7XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIHNldE5hbWUobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cblxuICBzZXRJbmRleChpbmRleCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHNldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzKGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzKSB7XG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzO1xuICB9XG5cbiAgc2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcyhpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzKSB7XG4gICAgdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcztcbiAgfVxuXG4gIGRlY3JlbWVudEluZGV4KCkge1xuICAgIHRoaXMuaW5kZXgtLTtcbiAgfVxuXG4gIGFkZEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpIHtcbiAgICB0aGlzLmltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzLnB1c2goaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KTtcbiAgfVxuXG4gIGFkZEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4KSB7XG4gICAgdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzLnB1c2goaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICB9XG5cbiAgcmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcy5pbmRleE9mKGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCksXG4gICAgICAgICAgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICAgIHRoaXMuaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCk7XG4gIH1cblxuICByZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzLmluZGV4T2YoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpLFxuICAgICAgICAgIHN0YXJ0ID0gaW5kZXgsICAvLy9cbiAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCk7XG4gIH1cblxuICBmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2goY2FsbGJhY2spIHtcbiAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLCAgLy8vXG4gICAgICAgICAgdmlzaXRlZFZlcnRleGVzID0gW107XG5cbiAgICBmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2godmVydGV4LCBjYWxsYmFjaywgdmlzaXRlZFZlcnRleGVzKTtcblxuICAgIHJldHVybiB2aXNpdGVkVmVydGV4ZXM7XG4gIH1cblxuICBiYWNrd2FyZHNEZXB0aEZpcnN0U2VhcmNoKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmVydGV4ID0gdGhpcywgIC8vL1xuICAgICAgICAgIHZpc2l0ZWRWZXJ0ZXhlcyA9IFtdO1xuXG4gICAgYmFja3dhcmRzRGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsIGNhbGxiYWNrLCB2aXNpdGVkVmVydGV4ZXMpO1xuXG4gICAgcmV0dXJuIHZpc2l0ZWRWZXJ0ZXhlcztcbiAgfVxuXG4gIHNvbWVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcy5zb21lKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNvbWVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMuc29tZShjYWxsYmFjayk7XG4gIH1cblxuICBmb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5pbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChjYWxsYmFjaykge1xuICAgIHRoaXMuaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTmFtZUFuZEluZGV4KG5hbWUsIGluZGV4KSB7XG4gICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMgPSBbXSxcbiAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzID0gW10sXG4gICAgICAgICAgZGVwZW5kZW5jeVZlcnRleCA9IG5ldyBWZXJ0ZXgobmFtZSwgaW5kZXgsIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzLCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzKTtcblxuICAgIHJldHVybiBkZXBlbmRlbmN5VmVydGV4O1xuICB9XG59XG4iLCJSZWFjdC5jcmVhdGVFbGVtZW50Il0sIm5hbWVzIjpbIlZlcnRleCIsImxhc3QiLCJhcnJheVV0aWxpdGllcyIsInRhaWwiLCJuYW1lIiwiaW5kZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyIsImltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMiLCJnZXROYW1lIiwiZ2V0SW5kZXgiLCJnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyIsImdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMiLCJpc1N0cmFuZGVkIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXNMZW5ndGgiLCJsZW5ndGgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzTGVuZ3RoIiwic3RyYW5kZWQiLCJpc1ZlcnRleFJlYWNoYWJsZSIsInZlcnRleCIsImZvcndhcmRzVmlzaXRlZFZlcnRpY2VzIiwicmV0cmlldmVGb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyIsImxhc3RGb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXgiLCJ2ZXJ0ZXhSZWFjaGFibGUiLCJpc0VkZ2VQcmVzZW50QnlTb3VyY2VWZXJ0ZXgiLCJzb3VyY2VWZXJ0ZXgiLCJzb3VyY2VWZXJ0ZXhJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImlzVmVydGV4SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJlZGdlUHJlc2VudCIsImlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCIsInRhcmdldFZlcnRleCIsInRhcmdldFZlcnRleEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImlzVmVydGV4SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwicmV0cmlldmVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyIsImZvcndhcmRzVmlzaXRlZFZlcnRleGVzIiwiZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXNUYWlsIiwic3VjY2Vzc29yVmVydGV4ZXMiLCJzdWNjZXNzb3JWZXJ0ZXhOYW1lcyIsInZlcnRleE5hbWVzRnJvbVZlcnRleGVzIiwicmV0cmlldmVQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwiYmFja3dhcmRzVmlzaXRlZFZlcnRleGVzIiwicmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMiLCJiYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXNUYWlsIiwicHJlZGVjZXNzb3JWZXJ0ZXhlcyIsInByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhBIiwidmlzaXRlZFZlcnRleGVzIiwiZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoIiwidmVydGV4QiIsInRlcm1pbmF0ZSIsImJhY2t3YXJkc0RlcHRoRmlyc3RTZWFyY2giLCJ2ZXJ0ZXhJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJpbmNsdWRlcyIsInZlcnRleEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4IiwiZ2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyIsImdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwic2V0TmFtZSIsInNldEluZGV4Iiwic2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMiLCJzZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzIiwiZGVjcmVtZW50SW5kZXgiLCJhZGRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJwdXNoIiwiYWRkSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsInJlbW92ZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImluZGV4T2YiLCJzdGFydCIsImRlbGV0ZUNvdW50Iiwic3BsaWNlIiwicmVtb3ZlSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJjYWxsYmFjayIsInNvbWVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJzb21lIiwic29tZUltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4IiwiZm9yRWFjaEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImZvckVhY2giLCJmb3JFYWNoSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJmcm9tTmFtZUFuZEluZGV4IiwiZGVwZW5kZW5jeVZlcnRleCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFTcUJBOzs7eUJBUFU7c0JBRVM7c0JBQzRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVwRSxJQUFRQyxPQUFlQywwQkFBZkQsTUFBTUUsT0FBU0QsMEJBQVRDO0FBRUMsSUFB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-directed-graphs",
3
3
  "author": "James Smith",
4
- "version": "3.0.37",
4
+ "version": "3.0.42",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-directed-graphs",
7
7
  "description": "Occam's directed graphs.",
@@ -14,15 +14,13 @@
14
14
  },
15
15
  "devDependencies": {
16
16
  "@swc/core": "^1.2.50",
17
- "esbuild": "^0.9.6",
18
- "express": "^4.17.1",
19
- "lively-cli": "^2.0.34",
17
+ "chai": "^4.1.0",
18
+ "mocha": "^6.0.2",
20
19
  "watchful-cli": "^1.7.19"
21
20
  },
22
21
  "scripts": {
23
- "start": "node ./bin/main.js",
24
22
  "clean": "rm -rf ./lib",
25
- "watchful": "watchful -m --transpiler=swc --bundler=esbuild --source-directory=./src --lib-directory=./lib --entry-file=example.js --bundle-file=./example.js --wait=100",
23
+ "watchful": "watchful -m --transpiler=swc --source-directory=./src --lib-directory=./lib --pause=100",
26
24
  "batch": "npm run watchful batch --",
27
25
  "batch-debug": "npm run watchful batch -- --debug",
28
26
  "incremental": "npm run watchful incremental --",
@@ -30,7 +28,8 @@
30
28
  "build": "npm run clean && npm run batch",
31
29
  "build-debug": "npm run clean && npm run batch-debug",
32
30
  "watch": "npm run clean && npm run batch && npm run incremental",
33
- "watch-debug": "npm run clean && npm run batch-debug && npm run incremental-debug"
31
+ "watch-debug": "npm run clean && npm run batch-debug && npm run incremental-debug",
32
+ "test": "mocha --recursive -R spec ./test"
34
33
  },
35
34
  "main": "./lib/index.js"
36
35
  }