occam-directed-graphs 3.0.37 → 3.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -49
- package/lib/cycle.js +31 -14
- package/lib/directedGraph.js +215 -201
- package/lib/index.js +9 -1
- package/lib/utilities/index.js +40 -0
- package/lib/utilities/search.js +91 -0
- package/lib/utilities/vertex.js +11 -50
- package/lib/vertex.js +88 -251
- package/package.json +6 -7
- package/src/cycle.js +8 -28
- package/src/directedGraph.js +277 -198
- package/src/index.js +2 -0
- package/src/utilities/index.js +25 -0
- package/src/utilities/search.js +69 -0
- package/src/utilities/vertex.js +6 -61
- package/src/vertex.js +92 -261
- package/test/cirectedGraph.js +589 -0
- package/bin/main.js +0 -15
- package/lib/directedAcyclicGraph.js +0 -364
- package/lib/example.js +0 -21
- package/lib/partialCycle.js +0 -102
- package/lib/utilities/edge.js +0 -65
- package/src/directedAcyclicGraph.js +0 -422
- package/src/example.js +0 -22
- package/src/partialCycle.js +0 -69
- package/src/utilities/edge.js +0 -58
package/lib/directedGraph.js
CHANGED
|
@@ -11,10 +11,17 @@ Object.defineProperty(exports, "default", {
|
|
|
11
11
|
var _necessary = require("necessary");
|
|
12
12
|
var _edge = /*#__PURE__*/ _interop_require_default(require("./edge"));
|
|
13
13
|
var _cycle = /*#__PURE__*/ _interop_require_default(require("./cycle"));
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
|
|
14
|
+
var _vertex = /*#__PURE__*/ _interop_require_default(require("./vertex"));
|
|
15
|
+
var _index = require("./utilities/index");
|
|
16
|
+
var _vertex1 = require("./utilities/vertex");
|
|
17
|
+
function _array_like_to_array(arr, len) {
|
|
18
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
19
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
20
|
+
return arr2;
|
|
21
|
+
}
|
|
22
|
+
function _array_without_holes(arr) {
|
|
23
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
24
|
+
}
|
|
18
25
|
function _class_call_check(instance, Constructor) {
|
|
19
26
|
if (!(instance instanceof Constructor)) {
|
|
20
27
|
throw new TypeError("Cannot call a class as a function");
|
|
@@ -39,203 +46,227 @@ function _interop_require_default(obj) {
|
|
|
39
46
|
default: obj
|
|
40
47
|
};
|
|
41
48
|
}
|
|
42
|
-
|
|
49
|
+
function _iterable_to_array(iter) {
|
|
50
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
51
|
+
}
|
|
52
|
+
function _non_iterable_spread() {
|
|
53
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
54
|
+
}
|
|
55
|
+
function _to_consumable_array(arr) {
|
|
56
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
57
|
+
}
|
|
58
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
59
|
+
if (!o) return;
|
|
60
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
61
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
62
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
63
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
64
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
65
|
+
}
|
|
66
|
+
var first = _necessary.arrayUtilities.first;
|
|
43
67
|
var DirectedGraph = /*#__PURE__*/ function() {
|
|
44
|
-
function DirectedGraph(
|
|
68
|
+
function DirectedGraph(vertexMap) {
|
|
45
69
|
_class_call_check(this, DirectedGraph);
|
|
46
|
-
this.
|
|
47
|
-
this.directedAcyclicGraph = directedAcyclicGraph;
|
|
70
|
+
this.vertexMap = vertexMap;
|
|
48
71
|
}
|
|
49
72
|
_create_class(DirectedGraph, [
|
|
50
73
|
{
|
|
51
|
-
key: "
|
|
52
|
-
value: function
|
|
53
|
-
return this.
|
|
74
|
+
key: "getVertexNap",
|
|
75
|
+
value: function getVertexNap() {
|
|
76
|
+
return this.vertexMap;
|
|
54
77
|
}
|
|
55
78
|
},
|
|
56
79
|
{
|
|
57
|
-
key: "
|
|
58
|
-
value: function
|
|
59
|
-
|
|
80
|
+
key: "getVertexes",
|
|
81
|
+
value: function getVertexes() {
|
|
82
|
+
var vertexMapValues = Object.values(this.vertexMap), vertexes = vertexMapValues; ///
|
|
83
|
+
return vertexes;
|
|
60
84
|
}
|
|
61
85
|
},
|
|
62
86
|
{
|
|
63
87
|
key: "getVertexNames",
|
|
64
88
|
value: function getVertexNames() {
|
|
65
|
-
|
|
89
|
+
var vertexMapKeys = Object.keys(this.vertexMap), vertexNames = vertexMapKeys; ///
|
|
90
|
+
return vertexNames;
|
|
66
91
|
}
|
|
67
92
|
},
|
|
68
93
|
{
|
|
69
94
|
key: "getOrderedVertexNames",
|
|
70
95
|
value: function getOrderedVertexNames() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
key: "addVertexByVertexName",
|
|
76
|
-
value: function addVertexByVertexName(vertexName) {
|
|
77
|
-
this.directedAcyclicGraph.addVertexByVertexName(vertexName);
|
|
96
|
+
var vertexes = this.getVertexes();
|
|
97
|
+
(0, _vertex1.orderVertexes)(vertexes);
|
|
98
|
+
var orderedVertexes = vertexes, orderedVertexNames = (0, _vertex1.vertexNamesFromVertexes)(orderedVertexes);
|
|
99
|
+
return orderedVertexNames;
|
|
78
100
|
}
|
|
79
101
|
},
|
|
80
102
|
{
|
|
81
|
-
key: "
|
|
82
|
-
value: function
|
|
83
|
-
|
|
103
|
+
key: "getVertexByVertexName",
|
|
104
|
+
value: function getVertexByVertexName(vertexName) {
|
|
105
|
+
var vertexPresent = this.isVertexPresentByVertexName(vertexName), vertex = vertexPresent ? this.vertexMap[vertexName] : null;
|
|
106
|
+
return vertex;
|
|
84
107
|
}
|
|
85
108
|
},
|
|
86
109
|
{
|
|
87
|
-
key: "
|
|
88
|
-
value: function
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
{
|
|
99
|
-
key: "getPredecessorVertexNamesByVertexName",
|
|
100
|
-
value: function getPredecessorVertexNamesByVertexName(vertexName) {
|
|
101
|
-
return this.directedAcyclicGraph.getPredecessorVertexNamesByVertexName(vertexName);
|
|
110
|
+
key: "getEdgesBySourceVertexName",
|
|
111
|
+
value: function getEdgesBySourceVertexName(sourceVertexName) {
|
|
112
|
+
var edges = [], sourceVertex = this.getVertexByVertexName(sourceVertexName);
|
|
113
|
+
if (sourceVertex !== null) {
|
|
114
|
+
var immediateSuccessorVertexes = sourceVertex.getImmediateSuccessorVertexes(), immediateSuccessorVertexNames = (0, _vertex1.vertexNamesFromVertexes)(immediateSuccessorVertexes), targetVertexNames = immediateSuccessorVertexNames; ///
|
|
115
|
+
targetVertexNames.forEach(function(targetVertexName) {
|
|
116
|
+
var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
117
|
+
edges.push(edge);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return edges;
|
|
102
121
|
}
|
|
103
122
|
},
|
|
104
123
|
{
|
|
105
|
-
key: "
|
|
106
|
-
value: function
|
|
107
|
-
var
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
var cyclicEdgeSourceVertexName = cyclicEdge.getSourceVertexName(), immediatePredecessorVertexName = cyclicEdgeSourceVertexName; ///
|
|
114
|
-
immediatePredecessorVertexNames.push(immediatePredecessorVertexName);
|
|
115
|
-
}
|
|
124
|
+
key: "getEdgesByTargetVertexName",
|
|
125
|
+
value: function getEdgesByTargetVertexName(targetVertexName) {
|
|
126
|
+
var edges = [], targetVertex = this.getVertexByVertexName(targetVertexName);
|
|
127
|
+
if (targetVertex !== null) {
|
|
128
|
+
var immediatePredecessorVertexes = targetVertex.getImmediatePredecessorVertexes(), immediatePredecessorVertexNames = (0, _vertex1.vertexNamesFromVertexes)(immediatePredecessorVertexes), sourceVertexNames = immediatePredecessorVertexNames; ///
|
|
129
|
+
sourceVertexNames.forEach(function(sourceVertexName) {
|
|
130
|
+
var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
131
|
+
edges.push(edge);
|
|
116
132
|
});
|
|
117
133
|
}
|
|
118
|
-
return
|
|
134
|
+
return edges;
|
|
119
135
|
}
|
|
120
136
|
},
|
|
121
137
|
{
|
|
122
|
-
key: "
|
|
123
|
-
value: function
|
|
124
|
-
var
|
|
125
|
-
var
|
|
126
|
-
if (
|
|
127
|
-
this.cyclicEdges.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
key: "getFirstCycle",
|
|
139
|
+
value: function getFirstCycle() {
|
|
140
|
+
var firstCycle = null;
|
|
141
|
+
var cyclesPresent = this.areCyclesPresent();
|
|
142
|
+
if (cyclesPresent) {
|
|
143
|
+
var cyclicEdges = this.getCyclicEdges(), firstCyclicEdge = first(cyclicEdges), sourceVertexName = firstCyclicEdge.getSourceVertexName(), targetVertexName = firstCyclicEdge.getTargetVertexName(), sourceVertex = this.getVertexByVertexName(sourceVertexName), targetVertex = this.getVertexByVertexName(targetVertexName);
|
|
144
|
+
targetVertex.forwardsDepthFirstSearch(function(vertex, predecessorVertexes) {
|
|
145
|
+
var terminate = false;
|
|
146
|
+
if (vertex === sourceVertex) {
|
|
147
|
+
terminate = true;
|
|
148
|
+
var cycle = _cycle.default.fromSourceVertexAndPredecessorVertexes(sourceVertex, predecessorVertexes); ///
|
|
149
|
+
firstCycle = cycle; ///
|
|
132
150
|
}
|
|
151
|
+
return terminate;
|
|
133
152
|
});
|
|
134
153
|
}
|
|
135
|
-
return
|
|
154
|
+
return firstCycle;
|
|
136
155
|
}
|
|
137
156
|
},
|
|
138
157
|
{
|
|
139
|
-
key: "
|
|
140
|
-
value: function
|
|
141
|
-
var
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
158
|
+
key: "getCyclicEdges",
|
|
159
|
+
value: function getCyclicEdges() {
|
|
160
|
+
var cyclicEdges = [], vertexes = this.getVertexes();
|
|
161
|
+
vertexes.forEach(function(vertex) {
|
|
162
|
+
var sourceVertex = vertex, sourceVertexIndex = sourceVertex.getIndex();
|
|
163
|
+
vertex.forEachImmediateSuccessorVertex(function(immediateSuccessorVertex) {
|
|
164
|
+
var targetVertex = immediateSuccessorVertex, targetVertexIndex = targetVertex.getIndex();
|
|
165
|
+
if (targetVertexIndex < sourceVertexIndex) {
|
|
166
|
+
var sourceVertexName = sourceVertex.getName(), targetVertexName = targetVertex.getName(), edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName), cyclicEdge = edge; ///
|
|
167
|
+
cyclicEdges.push(cyclicEdge);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
sourceVertex;
|
|
171
|
+
});
|
|
172
|
+
return cyclicEdges;
|
|
148
173
|
}
|
|
149
174
|
},
|
|
150
175
|
{
|
|
151
|
-
key: "
|
|
152
|
-
value: function
|
|
153
|
-
var
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
var visitedVertexName = visitedVertex.getName(), sourceVertexName = visitedVertexName; ///
|
|
158
|
-
filter(cyclicEdges, function(cyclicEdge) {
|
|
159
|
-
var matches = cyclicEdge.matchSourceVertexName(sourceVertexName);
|
|
160
|
-
if (matches) {
|
|
161
|
-
var predecessorVertices = getPredecessorVertices(), partialCycle = _partialCycle.default.fromCyclicEdgeAndPredecessorVertices(cyclicEdge, predecessorVertices);
|
|
162
|
-
partialCycles.push(partialCycle);
|
|
163
|
-
} else {
|
|
176
|
+
key: "areCyclesPresent",
|
|
177
|
+
value: function areCyclesPresent() {
|
|
178
|
+
var vertexes = this.getVertexes(), cyclesPresent = vertexes.some(function(vertex) {
|
|
179
|
+
var sourceVertex = vertex, sourceVertexIndex = sourceVertex.getIndex(), cyclicEdgePresent = vertex.someImmediateSuccessorVertex(function(immediateSuccessorVertex) {
|
|
180
|
+
var targetVertex = immediateSuccessorVertex, targetVertexIndex = targetVertex.getIndex();
|
|
181
|
+
if (targetVertexIndex < sourceVertexIndex) {
|
|
164
182
|
return true;
|
|
165
183
|
}
|
|
166
184
|
});
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
partialCycles.some(function(partialCycle) {
|
|
171
|
-
var targetVertexName = partialCycle.getTargetVertexName(), targetVertex = _this.directedAcyclicGraph.getVertexByVertexName(targetVertexName);
|
|
172
|
-
(0, _vertex.forwardsDepthFirstSearch)(targetVertex, function(visitedVertex, getPredecessorVertices) {
|
|
173
|
-
var visitedVertexName = visitedVertex.getName();
|
|
174
|
-
if (visitedVertexName === vertexName) {
|
|
175
|
-
var predecessorVertices = getPredecessorVertices(), successorVertices = predecessorVertices, cycle = _cycle.default.fromVertexNamePartialCycleAndSuccessorVertices(vertexName, partialCycle, successorVertices);
|
|
176
|
-
cycles.push(cycle);
|
|
177
|
-
}
|
|
178
|
-
var cyclesLength = cycles.length, terminate = cyclesLength > 0;
|
|
179
|
-
return terminate;
|
|
180
|
-
});
|
|
185
|
+
if (cyclicEdgePresent) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
181
188
|
});
|
|
182
|
-
|
|
183
|
-
if (cyclesLength > 0) {
|
|
184
|
-
firstCycle = first(cycles);
|
|
185
|
-
}
|
|
186
|
-
return firstCycle;
|
|
189
|
+
return cyclesPresent;
|
|
187
190
|
}
|
|
188
191
|
},
|
|
189
192
|
{
|
|
190
|
-
key: "
|
|
191
|
-
value: function
|
|
192
|
-
var
|
|
193
|
-
|
|
193
|
+
key: "isEdgePresent",
|
|
194
|
+
value: function isEdgePresent(edge) {
|
|
195
|
+
var edgePresent = false;
|
|
196
|
+
var sourceVertexName = edge.getSourceVertexName(), sourceVertex = this.getVertexByVertexName(sourceVertexName);
|
|
197
|
+
if (sourceVertex !== null) {
|
|
198
|
+
var targetVertexName = edge.getTargetVertexName(), targetVertex = this.getVertexByVertexName(targetVertexName);
|
|
199
|
+
if (targetVertex !== null) {
|
|
200
|
+
edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return edgePresent;
|
|
194
204
|
}
|
|
195
205
|
},
|
|
196
206
|
{
|
|
197
|
-
key: "
|
|
198
|
-
value: function
|
|
199
|
-
var
|
|
200
|
-
return
|
|
207
|
+
key: "isVertexPresentByVertexName",
|
|
208
|
+
value: function isVertexPresentByVertexName(vertexName) {
|
|
209
|
+
var vertexNames = this.getVertexNames(), vertexNamesIncludesVertexName = vertexNames.includes(vertexName), vertexPresent = vertexNamesIncludesVertexName; ///
|
|
210
|
+
return vertexPresent;
|
|
201
211
|
}
|
|
202
212
|
},
|
|
203
213
|
{
|
|
204
|
-
key: "
|
|
205
|
-
value: function
|
|
206
|
-
var
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
214
|
+
key: "addVertexByVertexName",
|
|
215
|
+
value: function addVertexByVertexName(vertexName) {
|
|
216
|
+
var vertexPresent = this.isVertexPresentByVertexName(vertexName);
|
|
217
|
+
if (!vertexPresent) {
|
|
218
|
+
var vertexNames = this.getVertexNames(), vertexNamesLength = vertexNames.length, name = vertexName, index = vertexNamesLength, vertex = _vertex.default.fromNameAndIndex(name, index);
|
|
219
|
+
this.setVertexByVertexName(vertexName, vertex);
|
|
220
|
+
}
|
|
221
|
+
var vertex1 = this.getVertexByVertexName(vertexName);
|
|
222
|
+
return vertex1;
|
|
210
223
|
}
|
|
211
224
|
},
|
|
212
225
|
{
|
|
213
226
|
key: "removeVertexByVertexName",
|
|
214
227
|
value: function removeVertexByVertexName(vertexName) {
|
|
215
|
-
this.
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
228
|
+
var vertexPresent = this.isVertexPresentByVertexName(vertexName);
|
|
229
|
+
if (!vertexPresent) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
var vertex = this.getVertexByVertexName(vertexName);
|
|
233
|
+
vertex.forEachImmediateSuccessorVertex(function(immediateSuccessVertex) {
|
|
234
|
+
var immediatePredecessorVertex = vertex; ///
|
|
235
|
+
immediateSuccessVertex.removeImmediatePredecessorVertex(immediatePredecessorVertex);
|
|
236
|
+
});
|
|
237
|
+
vertex.forEachImmediatePredecessorVertex(function(immediatePredecessorVertex) {
|
|
238
|
+
var immediateSuccessVertex = vertex; ///
|
|
239
|
+
immediatePredecessorVertex.removeImmediateSuccessorVertex(immediateSuccessVertex);
|
|
240
|
+
});
|
|
241
|
+
this.deleteVertexByVertexName(vertexName);
|
|
242
|
+
var vertexes = this.getVertexes(), deletedVertex = vertex, deletedVertexIndex = deletedVertex.getIndex();
|
|
243
|
+
vertexes.forEach(function(vertex) {
|
|
244
|
+
var vertexIndex = vertex.getIndex();
|
|
245
|
+
if (vertexIndex > deletedVertexIndex) {
|
|
246
|
+
vertex.decrementIndex();
|
|
247
|
+
}
|
|
225
248
|
});
|
|
249
|
+
this.filterCyclicEdges();
|
|
226
250
|
}
|
|
227
251
|
},
|
|
228
252
|
{
|
|
229
253
|
key: "addEdge",
|
|
230
254
|
value: function addEdge(edge) {
|
|
231
|
-
var
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
255
|
+
var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName();
|
|
256
|
+
if (sourceVertexName === targetVertexName) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
var sourceVertex = this.addVertexByVertexName(sourceVertexName), targetVertex = this.addVertexByVertexName(targetVertexName), edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
|
|
260
|
+
if (edgePresent) {
|
|
261
|
+
return;
|
|
238
262
|
}
|
|
263
|
+
var sourceVertexIndex = sourceVertex.getIndex(), targetVertexIndex = targetVertex.getIndex();
|
|
264
|
+
if (sourceVertexIndex > targetVertexIndex) {
|
|
265
|
+
this.reorderVertexesBySourceVertexAndTargetVertex(sourceVertex, targetVertex);
|
|
266
|
+
}
|
|
267
|
+
var immediatePredecessorVertex = sourceVertex, immediateSuccessorVertex = targetVertex; ///
|
|
268
|
+
immediatePredecessorVertex.addImmediateSuccessorVertex(immediateSuccessorVertex);
|
|
269
|
+
immediateSuccessorVertex.addImmediatePredecessorVertex(immediatePredecessorVertex);
|
|
239
270
|
}
|
|
240
271
|
},
|
|
241
272
|
{
|
|
@@ -243,30 +274,26 @@ var DirectedGraph = /*#__PURE__*/ function() {
|
|
|
243
274
|
value: function addEdges(edges) {
|
|
244
275
|
var _this = this;
|
|
245
276
|
edges.forEach(function(edge) {
|
|
246
|
-
|
|
277
|
+
_this.addEdge(edge);
|
|
247
278
|
});
|
|
248
279
|
}
|
|
249
280
|
},
|
|
250
281
|
{
|
|
251
282
|
key: "removeEdge",
|
|
252
|
-
value: function removeEdge(edge) {
|
|
253
|
-
var
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
if (targetVertexStranded) {
|
|
268
|
-
this.directedAcyclicGraph.removeVertexByVertexName(targetVertexName);
|
|
269
|
-
}
|
|
283
|
+
value: function removeEdge(edge, removeStrandedVertexes) {
|
|
284
|
+
var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName(), sourceVertex = this.addVertexByVertexName(sourceVertexName), targetVertex = this.addVertexByVertexName(targetVertexName), edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
|
|
285
|
+
if (!edgePresent) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
sourceVertex.removeImmediateSuccessorVertex(targetVertex);
|
|
289
|
+
targetVertex.removeImmediatePredecessorVertex(sourceVertex);
|
|
290
|
+
if (removeStrandedVertexes) {
|
|
291
|
+
var sourceVertexStranded = sourceVertex.isStranded(), targetVertexStranded = targetVertex.isStranded();
|
|
292
|
+
if (sourceVertexStranded) {
|
|
293
|
+
this.removeVertexByVertexName(sourceVertexName);
|
|
294
|
+
}
|
|
295
|
+
if (targetVertexStranded) {
|
|
296
|
+
this.removeVertexByVertexName(targetVertexName);
|
|
270
297
|
}
|
|
271
298
|
}
|
|
272
299
|
this.filterCyclicEdges();
|
|
@@ -275,76 +302,63 @@ var DirectedGraph = /*#__PURE__*/ function() {
|
|
|
275
302
|
{
|
|
276
303
|
key: "removeEdges",
|
|
277
304
|
value: function removeEdges(edges) {
|
|
278
|
-
var
|
|
305
|
+
var removeStrandedVertexes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
279
306
|
var _this = this;
|
|
280
307
|
edges.forEach(function(edge) {
|
|
281
|
-
|
|
308
|
+
_this.removeEdge(edge, removeStrandedVertexes);
|
|
282
309
|
});
|
|
283
310
|
}
|
|
284
311
|
},
|
|
285
312
|
{
|
|
286
|
-
key: "
|
|
287
|
-
value: function
|
|
288
|
-
|
|
289
|
-
this.addEdge(edge);
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
key: "removeEdgeByVertexNames",
|
|
294
|
-
value: function removeEdgeByVertexNames(sourceVertexName, targetVertexName) {
|
|
295
|
-
var removeStrandedVertices = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
|
|
296
|
-
var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
297
|
-
this.removeEdge(edge, removeStrandedVertices);
|
|
313
|
+
key: "removeAllEdgesAndVertexes",
|
|
314
|
+
value: function removeAllEdgesAndVertexes() {
|
|
315
|
+
this.vertexMap = {};
|
|
298
316
|
}
|
|
299
317
|
},
|
|
300
318
|
{
|
|
301
|
-
key: "
|
|
302
|
-
value: function
|
|
303
|
-
var
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
319
|
+
key: "reorderVertexesBySourceVertexAndTargetVertex",
|
|
320
|
+
value: function reorderVertexesBySourceVertexAndTargetVertex(sourceVertex, targetVertex) {
|
|
321
|
+
var sourceVertexReachable = targetVertex.isVertexReachable(sourceVertex);
|
|
322
|
+
if (sourceVertexReachable) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
var forwardsVisitedVertexes = targetVertex.retrieveForwardsVisitedVertexes(), backwardsVisitedVertexes = sourceVertex.retrieveBackwardsVisitedVertexes();
|
|
326
|
+
(0, _vertex1.orderVertexes)(backwardsVisitedVertexes);
|
|
327
|
+
(0, _vertex1.orderVertexes)(forwardsVisitedVertexes);
|
|
328
|
+
var visitedVertexes = _to_consumable_array(backwardsVisitedVertexes).concat(_to_consumable_array(forwardsVisitedVertexes)), visitedIndexes = (0, _index.indexesFromVertexes)(visitedVertexes);
|
|
329
|
+
(0, _index.orderIndexes)(visitedIndexes);
|
|
330
|
+
visitedVertexes.forEach(function(visitedVertex, index) {
|
|
331
|
+
var visitedIndex = visitedIndexes[index];
|
|
332
|
+
index = visitedIndex; ///
|
|
333
|
+
visitedVertex.setIndex(index);
|
|
334
|
+
});
|
|
307
335
|
}
|
|
308
336
|
},
|
|
309
337
|
{
|
|
310
|
-
key: "
|
|
311
|
-
value: function
|
|
312
|
-
var
|
|
313
|
-
|
|
314
|
-
this.
|
|
315
|
-
this.removeEdges(edges, removeStrandedVertices);
|
|
338
|
+
key: "filterCyclicEdges",
|
|
339
|
+
value: function filterCyclicEdges() {
|
|
340
|
+
var cyclicEdges = this.getCyclicEdges(), edges = cyclicEdges; ///
|
|
341
|
+
this.removeEdges(edges);
|
|
342
|
+
this.addEdges(edges);
|
|
316
343
|
}
|
|
317
344
|
},
|
|
318
345
|
{
|
|
319
|
-
key: "
|
|
320
|
-
value: function
|
|
321
|
-
this.
|
|
322
|
-
this.cyclicEdges = [];
|
|
346
|
+
key: "setVertexByVertexName",
|
|
347
|
+
value: function setVertexByVertexName(vertexName, vertex) {
|
|
348
|
+
this.vertexMap[vertexName] = vertex;
|
|
323
349
|
}
|
|
324
350
|
},
|
|
325
351
|
{
|
|
326
|
-
key: "
|
|
327
|
-
value: function
|
|
328
|
-
|
|
329
|
-
filter(this.cyclicEdges, function(cyclicEdge) {
|
|
330
|
-
var sourceVertexName = cyclicEdge.getSourceVertexName(), targetVertexName = cyclicEdge.getTargetVertexName(), sourceVertexPresent = _this.isVertexPresentByVertexName(sourceVertexName), targetVertexPresent = _this.isVertexPresentByVertexName(targetVertexName);
|
|
331
|
-
if (sourceVertexPresent && targetVertexPresent) {
|
|
332
|
-
return true;
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
filter(this.cyclicEdges, function(cyclicEdge) {
|
|
336
|
-
var edge = cyclicEdge, success = _this.directedAcyclicGraph.addEdge(edge);
|
|
337
|
-
if (!success) {
|
|
338
|
-
return true;
|
|
339
|
-
}
|
|
340
|
-
});
|
|
352
|
+
key: "deleteVertexByVertexName",
|
|
353
|
+
value: function deleteVertexByVertexName(vertexName) {
|
|
354
|
+
delete this.vertexMap[vertexName];
|
|
341
355
|
}
|
|
342
356
|
}
|
|
343
357
|
], [
|
|
344
358
|
{
|
|
345
359
|
key: "fromNothing",
|
|
346
360
|
value: function fromNothing() {
|
|
347
|
-
var
|
|
361
|
+
var vertexMap = {}, directedGraph = new DirectedGraph(vertexMap);
|
|
348
362
|
return directedGraph;
|
|
349
363
|
}
|
|
350
364
|
}
|
|
@@ -352,4 +366,4 @@ var DirectedGraph = /*#__PURE__*/ function() {
|
|
|
352
366
|
return DirectedGraph;
|
|
353
367
|
}();
|
|
354
368
|
|
|
355
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEdyYXBoLmpzIiwiPDxqc3gtY29uZmlnLXByYWdtYS5qcz4+Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVkZ2UgZnJvbSBcIi4vZWRnZVwiO1xuaW1wb3J0IEN5Y2xlIGZyb20gXCIuL2N5Y2xlXCI7XG5pbXBvcnQgUGFydGlhbEN5Y2xlIGZyb20gXCIuL3BhcnRpYWxDeWNsZVwiO1xuaW1wb3J0IERpcmVjdGVkQWN5Y2xpY0dyYXBoIGZyb20gXCIuL2RpcmVjdGVkQWN5Y2xpY0dyYXBoXCI7XG5cbmltcG9ydCB7IGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCB9IGZyb20gXCIuL3V0aWxpdGllcy92ZXJ0ZXhcIjtcbmltcG9ydCB7IGNoZWNrRWRnZXNJbmNsdWRlc0VkZ2UsIHJlbW92ZUVkZ2VGcm9tRWRnZXMsIGVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lLCBlZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSB9IGZyb20gXCIuL3V0aWxpdGllcy9lZGdlXCI7XG5cbmNvbnN0IHsgZmlyc3QsIGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpcmVjdGVkR3JhcGgge1xuICBjb25zdHJ1Y3RvcihjeWNsaWNFZGdlcywgZGlyZWN0ZWRBY3ljbGljR3JhcGgpIHtcbiAgICB0aGlzLmN5Y2xpY0VkZ2VzID0gY3ljbGljRWRnZXM7XG5cbiAgICB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gZGlyZWN0ZWRBY3ljbGljR3JhcGg7XG4gIH1cblxuICBnZXRDeWNsaWNFZGdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jeWNsaWNFZGdlcztcbiAgfVxuXG4gIGdldERpcmVjdGVkQWN5Y2xpY0dyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoO1xuICB9XG5cbiAgZ2V0VmVydGV4TmFtZXMoKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldFZlcnRleE5hbWVzKCk7IH1cblxuICBnZXRPcmRlcmVkVmVydGV4TmFtZXMoKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldE9yZGVyZWRWZXJ0ZXhOYW1lcygpOyB9XG5cbiAgYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHsgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5hZGRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7IH1cblxuICBpc0VkZ2VQcmVzZW50QnlWZXJ0ZXhOYW1lcyhzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmlzRWRnZVByZXNlbnRCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUpOyB9XG5cbiAgaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHsgcmV0dXJuIHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpOyB9XG5cbiAgZ2V0U3VjY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSkgeyByZXR1cm4gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTsgfVxuXG4gIGdldFByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSkgeyByZXR1cm4gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpOyB9XG5cbiAgZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lLCBpbmNsdWRlQ3ljbGljRWRnZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICBpZiAoaW5jbHVkZUN5Y2xpY0VkZ2VzKSB7XG4gICAgICB0aGlzLmN5Y2xpY0VkZ2VzLmZvckVhY2goKGN5Y2xpY0VkZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKTtcblxuICAgICAgICBpZiAoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPT09IHZlcnRleE5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lOyAgLy8vXG5cbiAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzLnB1c2goaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lLCBpbmNsdWRlQ3ljbGljRWRnZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmIChpbmNsdWRlQ3ljbGljRWRnZXMpIHtcbiAgICAgIHRoaXMuY3ljbGljRWRnZXMuZm9yRWFjaCgoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpO1xuXG4gICAgICAgIGlmIChjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9PT0gdmVydGV4TmFtZSkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xpY0VkZ2VUYXJnZXRWZXJ0ZXhOYW1lID0gY3ljbGljRWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2VUYXJnZXRWZXJ0ZXhOYW1lOyAgLy8vXG5cbiAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcy5wdXNoKGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBhcmVDeWNsZXNQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBsZXQgY3ljbGVzUHJlc2VudCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdmVydGV4UHJlc2VudCA9IHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHZlcnRleFByZXNlbnQpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q3ljbGUgPSB0aGlzLmdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICAgIGN5Y2xlc1ByZXNlbnQgPSAoZmlyc3RDeWNsZSAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN5Y2xlc1ByZXNlbnQ7XG4gIH1cblxuICBnZXRGaXJzdEN5Y2xlQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBsZXQgZmlyc3RDeWNsZSA9IG51bGw7XG4gICAgXG4gICAgY29uc3QgdmVydGV4ID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSksXG4gICAgICAgICAgY3ljbGljRWRnZXMgPSB0aGlzLmN5Y2xpY0VkZ2VzLnNsaWNlKCksIC8vL1xuICAgICAgICAgIHBhcnRpYWxDeWNsZXMgPSBbXSxcbiAgICAgICAgICBjeWNsZXMgPSBbXTtcblxuICAgIGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsICh2aXNpdGVkVmVydGV4LCBnZXRQcmVkZWNlc3NvclZlcnRpY2VzKSA9PiB7XG4gICAgICBjb25zdCB2aXNpdGVkVmVydGV4TmFtZSA9IHZpc2l0ZWRWZXJ0ZXguZ2V0TmFtZSgpLFxuICAgICAgICAgICAgc291cmNlVmVydGV4TmFtZSA9IHZpc2l0ZWRWZXJ0ZXhOYW1lOyAvLy9cblxuICAgICAgZmlsdGVyKGN5Y2xpY0VkZ2VzLCAoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gY3ljbGljRWRnZS5tYXRjaFNvdXJjZVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvclZlcnRpY2VzID0gZ2V0UHJlZGVjZXNzb3JWZXJ0aWNlcygpLFxuICAgICAgICAgICAgICAgIHBhcnRpYWxDeWNsZSA9ICBQYXJ0aWFsQ3ljbGUuZnJvbUN5Y2xpY0VkZ2VBbmRQcmVkZWNlc3NvclZlcnRpY2VzKGN5Y2xpY0VkZ2UsIHByZWRlY2Vzc29yVmVydGljZXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHBhcnRpYWxDeWNsZXMucHVzaChwYXJ0aWFsQ3ljbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY3ljbGljRWRnZXNMZW5ndGggPSBjeWNsaWNFZGdlcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXJtaW5hdGUgPSAoY3ljbGljRWRnZXNMZW5ndGggPT09IDApO1xuXG4gICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgIH0pO1xuXG4gICAgcGFydGlhbEN5Y2xlcy5zb21lKChwYXJ0aWFsQ3ljbGUpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICAgIGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCh0YXJnZXRWZXJ0ZXgsICh2aXNpdGVkVmVydGV4LCBnZXRQcmVkZWNlc3NvclZlcnRpY2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2l0ZWRWZXJ0ZXhOYW1lID0gdmlzaXRlZFZlcnRleC5nZXROYW1lKCk7XG5cbiAgICAgICAgaWYgKHZpc2l0ZWRWZXJ0ZXhOYW1lID09PSB2ZXJ0ZXhOYW1lKSB7XG4gICAgICAgICAgY29uc3QgcHJlZGVjZXNzb3JWZXJ0aWNlcyA9IGdldFByZWRlY2Vzc29yVmVydGljZXMoKSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzb3JWZXJ0aWNlcyA9IHByZWRlY2Vzc29yVmVydGljZXMsICAvLy9cbiAgICAgICAgICAgICAgICBjeWNsZSA9IEN5Y2xlLmZyb21WZXJ0ZXhOYW1lUGFydGlhbEN5Y2xlQW5kU3VjY2Vzc29yVmVydGljZXModmVydGV4TmFtZSwgcGFydGlhbEN5Y2xlLCBzdWNjZXNzb3JWZXJ0aWNlcyk7XG5cbiAgICAgICAgICBjeWNsZXMucHVzaChjeWNsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjeWNsZXNMZW5ndGggPSBjeWNsZXMubGVuZ3RoLFxuICAgICAgICAgICAgICB0ZXJtaW5hdGUgPSAoY3ljbGVzTGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHRlcm1pbmF0ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3ljbGVzTGVuZ3RoID0gY3ljbGVzLmxlbmd0aDtcbiAgICBcbiAgICBpZiAoY3ljbGVzTGVuZ3RoID4gMCkge1xuICAgICAgZmlyc3RDeWNsZSA9IGZpcnN0KGN5Y2xlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0Q3ljbGU7XG4gIH1cblxuICBnZXRGaXJzdEN5Y2xlKCkge1xuICAgIGNvbnN0IGZpcnN0Q3ljbGljRWRnZSA9IGZpcnN0KHRoaXMuY3ljbGljRWRnZXMpLFxuICAgICAgICAgIGN5Y2xpY0VkZ2UgPSBmaXJzdEN5Y2xpY0VkZ2UsIC8vL1xuICAgICAgICAgIHNvdXJjZVZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lID0gc291cmNlVmVydGV4TmFtZSwgIC8vL1xuICAgICAgICAgIGZpcnN0Q3ljbGUgPSB0aGlzLmdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICByZXR1cm4gZmlyc3RDeWNsZTtcbiAgfVxuXG4gIGFyZUN5Y2xlc1ByZXNlbnQoKSB7XG4gICAgY29uc3QgY3ljbGljRWRnZXNMZW5ndGggPSB0aGlzLmN5Y2xpY0VkZ2VzLmxlbmd0aCxcbiAgICAgICAgICBjeWNsZXNQcmVzZW50ID0gKGN5Y2xpY0VkZ2VzTGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gY3ljbGVzUHJlc2VudDtcbiAgfVxuXG4gIGFkZFZlcnRpY2VzQnlWZXJ0ZXhOYW1lcyh2ZXJ0ZXhOYW1lcykge1xuICAgIHZlcnRleE5hbWVzLmZvckVhY2goKHZlcnRleE5hbWUpID0+IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpKTtcbiAgfVxuXG4gIHJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICB0aGlzLmZpbHRlckN5Y2xpY0VkZ2VzKCk7XG4gIH1cblxuICByZW1vdmVWZXJ0aWNlc0J5VmVydGV4TmFtZXModmVydGV4TmFtZXMpIHtcbiAgICB2ZXJ0ZXhOYW1lcy5mb3JFYWNoKCh2ZXJ0ZXhOYW1lKSA9PiB0aGlzLnJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSk7XG4gIH1cblxuICBhZGRFZGdlKGVkZ2UpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5hZGRFZGdlKGVkZ2UpO1xuICAgIFxuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgY29uc3QgY3ljbGljRWRnZXNJbmNsdWRlc0VkZ2UgPSBjaGVja0VkZ2VzSW5jbHVkZXNFZGdlKGVkZ2UsIHRoaXMuY3ljbGljRWRnZXMpO1xuXG4gICAgICBpZiAoIWN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xpY0VkZ2UgPSBlZGdlOyAgLy8vXG5cbiAgICAgICAgdGhpcy5jeWNsaWNFZGdlcy5wdXNoKGN5Y2xpY0VkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgYWRkRWRnZXMoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB0aGlzLmFkZEVkZ2UoZWRnZSkpO1xuICB9XG5cbiAgcmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzID0gZmFsc2UpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlc0luY2x1ZGVzRWRnZSA9IGNoZWNrRWRnZXNJbmNsdWRlc0VkZ2UoZWRnZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZVByZXNlbnQgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmlzRWRnZVByZXNlbnQoZWRnZSksXG4gICAgICAgICAgZWRnZUN5Y2xpYyA9IGN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlOyAvLy9cblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgLy8vXG4gICAgfSBlbHNlIGlmIChlZGdlQ3ljbGljKSB7XG4gICAgICBjb25zdCBjeWNsaWNFZGdlID0gZWRnZTsgIC8vL1xuXG4gICAgICByZW1vdmVFZGdlRnJvbUVkZ2VzKGN5Y2xpY0VkZ2UsIHRoaXMuY3ljbGljRWRnZXMpO1xuICAgIH0gZWxzZSBpZiAoZWRnZVByZXNlbnQpIHtcbiAgICAgIHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGgucmVtb3ZlRWRnZShlZGdlKTtcblxuICAgICAgaWYgKHJlbW92ZVN0cmFuZGVkVmVydGljZXMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlVmVydGV4TmFtZSA9IGVkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXggPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldFZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgICAgc291cmNlVmVydGV4U3RyYW5kZWQgPSBzb3VyY2VWZXJ0ZXguaXNTdHJhbmRlZCgpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhTdHJhbmRlZCA9IHRhcmdldFZlcnRleC5pc1N0cmFuZGVkKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVZlcnRleFN0cmFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0VmVydGV4U3RyYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLnJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyQ3ljbGljRWRnZXMoKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzID0gZmFsc2UpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB0aGlzLnJlbW92ZUVkZ2UoZWRnZSwgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcykpO1xuICB9XG5cbiAgYWRkRWRnZUJ5VmVydGV4TmFtZXMoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIHRoaXMuYWRkRWRnZShlZGdlKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIHRoaXMucmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGN5Y2xpY0VkZ2VzID0gZWRnZXNCeVRhcmdldFZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgdGhpcy5yZW1vdmVFZGdlcyhjeWNsaWNFZGdlcywgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyk7XG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGN5Y2xpY0VkZ2VzID0gZWRnZXNCeVNvdXJjZVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgdGhpcy5yZW1vdmVFZGdlcyhjeWNsaWNFZGdlcywgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyk7XG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUFsbEVkZ2VzQW5kVmVydGljZXMoKSB7XG4gICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaCA9IERpcmVjdGVkQWN5Y2xpY0dyYXBoLmZyb21Ob3RoaW5nKCk7XG5cbiAgICB0aGlzLmN5Y2xpY0VkZ2VzID0gW107XG4gIH1cblxuICBmaWx0ZXJDeWNsaWNFZGdlcygpIHtcbiAgICBmaWx0ZXIodGhpcy5jeWNsaWNFZGdlcywgKGN5Y2xpY0VkZ2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKSxcbiAgICAgICAgICAgIHNvdXJjZVZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgaWYgKHNvdXJjZVZlcnRleFByZXNlbnQgJiYgdGFyZ2V0VmVydGV4UHJlc2VudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZpbHRlcih0aGlzLmN5Y2xpY0VkZ2VzLCAoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgY29uc3QgZWRnZSA9IGN5Y2xpY0VkZ2UsICAvLy9cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmFkZEVkZ2UoZWRnZSk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IFtdLFxuICAgICAgICAgIGRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gRGlyZWN0ZWRBY3ljbGljR3JhcGguZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgICBkaXJlY3RlZEdyYXBoID0gbmV3IERpcmVjdGVkR3JhcGgoY3ljbGljRWRnZXMsIGRpcmVjdGVkQWN5Y2xpY0dyYXBoKTtcbiAgICBcbiAgICByZXR1cm4gZGlyZWN0ZWRHcmFwaDsgICAgXG4gIH1cbn1cbiIsIlJlYWN0LmNyZWF0ZUVsZW1lbnQiXSwibmFtZXMiOlsiRGlyZWN0ZWRHcmFwaCIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJmaWx0ZXIiLCJjeWNsaWNFZGdlcyIsImRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwiZ2V0Q3ljbGljRWRnZXMiLCJnZXREaXJlY3RlZEFjeWNsaWNHcmFwaCIsImdldFZlcnRleE5hbWVzIiwiZ2V0T3JkZXJlZFZlcnRleE5hbWVzIiwiYWRkVmVydGV4QnlWZXJ0ZXhOYW1lIiwidmVydGV4TmFtZSIsImlzRWRnZVByZXNlbnRCeVZlcnRleE5hbWVzIiwic291cmNlVmVydGV4TmFtZSIsInRhcmdldFZlcnRleE5hbWUiLCJpc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUiLCJnZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSIsImdldFByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUiLCJnZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwiaW5jbHVkZUN5Y2xpY0VkZ2VzIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsImZvckVhY2giLCJjeWNsaWNFZGdlIiwiY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUiLCJnZXRUYXJnZXRWZXJ0ZXhOYW1lIiwiY3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUiLCJnZXRTb3VyY2VWZXJ0ZXhOYW1lIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lIiwicHVzaCIsImdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lIiwiYXJlQ3ljbGVzUHJlc2VudEJ5VmVydGV4TmFtZSIsImN5Y2xlc1ByZXNlbnQiLCJ2ZXJ0ZXhQcmVzZW50IiwiZmlyc3RDeWNsZSIsImdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUiLCJ2ZXJ0ZXgiLCJnZXRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJzbGljZSIsInBhcnRpYWxDeWNsZXMiLCJjeWNsZXMiLCJmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2giLCJ2aXNpdGVkVmVydGV4IiwiZ2V0UHJlZGVjZXNzb3JWZXJ0aWNlcyIsInZpc2l0ZWRWZXJ0ZXhOYW1lIiwiZ2V0TmFtZSIsIm1hdGNoZXMiLCJtYXRjaFNvdXJjZVZlcnRleE5hbWUiLCJwcmVkZWNlc3NvclZlcnRpY2VzIiwicGFydGlhbEN5Y2xlIiwiUGFydGlhbEN5Y2xlIiwiZnJvbUN5Y2xpY0VkZ2VBbmRQcmVkZWNlc3NvclZlcnRpY2VzIiwiY3ljbGljRWRnZXNMZW5ndGgiLCJsZW5ndGgiLCJ0ZXJtaW5hdGUiLCJzb21lIiwidGFyZ2V0VmVydGV4Iiwic3VjY2Vzc29yVmVydGljZXMiLCJjeWNsZSIsIkN5Y2xlIiwiZnJvbVZlcnRleE5hbWVQYXJ0aWFsQ3ljbGVBbmRTdWNjZXNzb3JWZXJ0aWNlcyIsImN5Y2xlc0xlbmd0aCIsImdldEZpcnN0Q3ljbGUiLCJmaXJzdEN5Y2xpY0VkZ2UiLCJhcmVDeWNsZXNQcmVzZW50IiwiYWRkVmVydGljZXNCeVZlcnRleE5hbWVzIiwidmVydGV4TmFtZXMiLCJyZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUiLCJmaWx0ZXJDeWNsaWNFZGdlcyIsInJlbW92ZVZlcnRpY2VzQnlWZXJ0ZXhOYW1lcyIsImFkZEVkZ2UiLCJlZGdlIiwic3VjY2VzcyIsImN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlIiwiY2hlY2tFZGdlc0luY2x1ZGVzRWRnZSIsImFkZEVkZ2VzIiwiZWRnZXMiLCJyZW1vdmVFZGdlIiwicmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyIsImVkZ2VQcmVzZW50IiwiaXNFZGdlUHJlc2VudCIsImVkZ2VDeWNsaWMiLCJyZW1vdmVFZGdlRnJvbUVkZ2VzIiwic291cmNlVmVydGV4Iiwic291cmNlVmVydGV4U3RyYW5kZWQiLCJpc1N0cmFuZGVkIiwidGFyZ2V0VmVydGV4U3RyYW5kZWQiLCJyZW1vdmVFZGdlcyIsImFkZEVkZ2VCeVZlcnRleE5hbWVzIiwiRWRnZSIsImZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZSIsInJlbW92ZUVkZ2VCeVZlcnRleE5hbWVzIiwicmVtb3ZlRWRnZXNCeVRhcmdldFZlcnRleE5hbWUiLCJlZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSIsImdldEVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lIiwicmVtb3ZlRWRnZXNCeVNvdXJjZVZlcnRleE5hbWUiLCJlZGdlc0J5U291cmNlVmVydGV4TmFtZSIsImdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lIiwicmVtb3ZlQWxsRWRnZXNBbmRWZXJ0aWNlcyIsIkRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwiZnJvbU5vdGhpbmciLCJzb3VyY2VWZXJ0ZXhQcmVzZW50IiwidGFyZ2V0VmVydGV4UHJlc2VudCIsImRpcmVjdGVkR3JhcGgiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBY3FCQTs7O3lCQVpVOzJEQUVkOzREQUNDO21FQUNPOzJFQUNRO3NCQUVRO3FCQUNxRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RyxJQUFRQyxRQUFrQkMsMEJBQWxCRCxPQUFPRSxTQUFXRCwwQkFBWEM7QUFFQSxJQUFBLEFBQU1ILDhCQUFOO2FBQU1BLGNBQ1BJLFdBQVcsRUFBRUMsb0JBQW9CO2dDQUQxQkw7UUFFakIsSUFBSSxDQUFDSSxjQUFjQTtRQUVuQixJQUFJLENBQUNDLHVCQUF1QkE7O2tCQUpYTDs7WUFPbkJNLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Y7WUFDZDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Y7WUFDZDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFBbUIsT0FBTyxJQUFJLENBQUNILHFCQUFxQkc7WUFBa0I7OztZQUV0RUMsS0FBQUE7bUJBQUFBLFNBQUFB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
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEdyYXBoLmpzIiwiPDxqc3gtY29uZmlnLXByYWdtYS5qcz4+Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVkZ2UgZnJvbSBcIi4vZWRnZVwiO1xuaW1wb3J0IEN5Y2xlIGZyb20gXCIuL2N5Y2xlXCI7XG5pbXBvcnQgVmVydGV4IGZyb20gXCIuL3ZlcnRleFwiO1xuXG5pbXBvcnQgeyBvcmRlckluZGV4ZXMsIGluZGV4ZXNGcm9tVmVydGV4ZXMgfSBmcm9tIFwiLi91dGlsaXRpZXMvaW5kZXhcIjtcbmltcG9ydCB7IG9yZGVyVmVydGV4ZXMsIHZlcnRleE5hbWVzRnJvbVZlcnRleGVzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlyZWN0ZWRHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKHZlcnRleE1hcCkge1xuICAgIHRoaXMudmVydGV4TWFwID0gdmVydGV4TWFwO1xuICB9XG5cbiAgZ2V0VmVydGV4TmFwKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnRleE1hcDtcbiAgfVxuXG4gIGdldFZlcnRleGVzKCkge1xuICAgIGNvbnN0IHZlcnRleE1hcFZhbHVlcyA9IE9iamVjdC52YWx1ZXModGhpcy52ZXJ0ZXhNYXApLFxuICAgICAgICAgIHZlcnRleGVzID0gdmVydGV4TWFwVmFsdWVzOyAvLy9cblxuICAgIHJldHVybiB2ZXJ0ZXhlcztcbiAgfVxuXG4gIGdldFZlcnRleE5hbWVzKCkge1xuICAgIGNvbnN0IHZlcnRleE1hcEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZlcnRleE1hcCksXG4gICAgICAgICAgdmVydGV4TmFtZXMgPSB2ZXJ0ZXhNYXBLZXlzOyAgLy8vXG5cbiAgICByZXR1cm4gdmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRPcmRlcmVkVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgdmVydGV4ZXMgPSB0aGlzLmdldFZlcnRleGVzKCk7XG5cbiAgICBvcmRlclZlcnRleGVzKHZlcnRleGVzKTtcblxuICAgIGNvbnN0IG9yZGVyZWRWZXJ0ZXhlcyA9IHZlcnRleGVzLCAvLy9cbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyhvcmRlcmVkVmVydGV4ZXMpO1xuXG4gICAgcmV0dXJuIG9yZGVyZWRWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3QgdmVydGV4UHJlc2VudCA9IHRoaXMuaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpLFxuICAgICAgICAgIHZlcnRleCA9IHZlcnRleFByZXNlbnQgP1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhNYXBbdmVydGV4TmFtZV0gOlxuICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuXG4gICAgcmV0dXJuIHZlcnRleDtcbiAgfVxuXG4gIGdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpIHtcbiAgICBjb25zdCBlZGdlcyA9IFtdLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMgPSBzb3VyY2VWZXJ0ZXguZ2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMoKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzID0gdmVydGV4TmFtZXNGcm9tVmVydGV4ZXMoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZXMgPSBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICB0YXJnZXRWZXJ0ZXhOYW1lcy5mb3JFYWNoKCh0YXJnZXRWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgZ2V0RWRnZXNCeVRhcmdldFZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2VzID0gW10sXG4gICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICBpZiAodGFyZ2V0VmVydGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzID0gdGFyZ2V0VmVydGV4LmdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMoKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyhpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzKSxcbiAgICAgICAgICAgIHNvdXJjZVZlcnRleE5hbWVzID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICBzb3VyY2VWZXJ0ZXhOYW1lcy5mb3JFYWNoKChzb3VyY2VWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgZ2V0Rmlyc3RDeWNsZSgpIHtcbiAgICBsZXQgZmlyc3RDeWNsZSA9IG51bGw7XG5cbiAgICBjb25zdCBjeWNsZXNQcmVzZW50ID0gdGhpcy5hcmVDeWNsZXNQcmVzZW50KCk7XG5cbiAgICBpZiAoY3ljbGVzUHJlc2VudCkge1xuICAgICAgY29uc3QgY3ljbGljRWRnZXMgPSB0aGlzLmdldEN5Y2xpY0VkZ2VzKCksXG4gICAgICAgICAgICBmaXJzdEN5Y2xpY0VkZ2UgPSBmaXJzdChjeWNsaWNFZGdlcyksXG4gICAgICAgICAgICBzb3VyY2VWZXJ0ZXhOYW1lID0gZmlyc3RDeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSwgLy8vXG4gICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZmlyc3RDeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKSwgLy8vXG4gICAgICAgICAgICBzb3VyY2VWZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgICB0YXJnZXRWZXJ0ZXguZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoKCh2ZXJ0ZXgsIHByZWRlY2Vzc29yVmVydGV4ZXMpID0+IHtcbiAgICAgICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh2ZXJ0ZXggPT09IHNvdXJjZVZlcnRleCkge1xuICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBjeWNsZSA9IEN5Y2xlLmZyb21Tb3VyY2VWZXJ0ZXhBbmRQcmVkZWNlc3NvclZlcnRleGVzKHNvdXJjZVZlcnRleCwgcHJlZGVjZXNzb3JWZXJ0ZXhlcyk7ICAvLy9cblxuICAgICAgICAgIGZpcnN0Q3ljbGUgPSBjeWNsZTsgLy8vXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0Q3ljbGU7XG4gIH1cblxuICBnZXRDeWNsaWNFZGdlcygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IFtdLFxuICAgICAgICAgIHZlcnRleGVzID0gdGhpcy5nZXRWZXJ0ZXhlcygpO1xuXG4gICAgdmVydGV4ZXMuZm9yRWFjaCgodmVydGV4KSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VWZXJ0ZXggPSB2ZXJ0ZXgsICAvLy9cbiAgICAgICAgICAgIHNvdXJjZVZlcnRleEluZGV4ID0gc291cmNlVmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgIHZlcnRleC5mb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmVydGV4ID0gaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4LCAgLy8vXG4gICAgICAgICAgICAgIHRhcmdldFZlcnRleEluZGV4ID0gdGFyZ2V0VmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFZlcnRleEluZGV4IDwgc291cmNlVmVydGV4SW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWZXJ0ZXhOYW1lID0gc291cmNlVmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gdGFyZ2V0VmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICBlZGdlID0gRWRnZS5mcm9tU291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSksXG4gICAgICAgICAgICAgICAgY3ljbGljRWRnZSA9IGVkZ2U7ICAvLy9cblxuICAgICAgICAgIGN5Y2xpY0VkZ2VzLnB1c2goY3ljbGljRWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2VWZXJ0ZXhcbiAgICB9KTtcblxuICAgIHJldHVybiBjeWNsaWNFZGdlcztcbiAgfVxuXG4gIGFyZUN5Y2xlc1ByZXNlbnQoKSB7XG4gICAgY29uc3QgdmVydGV4ZXMgPSB0aGlzLmdldFZlcnRleGVzKCksXG4gICAgICAgICAgY3ljbGVzUHJlc2VudCA9IHZlcnRleGVzLnNvbWUoKHZlcnRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVmVydGV4ID0gdmVydGV4LCAgLy8vXG4gICAgICAgICAgICAgICAgICBzb3VyY2VWZXJ0ZXhJbmRleCA9IHNvdXJjZVZlcnRleC5nZXRJbmRleCgpLFxuICAgICAgICAgICAgICAgICAgY3ljbGljRWRnZVByZXNlbnQgPSB2ZXJ0ZXguc29tZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCgoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFZlcnRleCA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCwgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhJbmRleCA9IHRhcmdldFZlcnRleC5nZXRJbmRleCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRWZXJ0ZXhJbmRleCA8IHNvdXJjZVZlcnRleEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoY3ljbGljRWRnZVByZXNlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3ljbGVzUHJlc2VudDtcbiAgfVxuXG4gIGlzRWRnZVByZXNlbnQoZWRnZSkge1xuICAgIGxldCBlZGdlUHJlc2VudCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlVmVydGV4TmFtZSA9IGVkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFyZ2V0VmVydGV4TmFtZSA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICAgIGlmICh0YXJnZXRWZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgZWRnZVByZXNlbnQgPSBzb3VyY2VWZXJ0ZXguaXNFZGdlUHJlc2VudEJ5VGFyZ2V0VmVydGV4KHRhcmdldFZlcnRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VQcmVzZW50O1xuICB9XG5cbiAgaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhOYW1lcyA9IHRoaXMuZ2V0VmVydGV4TmFtZXMoKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZSA9IHZlcnRleE5hbWVzLmluY2x1ZGVzKHZlcnRleE5hbWUpLFxuICAgICAgICAgIHZlcnRleFByZXNlbnQgPSB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZTsgIC8vL1xuXG4gICAgcmV0dXJuIHZlcnRleFByZXNlbnQ7XG4gIH1cblxuICBhZGRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSkge1xuICAgIGNvbnN0IHZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmICghdmVydGV4UHJlc2VudCkge1xuICAgICAgY29uc3QgdmVydGV4TmFtZXMgPSB0aGlzLmdldFZlcnRleE5hbWVzKCksXG4gICAgICAgICAgICB2ZXJ0ZXhOYW1lc0xlbmd0aCA9IHZlcnRleE5hbWVzLmxlbmd0aCxcbiAgICAgICAgICAgIG5hbWUgPSB2ZXJ0ZXhOYW1lLCAgLy8vXG4gICAgICAgICAgICBpbmRleCA9IHZlcnRleE5hbWVzTGVuZ3RoLCAvLy9cbiAgICAgICAgICAgIHZlcnRleCA9IFZlcnRleC5mcm9tTmFtZUFuZEluZGV4KG5hbWUsIGluZGV4KTtcblxuICAgICAgdGhpcy5zZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSwgdmVydGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIHJldHVybiB2ZXJ0ZXg7XG4gIH1cblxuICByZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSkge1xuICAgIGNvbnN0IHZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmICghdmVydGV4UHJlc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpO1xuXG4gICAgdmVydGV4LmZvckVhY2hJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoKGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdmVydGV4OyAgLy8vXG5cbiAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICAgIH0pO1xuXG4gICAgdmVydGV4LmZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXggPSB2ZXJ0ZXg7ICAvLy9cblxuICAgICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZWxldGVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICBjb25zdCB2ZXJ0ZXhlcyA9IHRoaXMuZ2V0VmVydGV4ZXMoKSxcbiAgICAgICAgICBkZWxldGVkVmVydGV4ID0gdmVydGV4LCAvLy9cbiAgICAgICAgICBkZWxldGVkVmVydGV4SW5kZXggPSBkZWxldGVkVmVydGV4LmdldEluZGV4KCk7XG5cbiAgICB2ZXJ0ZXhlcy5mb3JFYWNoKCh2ZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnRleEluZGV4ID0gdmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgIGlmICh2ZXJ0ZXhJbmRleCA+IGRlbGV0ZWRWZXJ0ZXhJbmRleCkge1xuICAgICAgICB2ZXJ0ZXguZGVjcmVtZW50SW5kZXgoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZmlsdGVyQ3ljbGljRWRnZXMoKTtcbiAgfVxuXG4gIGFkZEVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBlZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4TmFtZSA9PT0gdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZVZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4LmlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCh0YXJnZXRWZXJ0ZXgpO1xuXG4gICAgaWYgKGVkZ2VQcmVzZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVmVydGV4SW5kZXggPSBzb3VyY2VWZXJ0ZXguZ2V0SW5kZXgoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhJbmRleCA9IHRhcmdldFZlcnRleC5nZXRJbmRleCgpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleEluZGV4ID4gdGFyZ2V0VmVydGV4SW5kZXgpIHtcbiAgICAgIHRoaXMucmVvcmRlclZlcnRleGVzQnlTb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXgoc291cmNlVmVydGV4LCB0YXJnZXRWZXJ0ZXgpO1xuICAgIH1cblxuICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gc291cmNlVmVydGV4LCAvLy9cbiAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXggPSB0YXJnZXRWZXJ0ZXg7IC8vL1xuXG4gICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXguYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCk7XG5cbiAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXguYWRkSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICB9XG5cbiAgYWRkRWRnZXMoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICB0aGlzLmFkZEVkZ2UoZWRnZSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVFZGdlKGVkZ2UsIHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMpIHtcbiAgICBjb25zdCBzb3VyY2VWZXJ0ZXhOYW1lID0gZWRnZS5nZXRTb3VyY2VWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4LmlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCh0YXJnZXRWZXJ0ZXgpO1xuXG4gICAgaWYgKCFlZGdlUHJlc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNvdXJjZVZlcnRleC5yZW1vdmVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgodGFyZ2V0VmVydGV4KTtcblxuICAgIHRhcmdldFZlcnRleC5yZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChzb3VyY2VWZXJ0ZXgpO1xuXG4gICAgaWYgKHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleFN0cmFuZGVkID0gc291cmNlVmVydGV4LmlzU3RyYW5kZWQoKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleFN0cmFuZGVkID0gdGFyZ2V0VmVydGV4LmlzU3RyYW5kZWQoKTtcblxuICAgICAgaWYgKHNvdXJjZVZlcnRleFN0cmFuZGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0VmVydGV4U3RyYW5kZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJDeWNsaWNFZGdlcygpO1xuICB9XG5cbiAgcmVtb3ZlRWRnZXMoZWRnZXMsIHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMgPSBmYWxzZSkge1xuICAgIGVkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRleGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUFsbEVkZ2VzQW5kVmVydGV4ZXMoKSB7XG4gICAgdGhpcy52ZXJ0ZXhNYXAgPSB7fTtcbiAgfVxuXG4gIHJlb3JkZXJWZXJ0ZXhlc0J5U291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4KHNvdXJjZVZlcnRleCwgdGFyZ2V0VmVydGV4KSB7XG4gICAgY29uc3Qgc291cmNlVmVydGV4UmVhY2hhYmxlID0gdGFyZ2V0VmVydGV4LmlzVmVydGV4UmVhY2hhYmxlKHNvdXJjZVZlcnRleCk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4UmVhY2hhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXMgPSB0YXJnZXRWZXJ0ZXgucmV0cmlldmVGb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcygpLFxuICAgICAgICAgIGJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyA9IHNvdXJjZVZlcnRleC5yZXRyaWV2ZUJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcygpO1xuXG4gICAgb3JkZXJWZXJ0ZXhlcyhiYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMpO1xuXG4gICAgb3JkZXJWZXJ0ZXhlcyhmb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyk7XG5cbiAgICBjb25zdCB2aXNpdGVkVmVydGV4ZXMgPSBbXG4gICAgICAgICAgICAuLi5iYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMsXG4gICAgICAgICAgICAuLi5mb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlc1xuICAgICAgICAgIF0sXG4gICAgICAgICAgdmlzaXRlZEluZGV4ZXMgPSBpbmRleGVzRnJvbVZlcnRleGVzKHZpc2l0ZWRWZXJ0ZXhlcyk7XG5cbiAgICBvcmRlckluZGV4ZXModmlzaXRlZEluZGV4ZXMpO1xuXG4gICAgdmlzaXRlZFZlcnRleGVzLmZvckVhY2goKHZpc2l0ZWRWZXJ0ZXgsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2aXNpdGVkSW5kZXggPSB2aXNpdGVkSW5kZXhlc1tpbmRleF07XG5cbiAgICAgIGluZGV4ID0gdmlzaXRlZEluZGV4OyAvLy9cblxuICAgICAgdmlzaXRlZFZlcnRleC5zZXRJbmRleChpbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICBmaWx0ZXJDeWNsaWNFZGdlcygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IHRoaXMuZ2V0Q3ljbGljRWRnZXMoKSxcbiAgICAgICAgICBlZGdlcyA9IGN5Y2xpY0VkZ2VzOyAgLy8vXG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzKTtcblxuICAgIHRoaXMuYWRkRWRnZXMoZWRnZXMpO1xuICB9XG5cbiAgc2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUsIHZlcnRleCkge1xuICAgIHRoaXMudmVydGV4TWFwW3ZlcnRleE5hbWVdID0gdmVydGV4O1xuICB9XG5cbiAgZGVsZXRlVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy52ZXJ0ZXhNYXBbdmVydGV4TmFtZV07XG4gIH1cblxuICBzdGF0aWMgZnJvbU5vdGhpbmcoKSB7XG4gICAgY29uc3QgdmVydGV4TWFwID0ge30sXG4gICAgICAgICAgZGlyZWN0ZWRHcmFwaCA9IG5ldyBEaXJlY3RlZEdyYXBoKHZlcnRleE1hcCk7XG4gICAgXG4gICAgcmV0dXJuIGRpcmVjdGVkR3JhcGg7ICAgIFxuICB9XG59XG4iLCJSZWFjdC5jcmVhdGVFbGVtZW50Il0sIm5hbWVzIjpbIkRpcmVjdGVkR3JhcGgiLCJmaXJzdCIsImFycmF5VXRpbGl0aWVzIiwidmVydGV4TWFwIiwiZ2V0VmVydGV4TmFwIiwiZ2V0VmVydGV4ZXMiLCJ2ZXJ0ZXhNYXBWYWx1ZXMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJ2ZXJ0ZXhlcyIsImdldFZlcnRleE5hbWVzIiwidmVydGV4TWFwS2V5cyIsImtleXMiLCJ2ZXJ0ZXhOYW1lcyIsImdldE9yZGVyZWRWZXJ0ZXhOYW1lcyIsIm9yZGVyVmVydGV4ZXMiLCJvcmRlcmVkVmVydGV4ZXMiLCJvcmRlcmVkVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyIsImdldFZlcnRleEJ5VmVydGV4TmFtZSIsInZlcnRleE5hbWUiLCJ2ZXJ0ZXhQcmVzZW50IiwiaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lIiwidmVydGV4IiwiZ2V0RWRnZXNCeVNvdXJjZVZlcnRleE5hbWUiLCJzb3VyY2VWZXJ0ZXhOYW1lIiwiZWRnZXMiLCJzb3VyY2VWZXJ0ZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyIsImdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJ0YXJnZXRWZXJ0ZXhOYW1lcyIsImZvckVhY2giLCJ0YXJnZXRWZXJ0ZXhOYW1lIiwiZWRnZSIsIkVkZ2UiLCJmcm9tU291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUiLCJwdXNoIiwiZ2V0RWRnZXNCeVRhcmdldFZlcnRleE5hbWUiLCJ0YXJnZXRWZXJ0ZXgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzIiwiZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcyIsImltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJzb3VyY2VWZXJ0ZXhOYW1lcyIsImdldEZpcnN0Q3ljbGUiLCJmaXJzdEN5Y2xlIiwiY3ljbGVzUHJlc2VudCIsImFyZUN5Y2xlc1ByZXNlbnQiLCJjeWNsaWNFZGdlcyIsImdldEN5Y2xpY0VkZ2VzIiwiZmlyc3RDeWNsaWNFZGdlIiwiZ2V0U291cmNlVmVydGV4TmFtZSIsImdldFRhcmdldFZlcnRleE5hbWUiLCJmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2giLCJwcmVkZWNlc3NvclZlcnRleGVzIiwidGVybWluYXRlIiwiY3ljbGUiLCJDeWNsZSIsImZyb21Tb3VyY2VWZXJ0ZXhBbmRQcmVkZWNlc3NvclZlcnRleGVzIiwic291cmNlVmVydGV4SW5kZXgiLCJnZXRJbmRleCIsImZvckVhY2hJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJ0YXJnZXRWZXJ0ZXhJbmRleCIsImdldE5hbWUiLCJjeWNsaWNFZGdlIiwic29tZSIsImN5Y2xpY0VkZ2VQcmVzZW50Iiwic29tZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImlzRWRnZVByZXNlbnQiLCJlZGdlUHJlc2VudCIsImlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCIsInZlcnRleE5hbWVzSW5jbHVkZXNWZXJ0ZXhOYW1lIiwiaW5jbHVkZXMiLCJhZGRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJ2ZXJ0ZXhOYW1lc0xlbmd0aCIsImxlbmd0aCIsIm5hbWUiLCJpbmRleCIsIlZlcnRleCIsImZyb21OYW1lQW5kSW5kZXgiLCJzZXRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJyZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUiLCJpbW1lZGlhdGVTdWNjZXNzVmVydGV4IiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJyZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsInJlbW92ZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImRlbGV0ZVZlcnRleEJ5VmVydGV4TmFtZSIsImRlbGV0ZWRWZXJ0ZXgiLCJkZWxldGVkVmVydGV4SW5kZXgiLCJ2ZXJ0ZXhJbmRleCIsImRlY3JlbWVudEluZGV4IiwiZmlsdGVyQ3ljbGljRWRnZXMiLCJhZGRFZGdlIiwicmVvcmRlclZlcnRleGVzQnlTb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXgiLCJhZGRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJhZGRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImFkZEVkZ2VzIiwicmVtb3ZlRWRnZSIsInJlbW92ZVN0cmFuZGVkVmVydGV4ZXMiLCJzb3VyY2VWZXJ0ZXhTdHJhbmRlZCIsImlzU3RyYW5kZWQiLCJ0YXJnZXRWZXJ0ZXhTdHJhbmRlZCIsInJlbW92ZUVkZ2VzIiwicmVtb3ZlQWxsRWRnZXNBbmRWZXJ0ZXhlcyIsInNvdXJjZVZlcnRleFJlYWNoYWJsZSIsImlzVmVydGV4UmVhY2hhYmxlIiwiZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXMiLCJyZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRleGVzIiwiYmFja3dhcmRzVmlzaXRlZFZlcnRleGVzIiwicmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMiLCJ2aXNpdGVkVmVydGV4ZXMiLCJ2aXNpdGVkSW5kZXhlcyIsImluZGV4ZXNGcm9tVmVydGV4ZXMiLCJvcmRlckluZGV4ZXMiLCJ2aXNpdGVkVmVydGV4IiwidmlzaXRlZEluZGV4Iiwic2V0SW5kZXgiLCJmcm9tTm90aGluZyIsImRpcmVjdGVkR3JhcGgiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBYXFCQTs7O3lCQVhVOzJEQUVkOzREQUNDOzZEQUNDO3FCQUUrQjt1QkFDSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdkQsSUFBTSxBQUFFQyxRQUFVQywwQkFBVkQ7QUFFTyxJQUFBLEFBQU1ELDhCQUFOO2FBQU1BLGNBQ1BHLFNBQVM7Z0NBREZIO1FBRWpCLElBQUksQ0FBQ0csWUFBWUE7O2tCQUZBSDs7WUFLbkJJLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Q7WUFDZDs7O1lBRUFFLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFNQyxrQkFBa0JDLE9BQU9DLE9BQU8sSUFBSSxDQUFDTCxZQUNyQ00sV0FBV0gsaUJBQWlCLEdBQUc7Z0JBRXJDLE9BQU9HO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTUMsZ0JBQWdCSixPQUFPSyxLQUFLLElBQUksQ0FBQ1QsWUFDakNVLGNBQWNGLGVBQWdCLEdBQUc7Z0JBRXZDLE9BQU9FO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTUwsV0FBVyxJQUFJLENBQUNKO2dCQUV0QlUsSUFBQUEsd0JBQWNOO2dCQUVkLElBQU1PLGtCQUFrQlAsVUFDbEJRLHFCQUFxQkMsSUFBQUEsa0NBQXdCRjtnQkFFbkQsT0FBT0M7WUFDVDs7O1lBRUFFLEtBQUFBO21CQUFBQSxTQUFBQSxzQkFBc0JDLFVBQVU7Z0JBQzlCLElBQU1DLGdCQUFnQixJQUFJLENBQUNDLDRCQUE0QkYsYUFDakRHLFNBQVNGLGdCQUNFLElBQUksQ0FBQ2xCLFNBQVMsQ0FBQ2lCLFdBQVcsR0FDeEI7Z0JBRW5CLE9BQU9HO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsMkJBQTJCQyxnQkFBZ0I7Z0JBQ3pDLElBQU1DLFFBQVEsRUFBRSxFQUNWQyxlQUFlLElBQUksQ0FBQ1Isc0JBQXNCTTtnQkFFaEQsSUFBSUUsaUJBQWlCLE1BQU07b0JBQ3pCLElBQU1DLDZCQUE2QkQsYUFBYUUsaUNBQzFDQyxnQ0FBZ0NaLElBQUFBLGtDQUF3QlUsNkJBQ3hERyxvQkFBb0JELCtCQUFnQyxHQUFHO29CQUU3REMsa0JBQWtCQyxRQUFRLFNBQUNDO3dCQUN6QixJQUFNQyxPQUFPQyxjQUFLQyx3Q0FBd0NYLGtCQUFrQlE7d0JBRTVFUCxNQUFNVyxLQUFLSDtvQkFDYjtnQkFDRjtnQkFFQSxPQUFPUjtZQUNUOzs7WUFFQVksS0FBQUE7bUJBQUFBLFNBQUFBLDJCQUEyQkwsZ0JBQWdCO2dCQUN6QyxJQUFNUCxRQUFRLEVBQUUsRUFDVmEsZUFBZSxJQUFJLENBQUNwQixzQkFBc0JjO2dCQUVoRCxJQUFJTSxpQkFBaUIsTUFBTTtvQkFDekIsSUFBTUMsK0JBQStCRCxhQUFhRSxtQ0FDNUNDLGtDQUFrQ3hCLElBQUFBLGtDQUF3QnNCLCtCQUMxREcsb0JBQW9CRCxpQ0FBa0MsR0FBRztvQkFFL0RDLGtCQUFrQlgsUUFBUSxTQUFDUDt3QkFDekIsSUFBTVMsT0FBT0MsY0FBS0Msd0NBQXdDWCxrQkFBa0JRO3dCQUU1RVAsTUFBTVcsS0FBS0g7b0JBQ2I7Z0JBQ0Y7Z0JBRUEsT0FBT1I7WUFDVDs7O1lBRUFrQixLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBSUMsYUFBYTtnQkFFakIsSUFBTUMsZ0JBQWdCLElBQUksQ0FBQ0M7Z0JBRTNCLElBQUlELGVBQWU7b0JBQ2pCLElBQU1FLGNBQWMsSUFBSSxDQUFDQyxrQkFDbkJDLGtCQUFrQmpELE1BQU0rQyxjQUN4QnZCLG1CQUFtQnlCLGdCQUFnQkMsdUJBQ25DbEIsbUJBQW1CaUIsZ0JBQWdCRSx1QkFDbkN6QixlQUFlLElBQUksQ0FBQ1Isc0JBQXNCTSxtQkFDMUNjLGVBQWUsSUFBSSxDQUFDcEIsc0JBQXNCYztvQkFFaERNLGFBQWFjLHlCQUF5QixTQUFDOUIsUUFBUStCO3dCQUM3QyxJQUFJQyxZQUFZO3dCQUVoQixJQUFJaEMsV0FBV0ksY0FBYzs0QkFDM0I0QixZQUFZOzRCQUVaLElBQU1DLFFBQVFDLGVBQU1DLHVDQUF1Qy9CLGNBQWMyQixzQkFBdUIsR0FBRzs0QkFFbkdULGFBQWFXLE9BQU8sR0FBRzt3QkFDekI7d0JBRUEsT0FBT0Q7b0JBQ1Q7Z0JBQ0Y7Z0JBRUEsT0FBT1Y7WUFDVDs7O1lBRUFJLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFNRCxjQUFjLEVBQUUsRUFDaEJ2QyxXQUFXLElBQUksQ0FBQ0o7Z0JBRXRCSSxTQUFTdUIsUUFBUSxTQUFDVDtvQkFDaEIsSUFBTUksZUFBZUosUUFDZm9DLG9CQUFvQmhDLGFBQWFpQztvQkFFdkNyQyxPQUFPc0MsZ0NBQWdDLFNBQUNDO3dCQUN0QyxJQUFNdkIsZUFBZXVCLDBCQUNmQyxvQkFBb0J4QixhQUFhcUI7d0JBRXZDLElBQUlHLG9CQUFvQkosbUJBQW1COzRCQUN6QyxJQUFNbEMsbUJBQW1CRSxhQUFhcUMsV0FDaEMvQixtQkFBbUJNLGFBQWF5QixXQUNoQzlCLE9BQU9DLGNBQUtDLHdDQUF3Q1gsa0JBQWtCUSxtQkFDdEVnQyxhQUFhL0IsTUFBTyxHQUFHOzRCQUU3QmMsWUFBWVgsS0FBSzRCO3dCQUNuQjtvQkFDRjtvQkFFQXRDO2dCQUNGO2dCQUVBLE9BQU9xQjtZQUNUOzs7WUFFQUQsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQU10QyxXQUFXLElBQUksQ0FBQ0osZUFDaEJ5QyxnQkFBZ0JyQyxTQUFTeUQsS0FBSyxTQUFDM0M7b0JBQzdCLElBQU1JLGVBQWVKLFFBQ2ZvQyxvQkFBb0JoQyxhQUFhaUMsWUFDakNPLG9CQUFvQjVDLE9BQU82Qyw2QkFBNkIsU0FBQ047d0JBQ3ZELElBQU12QixlQUFldUIsMEJBQ2ZDLG9CQUFvQnhCLGFBQWFxQjt3QkFFdkMsSUFBSUcsb0JBQW9CSixtQkFBbUI7NEJBQ3pDLE9BQU87d0JBQ1Q7b0JBQ0Y7b0JBRU4sSUFBSVEsbUJBQW1CO3dCQUNyQixPQUFPO29CQUNUO2dCQUNGO2dCQUVOLE9BQU9yQjtZQUNUOzs7WUFFQXVCLEtBQUFBO21CQUFBQSxTQUFBQSxjQUFjbkMsSUFBSTtnQkFDaEIsSUFBSW9DLGNBQWM7Z0JBRWxCLElBQU03QyxtQkFBbUJTLEtBQUtpQix1QkFDeEJ4QixlQUFlLElBQUksQ0FBQ1Isc0JBQXNCTTtnQkFFaEQsSUFBSUUsaUJBQWlCLE1BQU07b0JBQ3pCLElBQU1NLG1CQUFtQkMsS0FBS2tCLHVCQUN4QmIsZUFBZSxJQUFJLENBQUNwQixzQkFBc0JjO29CQUVoRCxJQUFJTSxpQkFBaUIsTUFBTTt3QkFDekIrQixjQUFjM0MsYUFBYTRDLDRCQUE0QmhDO29CQUN6RDtnQkFDRjtnQkFFQSxPQUFPK0I7WUFDVDs7O1lBRUFoRCxLQUFBQTttQkFBQUEsU0FBQUEsNEJBQTRCRixVQUFVO2dCQUNwQyxJQUFNUCxjQUFjLElBQUksQ0FBQ0gsa0JBQ25COEQsZ0NBQWdDM0QsWUFBWTRELFNBQVNyRCxhQUNyREMsZ0JBQWdCbUQsK0JBQWdDLEdBQUc7Z0JBRXpELE9BQU9uRDtZQUNUOzs7WUFFQXFELEtBQUFBO21CQUFBQSxTQUFBQSxzQkFBc0J0RCxVQUFVO2dCQUM5QixJQUFNQyxnQkFBZ0IsSUFBSSxDQUFDQyw0QkFBNEJGO2dCQUV2RCxJQUFJLENBQUNDLGVBQWU7b0JBQ2xCLElBQU1SLGNBQWMsSUFBSSxDQUFDSCxrQkFDbkJpRSxvQkFBb0I5RCxZQUFZK0QsUUFDaENDLE9BQU96RCxZQUNQMEQsUUFBUUgsbUJBQ1JwRCxTQUFTd0QsZ0JBQU9DLGlCQUFpQkgsTUFBTUM7b0JBRTdDLElBQUksQ0FBQ0csc0JBQXNCN0QsWUFBWUc7Z0JBQ3pDO2dCQUVBLElBQU1BLFVBQVMsSUFBSSxDQUFDSixzQkFBc0JDO2dCQUUxQyxPQUFPRztZQUNUOzs7WUFFQTJELEtBQUFBO21CQUFBQSxTQUFBQSx5QkFBeUI5RCxVQUFVO2dCQUNqQyxJQUFNQyxnQkFBZ0IsSUFBSSxDQUFDQyw0QkFBNEJGO2dCQUV2RCxJQUFJLENBQUNDLGVBQWU7b0JBQ2xCO2dCQUNGO2dCQUVBLElBQU1FLFNBQVMsSUFBSSxDQUFDSixzQkFBc0JDO2dCQUUxQ0csT0FBT3NDLGdDQUFnQyxTQUFDc0I7b0JBQ3RDLElBQU1DLDZCQUE2QjdELFFBQVMsR0FBRztvQkFFL0M0RCx1QkFBdUJFLGlDQUFpQ0Q7Z0JBQzFEO2dCQUVBN0QsT0FBTytELGtDQUFrQyxTQUFDRjtvQkFDeEMsSUFBTUQseUJBQXlCNUQsUUFBUyxHQUFHO29CQUUzQzZELDJCQUEyQkcsK0JBQStCSjtnQkFDNUQ7Z0JBRUEsSUFBSSxDQUFDSyx5QkFBeUJwRTtnQkFFOUIsSUFBTVgsV0FBVyxJQUFJLENBQUNKLGVBQ2hCb0YsZ0JBQWdCbEUsUUFDaEJtRSxxQkFBcUJELGNBQWM3QjtnQkFFekNuRCxTQUFTdUIsUUFBUSxTQUFDVDtvQkFDaEIsSUFBTW9FLGNBQWNwRSxPQUFPcUM7b0JBRTNCLElBQUkrQixjQUFjRCxvQkFBb0I7d0JBQ3BDbkUsT0FBT3FFO29CQUNUO2dCQUNGO2dCQUVBLElBQUksQ0FBQ0M7WUFDUDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxRQUFRNUQsSUFBSTtnQkFDVixJQUFNVCxtQkFBbUJTLEtBQUtpQix1QkFDeEJsQixtQkFBbUJDLEtBQUtrQjtnQkFFOUIsSUFBSTNCLHFCQUFxQlEsa0JBQWtCO29CQUN6QztnQkFDRjtnQkFFQSxJQUFNTixlQUFlLElBQUksQ0FBQytDLHNCQUFzQmpELG1CQUMxQ2MsZUFBZSxJQUFJLENBQUNtQyxzQkFBc0J6QyxtQkFDMUNxQyxjQUFjM0MsYUFBYTRDLDRCQUE0QmhDO2dCQUU3RCxJQUFJK0IsYUFBYTtvQkFDZjtnQkFDRjtnQkFFQSxJQUFNWCxvQkFBb0JoQyxhQUFhaUMsWUFDakNHLG9CQUFvQnhCLGFBQWFxQjtnQkFFdkMsSUFBSUQsb0JBQW9CSSxtQkFBbUI7b0JBQ3pDLElBQUksQ0FBQ2dDLDZDQUE2Q3BFLGNBQWNZO2dCQUNsRTtnQkFFQSxJQUFNNkMsNkJBQTZCekQsY0FDN0JtQywyQkFBMkJ2QixjQUFjLEdBQUc7Z0JBRWxENkMsMkJBQTJCWSw0QkFBNEJsQztnQkFFdkRBLHlCQUF5Qm1DLDhCQUE4QmI7WUFDekQ7OztZQUVBYyxLQUFBQTttQkFBQUEsU0FBQUEsU0FBU3hFLEtBQUs7O2dCQUNaQSxNQUFNTSxRQUFRLFNBQUNFO29CQUNiLE1BQUs0RCxRQUFRNUQ7Z0JBQ2Y7WUFDRjs7O1lBRUFpRSxLQUFBQTttQkFBQUEsU0FBQUEsV0FBV2pFLElBQUksRUFBRWtFLHNCQUFzQjtnQkFDckMsSUFBTTNFLG1CQUFtQlMsS0FBS2lCLHVCQUN4QmxCLG1CQUFtQkMsS0FBS2tCLHVCQUN4QnpCLGVBQWUsSUFBSSxDQUFDK0Msc0JBQXNCakQsbUJBQzFDYyxlQUFlLElBQUksQ0FBQ21DLHNCQUFzQnpDLG1CQUMxQ3FDLGNBQWMzQyxhQUFhNEMsNEJBQTRCaEM7Z0JBRTdELElBQUksQ0FBQytCLGFBQWE7b0JBQ2hCO2dCQUNGO2dCQUVBM0MsYUFBYTRELCtCQUErQmhEO2dCQUU1Q0EsYUFBYThDLGlDQUFpQzFEO2dCQUU5QyxJQUFJeUUsd0JBQXdCO29CQUMxQixJQUFNQyx1QkFBdUIxRSxhQUFhMkUsY0FDcENDLHVCQUF1QmhFLGFBQWErRDtvQkFFMUMsSUFBSUQsc0JBQXNCO3dCQUN4QixJQUFJLENBQUNuQix5QkFBeUJ6RDtvQkFDaEM7b0JBRUEsSUFBSThFLHNCQUFzQjt3QkFDeEIsSUFBSSxDQUFDckIseUJBQXlCakQ7b0JBQ2hDO2dCQUNGO2dCQUVBLElBQUksQ0FBQzREO1lBQ1A7OztZQUVBVyxLQUFBQTttQkFBQUEsU0FBQUEsWUFBWTlFLEtBQUs7b0JBQUUwRSx5QkFBQUEsaUVBQXlCOztnQkFDMUMxRSxNQUFNTSxRQUFRLFNBQUNFO29CQUNiLE1BQUtpRSxXQUFXakUsTUFBTWtFO2dCQUN4QjtZQUNGOzs7WUFFQUssS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQUksQ0FBQ3RHLFlBQVksQ0FBQztZQUNwQjs7O1lBRUE0RixLQUFBQTttQkFBQUEsU0FBQUEsNkNBQTZDcEUsWUFBWSxFQUFFWSxZQUFZO2dCQUNyRSxJQUFNbUUsd0JBQXdCbkUsYUFBYW9FLGtCQUFrQmhGO2dCQUU3RCxJQUFJK0UsdUJBQXVCO29CQUN6QjtnQkFDRjtnQkFFQSxJQUFNRSwwQkFBMEJyRSxhQUFhc0UsbUNBQ3ZDQywyQkFBMkJuRixhQUFhb0Y7Z0JBRTlDaEcsSUFBQUEsd0JBQWMrRjtnQkFFZC9GLElBQUFBLHdCQUFjNkY7Z0JBRWQsSUFBTUksa0JBQWtCLEFBQ2hCLHFCQUFHRixpQ0FDSCxxQkFBR0YsMkJBRUxLLGlCQUFpQkMsSUFBQUEsNEJBQW9CRjtnQkFFM0NHLElBQUFBLHFCQUFhRjtnQkFFYkQsZ0JBQWdCaEYsUUFBUSxTQUFDb0YsZUFBZXRDO29CQUN0QyxJQUFNdUMsZUFBZUosY0FBYyxDQUFDbkMsTUFBTTtvQkFFMUNBLFFBQVF1QyxjQUFjLEdBQUc7b0JBRXpCRCxjQUFjRSxTQUFTeEM7Z0JBQ3pCO1lBQ0Y7OztZQUVBZSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTTdDLGNBQWMsSUFBSSxDQUFDQyxrQkFDbkJ2QixRQUFRc0IsYUFBYyxHQUFHO2dCQUUvQixJQUFJLENBQUN3RCxZQUFZOUU7Z0JBRWpCLElBQUksQ0FBQ3dFLFNBQVN4RTtZQUNoQjs7O1lBRUF1RCxLQUFBQTttQkFBQUEsU0FBQUEsc0JBQXNCN0QsVUFBVSxFQUFFRyxNQUFNO2dCQUN0QyxJQUFJLENBQUNwQixTQUFTLENBQUNpQixXQUFXLEdBQUdHO1lBQy9COzs7WUFFQWlFLEtBQUFBO21CQUFBQSxTQUFBQSx5QkFBeUJwRSxVQUFVO2dCQUNqQyxPQUFPLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQ2lCLFdBQVc7WUFDbkM7Ozs7WUFFT21HLEtBQUFBO21CQUFQLFNBQU9BO2dCQUNMLElBQU1wSCxZQUFZLENBQUMsR0FDYnFILGdCQUFnQixJQXBYTHhILGNBb1h1Qkc7Z0JBRXhDLE9BQU9xSDtZQUNUOzs7V0F2WG1CeEgifQ==
|