@getopenpay/openpay-js 0.5.14 → 0.5.16
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/dist/{ExportResult-B-YLKMaU.js → ExportResult-BacsqwKA.js} +1 -1
- package/dist/{Resource-qJjZ52YV.js → Resource-CUhg8dEK.js} +6 -6
- package/dist/SimpleSpanProcessor-BtNzab2_.js +910 -0
- package/dist/_commonjsHelpers-CdLE1o9f.js +30 -0
- package/dist/detect-resources-6fNItMfQ.js +862 -0
- package/dist/{diag-api-CCLNzlUs.js → diag-api-BaoBTidT.js} +2 -2
- package/dist/index-2Dpi7rDE.js +127 -0
- package/dist/index-BkFKN09r.js +18 -0
- package/dist/index-BohOdvI5.js +6718 -0
- package/dist/index-Cb6WFqJj.js +1012 -0
- package/dist/index-CfhP31jP.js +147 -0
- package/dist/index-CmjNpx1j.js +1619 -0
- package/dist/index-CsjF5pDg.js +6 -0
- package/dist/index-Dcezwdcs.js +7000 -0
- package/dist/index-DhyFkarT.js +430 -0
- package/dist/index-t_WVTb5S.js +28 -0
- package/dist/index.d.ts +27 -2
- package/dist/index.es.js +2 -2
- package/dist/index.umd.js +40 -40
- package/dist/lifecycle-D1BdEbZs.js +119 -0
- package/dist/{metrics-api-DtBUlvdW.js → metrics-api-CsLzDvjo.js} +28 -28
- package/dist/sdk-info-ChuKu8zW.js +285 -0
- package/dist/suppress-tracing-Cu47NVB2.js +17 -0
- package/dist/url-CgnFZYDI.js +798 -0
- package/dist/utils-BJ1UAbM8.js +101 -0
- package/dist/utils-De78ey-v.js +12 -0
- package/dist/utils-Dius2V8g.js +270 -0
- package/package.json +4 -4
- package/dist/SimpleSpanProcessor-BwonVfHA.js +0 -957
- package/dist/_commonjsHelpers-f76XedMs.js +0 -25
- package/dist/detect-resources-Bi3A_QRE.js +0 -854
- package/dist/index-BIZrcIxl.js +0 -19
- package/dist/index-Bs_K1BID.js +0 -431
- package/dist/index-CRez6biP.js +0 -150
- package/dist/index-Cmp0890G.js +0 -1599
- package/dist/index-DCgcMBKE.js +0 -52
- package/dist/index-DDPV-DRN.js +0 -7040
- package/dist/index-SVnUIdm3.js +0 -130
- package/dist/index-UHBeywOG.js +0 -330
- package/dist/index-sp5MCjj0.js +0 -6685
- package/dist/index-wETKGbBW.js +0 -830
- package/dist/lifecycle-BjQ-7GLm.js +0 -119
- package/dist/sdk-info-Ved2vK62.js +0 -484
- package/dist/url-C-ZmHCbX.js +0 -797
- package/dist/utils-CX5YT7yI.js +0 -14
- package/dist/utils-DwFEBfnB.js +0 -142
- package/dist/utils-wV4fOQ_R.js +0 -381
|
@@ -0,0 +1,910 @@
|
|
|
1
|
+
import { e as nt, t as _, i as it, T as L, b as ot, a as T, I as at, S as st } from "./index-Dcezwdcs.js";
|
|
2
|
+
import { d } from "./diag-api-BaoBTidT.js";
|
|
3
|
+
import { o as I, l as ut, n as k, q as lt, j as pt, m as w, r as dt, s as ct, v as N, w as M, x as ft, p as ht, y as V } from "./url-CgnFZYDI.js";
|
|
4
|
+
import { i as _t, s as x, g as h, a as A, T as v, b as mt, D as vt, c as St, u as yt, B as Z, S as H, C as Et, W as Tt, d as gt, m as Lt, e as Pt } from "./index-Cb6WFqJj.js";
|
|
5
|
+
import { s as At, i as bt } from "./suppress-tracing-Cu47NVB2.js";
|
|
6
|
+
import { R as Q } from "./Resource-CUhg8dEK.js";
|
|
7
|
+
import { E as U } from "./ExportResult-BacsqwKA.js";
|
|
8
|
+
var wt = "exception", D = function() {
|
|
9
|
+
return D = Object.assign || function(r) {
|
|
10
|
+
for (var t, e = 1, n = arguments.length; e < n; e++) {
|
|
11
|
+
t = arguments[e];
|
|
12
|
+
for (var o in t) Object.prototype.hasOwnProperty.call(t, o) && (r[o] = t[o]);
|
|
13
|
+
}
|
|
14
|
+
return r;
|
|
15
|
+
}, D.apply(this, arguments);
|
|
16
|
+
}, Ct = function(r) {
|
|
17
|
+
var t = typeof Symbol == "function" && Symbol.iterator, e = t && r[t], n = 0;
|
|
18
|
+
if (e) return e.call(r);
|
|
19
|
+
if (r && typeof r.length == "number") return {
|
|
20
|
+
next: function() {
|
|
21
|
+
return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
25
|
+
}, X = function(r, t) {
|
|
26
|
+
var e = typeof Symbol == "function" && r[Symbol.iterator];
|
|
27
|
+
if (!e) return r;
|
|
28
|
+
var n = e.call(r), o, i = [], a;
|
|
29
|
+
try {
|
|
30
|
+
for (; (t === void 0 || t-- > 0) && !(o = n.next()).done; ) i.push(o.value);
|
|
31
|
+
} catch (s) {
|
|
32
|
+
a = { error: s };
|
|
33
|
+
} finally {
|
|
34
|
+
try {
|
|
35
|
+
o && !o.done && (e = n.return) && e.call(n);
|
|
36
|
+
} finally {
|
|
37
|
+
if (a) throw a.error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return i;
|
|
41
|
+
}, Ot = function(r, t, e) {
|
|
42
|
+
if (e || arguments.length === 2) for (var n = 0, o = t.length, i; n < o; n++)
|
|
43
|
+
(i || !(n in t)) && (i || (i = Array.prototype.slice.call(t, 0, n)), i[n] = t[n]);
|
|
44
|
+
return r.concat(i || Array.prototype.slice.call(t));
|
|
45
|
+
}, xt = (
|
|
46
|
+
/** @class */
|
|
47
|
+
(function() {
|
|
48
|
+
function r(t, e, n, o, i, a, s, l, u, p) {
|
|
49
|
+
s === void 0 && (s = []), this.attributes = {}, this.links = [], this.events = [], this._droppedAttributesCount = 0, this._droppedEventsCount = 0, this._droppedLinksCount = 0, this.status = {
|
|
50
|
+
code: nt.UNSET
|
|
51
|
+
}, this.endTime = [0, 0], this._ended = !1, this._duration = [-1, -1], this.name = n, this._spanContext = o, this.parentSpanId = a, this.kind = i, this.links = s;
|
|
52
|
+
var c = Date.now();
|
|
53
|
+
this._performanceStartTime = I.now(), this._performanceOffset = c - (this._performanceStartTime + ut()), this._startTimeProvided = l != null, this.startTime = this._getTime(l ?? c), this.resource = t.resource, this.instrumentationLibrary = t.instrumentationLibrary, this._spanLimits = t.getSpanLimits(), this._attributeValueLengthLimit = this._spanLimits.attributeValueLengthLimit || 0, p != null && this.setAttributes(p), this._spanProcessor = t.getActiveSpanProcessor(), this._spanProcessor.onStart(this, e);
|
|
54
|
+
}
|
|
55
|
+
return r.prototype.spanContext = function() {
|
|
56
|
+
return this._spanContext;
|
|
57
|
+
}, r.prototype.setAttribute = function(t, e) {
|
|
58
|
+
return e == null || this._isSpanEnded() ? this : t.length === 0 ? (d.warn("Invalid attribute key: " + t), this) : _t(e) ? Object.keys(this.attributes).length >= this._spanLimits.attributeCountLimit && !Object.prototype.hasOwnProperty.call(this.attributes, t) ? (this._droppedAttributesCount++, this) : (this.attributes[t] = this._truncateToSize(e), this) : (d.warn("Invalid attribute value set for key: " + t), this);
|
|
59
|
+
}, r.prototype.setAttributes = function(t) {
|
|
60
|
+
var e, n;
|
|
61
|
+
try {
|
|
62
|
+
for (var o = Ct(Object.entries(t)), i = o.next(); !i.done; i = o.next()) {
|
|
63
|
+
var a = X(i.value, 2), s = a[0], l = a[1];
|
|
64
|
+
this.setAttribute(s, l);
|
|
65
|
+
}
|
|
66
|
+
} catch (u) {
|
|
67
|
+
e = { error: u };
|
|
68
|
+
} finally {
|
|
69
|
+
try {
|
|
70
|
+
i && !i.done && (n = o.return) && n.call(o);
|
|
71
|
+
} finally {
|
|
72
|
+
if (e) throw e.error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return this;
|
|
76
|
+
}, r.prototype.addEvent = function(t, e, n) {
|
|
77
|
+
if (this._isSpanEnded())
|
|
78
|
+
return this;
|
|
79
|
+
if (this._spanLimits.eventCountLimit === 0)
|
|
80
|
+
return d.warn("No events allowed."), this._droppedEventsCount++, this;
|
|
81
|
+
this.events.length >= this._spanLimits.eventCountLimit && (this._droppedEventsCount === 0 && d.debug("Dropping extra events."), this.events.shift(), this._droppedEventsCount++), k(e) && (k(n) || (n = e), e = void 0);
|
|
82
|
+
var o = x(e);
|
|
83
|
+
return this.events.push({
|
|
84
|
+
name: t,
|
|
85
|
+
attributes: o,
|
|
86
|
+
time: this._getTime(n),
|
|
87
|
+
droppedAttributesCount: 0
|
|
88
|
+
}), this;
|
|
89
|
+
}, r.prototype.addLink = function(t) {
|
|
90
|
+
return this.links.push(t), this;
|
|
91
|
+
}, r.prototype.addLinks = function(t) {
|
|
92
|
+
var e;
|
|
93
|
+
return (e = this.links).push.apply(e, Ot([], X(t), !1)), this;
|
|
94
|
+
}, r.prototype.setStatus = function(t) {
|
|
95
|
+
return this._isSpanEnded() ? this : (this.status = D({}, t), this.status.message != null && typeof t.message != "string" && (d.warn("Dropping invalid status.message of type '" + typeof t.message + "', expected 'string'"), delete this.status.message), this);
|
|
96
|
+
}, r.prototype.updateName = function(t) {
|
|
97
|
+
return this._isSpanEnded() ? this : (this.name = t, this);
|
|
98
|
+
}, r.prototype.end = function(t) {
|
|
99
|
+
if (this._isSpanEnded()) {
|
|
100
|
+
d.error(this.name + " " + this._spanContext.traceId + "-" + this._spanContext.spanId + " - You can only call end() on a span once.");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this._ended = !0, this.endTime = this._getTime(t), this._duration = lt(this.startTime, this.endTime), this._duration[0] < 0 && (d.warn("Inconsistent start and end time, startTime > endTime. Setting span duration to 0ms.", this.startTime, this.endTime), this.endTime = this.startTime.slice(), this._duration = [0, 0]), this._droppedEventsCount > 0 && d.warn("Dropped " + this._droppedEventsCount + " events because eventCountLimit reached"), this._spanProcessor.onEnd(this);
|
|
104
|
+
}, r.prototype._getTime = function(t) {
|
|
105
|
+
if (typeof t == "number" && t <= I.now())
|
|
106
|
+
return pt(t + this._performanceOffset);
|
|
107
|
+
if (typeof t == "number")
|
|
108
|
+
return w(t);
|
|
109
|
+
if (t instanceof Date)
|
|
110
|
+
return w(t.getTime());
|
|
111
|
+
if (dt(t))
|
|
112
|
+
return t;
|
|
113
|
+
if (this._startTimeProvided)
|
|
114
|
+
return w(Date.now());
|
|
115
|
+
var e = I.now() - this._performanceStartTime;
|
|
116
|
+
return ct(this.startTime, w(e));
|
|
117
|
+
}, r.prototype.isRecording = function() {
|
|
118
|
+
return this._ended === !1;
|
|
119
|
+
}, r.prototype.recordException = function(t, e) {
|
|
120
|
+
var n = {};
|
|
121
|
+
typeof t == "string" ? n[M] = t : t && (t.code ? n[N] = t.code.toString() : t.name && (n[N] = t.name), t.message && (n[M] = t.message), t.stack && (n[ft] = t.stack)), n[N] || n[M] ? this.addEvent(wt, n, e) : d.warn("Failed to record an exception " + t);
|
|
122
|
+
}, Object.defineProperty(r.prototype, "duration", {
|
|
123
|
+
get: function() {
|
|
124
|
+
return this._duration;
|
|
125
|
+
},
|
|
126
|
+
enumerable: !1,
|
|
127
|
+
configurable: !0
|
|
128
|
+
}), Object.defineProperty(r.prototype, "ended", {
|
|
129
|
+
get: function() {
|
|
130
|
+
return this._ended;
|
|
131
|
+
},
|
|
132
|
+
enumerable: !1,
|
|
133
|
+
configurable: !0
|
|
134
|
+
}), Object.defineProperty(r.prototype, "droppedAttributesCount", {
|
|
135
|
+
get: function() {
|
|
136
|
+
return this._droppedAttributesCount;
|
|
137
|
+
},
|
|
138
|
+
enumerable: !1,
|
|
139
|
+
configurable: !0
|
|
140
|
+
}), Object.defineProperty(r.prototype, "droppedEventsCount", {
|
|
141
|
+
get: function() {
|
|
142
|
+
return this._droppedEventsCount;
|
|
143
|
+
},
|
|
144
|
+
enumerable: !1,
|
|
145
|
+
configurable: !0
|
|
146
|
+
}), Object.defineProperty(r.prototype, "droppedLinksCount", {
|
|
147
|
+
get: function() {
|
|
148
|
+
return this._droppedLinksCount;
|
|
149
|
+
},
|
|
150
|
+
enumerable: !1,
|
|
151
|
+
configurable: !0
|
|
152
|
+
}), r.prototype._isSpanEnded = function() {
|
|
153
|
+
return this._ended && d.warn("Can not execute the operation on ended Span {traceId: " + this._spanContext.traceId + ", spanId: " + this._spanContext.spanId + "}"), this._ended;
|
|
154
|
+
}, r.prototype._truncateToLimitUtil = function(t, e) {
|
|
155
|
+
return t.length <= e ? t : t.substring(0, e);
|
|
156
|
+
}, r.prototype._truncateToSize = function(t) {
|
|
157
|
+
var e = this, n = this._attributeValueLengthLimit;
|
|
158
|
+
return n <= 0 ? (d.warn("Attribute value limit must be positive, got " + n), t) : typeof t == "string" ? this._truncateToLimitUtil(t, n) : Array.isArray(t) ? t.map(function(o) {
|
|
159
|
+
return typeof o == "string" ? e._truncateToLimitUtil(o, n) : o;
|
|
160
|
+
}) : t;
|
|
161
|
+
}, r;
|
|
162
|
+
})()
|
|
163
|
+
), P;
|
|
164
|
+
(function(r) {
|
|
165
|
+
r[r.NOT_RECORD = 0] = "NOT_RECORD", r[r.RECORD = 1] = "RECORD", r[r.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
|
|
166
|
+
})(P || (P = {}));
|
|
167
|
+
var R = (
|
|
168
|
+
/** @class */
|
|
169
|
+
(function() {
|
|
170
|
+
function r() {
|
|
171
|
+
}
|
|
172
|
+
return r.prototype.shouldSample = function() {
|
|
173
|
+
return {
|
|
174
|
+
decision: P.NOT_RECORD
|
|
175
|
+
};
|
|
176
|
+
}, r.prototype.toString = function() {
|
|
177
|
+
return "AlwaysOffSampler";
|
|
178
|
+
}, r;
|
|
179
|
+
})()
|
|
180
|
+
), g = (
|
|
181
|
+
/** @class */
|
|
182
|
+
(function() {
|
|
183
|
+
function r() {
|
|
184
|
+
}
|
|
185
|
+
return r.prototype.shouldSample = function() {
|
|
186
|
+
return {
|
|
187
|
+
decision: P.RECORD_AND_SAMPLED
|
|
188
|
+
};
|
|
189
|
+
}, r.prototype.toString = function() {
|
|
190
|
+
return "AlwaysOnSampler";
|
|
191
|
+
}, r;
|
|
192
|
+
})()
|
|
193
|
+
), B = (
|
|
194
|
+
/** @class */
|
|
195
|
+
(function() {
|
|
196
|
+
function r(t) {
|
|
197
|
+
var e, n, o, i;
|
|
198
|
+
this._root = t.root, this._root || (h(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new g()), this._remoteParentSampled = (e = t.remoteParentSampled) !== null && e !== void 0 ? e : new g(), this._remoteParentNotSampled = (n = t.remoteParentNotSampled) !== null && n !== void 0 ? n : new R(), this._localParentSampled = (o = t.localParentSampled) !== null && o !== void 0 ? o : new g(), this._localParentNotSampled = (i = t.localParentNotSampled) !== null && i !== void 0 ? i : new R();
|
|
199
|
+
}
|
|
200
|
+
return r.prototype.shouldSample = function(t, e, n, o, i, a) {
|
|
201
|
+
var s = _.getSpanContext(t);
|
|
202
|
+
return !s || !it(s) ? this._root.shouldSample(t, e, n, o, i, a) : s.isRemote ? s.traceFlags & L.SAMPLED ? this._remoteParentSampled.shouldSample(t, e, n, o, i, a) : this._remoteParentNotSampled.shouldSample(t, e, n, o, i, a) : s.traceFlags & L.SAMPLED ? this._localParentSampled.shouldSample(t, e, n, o, i, a) : this._localParentNotSampled.shouldSample(t, e, n, o, i, a);
|
|
203
|
+
}, r.prototype.toString = function() {
|
|
204
|
+
return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
|
|
205
|
+
}, r;
|
|
206
|
+
})()
|
|
207
|
+
), W = (
|
|
208
|
+
/** @class */
|
|
209
|
+
(function() {
|
|
210
|
+
function r(t) {
|
|
211
|
+
t === void 0 && (t = 0), this._ratio = t, this._ratio = this._normalize(t), this._upperBound = Math.floor(this._ratio * 4294967295);
|
|
212
|
+
}
|
|
213
|
+
return r.prototype.shouldSample = function(t, e) {
|
|
214
|
+
return {
|
|
215
|
+
decision: ot(e) && this._accumulate(e) < this._upperBound ? P.RECORD_AND_SAMPLED : P.NOT_RECORD
|
|
216
|
+
};
|
|
217
|
+
}, r.prototype.toString = function() {
|
|
218
|
+
return "TraceIdRatioBased{" + this._ratio + "}";
|
|
219
|
+
}, r.prototype._normalize = function(t) {
|
|
220
|
+
return typeof t != "number" || isNaN(t) ? 0 : t >= 1 ? 1 : t <= 0 ? 0 : t;
|
|
221
|
+
}, r.prototype._accumulate = function(t) {
|
|
222
|
+
for (var e = 0, n = 0; n < t.length / 8; n++) {
|
|
223
|
+
var o = n * 8, i = parseInt(t.slice(o, o + 8), 16);
|
|
224
|
+
e = (e ^ i) >>> 0;
|
|
225
|
+
}
|
|
226
|
+
return e;
|
|
227
|
+
}, r;
|
|
228
|
+
})()
|
|
229
|
+
), Rt = v.AlwaysOn, E = 1;
|
|
230
|
+
function J() {
|
|
231
|
+
var r = A();
|
|
232
|
+
return {
|
|
233
|
+
sampler: $(r),
|
|
234
|
+
forceFlushTimeoutMillis: 3e4,
|
|
235
|
+
generalLimits: {
|
|
236
|
+
attributeValueLengthLimit: r.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,
|
|
237
|
+
attributeCountLimit: r.OTEL_ATTRIBUTE_COUNT_LIMIT
|
|
238
|
+
},
|
|
239
|
+
spanLimits: {
|
|
240
|
+
attributeValueLengthLimit: r.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,
|
|
241
|
+
attributeCountLimit: r.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,
|
|
242
|
+
linkCountLimit: r.OTEL_SPAN_LINK_COUNT_LIMIT,
|
|
243
|
+
eventCountLimit: r.OTEL_SPAN_EVENT_COUNT_LIMIT,
|
|
244
|
+
attributePerEventCountLimit: r.OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,
|
|
245
|
+
attributePerLinkCountLimit: r.OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT
|
|
246
|
+
},
|
|
247
|
+
mergeResourceWithDefaults: !0
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function $(r) {
|
|
251
|
+
switch (r === void 0 && (r = A()), r.OTEL_TRACES_SAMPLER) {
|
|
252
|
+
case v.AlwaysOn:
|
|
253
|
+
return new g();
|
|
254
|
+
case v.AlwaysOff:
|
|
255
|
+
return new R();
|
|
256
|
+
case v.ParentBasedAlwaysOn:
|
|
257
|
+
return new B({
|
|
258
|
+
root: new g()
|
|
259
|
+
});
|
|
260
|
+
case v.ParentBasedAlwaysOff:
|
|
261
|
+
return new B({
|
|
262
|
+
root: new R()
|
|
263
|
+
});
|
|
264
|
+
case v.TraceIdRatio:
|
|
265
|
+
return new W(Y(r));
|
|
266
|
+
case v.ParentBasedTraceIdRatio:
|
|
267
|
+
return new B({
|
|
268
|
+
root: new W(Y(r))
|
|
269
|
+
});
|
|
270
|
+
default:
|
|
271
|
+
return d.error('OTEL_TRACES_SAMPLER value "' + r.OTEL_TRACES_SAMPLER + " invalid, defaulting to " + Rt + '".'), new g();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function Y(r) {
|
|
275
|
+
if (r.OTEL_TRACES_SAMPLER_ARG === void 0 || r.OTEL_TRACES_SAMPLER_ARG === "")
|
|
276
|
+
return d.error("OTEL_TRACES_SAMPLER_ARG is blank, defaulting to " + E + "."), E;
|
|
277
|
+
var t = Number(r.OTEL_TRACES_SAMPLER_ARG);
|
|
278
|
+
return isNaN(t) ? (d.error("OTEL_TRACES_SAMPLER_ARG=" + r.OTEL_TRACES_SAMPLER_ARG + " was given, but it is invalid, defaulting to " + E + "."), E) : t < 0 || t > 1 ? (d.error("OTEL_TRACES_SAMPLER_ARG=" + r.OTEL_TRACES_SAMPLER_ARG + " was given, but it is out of range ([0..1]), defaulting to " + E + "."), E) : t;
|
|
279
|
+
}
|
|
280
|
+
function It(r) {
|
|
281
|
+
var t = {
|
|
282
|
+
sampler: $()
|
|
283
|
+
}, e = J(), n = Object.assign({}, e, t, r);
|
|
284
|
+
return n.generalLimits = Object.assign({}, e.generalLimits, r.generalLimits || {}), n.spanLimits = Object.assign({}, e.spanLimits, r.spanLimits || {}), n;
|
|
285
|
+
}
|
|
286
|
+
function Nt(r) {
|
|
287
|
+
var t, e, n, o, i, a, s, l, u, p, c, f, y = Object.assign({}, r.spanLimits), m = mt();
|
|
288
|
+
return y.attributeCountLimit = (a = (i = (o = (e = (t = r.spanLimits) === null || t === void 0 ? void 0 : t.attributeCountLimit) !== null && e !== void 0 ? e : (n = r.generalLimits) === null || n === void 0 ? void 0 : n.attributeCountLimit) !== null && o !== void 0 ? o : m.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT) !== null && i !== void 0 ? i : m.OTEL_ATTRIBUTE_COUNT_LIMIT) !== null && a !== void 0 ? a : vt, y.attributeValueLengthLimit = (f = (c = (p = (l = (s = r.spanLimits) === null || s === void 0 ? void 0 : s.attributeValueLengthLimit) !== null && l !== void 0 ? l : (u = r.generalLimits) === null || u === void 0 ? void 0 : u.attributeValueLengthLimit) !== null && p !== void 0 ? p : m.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT) !== null && c !== void 0 ? c : m.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT) !== null && f !== void 0 ? f : St, Object.assign({}, r, { spanLimits: y });
|
|
289
|
+
}
|
|
290
|
+
var Mt = (
|
|
291
|
+
/** @class */
|
|
292
|
+
(function() {
|
|
293
|
+
function r(t, e) {
|
|
294
|
+
this._exporter = t, this._isExporting = !1, this._finishedSpans = [], this._droppedSpansCount = 0;
|
|
295
|
+
var n = A();
|
|
296
|
+
this._maxExportBatchSize = typeof e?.maxExportBatchSize == "number" ? e.maxExportBatchSize : n.OTEL_BSP_MAX_EXPORT_BATCH_SIZE, this._maxQueueSize = typeof e?.maxQueueSize == "number" ? e.maxQueueSize : n.OTEL_BSP_MAX_QUEUE_SIZE, this._scheduledDelayMillis = typeof e?.scheduledDelayMillis == "number" ? e.scheduledDelayMillis : n.OTEL_BSP_SCHEDULE_DELAY, this._exportTimeoutMillis = typeof e?.exportTimeoutMillis == "number" ? e.exportTimeoutMillis : n.OTEL_BSP_EXPORT_TIMEOUT, this._shutdownOnce = new Z(this._shutdown, this), this._maxExportBatchSize > this._maxQueueSize && (d.warn("BatchSpanProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize"), this._maxExportBatchSize = this._maxQueueSize);
|
|
297
|
+
}
|
|
298
|
+
return r.prototype.forceFlush = function() {
|
|
299
|
+
return this._shutdownOnce.isCalled ? this._shutdownOnce.promise : this._flushAll();
|
|
300
|
+
}, r.prototype.onStart = function(t, e) {
|
|
301
|
+
}, r.prototype.onEnd = function(t) {
|
|
302
|
+
this._shutdownOnce.isCalled || (t.spanContext().traceFlags & L.SAMPLED) !== 0 && this._addToBuffer(t);
|
|
303
|
+
}, r.prototype.shutdown = function() {
|
|
304
|
+
return this._shutdownOnce.call();
|
|
305
|
+
}, r.prototype._shutdown = function() {
|
|
306
|
+
var t = this;
|
|
307
|
+
return Promise.resolve().then(function() {
|
|
308
|
+
return t.onShutdown();
|
|
309
|
+
}).then(function() {
|
|
310
|
+
return t._flushAll();
|
|
311
|
+
}).then(function() {
|
|
312
|
+
return t._exporter.shutdown();
|
|
313
|
+
});
|
|
314
|
+
}, r.prototype._addToBuffer = function(t) {
|
|
315
|
+
if (this._finishedSpans.length >= this._maxQueueSize) {
|
|
316
|
+
this._droppedSpansCount === 0 && d.debug("maxQueueSize reached, dropping spans"), this._droppedSpansCount++;
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
this._droppedSpansCount > 0 && (d.warn("Dropped " + this._droppedSpansCount + " spans because maxQueueSize reached"), this._droppedSpansCount = 0), this._finishedSpans.push(t), this._maybeStartTimer();
|
|
320
|
+
}, r.prototype._flushAll = function() {
|
|
321
|
+
var t = this;
|
|
322
|
+
return new Promise(function(e, n) {
|
|
323
|
+
for (var o = [], i = Math.ceil(t._finishedSpans.length / t._maxExportBatchSize), a = 0, s = i; a < s; a++)
|
|
324
|
+
o.push(t._flushOneBatch());
|
|
325
|
+
Promise.all(o).then(function() {
|
|
326
|
+
e();
|
|
327
|
+
}).catch(n);
|
|
328
|
+
});
|
|
329
|
+
}, r.prototype._flushOneBatch = function() {
|
|
330
|
+
var t = this;
|
|
331
|
+
return this._clearTimer(), this._finishedSpans.length === 0 ? Promise.resolve() : new Promise(function(e, n) {
|
|
332
|
+
var o = setTimeout(function() {
|
|
333
|
+
n(new Error("Timeout"));
|
|
334
|
+
}, t._exportTimeoutMillis);
|
|
335
|
+
T.with(At(T.active()), function() {
|
|
336
|
+
var i;
|
|
337
|
+
t._finishedSpans.length <= t._maxExportBatchSize ? (i = t._finishedSpans, t._finishedSpans = []) : i = t._finishedSpans.splice(0, t._maxExportBatchSize);
|
|
338
|
+
for (var a = function() {
|
|
339
|
+
return t._exporter.export(i, function(c) {
|
|
340
|
+
var f;
|
|
341
|
+
clearTimeout(o), c.code === U.SUCCESS ? e() : n((f = c.error) !== null && f !== void 0 ? f : new Error("BatchSpanProcessor: span export failed"));
|
|
342
|
+
});
|
|
343
|
+
}, s = null, l = 0, u = i.length; l < u; l++) {
|
|
344
|
+
var p = i[l];
|
|
345
|
+
p.resource.asyncAttributesPending && p.resource.waitForAsyncAttributes && (s ?? (s = []), s.push(p.resource.waitForAsyncAttributes()));
|
|
346
|
+
}
|
|
347
|
+
s === null ? a() : Promise.all(s).then(a, function(c) {
|
|
348
|
+
h(c), n(c);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
}, r.prototype._maybeStartTimer = function() {
|
|
353
|
+
var t = this;
|
|
354
|
+
if (!this._isExporting) {
|
|
355
|
+
var e = function() {
|
|
356
|
+
t._isExporting = !0, t._flushOneBatch().finally(function() {
|
|
357
|
+
t._isExporting = !1, t._finishedSpans.length > 0 && (t._clearTimer(), t._maybeStartTimer());
|
|
358
|
+
}).catch(function(n) {
|
|
359
|
+
t._isExporting = !1, h(n);
|
|
360
|
+
});
|
|
361
|
+
};
|
|
362
|
+
if (this._finishedSpans.length >= this._maxExportBatchSize)
|
|
363
|
+
return e();
|
|
364
|
+
this._timer === void 0 && (this._timer = setTimeout(function() {
|
|
365
|
+
return e();
|
|
366
|
+
}, this._scheduledDelayMillis), yt(this._timer));
|
|
367
|
+
}
|
|
368
|
+
}, r.prototype._clearTimer = function() {
|
|
369
|
+
this._timer !== void 0 && (clearTimeout(this._timer), this._timer = void 0);
|
|
370
|
+
}, r;
|
|
371
|
+
})()
|
|
372
|
+
), Bt = /* @__PURE__ */ (function() {
|
|
373
|
+
var r = function(t, e) {
|
|
374
|
+
return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, o) {
|
|
375
|
+
n.__proto__ = o;
|
|
376
|
+
} || function(n, o) {
|
|
377
|
+
for (var i in o) Object.prototype.hasOwnProperty.call(o, i) && (n[i] = o[i]);
|
|
378
|
+
}, r(t, e);
|
|
379
|
+
};
|
|
380
|
+
return function(t, e) {
|
|
381
|
+
if (typeof e != "function" && e !== null)
|
|
382
|
+
throw new TypeError("Class extends value " + String(e) + " is not a constructor or null");
|
|
383
|
+
r(t, e);
|
|
384
|
+
function n() {
|
|
385
|
+
this.constructor = t;
|
|
386
|
+
}
|
|
387
|
+
t.prototype = e === null ? Object.create(e) : (n.prototype = e.prototype, new n());
|
|
388
|
+
};
|
|
389
|
+
})(), Dt = (
|
|
390
|
+
/** @class */
|
|
391
|
+
(function(r) {
|
|
392
|
+
Bt(t, r);
|
|
393
|
+
function t(e, n) {
|
|
394
|
+
var o = r.call(this, e, n) || this;
|
|
395
|
+
return o.onInit(n), o;
|
|
396
|
+
}
|
|
397
|
+
return t.prototype.onInit = function(e) {
|
|
398
|
+
var n = this;
|
|
399
|
+
e?.disableAutoFlushOnDocumentHide !== !0 && typeof document < "u" && (this._visibilityChangeListener = function() {
|
|
400
|
+
document.visibilityState === "hidden" && n.forceFlush().catch(function(o) {
|
|
401
|
+
h(o);
|
|
402
|
+
});
|
|
403
|
+
}, this._pageHideListener = function() {
|
|
404
|
+
n.forceFlush().catch(function(o) {
|
|
405
|
+
h(o);
|
|
406
|
+
});
|
|
407
|
+
}, document.addEventListener("visibilitychange", this._visibilityChangeListener), document.addEventListener("pagehide", this._pageHideListener));
|
|
408
|
+
}, t.prototype.onShutdown = function() {
|
|
409
|
+
typeof document < "u" && (this._visibilityChangeListener && document.removeEventListener("visibilitychange", this._visibilityChangeListener), this._pageHideListener && document.removeEventListener("pagehide", this._pageHideListener));
|
|
410
|
+
}, t;
|
|
411
|
+
})(Mt)
|
|
412
|
+
), Ut = 8, Ft = 16, Gt = (
|
|
413
|
+
/** @class */
|
|
414
|
+
/* @__PURE__ */ (function() {
|
|
415
|
+
function r() {
|
|
416
|
+
this.generateTraceId = q(Ft), this.generateSpanId = q(Ut);
|
|
417
|
+
}
|
|
418
|
+
return r;
|
|
419
|
+
})()
|
|
420
|
+
), C = Array(32);
|
|
421
|
+
function q(r) {
|
|
422
|
+
return function() {
|
|
423
|
+
for (var e = 0; e < r * 2; e++)
|
|
424
|
+
C[e] = Math.floor(Math.random() * 16) + 48, C[e] >= 58 && (C[e] += 39);
|
|
425
|
+
return String.fromCharCode.apply(null, C.slice(0, r * 2));
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
var zt = (
|
|
429
|
+
/** @class */
|
|
430
|
+
(function() {
|
|
431
|
+
function r(t, e, n) {
|
|
432
|
+
this._tracerProvider = n;
|
|
433
|
+
var o = It(e);
|
|
434
|
+
this._sampler = o.sampler, this._generalLimits = o.generalLimits, this._spanLimits = o.spanLimits, this._idGenerator = e.idGenerator || new Gt(), this.resource = n.resource, this.instrumentationLibrary = t;
|
|
435
|
+
}
|
|
436
|
+
return r.prototype.startSpan = function(t, e, n) {
|
|
437
|
+
var o, i, a;
|
|
438
|
+
e === void 0 && (e = {}), n === void 0 && (n = T.active()), e.root && (n = _.deleteSpan(n));
|
|
439
|
+
var s = _.getSpan(n);
|
|
440
|
+
if (bt(n)) {
|
|
441
|
+
d.debug("Instrumentation suppressed, returning Noop Span");
|
|
442
|
+
var l = _.wrapSpanContext(at);
|
|
443
|
+
return l;
|
|
444
|
+
}
|
|
445
|
+
var u = s?.spanContext(), p = this._idGenerator.generateSpanId(), c, f, y;
|
|
446
|
+
!u || !_.isSpanContextValid(u) ? c = this._idGenerator.generateTraceId() : (c = u.traceId, f = u.traceState, y = u.spanId);
|
|
447
|
+
var m = (o = e.kind) !== null && o !== void 0 ? o : st.INTERNAL, F = ((i = e.links) !== null && i !== void 0 ? i : []).map(function(j) {
|
|
448
|
+
return {
|
|
449
|
+
context: j.context,
|
|
450
|
+
attributes: x(j.attributes)
|
|
451
|
+
};
|
|
452
|
+
}), G = x(e.attributes), b = this._sampler.shouldSample(n, c, t, m, G, F);
|
|
453
|
+
f = (a = b.traceState) !== null && a !== void 0 ? a : f;
|
|
454
|
+
var tt = b.decision === H.RECORD_AND_SAMPLED ? L.SAMPLED : L.NONE, z = { traceId: c, spanId: p, traceFlags: tt, traceState: f };
|
|
455
|
+
if (b.decision === H.NOT_RECORD) {
|
|
456
|
+
d.debug("Recording is off, propagating context in a non-recording span");
|
|
457
|
+
var l = _.wrapSpanContext(z);
|
|
458
|
+
return l;
|
|
459
|
+
}
|
|
460
|
+
var et = x(Object.assign(G, b.attributes)), rt = new xt(this, n, t, z, m, y, F, e.startTime, void 0, et);
|
|
461
|
+
return rt;
|
|
462
|
+
}, r.prototype.startActiveSpan = function(t, e, n, o) {
|
|
463
|
+
var i, a, s;
|
|
464
|
+
if (!(arguments.length < 2)) {
|
|
465
|
+
arguments.length === 2 ? s = e : arguments.length === 3 ? (i = e, s = n) : (i = e, a = n, s = o);
|
|
466
|
+
var l = a ?? T.active(), u = this.startSpan(t, i, l), p = _.setSpan(l, u);
|
|
467
|
+
return T.with(p, s, void 0, u);
|
|
468
|
+
}
|
|
469
|
+
}, r.prototype.getGeneralLimits = function() {
|
|
470
|
+
return this._generalLimits;
|
|
471
|
+
}, r.prototype.getSpanLimits = function() {
|
|
472
|
+
return this._spanLimits;
|
|
473
|
+
}, r.prototype.getActiveSpanProcessor = function() {
|
|
474
|
+
return this._tracerProvider.getActiveSpanProcessor();
|
|
475
|
+
}, r;
|
|
476
|
+
})()
|
|
477
|
+
), O = function(r) {
|
|
478
|
+
var t = typeof Symbol == "function" && Symbol.iterator, e = t && r[t], n = 0;
|
|
479
|
+
if (e) return e.call(r);
|
|
480
|
+
if (r && typeof r.length == "number") return {
|
|
481
|
+
next: function() {
|
|
482
|
+
return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
486
|
+
}, K = (
|
|
487
|
+
/** @class */
|
|
488
|
+
(function() {
|
|
489
|
+
function r(t) {
|
|
490
|
+
this._spanProcessors = t;
|
|
491
|
+
}
|
|
492
|
+
return r.prototype.forceFlush = function() {
|
|
493
|
+
var t, e, n = [];
|
|
494
|
+
try {
|
|
495
|
+
for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
|
|
496
|
+
var a = i.value;
|
|
497
|
+
n.push(a.forceFlush());
|
|
498
|
+
}
|
|
499
|
+
} catch (s) {
|
|
500
|
+
t = { error: s };
|
|
501
|
+
} finally {
|
|
502
|
+
try {
|
|
503
|
+
i && !i.done && (e = o.return) && e.call(o);
|
|
504
|
+
} finally {
|
|
505
|
+
if (t) throw t.error;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return new Promise(function(s) {
|
|
509
|
+
Promise.all(n).then(function() {
|
|
510
|
+
s();
|
|
511
|
+
}).catch(function(l) {
|
|
512
|
+
h(l || new Error("MultiSpanProcessor: forceFlush failed")), s();
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
}, r.prototype.onStart = function(t, e) {
|
|
516
|
+
var n, o;
|
|
517
|
+
try {
|
|
518
|
+
for (var i = O(this._spanProcessors), a = i.next(); !a.done; a = i.next()) {
|
|
519
|
+
var s = a.value;
|
|
520
|
+
s.onStart(t, e);
|
|
521
|
+
}
|
|
522
|
+
} catch (l) {
|
|
523
|
+
n = { error: l };
|
|
524
|
+
} finally {
|
|
525
|
+
try {
|
|
526
|
+
a && !a.done && (o = i.return) && o.call(i);
|
|
527
|
+
} finally {
|
|
528
|
+
if (n) throw n.error;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}, r.prototype.onEnd = function(t) {
|
|
532
|
+
var e, n;
|
|
533
|
+
try {
|
|
534
|
+
for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
|
|
535
|
+
var a = i.value;
|
|
536
|
+
a.onEnd(t);
|
|
537
|
+
}
|
|
538
|
+
} catch (s) {
|
|
539
|
+
e = { error: s };
|
|
540
|
+
} finally {
|
|
541
|
+
try {
|
|
542
|
+
i && !i.done && (n = o.return) && n.call(o);
|
|
543
|
+
} finally {
|
|
544
|
+
if (e) throw e.error;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}, r.prototype.shutdown = function() {
|
|
548
|
+
var t, e, n = [];
|
|
549
|
+
try {
|
|
550
|
+
for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
|
|
551
|
+
var a = i.value;
|
|
552
|
+
n.push(a.shutdown());
|
|
553
|
+
}
|
|
554
|
+
} catch (s) {
|
|
555
|
+
t = { error: s };
|
|
556
|
+
} finally {
|
|
557
|
+
try {
|
|
558
|
+
i && !i.done && (e = o.return) && e.call(o);
|
|
559
|
+
} finally {
|
|
560
|
+
if (t) throw t.error;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return new Promise(function(s, l) {
|
|
564
|
+
Promise.all(n).then(function() {
|
|
565
|
+
s();
|
|
566
|
+
}, l);
|
|
567
|
+
});
|
|
568
|
+
}, r;
|
|
569
|
+
})()
|
|
570
|
+
), jt = (
|
|
571
|
+
/** @class */
|
|
572
|
+
(function() {
|
|
573
|
+
function r() {
|
|
574
|
+
}
|
|
575
|
+
return r.prototype.onStart = function(t, e) {
|
|
576
|
+
}, r.prototype.onEnd = function(t) {
|
|
577
|
+
}, r.prototype.shutdown = function() {
|
|
578
|
+
return Promise.resolve();
|
|
579
|
+
}, r.prototype.forceFlush = function() {
|
|
580
|
+
return Promise.resolve();
|
|
581
|
+
}, r;
|
|
582
|
+
})()
|
|
583
|
+
), kt = function(r, t) {
|
|
584
|
+
var e = typeof Symbol == "function" && r[Symbol.iterator];
|
|
585
|
+
if (!e) return r;
|
|
586
|
+
var n = e.call(r), o, i = [], a;
|
|
587
|
+
try {
|
|
588
|
+
for (; (t === void 0 || t-- > 0) && !(o = n.next()).done; ) i.push(o.value);
|
|
589
|
+
} catch (s) {
|
|
590
|
+
a = { error: s };
|
|
591
|
+
} finally {
|
|
592
|
+
try {
|
|
593
|
+
o && !o.done && (e = n.return) && e.call(n);
|
|
594
|
+
} finally {
|
|
595
|
+
if (a) throw a.error;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
return i;
|
|
599
|
+
}, Vt = function(r, t, e) {
|
|
600
|
+
if (e || arguments.length === 2) for (var n = 0, o = t.length, i; n < o; n++)
|
|
601
|
+
(i || !(n in t)) && (i || (i = Array.prototype.slice.call(t, 0, n)), i[n] = t[n]);
|
|
602
|
+
return r.concat(i || Array.prototype.slice.call(t));
|
|
603
|
+
}, S;
|
|
604
|
+
(function(r) {
|
|
605
|
+
r[r.resolved = 0] = "resolved", r[r.timeout = 1] = "timeout", r[r.error = 2] = "error", r[r.unresolved = 3] = "unresolved";
|
|
606
|
+
})(S || (S = {}));
|
|
607
|
+
var te = (
|
|
608
|
+
/** @class */
|
|
609
|
+
(function() {
|
|
610
|
+
function r(t) {
|
|
611
|
+
t === void 0 && (t = {});
|
|
612
|
+
var e, n;
|
|
613
|
+
this._registeredSpanProcessors = [], this._tracers = /* @__PURE__ */ new Map();
|
|
614
|
+
var o = Lt({}, J(), Nt(t));
|
|
615
|
+
if (this.resource = (e = o.resource) !== null && e !== void 0 ? e : Q.empty(), o.mergeResourceWithDefaults && (this.resource = Q.default().merge(this.resource)), this._config = Object.assign({}, o, {
|
|
616
|
+
resource: this.resource
|
|
617
|
+
}), !((n = t.spanProcessors) === null || n === void 0) && n.length)
|
|
618
|
+
this._registeredSpanProcessors = Vt([], kt(t.spanProcessors), !1), this.activeSpanProcessor = new K(this._registeredSpanProcessors);
|
|
619
|
+
else {
|
|
620
|
+
var i = this._buildExporterFromEnv();
|
|
621
|
+
if (i !== void 0) {
|
|
622
|
+
var a = new Dt(i);
|
|
623
|
+
this.activeSpanProcessor = a;
|
|
624
|
+
} else
|
|
625
|
+
this.activeSpanProcessor = new jt();
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
return r.prototype.getTracer = function(t, e, n) {
|
|
629
|
+
var o = t + "@" + (e || "") + ":" + (n?.schemaUrl || "");
|
|
630
|
+
return this._tracers.has(o) || this._tracers.set(o, new zt({ name: t, version: e, schemaUrl: n?.schemaUrl }, this._config, this)), this._tracers.get(o);
|
|
631
|
+
}, r.prototype.addSpanProcessor = function(t) {
|
|
632
|
+
this._registeredSpanProcessors.length === 0 && this.activeSpanProcessor.shutdown().catch(function(e) {
|
|
633
|
+
return d.error("Error while trying to shutdown current span processor", e);
|
|
634
|
+
}), this._registeredSpanProcessors.push(t), this.activeSpanProcessor = new K(this._registeredSpanProcessors);
|
|
635
|
+
}, r.prototype.getActiveSpanProcessor = function() {
|
|
636
|
+
return this.activeSpanProcessor;
|
|
637
|
+
}, r.prototype.register = function(t) {
|
|
638
|
+
t === void 0 && (t = {}), _.setGlobalTracerProvider(this), t.propagator === void 0 && (t.propagator = this._buildPropagatorFromEnv()), t.contextManager && T.setGlobalContextManager(t.contextManager), t.propagator && ht.setGlobalPropagator(t.propagator);
|
|
639
|
+
}, r.prototype.forceFlush = function() {
|
|
640
|
+
var t = this._config.forceFlushTimeoutMillis, e = this._registeredSpanProcessors.map(function(n) {
|
|
641
|
+
return new Promise(function(o) {
|
|
642
|
+
var i, a = setTimeout(function() {
|
|
643
|
+
o(new Error("Span processor did not completed within timeout period of " + t + " ms")), i = S.timeout;
|
|
644
|
+
}, t);
|
|
645
|
+
n.forceFlush().then(function() {
|
|
646
|
+
clearTimeout(a), i !== S.timeout && (i = S.resolved, o(i));
|
|
647
|
+
}).catch(function(s) {
|
|
648
|
+
clearTimeout(a), i = S.error, o(s);
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
});
|
|
652
|
+
return new Promise(function(n, o) {
|
|
653
|
+
Promise.all(e).then(function(i) {
|
|
654
|
+
var a = i.filter(function(s) {
|
|
655
|
+
return s !== S.resolved;
|
|
656
|
+
});
|
|
657
|
+
a.length > 0 ? o(a) : n();
|
|
658
|
+
}).catch(function(i) {
|
|
659
|
+
return o([i]);
|
|
660
|
+
});
|
|
661
|
+
});
|
|
662
|
+
}, r.prototype.shutdown = function() {
|
|
663
|
+
return this.activeSpanProcessor.shutdown();
|
|
664
|
+
}, r.prototype._getPropagator = function(t) {
|
|
665
|
+
var e;
|
|
666
|
+
return (e = this.constructor._registeredPropagators.get(t)) === null || e === void 0 ? void 0 : e();
|
|
667
|
+
}, r.prototype._getSpanExporter = function(t) {
|
|
668
|
+
var e;
|
|
669
|
+
return (e = this.constructor._registeredExporters.get(t)) === null || e === void 0 ? void 0 : e();
|
|
670
|
+
}, r.prototype._buildPropagatorFromEnv = function() {
|
|
671
|
+
var t = this, e = Array.from(new Set(A().OTEL_PROPAGATORS)), n = e.map(function(i) {
|
|
672
|
+
var a = t._getPropagator(i);
|
|
673
|
+
return a || d.warn('Propagator "' + i + '" requested through environment variable is unavailable.'), a;
|
|
674
|
+
}), o = n.reduce(function(i, a) {
|
|
675
|
+
return a && i.push(a), i;
|
|
676
|
+
}, []);
|
|
677
|
+
if (o.length !== 0)
|
|
678
|
+
return e.length === 1 ? o[0] : new Et({
|
|
679
|
+
propagators: o
|
|
680
|
+
});
|
|
681
|
+
}, r.prototype._buildExporterFromEnv = function() {
|
|
682
|
+
var t = A().OTEL_TRACES_EXPORTER;
|
|
683
|
+
if (!(t === "none" || t === "")) {
|
|
684
|
+
var e = this._getSpanExporter(t);
|
|
685
|
+
return e || d.error('Exporter "' + t + '" requested through environment variable is unavailable.'), e;
|
|
686
|
+
}
|
|
687
|
+
}, r._registeredPropagators = /* @__PURE__ */ new Map([
|
|
688
|
+
["tracecontext", function() {
|
|
689
|
+
return new Tt();
|
|
690
|
+
}],
|
|
691
|
+
["baggage", function() {
|
|
692
|
+
return new gt();
|
|
693
|
+
}]
|
|
694
|
+
]), r._registeredExporters = /* @__PURE__ */ new Map(), r;
|
|
695
|
+
})()
|
|
696
|
+
), Ht = function(r) {
|
|
697
|
+
var t = typeof Symbol == "function" && Symbol.iterator, e = t && r[t], n = 0;
|
|
698
|
+
if (e) return e.call(r);
|
|
699
|
+
if (r && typeof r.length == "number") return {
|
|
700
|
+
next: function() {
|
|
701
|
+
return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
|
|
702
|
+
}
|
|
703
|
+
};
|
|
704
|
+
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
705
|
+
}, ee = (
|
|
706
|
+
/** @class */
|
|
707
|
+
(function() {
|
|
708
|
+
function r() {
|
|
709
|
+
}
|
|
710
|
+
return r.prototype.export = function(t, e) {
|
|
711
|
+
return this._sendSpans(t, e);
|
|
712
|
+
}, r.prototype.shutdown = function() {
|
|
713
|
+
return this._sendSpans([]), this.forceFlush();
|
|
714
|
+
}, r.prototype.forceFlush = function() {
|
|
715
|
+
return Promise.resolve();
|
|
716
|
+
}, r.prototype._exportInfo = function(t) {
|
|
717
|
+
var e;
|
|
718
|
+
return {
|
|
719
|
+
resource: {
|
|
720
|
+
attributes: t.resource.attributes
|
|
721
|
+
},
|
|
722
|
+
instrumentationScope: t.instrumentationLibrary,
|
|
723
|
+
traceId: t.spanContext().traceId,
|
|
724
|
+
parentId: t.parentSpanId,
|
|
725
|
+
traceState: (e = t.spanContext().traceState) === null || e === void 0 ? void 0 : e.serialize(),
|
|
726
|
+
name: t.name,
|
|
727
|
+
id: t.spanContext().spanId,
|
|
728
|
+
kind: t.kind,
|
|
729
|
+
timestamp: V(t.startTime),
|
|
730
|
+
duration: V(t.duration),
|
|
731
|
+
attributes: t.attributes,
|
|
732
|
+
status: t.status,
|
|
733
|
+
events: t.events,
|
|
734
|
+
links: t.links
|
|
735
|
+
};
|
|
736
|
+
}, r.prototype._sendSpans = function(t, e) {
|
|
737
|
+
var n, o;
|
|
738
|
+
try {
|
|
739
|
+
for (var i = Ht(t), a = i.next(); !a.done; a = i.next()) {
|
|
740
|
+
var s = a.value;
|
|
741
|
+
console.dir(this._exportInfo(s), { depth: 3 });
|
|
742
|
+
}
|
|
743
|
+
} catch (l) {
|
|
744
|
+
n = { error: l };
|
|
745
|
+
} finally {
|
|
746
|
+
try {
|
|
747
|
+
a && !a.done && (o = i.return) && o.call(i);
|
|
748
|
+
} finally {
|
|
749
|
+
if (n) throw n.error;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
if (e)
|
|
753
|
+
return e({ code: U.SUCCESS });
|
|
754
|
+
}, r;
|
|
755
|
+
})()
|
|
756
|
+
), Qt = function(r, t, e, n) {
|
|
757
|
+
function o(i) {
|
|
758
|
+
return i instanceof e ? i : new e(function(a) {
|
|
759
|
+
a(i);
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
return new (e || (e = Promise))(function(i, a) {
|
|
763
|
+
function s(p) {
|
|
764
|
+
try {
|
|
765
|
+
u(n.next(p));
|
|
766
|
+
} catch (c) {
|
|
767
|
+
a(c);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
function l(p) {
|
|
771
|
+
try {
|
|
772
|
+
u(n.throw(p));
|
|
773
|
+
} catch (c) {
|
|
774
|
+
a(c);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
function u(p) {
|
|
778
|
+
p.done ? i(p.value) : o(p.value).then(s, l);
|
|
779
|
+
}
|
|
780
|
+
u((n = n.apply(r, t || [])).next());
|
|
781
|
+
});
|
|
782
|
+
}, Xt = function(r, t) {
|
|
783
|
+
var e = { label: 0, sent: function() {
|
|
784
|
+
if (i[0] & 1) throw i[1];
|
|
785
|
+
return i[1];
|
|
786
|
+
}, trys: [], ops: [] }, n, o, i, a;
|
|
787
|
+
return a = { next: s(0), throw: s(1), return: s(2) }, typeof Symbol == "function" && (a[Symbol.iterator] = function() {
|
|
788
|
+
return this;
|
|
789
|
+
}), a;
|
|
790
|
+
function s(u) {
|
|
791
|
+
return function(p) {
|
|
792
|
+
return l([u, p]);
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
function l(u) {
|
|
796
|
+
if (n) throw new TypeError("Generator is already executing.");
|
|
797
|
+
for (; e; ) try {
|
|
798
|
+
if (n = 1, o && (i = u[0] & 2 ? o.return : u[0] ? o.throw || ((i = o.return) && i.call(o), 0) : o.next) && !(i = i.call(o, u[1])).done) return i;
|
|
799
|
+
switch (o = 0, i && (u = [u[0] & 2, i.value]), u[0]) {
|
|
800
|
+
case 0:
|
|
801
|
+
case 1:
|
|
802
|
+
i = u;
|
|
803
|
+
break;
|
|
804
|
+
case 4:
|
|
805
|
+
return e.label++, { value: u[1], done: !1 };
|
|
806
|
+
case 5:
|
|
807
|
+
e.label++, o = u[1], u = [0];
|
|
808
|
+
continue;
|
|
809
|
+
case 7:
|
|
810
|
+
u = e.ops.pop(), e.trys.pop();
|
|
811
|
+
continue;
|
|
812
|
+
default:
|
|
813
|
+
if (i = e.trys, !(i = i.length > 0 && i[i.length - 1]) && (u[0] === 6 || u[0] === 2)) {
|
|
814
|
+
e = 0;
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
817
|
+
if (u[0] === 3 && (!i || u[1] > i[0] && u[1] < i[3])) {
|
|
818
|
+
e.label = u[1];
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
if (u[0] === 6 && e.label < i[1]) {
|
|
822
|
+
e.label = i[1], i = u;
|
|
823
|
+
break;
|
|
824
|
+
}
|
|
825
|
+
if (i && e.label < i[2]) {
|
|
826
|
+
e.label = i[2], e.ops.push(u);
|
|
827
|
+
break;
|
|
828
|
+
}
|
|
829
|
+
i[2] && e.ops.pop(), e.trys.pop();
|
|
830
|
+
continue;
|
|
831
|
+
}
|
|
832
|
+
u = t.call(r, e);
|
|
833
|
+
} catch (p) {
|
|
834
|
+
u = [6, p], o = 0;
|
|
835
|
+
} finally {
|
|
836
|
+
n = i = 0;
|
|
837
|
+
}
|
|
838
|
+
if (u[0] & 5) throw u[1];
|
|
839
|
+
return { value: u[0] ? u[1] : void 0, done: !0 };
|
|
840
|
+
}
|
|
841
|
+
}, re = (
|
|
842
|
+
/** @class */
|
|
843
|
+
(function() {
|
|
844
|
+
function r(t) {
|
|
845
|
+
this._exporter = t, this._shutdownOnce = new Z(this._shutdown, this), this._unresolvedExports = /* @__PURE__ */ new Set();
|
|
846
|
+
}
|
|
847
|
+
return r.prototype.forceFlush = function() {
|
|
848
|
+
return Qt(this, void 0, void 0, function() {
|
|
849
|
+
return Xt(this, function(t) {
|
|
850
|
+
switch (t.label) {
|
|
851
|
+
case 0:
|
|
852
|
+
return [4, Promise.all(Array.from(this._unresolvedExports))];
|
|
853
|
+
case 1:
|
|
854
|
+
return t.sent(), this._exporter.forceFlush ? [4, this._exporter.forceFlush()] : [3, 3];
|
|
855
|
+
case 2:
|
|
856
|
+
t.sent(), t.label = 3;
|
|
857
|
+
case 3:
|
|
858
|
+
return [
|
|
859
|
+
2
|
|
860
|
+
/*return*/
|
|
861
|
+
];
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
});
|
|
865
|
+
}, r.prototype.onStart = function(t, e) {
|
|
866
|
+
}, r.prototype.onEnd = function(t) {
|
|
867
|
+
var e = this, n, o;
|
|
868
|
+
if (!this._shutdownOnce.isCalled && (t.spanContext().traceFlags & L.SAMPLED) !== 0) {
|
|
869
|
+
var i = function() {
|
|
870
|
+
return Pt._export(e._exporter, [t]).then(function(s) {
|
|
871
|
+
var l;
|
|
872
|
+
s.code !== U.SUCCESS && h((l = s.error) !== null && l !== void 0 ? l : new Error("SimpleSpanProcessor: span export failed (status " + s + ")"));
|
|
873
|
+
}).catch(function(s) {
|
|
874
|
+
h(s);
|
|
875
|
+
});
|
|
876
|
+
};
|
|
877
|
+
if (t.resource.asyncAttributesPending) {
|
|
878
|
+
var a = (o = (n = t.resource).waitForAsyncAttributes) === null || o === void 0 ? void 0 : o.call(n).then(function() {
|
|
879
|
+
return a != null && e._unresolvedExports.delete(a), i();
|
|
880
|
+
}, function(s) {
|
|
881
|
+
return h(s);
|
|
882
|
+
});
|
|
883
|
+
a != null && this._unresolvedExports.add(a);
|
|
884
|
+
} else
|
|
885
|
+
i();
|
|
886
|
+
}
|
|
887
|
+
}, r.prototype.shutdown = function() {
|
|
888
|
+
return this._shutdownOnce.call();
|
|
889
|
+
}, r.prototype._shutdown = function() {
|
|
890
|
+
return this._exporter.shutdown();
|
|
891
|
+
}, r;
|
|
892
|
+
})()
|
|
893
|
+
);
|
|
894
|
+
export {
|
|
895
|
+
R as A,
|
|
896
|
+
te as B,
|
|
897
|
+
ee as C,
|
|
898
|
+
S as F,
|
|
899
|
+
jt as N,
|
|
900
|
+
B as P,
|
|
901
|
+
Gt as R,
|
|
902
|
+
re as S,
|
|
903
|
+
zt as T,
|
|
904
|
+
Dt as a,
|
|
905
|
+
g as b,
|
|
906
|
+
W as c,
|
|
907
|
+
P as d,
|
|
908
|
+
xt as e
|
|
909
|
+
};
|
|
910
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDR9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZSBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwOH1+LmpzJztcbmltcG9ydCB7IG8gYXMgb3RwZXJmb3JtYW5jZSwgbCBhcyBnZXRUaW1lT3JpZ2luLCBuIGFzIGlzVGltZUlucHV0LCBxIGFzIGhyVGltZUR1cmF0aW9uLCBqIGFzIGhyVGltZSwgbSBhcyBtaWxsaXNUb0hyVGltZSwgciBhcyBpc1RpbWVJbnB1dEhyVGltZSwgcyBhcyBhZGRIclRpbWVzLCB2IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFLCB3IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDBkfX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgZ2V0RW52LCBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGIgYXMgZ2V0RW52V2l0aG91dERlZmF1bHRzLCBEIGFzIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULCBjIGFzIERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCwgdSBhcyB1bnJlZlRpbWVyLCBCIGFzIEJpbmRPbmNlRnV0dXJlLCBTIGFzIFNhbXBsaW5nRGVjaXNpb24kMSwgQyBhcyBDb21wb3NpdGVQcm9wYWdhdG9yLCBXIGFzIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsIGQgYXMgVzNDQmFnZ2FnZVByb3BhZ2F0b3IsIG0gYXMgbWVyZ2UsIGUgYXMgaW50ZXJuYWwgfSBmcm9tICcuL2luZGV4LSF+ezAwbX1+LmpzJztcbmltcG9ydCB7IHMgYXMgc3VwcHJlc3NUcmFjaW5nLCBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQgfSBmcm9tICcuL3N1cHByZXNzLXRyYWNpbmctIX57MDBhfX4uanMnO1xuaW1wb3J0IHsgUiBhcyBSZXNvdXJjZSB9IGZyb20gJy4vUmVzb3VyY2UtIX57MDAyfX4uanMnO1xuaW1wb3J0IHsgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gRXZlbnQgbmFtZSBkZWZpbml0aW9uc1xudmFyIEV4Y2VwdGlvbkV2ZW50TmFtZSA9ICdleGNlcHRpb24nO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX192YWx1ZXMkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNwYW4uXG4gKi9cbnZhciBTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3BhbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIGNhbGxpbmcgU3BhbiBjb25zdHJ1Y3RvciBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHRyYWNlci5zdGFydFNwYW4uXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiBTcGFuKHBhcmVudFRyYWNlciwgY29udGV4dCwgc3Bhbk5hbWUsIHNwYW5Db250ZXh0LCBraW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBzdGFydFRpbWUsIF9kZXByZWNhdGVkQ2xvY2ssIC8vIGtlZXBpbmcgdGhpcyBhcmd1bWVudCBldmVuIHRob3VnaCBpdCBpcyB1bnVzZWQgdG8gZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgYXR0cmlidXRlcykge1xuICAgICAgICBpZiAobGlua3MgPT09IHZvaWQgMCkgeyBsaW5rcyA9IFtdOyB9XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICB0aGlzLmxpbmtzID0gW107XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgICAgIHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkTGlua3NDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdHVzID0ge1xuICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuVU5TRVQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IFswLCAwXTtcbiAgICAgICAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBbLTEsIC0xXTtcbiAgICAgICAgdGhpcy5uYW1lID0gc3Bhbk5hbWU7XG4gICAgICAgIHRoaXMuX3NwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQ7XG4gICAgICAgIHRoaXMucGFyZW50U3BhbklkID0gcGFyZW50U3BhbklkO1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLmxpbmtzID0gbGlua3M7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSA9IG90cGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0ID1cbiAgICAgICAgICAgIG5vdyAtICh0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSArIGdldFRpbWVPcmlnaW4oKSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkID0gc3RhcnRUaW1lICE9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5fZ2V0VGltZShzdGFydFRpbWUgIT09IG51bGwgJiYgc3RhcnRUaW1lICE9PSB2b2lkIDAgPyBzdGFydFRpbWUgOiBub3cpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gcGFyZW50VHJhY2VyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBwYXJlbnRUcmFjZXIuaW5zdHJ1bWVudGF0aW9uTGlicmFyeTtcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IHBhcmVudFRyYWNlci5nZXRTcGFuTGltaXRzKCk7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0IHx8IDA7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zcGFuUHJvY2Vzc29yID0gcGFyZW50VHJhY2VyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vblN0YXJ0KHRoaXMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBTcGFuLnByb3RvdHlwZS5zcGFuQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0O1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUga2V5OiBcIiArIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXR0cmlidXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcykubGVuZ3RoID49XG4gICAgICAgICAgICB0aGlzLl9zcGFuTGltaXRzLmF0dHJpYnV0ZUNvdW50TGltaXQgJiZcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNba2V5XSA9IHRoaXMuX3RydW5jYXRlVG9TaXplKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDIoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkJDEoX2MudmFsdWUsIDIpLCBrID0gX2RbMF0sIHYgPSBfZFsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBTcGFuIE5hbWVcbiAgICAgKiBAcGFyYW0gW2F0dHJpYnV0ZXNPclN0YXJ0VGltZV0gU3BhbiBhdHRyaWJ1dGVzIG9yIHN0YXJ0IHRpbWVcbiAgICAgKiAgICAgaWYgdHlwZSBpcyB7QHR5cGUgVGltZUlucHV0fSBhbmQgM3JkIHBhcmFtIGlzIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBbdGltZVN0YW1wXSBTcGVjaWZpZWQgdGltZSBzdGFtcCBmb3IgdGhlIGV2ZW50XG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlc09yU3RhcnRUaW1lLCB0aW1lU3RhbXApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ05vIGV2ZW50cyBhbGxvd2VkLicpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ldmVudHMubGVuZ3RoID49IHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnRHJvcHBpbmcgZXh0cmEgZXZlbnRzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmVudHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dChhdHRyaWJ1dGVzT3JTdGFydFRpbWUpKSB7XG4gICAgICAgICAgICBpZiAoIWlzVGltZUlucHV0KHRpbWVTdGFtcCkpIHtcbiAgICAgICAgICAgICAgICB0aW1lU3RhbXAgPSBhdHRyaWJ1dGVzT3JTdGFydFRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVzT3JTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlc09yU3RhcnRUaW1lKTtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHRpbWU6IHRoaXMuX2dldFRpbWUodGltZVN0YW1wKSxcbiAgICAgICAgICAgIGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmsgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgICB0aGlzLmxpbmtzLnB1c2gobGluayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkTGlua3MgPSBmdW5jdGlvbiAobGlua3MpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLmxpbmtzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5JDEoW10sIF9fcmVhZCQxKGxpbmtzKSwgZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRTdGF0dXMgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gX19hc3NpZ24oe30sIHN0YXR1cyk7XG4gICAgICAgIC8vIFdoZW4gdXNpbmcgdHJ5LWNhdGNoLCB0aGUgY2F1Z2h0IFwiZXJyb3JcIiBpcyBvZiB0eXBlIGBhbnlgLiBXaGVuIHRoZW4gYXNzaWduaW5nIGBhbnlgIHRvIGBzdGF0dXMubWVzc2FnZWAsXG4gICAgICAgIC8vIFR5cGVTY3JpcHQgd2lsbCBub3QgZXJyb3IuIFdoaWxlIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgdXNlIG9mIGFueSBBUEksIGl0IGlzIG1vcmUgY29tbW9uIG9uIFNwYW4jc2V0U3RhdHVzKClcbiAgICAgICAgLy8gYXMgaXQncyBsaWtlbHkgdXNlZCBpbiBhIGNhdGNoLWJsb2NrLiBUaGVyZWZvcmUsIHdlIHZhbGlkYXRlIGlmIGBzdGF0dXMubWVzc2FnZWAgaXMgYWN0dWFsbHkgYSBzdHJpbmcsIG51bGwsIG9yXG4gICAgICAgIC8vIHVuZGVmaW5lZCB0byBhdm9pZCBhbiBpbmNvcnJlY3QgdHlwZSBjYXVzaW5nIGlzc3VlcyBkb3duc3RyZWFtLlxuICAgICAgICBpZiAodGhpcy5zdGF0dXMubWVzc2FnZSAhPSBudWxsICYmIHR5cGVvZiBzdGF0dXMubWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwaW5nIGludmFsaWQgc3RhdHVzLm1lc3NhZ2Ugb2YgdHlwZSAnXCIgKyB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgKyBcIicsIGV4cGVjdGVkICdzdHJpbmcnXCIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RhdHVzLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS51cGRhdGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZW5kVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSkge1xuICAgICAgICAgICAgZGlhZy5lcnJvcih0aGlzLm5hbWUgKyBcIiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwiIC0gWW91IGNhbiBvbmx5IGNhbGwgZW5kKCkgb24gYSBzcGFuIG9uY2UuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5fZ2V0VGltZShlbmRUaW1lKTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBoclRpbWVEdXJhdGlvbih0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uWzBdIDwgMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdJbmNvbnNpc3RlbnQgc3RhcnQgYW5kIGVuZCB0aW1lLCBzdGFydFRpbWUgPiBlbmRUaW1lLiBTZXR0aW5nIHNwYW4gZHVyYXRpb24gdG8gMG1zLicsIHRoaXMuc3RhcnRUaW1lLCB0aGlzLmVuZFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5zdGFydFRpbWUuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWzAsIDBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ICsgXCIgZXZlbnRzIGJlY2F1c2UgZXZlbnRDb3VudExpbWl0IHJlYWNoZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vbkVuZCh0aGlzKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLl9nZXRUaW1lID0gZnVuY3Rpb24gKGlucCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicgJiYgaW5wIDw9IG90cGVyZm9ybWFuY2Uubm93KCkpIHtcbiAgICAgICAgICAgIC8vIG11c3QgYmUgYSBwZXJmb3JtYW5jZSB0aW1lc3RhbXBcbiAgICAgICAgICAgIC8vIGFwcGx5IGNvcnJlY3Rpb24gYW5kIGNvbnZlcnQgdG8gaHJ0aW1lXG4gICAgICAgICAgICByZXR1cm4gaHJUaW1lKGlucCArIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShpbnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnAgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wLmdldFRpbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVGltZUlucHV0SHJUaW1lKGlucCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkKSB7XG4gICAgICAgICAgICAvLyBpZiB1c2VyIHByb3ZpZGVkIGEgdGltZSBmb3IgdGhlIHN0YXJ0IG1hbnVhbGx5XG4gICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgZHVyYXRpb24gdG8gY2FsY3VsYXRlIGV2ZW50L2VuZCB0aW1lc1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKERhdGUubm93KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtc0R1cmF0aW9uID0gb3RwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX3BlcmZvcm1hbmNlU3RhcnRUaW1lO1xuICAgICAgICByZXR1cm4gYWRkSHJUaW1lcyh0aGlzLnN0YXJ0VGltZSwgbWlsbGlzVG9IclRpbWUobXNEdXJhdGlvbikpO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuaXNSZWNvcmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZCA9PT0gZmFsc2U7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5yZWNvcmRFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCB0aW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZXhjZXB0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5jb2RlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleGNlcHRpb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdID0gZXhjZXB0aW9uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5zdGFjaykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0VdID0gZXhjZXB0aW9uLnN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXNlIGFyZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmcm9tIHNwZWNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdIHx8XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSkge1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChFeGNlcHRpb25FdmVudE5hbWUsIGF0dHJpYnV0ZXMsIHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRmFpbGVkIHRvIHJlY29yZCBhbiBleGNlcHRpb24gXCIgKyBleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHVyYXRpb25cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJlbmRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZGVkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRFdmVudHNDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkTGlua3NDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRMaW5rc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU3Bhbi5wcm90b3R5cGUuX2lzU3BhbkVuZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kZWQpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkNhbiBub3QgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIG9uIGVuZGVkIFNwYW4ge3RyYWNlSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQudHJhY2VJZCArIFwiLCBzcGFuSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQuc3BhbklkICsgXCJ9XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICB9O1xuICAgIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gdHJ1bmNhdGUgZ2l2ZW4gdmFsdWUgd2l0aGluIHNpemVcbiAgICAvLyBmb3IgdmFsdWUgdHlwZSBvZiBzdHJpbmcsIHdpbGwgdHJ1bmNhdGUgdG8gZ2l2ZW4gbGltaXRcbiAgICAvLyBmb3IgdHlwZSBvZiBub24tc3RyaW5nLCB3aWxsIHJldHVybiBzYW1lIHZhbHVlXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9MaW1pdFV0aWwgPSBmdW5jdGlvbiAodmFsdWUsIGxpbWl0KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gbGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGxpbWl0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgYW5kIGhhcyBtb3JlIGNoYXJhY3RlcnMgdGhhbiBnaXZlbiB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gdGhlblxuICAgICAqIHJldHVybiBzdHJpbmcgd2l0aCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgYXJyYXkgb2Ygc3RyaW5ncyB0aGVuXG4gICAgICogcmV0dXJuIG5ldyBhcnJheSBvZiBzdHJpbmdzIHdpdGggZWFjaCBlbGVtZW50IHRydW5jYXRlZCB0byB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gY2hhcmFjdGVyc1xuICAgICAqXG4gICAgICogT3RoZXJ3aXNlIHJldHVybiBzYW1lIEF0dHJpYnV0ZSB7QGNvZGUgdmFsdWV9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgdHJ1bmNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHNhbWUgdmFsdWVcbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5fdHJ1bmNhdGVUb1NpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5fYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDtcbiAgICAgICAgLy8gQ2hlY2sgbGltaXRcbiAgICAgICAgaWYgKGxpbWl0IDw9IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW52YWxpZCwgc28gZG8gbm90IHRydW5jYXRlXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJBdHRyaWJ1dGUgdmFsdWUgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgZ290IFwiICsgbGltaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsdWUsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiBzdHJpbmdzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gX3RoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsLCBsaW1pdCkgOiB2YWw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlciB0eXBlcywgbm8gbmVlZCB0byBhcHBseSB2YWx1ZSBsZW5ndGggbGltaXRcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIFNwYW47XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHNhbXBsaW5nIGRlY2lzaW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgU3Bhbn0gd2lsbCBiZSByZWNvcmRlZFxuICogYW5kIGNvbGxlY3RlZC5cbiAqL1xudmFyIFNhbXBsaW5nRGVjaXNpb247XG4oZnVuY3Rpb24gKFNhbXBsaW5nRGVjaXNpb24pIHtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSBmYWxzZWAsIHNwYW4gd2lsbCBub3QgYmUgcmVjb3JkZWQgYW5kIGFsbCBldmVudHNcbiAgICAgKiBhbmQgYXR0cmlidXRlcyB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiTk9UX1JFQ09SRFwiXSA9IDBdID0gXCJOT1RfUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAsIGJ1dCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIE5PVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEXCJdID0gMV0gPSBcIlJFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgIEFORCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRfQU5EX1NBTVBMRURcIl0gPSAyXSA9IFwiUkVDT1JEX0FORF9TQU1QTEVEXCI7XG59KShTYW1wbGluZ0RlY2lzaW9uIHx8IChTYW1wbGluZ0RlY2lzaW9uID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBubyB0cmFjZXMuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYWxsIHRyYWNlcy4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBhIGdpdmVuIGZyYWN0aW9uIG9mIHRyYWNlcyBiYXNlZCBvZiB0cmFjZSBpZCBkZXRlcm1pbmlzdGljYWxseS4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSID0gVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjtcbnZhciBERUZBVUxUX1JBVElPID0gMTtcbi8qKlxuICogTG9hZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIEZvciBmaWVsZHMgd2l0aCBwcmltaXRpdmUgdmFsdWVzLCBhbnkgdXNlci1wcm92aWRlZFxuICogdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlLiBGb3IgZmllbGRzIHdpdGhcbiAqIG5vbi1wcmltaXRpdmUgdmFsdWVzIChsaWtlIGBzcGFuTGltaXRzYCksIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIHdpbGwgYmVcbiAqIHVzZWQgdG8gZXh0ZW5kIHRoZSBkZWZhdWx0IHZhbHVlLlxuICovXG4vLyBvYmplY3QgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiB0aGlzIGZ1bmN0aW9uIGFuZCBjYWxsZWQgd2hlbiBuZWVkZWQgb3RoZXJ3aXNlXG4vLyBlbnZzIGFyZSBwYXJzZWQgYmVmb3JlIHRlc3RzIGFyZSByYW4gLSBjYXVzZXMgdGVzdHMgdXNpbmcgdGhlc2UgZW52cyB0byBmYWlsXG5mdW5jdGlvbiBsb2FkRGVmYXVsdENvbmZpZygpIHtcbiAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudihlbnYpLFxuICAgICAgICBmb3JjZUZsdXNoVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgICAgIGdlbmVyYWxMaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQsXG4gICAgICAgIH0sXG4gICAgICAgIHNwYW5MaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZUNvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgbGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlUGVyTGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBtZXJnZVJlc291cmNlV2l0aERlZmF1bHRzOiB0cnVlLFxuICAgIH07XG59XG4vKipcbiAqIEJhc2VkIG9uIGVudmlyb25tZW50LCBidWlsZHMgYSBzYW1wbGVyLCBjb21wbGllcyB3aXRoIHNwZWNpZmljYXRpb24uXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgb3B0aW9uYWwsIGJ5IGRlZmF1bHQgdXNlcyBnZXRFbnYoKSwgYnV0IGFsbG93cyBwYXNzaW5nIGEgdmFsdWUgdG8gcmV1c2UgcGFyc2VkIGVudmlyb25tZW50XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2FtcGxlckZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IHZvaWQgMCkgeyBlbnZpcm9ubWVudCA9IGdldEVudigpOyB9XG4gICAgc3dpdGNoIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSKSB7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgY2FzZSBUcmFjZXNTYW1wbGVyVmFsdWVzLlBhcmVudEJhc2VkQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09uU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09mZjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5UcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZFRyYWNlSWRSYXRpbzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVIgdmFsdWUgXFxcIlwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSICsgXCJcXFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkge1xuICAgIGlmIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHID09PSAnJykge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgaXMgYmxhbmssIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgdmFyIHByb2JhYmlsaXR5ID0gTnVtYmVyKGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHKTtcbiAgICBpZiAoaXNOYU4ocHJvYmFiaWxpdHkpKSB7XG4gICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSX0FSRz1cIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHICsgXCIgd2FzIGdpdmVuLCBidXQgaXQgaXMgaW52YWxpZCwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICBpZiAocHJvYmFiaWxpdHkgPCAwIHx8IHByb2JhYmlsaXR5ID4gMSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIG91dCBvZiByYW5nZSAoWzAuLjFdKSwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICByZXR1cm4gcHJvYmFiaWxpdHk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1lcmdlIERlZmF1bHQgY29uZmlndXJhdGlvbiAoYXMgc3BlY2lmaWVkIGluICcuL2NvbmZpZycpIHdpdGhcbiAqIHVzZXIgcHJvdmlkZWQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKHVzZXJDb25maWcpIHtcbiAgICB2YXIgcGVySW5zdGFuY2VEZWZhdWx0cyA9IHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudigpLFxuICAgIH07XG4gICAgdmFyIERFRkFVTFRfQ09ORklHID0gbG9hZERlZmF1bHRDb25maWcoKTtcbiAgICB2YXIgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcsIHBlckluc3RhbmNlRGVmYXVsdHMsIHVzZXJDb25maWcpO1xuICAgIHRhcmdldC5nZW5lcmFsTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcuZ2VuZXJhbExpbWl0cywgdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzIHx8IHt9KTtcbiAgICB0YXJnZXQuc3BhbkxpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnNwYW5MaW1pdHMsIHVzZXJDb25maWcuc3BhbkxpbWl0cyB8fCB7fSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKlxuICogV2hlbiBnZW5lcmFsIGxpbWl0cyBhcmUgcHJvdmlkZWQgYW5kIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBhcmUgbm90LFxuICogY29uZmlndXJlcyB0aGUgbW9kZWwgc3BlY2lmaWMgbGltaXRzIGJ5IHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2VuZXJhbCBvbmVzLlxuICogQHBhcmFtIHVzZXJDb25maWcgVXNlciBwcm92aWRlZCB0cmFjZXIgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiByZWNvbmZpZ3VyZUxpbWl0cyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgdmFyIHNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpO1xuICAgIHZhciBwYXJzZWRFbnZDb25maWcgPSBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKTtcbiAgICAvKipcbiAgICAgKiBSZWFzc2lnbiBzcGFuIGF0dHJpYnV0ZSBjb3VudCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ID1cbiAgICAgICAgKF9mID0gKF9lID0gKF9kID0gKF9iID0gKF9hID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKF9jID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoIGxpbWl0IHRvIHVzZSBmaXJzdCBub24gbnVsbCB2YWx1ZSBkZWZpbmVkIGJ5IHVzZXIgb3IgdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgKi9cbiAgICBzcGFuTGltaXRzLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAoX20gPSAoX2wgPSAoX2sgPSAoX2ggPSAoX2cgPSB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAoX2ogPSB1c2VyQ29uZmlnLmdlbmVyYWxMaW1pdHMpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZywgeyBzcGFuTGltaXRzOiBzcGFuTGltaXRzIH0pO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgYmF0Y2hlcyBzcGFucyBleHBvcnRlZCBieVxuICogdGhlIFNESyB0aGVuIHB1c2hlcyB0aGVtIHRvIHRoZSBleHBvcnRlciBwaXBlbGluZS5cbiAqL1xudmFyIEJhdGNoU3BhblByb2Nlc3NvckJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZShfZXhwb3J0ZXIsIGNvbmZpZykge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIHZhciBlbnYgPSBnZXRFbnYoKTtcbiAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4RXhwb3J0QmF0Y2hTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFO1xuICAgICAgICB0aGlzLl9tYXhRdWV1ZVNpemUgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcubWF4UXVldWVTaXplKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5tYXhRdWV1ZVNpemVcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9NQVhfUVVFVUVfU0laRTtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuc2NoZWR1bGVkRGVsYXlNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfU0NIRURVTEVfREVMQVk7XG4gICAgICAgIHRoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpcykgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX0VYUE9SVF9USU1FT1VUO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID4gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ0JhdGNoU3BhblByb2Nlc3NvcjogbWF4RXhwb3J0QmF0Y2hTaXplIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBtYXhRdWV1ZVNpemUsIHNldHRpbmcgbWF4RXhwb3J0QmF0Y2hTaXplIHRvIG1hdGNoIG1heFF1ZXVlU2l6ZScpO1xuICAgICAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID0gdGhpcy5fbWF4UXVldWVTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmx1c2hBbGwoKTtcbiAgICB9O1xuICAgIC8vIGRvZXMgbm90aGluZy5cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWRkVG9CdWZmZXIoc3Bhbik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU2h1dGRvd24oKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZmx1c2hBbGwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogQWRkIGEgc3BhbiBpbiB0aGUgYnVmZmVyLiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9hZGRUb0J1ZmZlciA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHJlYWNoZWQsIGRyb3Agc3BhblxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnbWF4UXVldWVTaXplIHJlYWNoZWQsIGRyb3BwaW5nIHNwYW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIHNvbWUgc3BhbnMgd2VyZSBkcm9wcGVkLCBsb2cgb25jZSB3aXRoIGNvdW50IG9mIHNwYW5zIGRyb3BwZWRcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwZWQgXCIgKyB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCArIFwiIHNwYW5zIGJlY2F1c2UgbWF4UXVldWVTaXplIHJlYWNoZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucy5wdXNoKHNwYW4pO1xuICAgICAgICB0aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbmQgYWxsIHNwYW5zIHRvIHRoZSBleHBvcnRlciByZXNwZWN0aW5nIHRoZSBiYXRjaCBzaXplIGxpbWl0XG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgb24gZm9yY2VGbHVzaCBvciBzaHV0ZG93bixcbiAgICAgKiBmb3IgYWxsIG90aGVyIGNhc2VzIF9mbHVzaCBzaG91bGQgYmUgdXNlZFxuICAgICAqICovXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGJhdGNoZXNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IE1hdGguY2VpbChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggLyBfdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY291bnQ7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKF90aGlzLl9mbHVzaE9uZUJhdGNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoT25lQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IHdhaXQgYW55bW9yZSBmb3IgZXhwb3J0LCB0aGlzIHdheSB0aGUgbmV4dCBiYXRjaCBjYW4gc3RhcnRcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdUaW1lb3V0JykpO1xuICAgICAgICAgICAgfSwgX3RoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMpO1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3duc3RyZWFtIGV4cG9ydGVyIGNhbGxzIGZyb20gZ2VuZXJhdGluZyBzcGFuc1xuICAgICAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBmaW5pc2hlZCBzcGFucyBidWZmZXIgaGVyZSBiZWNhdXNlIHRoZSBuZXh0IGludm9jYXRpb25zIG9mIHRoZSBfZmx1c2ggbWV0aG9kXG4gICAgICAgICAgICAgICAgLy8gY291bGQgcGFzcyB0aGUgc2FtZSBmaW5pc2hlZCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgaWYgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkXG4gICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbGJhY2suXG4gICAgICAgICAgICAgICAgdmFyIHNwYW5zO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPD0gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBzcGFucyA9IF90aGlzLl9maW5pc2hlZFNwYW5zO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucy5zcGxpY2UoMCwgX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9leHBvcnRlci5leHBvcnQoc3BhbnMsIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgoX2EgPSByZXN1bHQuZXJyb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBFcnJvcignQmF0Y2hTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHBlbmRpbmdSZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcGFucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMgIT09IG51bGwgJiYgcGVuZGluZ1Jlc291cmNlcyAhPT0gdm9pZCAwID8gcGVuZGluZ1Jlc291cmNlcyA6IChwZW5kaW5nUmVzb3VyY2VzID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Jlc291cmNlcy5wdXNoKHNwYW4ucmVzb3VyY2Uud2FpdEZvckFzeW5jQXR0cmlidXRlcygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nUmVzb3VyY2VzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwZW5kaW5nUmVzb3VyY2VzKS50aGVuKGRvRXhwb3J0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fbWF5YmVTdGFydFRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5faXNFeHBvcnRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IHRydWU7XG4gICAgICAgICAgICBfdGhpcy5fZmx1c2hPbmVCYXRjaCgpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyB3ZSBvbmx5IHdhaXQgaWYgdGhlIHF1ZXVlIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZWxlbWVudHMgeWV0XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90aW1lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmx1c2goKTsgfSwgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMpO1xuICAgICAgICB1bnJlZlRpbWVyKHRoaXMuX3RpbWVyKTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9jbGVhclRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJhdGNoU3BhblByb2Nlc3NvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCYXRjaFNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgX2V4cG9ydGVyLCBjb25maWcpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9uSW5pdChjb25maWcpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25Jbml0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5kaXNhYmxlQXV0b0ZsdXNoT25Eb2N1bWVudEhpZGUpICE9PSB0cnVlICYmXG4gICAgICAgICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gdXNlICdwYWdlaGlkZScgZXZlbnQgYXMgYSBmYWxsYmFjayBmb3IgU2FmYXJpOyBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNjc2OVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yO1xufShCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbnZhciBSYW5kb21JZEdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5kb21JZEdlbmVyYXRvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSByYW5kb20gMTYtYnl0ZSB0cmFjZSBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDMyIGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDEyOCBiaXRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRyYWNlSWQgPSBnZXRJZEdlbmVyYXRvcihUUkFDRV9JRF9CWVRFUyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDgtYnl0ZSBzcGFuIElEIGZvcm1hdHRlZC9lbmNvZGVkIGFzIGEgMTYgbG93ZXJjYXNlIGhleFxuICAgICAgICAgKiBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gNjQgYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVTcGFuSWQgPSBnZXRJZEdlbmVyYXRvcihTUEFOX0lEX0JZVEVTKTtcbiAgICB9XG4gICAgcmV0dXJuIFJhbmRvbUlkR2VuZXJhdG9yO1xufSgpKTtcbnZhciBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSA9IEFycmF5KDMyKTtcbmZ1bmN0aW9uIGdldElkR2VuZXJhdG9yKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMgKiAyOyBpKyspIHtcbiAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpICsgNDg7XG4gICAgICAgICAgICAvLyB2YWxpZCBoZXggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgNDgtNTcgYW5kIDk3LTEwMlxuICAgICAgICAgICAgaWYgKFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID49IDU4KSB7XG4gICAgICAgICAgICAgICAgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVlbaV0gKz0gMzk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkuc2xpY2UoMCwgYnl0ZXMgKiAyKSk7XG4gICAgfTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyLlxuICovXG52YXIgVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVHJhY2VyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFRyYWNlcihpbnN0cnVtZW50YXRpb25MaWJyYXJ5LCBjb25maWcsIF90cmFjZXJQcm92aWRlcikge1xuICAgICAgICB0aGlzLl90cmFjZXJQcm92aWRlciA9IF90cmFjZXJQcm92aWRlcjtcbiAgICAgICAgdmFyIGxvY2FsQ29uZmlnID0gbWVyZ2VDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fc2FtcGxlciA9IGxvY2FsQ29uZmlnLnNhbXBsZXI7XG4gICAgICAgIHRoaXMuX2dlbmVyYWxMaW1pdHMgPSBsb2NhbENvbmZpZy5nZW5lcmFsTGltaXRzO1xuICAgICAgICB0aGlzLl9zcGFuTGltaXRzID0gbG9jYWxDb25maWcuc3BhbkxpbWl0cztcbiAgICAgICAgdGhpcy5faWRHZW5lcmF0b3IgPSBjb25maWcuaWRHZW5lcmF0b3IgfHwgbmV3IFJhbmRvbUlkR2VuZXJhdG9yKCk7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBfdHJhY2VyUHJvdmlkZXIucmVzb3VyY2U7XG4gICAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uTGlicmFyeSA9IGluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIG5ldyBTcGFuIG9yIHJldHVybnMgdGhlIGRlZmF1bHQgTm9vcFNwYW4gYmFzZWQgb24gdGhlIHNhbXBsaW5nXG4gICAgICogZGVjaXNpb24uXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywgY29udGV4dCQxKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBpZiAoY29udGV4dCQxID09PSB2b2lkIDApIHsgY29udGV4dCQxID0gY29udGV4dC5hY3RpdmUoKTsgfVxuICAgICAgICAvLyByZW1vdmUgc3BhbiBmcm9tIGNvbnRleHQgaW4gY2FzZSBhIHJvb3Qgc3BhbiBpcyByZXF1ZXN0ZWQgdmlhIG9wdGlvbnNcbiAgICAgICAgaWYgKG9wdGlvbnMucm9vdCkge1xuICAgICAgICAgICAgY29udGV4dCQxID0gdHJhY2UuZGVsZXRlU3Bhbihjb250ZXh0JDEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuID0gdHJhY2UuZ2V0U3Bhbihjb250ZXh0JDEpO1xuICAgICAgICBpZiAoaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0JDEpKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdJbnN0cnVtZW50YXRpb24gc3VwcHJlc3NlZCwgcmV0dXJuaW5nIE5vb3AgU3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoSU5WQUxJRF9TUEFOX0NPTlRFWFQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudFNwYW5Db250ZXh0ID0gcGFyZW50U3BhbiA9PT0gbnVsbCB8fCBwYXJlbnRTcGFuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRTcGFuLnNwYW5Db250ZXh0KCk7XG4gICAgICAgIHZhciBzcGFuSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVNwYW5JZCgpO1xuICAgICAgICB2YXIgdHJhY2VJZDtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciBwYXJlbnRTcGFuSWQ7XG4gICAgICAgIGlmICghcGFyZW50U3BhbkNvbnRleHQgfHxcbiAgICAgICAgICAgICF0cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQocGFyZW50U3BhbkNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBOZXcgcm9vdCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlVHJhY2VJZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmV3IGNoaWxkIHNwYW4uXG4gICAgICAgICAgICB0cmFjZUlkID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VJZDtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBwYXJlbnRTcGFuQ29udGV4dC50cmFjZVN0YXRlO1xuICAgICAgICAgICAgcGFyZW50U3BhbklkID0gcGFyZW50U3BhbkNvbnRleHQuc3BhbklkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzcGFuS2luZCA9IChfYSA9IG9wdGlvbnMua2luZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogU3BhbktpbmQuSU5URVJOQUw7XG4gICAgICAgIHZhciBsaW5rcyA9ICgoX2IgPSBvcHRpb25zLmxpbmtzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSkubWFwKGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxpbmsuY29udGV4dCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzYW5pdGl6ZUF0dHJpYnV0ZXMobGluay5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHNhbml0aXplQXR0cmlidXRlcyhvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICAgICAgICAvLyBtYWtlIHNhbXBsaW5nIGRlY2lzaW9uXG4gICAgICAgIHZhciBzYW1wbGluZ1Jlc3VsdCA9IHRoaXMuX3NhbXBsZXIuc2hvdWxkU2FtcGxlKGNvbnRleHQkMSwgdHJhY2VJZCwgbmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgdHJhY2VTdGF0ZSA9IChfYyA9IHNhbXBsaW5nUmVzdWx0LnRyYWNlU3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciB0cmFjZUZsYWdzID0gc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgID8gVHJhY2VGbGFncy5TQU1QTEVEXG4gICAgICAgICAgICA6IFRyYWNlRmxhZ3MuTk9ORTtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0geyB0cmFjZUlkOiB0cmFjZUlkLCBzcGFuSWQ6IHNwYW5JZCwgdHJhY2VGbGFnczogdHJhY2VGbGFncywgdHJhY2VTdGF0ZTogdHJhY2VTdGF0ZSB9O1xuICAgICAgICBpZiAoc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5OT1RfUkVDT1JEKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdSZWNvcmRpbmcgaXMgb2ZmLCBwcm9wYWdhdGluZyBjb250ZXh0IGluIGEgbm9uLXJlY29yZGluZyBzcGFuJyk7XG4gICAgICAgICAgICB2YXIgbm9uUmVjb3JkaW5nU3BhbiA9IHRyYWNlLndyYXBTcGFuQ29udGV4dChzcGFuQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gbm9uUmVjb3JkaW5nU3BhbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaW5pdGlhbCBzcGFuIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIG9iamVjdCBtYXkgaGF2ZSBiZWVuIG11dGF0ZWRcbiAgICAgICAgLy8gYnkgdGhlIHNhbXBsZXIsIHNvIHdlIHNhbml0aXplIHRoZSBtZXJnZWQgYXR0cmlidXRlcyBiZWZvcmUgc2V0dGluZyB0aGVtLlxuICAgICAgICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBzYW1wbGluZ1Jlc3VsdC5hdHRyaWJ1dGVzKSk7XG4gICAgICAgIHZhciBzcGFuID0gbmV3IFNwYW4odGhpcywgY29udGV4dCQxLCBuYW1lLCBzcGFuQ29udGV4dCwgc3BhbktpbmQsIHBhcmVudFNwYW5JZCwgbGlua3MsIG9wdGlvbnMuc3RhcnRUaW1lLCB1bmRlZmluZWQsIGluaXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLnN0YXJ0QWN0aXZlU3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIHZhciBvcHRzO1xuICAgICAgICB2YXIgY3R4O1xuICAgICAgICB2YXIgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50Q29udGV4dCA9IGN0eCAhPT0gbnVsbCAmJiBjdHggIT09IHZvaWQgMCA/IGN0eCA6IGNvbnRleHQuYWN0aXZlKCk7XG4gICAgICAgIHZhciBzcGFuID0gdGhpcy5zdGFydFNwYW4obmFtZSwgb3B0cywgcGFyZW50Q29udGV4dCk7XG4gICAgICAgIHZhciBjb250ZXh0V2l0aFNwYW5TZXQgPSB0cmFjZS5zZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dC53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHtAbGluayBHZW5lcmFsTGltaXRzfS4gKi9cbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEdlbmVyYWxMaW1pdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmFsTGltaXRzO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgU3BhbkxpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRTcGFuTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkxpbWl0cztcbiAgICB9O1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlclByb3ZpZGVyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICB9O1xuICAgIHJldHVybiBUcmFjZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgc2ltcGx5IGZvcndhcmRzIGFsbFxuICogcmVjZWl2ZWQgZXZlbnRzIHRvIGEgbGlzdCBvZiB7QGxpbmsgU3BhblByb2Nlc3Nvcn1zLlxuICovXG52YXIgTXVsdGlTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpU3BhblByb2Nlc3Nvcihfc3BhblByb2Nlc3NvcnMpIHtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvcnMgPSBfc3BhblByb2Nlc3NvcnM7XG4gICAgfVxuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLmZvcmNlRmx1c2goKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IgfHwgbmV3IEVycm9yKCdNdWx0aVNwYW5Qcm9jZXNzb3I6IGZvcmNlRmx1c2ggZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChzcGFuLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgc3BhblByb2Nlc3Nvci5vblN0YXJ0KHNwYW4sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgZV8zLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25FbmQoc3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfNCwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLnNodXRkb3duKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzRfMSkgeyBlXzQgPSB7IGVycm9yOiBlXzRfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIFNwYW5Qcm9jZXNzb3IgKi9cbnZhciBOb29wU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wU3BhblByb2Nlc3NvcigpIHtcbiAgICB9XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoX3NwYW4sIF9jb250ZXh0KSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKF9zcGFuKSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBOb29wU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xudmFyIEZvcmNlRmx1c2hTdGF0ZTtcbihmdW5jdGlvbiAoRm9yY2VGbHVzaFN0YXRlKSB7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInJlc29sdmVkXCJdID0gMF0gPSBcInJlc29sdmVkXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInRpbWVvdXRcIl0gPSAxXSA9IFwidGltZW91dFwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJ1bnJlc29sdmVkXCJdID0gM10gPSBcInVucmVzb2x2ZWRcIjtcbn0pKEZvcmNlRmx1c2hTdGF0ZSB8fCAoRm9yY2VGbHVzaFN0YXRlID0ge30pKTtcbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyIHByb3ZpZGVyIHdoaWNoIHBsYXRmb3JtIGxpYnJhcmllcyBjYW4gZXh0ZW5kXG4gKi9cbnZhciBCYXNpY1RyYWNlclByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2ljVHJhY2VyUHJvdmlkZXIoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fdHJhY2VycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG1lcmdlZENvbmZpZyA9IG1lcmdlKHt9LCBsb2FkRGVmYXVsdENvbmZpZygpLCByZWNvbmZpZ3VyZUxpbWl0cyhjb25maWcpKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IChfYSA9IG1lcmdlZENvbmZpZy5yZXNvdXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUmVzb3VyY2UuZW1wdHkoKTtcbiAgICAgICAgaWYgKG1lcmdlZENvbmZpZy5tZXJnZVJlc291cmNlV2l0aERlZmF1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gUmVzb3VyY2UuZGVmYXVsdCgpLm1lcmdlKHRoaXMucmVzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENvbmZpZywge1xuICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKF9iID0gY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGNvbnZlcnRzIHRoZSB7QGxpbmsgU3Bhbn1cbiAqIHRvIHtAbGluayBSZWFkYWJsZVNwYW59IGFuZCBwYXNzZXMgaXQgdG8gdGhlIGNvbmZpZ3VyZWQgZXhwb3J0ZXIuXG4gKlxuICogT25seSBzcGFucyB0aGF0IGFyZSBzYW1wbGVkIGFyZSBjb252ZXJ0ZWQuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gZXhwb3J0cyBldmVyeSBlbmRlZCBzcGFuIGluZGl2aWR1YWxseSBpbnN0ZWFkIG9mIGJhdGNoaW5nIHNwYW5zIHRvZ2V0aGVyLCB3aGljaCBjYXVzZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgd2l0aCBtb3N0IGV4cG9ydGVycy4gRm9yIHByb2R1Y3Rpb24gdXNlLCBwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIHtAbGluayBCYXRjaFNwYW5Qcm9jZXNzb3J9IGluc3RlYWQuXG4gKi9cbnZhciBTaW1wbGVTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbXBsZVNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydGVyID0gX2V4cG9ydGVyO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICB0aGlzLl91bnJlc29sdmVkRXhwb3J0cyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBcbiAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB1bnJlc29sdmVkIHJlc291cmNlcyBiZWZvcmUgcmVzb2x2aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2gpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5fZXhwb3J0ZXIuZm9yY2VGbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvRXhwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFsXG4gICAgICAgICAgICAgICAgLl9leHBvcnQoX3RoaXMuX2V4cG9ydGVyLCBbc3Bhbl0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgIT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoXCJTaW1wbGVTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQgKHN0YXR1cyBcIiArIHJlc3VsdCArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0UHJvbWlzZV8xID0gKF9iID0gKF9hID0gc3Bhbi5yZXNvdXJjZSkud2FpdEZvckFzeW5jQXR0cmlidXRlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuZGVsZXRlKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7IH0pO1xuICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHVucmVzb2x2ZWQgZXhwb3J0c1xuICAgICAgICAgICAgaWYgKGV4cG9ydFByb21pc2VfMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuYWRkKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2b2lkIGRvRXhwb3J0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmNhbGwoKTtcbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLl9zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbmV4cG9ydCB7IEFsd2F5c09mZlNhbXBsZXIgYXMgQSwgQmFzaWNUcmFjZXJQcm92aWRlciBhcyBCLCBDb25zb2xlU3BhbkV4cG9ydGVyIGFzIEMsIEZvcmNlRmx1c2hTdGF0ZSBhcyBGLCBOb29wU3BhblByb2Nlc3NvciBhcyBOLCBQYXJlbnRCYXNlZFNhbXBsZXIgYXMgUCwgUmFuZG9tSWRHZW5lcmF0b3IgYXMgUiwgU2ltcGxlU3BhblByb2Nlc3NvciBhcyBTLCBUcmFjZXIgYXMgVCwgQmF0Y2hTcGFuUHJvY2Vzc29yIGFzIGEsIEFsd2F5c09uU2FtcGxlciBhcyBiLCBUcmFjZUlkUmF0aW9CYXNlZFNh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WCxHQUFFO0FBQUE7IiwKICAibmFtZXMiOiBbIlNwYW5TdGF0dXNDb2RlIiwgInRyYWNlIiwgImlzU3BhbkNvbnRleHRWYWxpZCIsICJUcmFjZUZsYWdzIiwgImlzVmFsaWRUcmFjZUlkIiwgImNvbnRleHQiLCAiSU5WQUxJRF9TUEFOX0NPTlRFWFQiLCAiU3BhbktpbmQiLCAib3RwZXJmb3JtYW5jZSIsICJnZXRUaW1lT3JpZ2luIiwgImlzVGltZUlucHV0IiwgImhyVGltZUR1cmF0aW9uIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFIiwgInByb3BhZ2F0aW9uIiwgImhyVGltZVRvTWljcm9zZWNvbmRzIiwgImlzQXR0cmlidXRlVmFsdWUiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJnZXRFbnYiLCAiVHJhY2VzU2FtcGxlclZhbHVlcyIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgInVucmVmVGltZXIiLCAiQmluZE9uY2VGdXR1cmUiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJzdXBwcmVzc1RyYWNpbmciLCAiaXNUcmFjaW5nU3VwcHJlc3NlZCIsICJSZXNvdXJjZSIsICJFeHBvcnRSZXN1bHRDb2RlIiwgIkV4Y2VwdGlvbkV2ZW50TmFtZSIsICJfX2Fzc2lnbiIsICJ0IiwgInMiLCAiaSIsICJwIiwgIl9fdmFsdWVzJDIiLCAibyIsICJtIiwgIl9fcmVhZCQxIiwgIm4iLCAiciIsICJhciIsICJlIiwgImVycm9yIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJTcGFuIiwgInBhcmVudFRyYWNlciIsICJzcGFuTmFtZSIsICJzcGFuQ29udGV4dCIsICJraW5kIiwgInBhcmVudFNwYW5JZCIsICJsaW5rcyIsICJzdGFydFRpbWUiLCAiX2RlcHJlY2F0ZWRDbG9jayIsICJhdHRyaWJ1dGVzIiwgIm5vdyIsICJrZXkiLCAidmFsdWUiLCAiZGlhZyIsICJlXzEiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiayIsICJ2IiwgImVfMV8xIiwgIm5hbWUiLCAiYXR0cmlidXRlc09yU3RhcnRUaW1lIiwgInRpbWVTdGFtcCIsICJsaW5rIiwgInN0YXR1cyIsICJlbmRUaW1lIiwgImlucCIsICJtc0R1cmF0aW9uIiwgImV4Y2VwdGlvbiIsICJ0aW1lIiwgImxpbWl0IiwgIl90aGlzIiwgInZhbCIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkFsd2F5c09mZlNhbXBsZXIiLCAiQWx3YXlzT25TYW1wbGVyIiwgIlBhcmVudEJhc2VkU2FtcGxlciIsICJjb25maWciLCAidHJhY2VJZCIsICJzcGFuS2luZCIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJwYXJ0IiwgIkZBTExCQUNLX09URUxfVFJBQ0VTX1NBTVBMRVIiLCAiREVGQVVMVF9SQVRJTyIsICJsb2FkRGVmYXVsdENvbmZpZyIsICJlbnYiLCAiYnVpbGRTYW1wbGVyRnJvbUVudiIsICJlbnZpcm9ubWVudCIsICJnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52IiwgInByb2JhYmlsaXR5IiwgIm1lcmdlQ29uZmlnIiwgInVzZXJDb25maWciLCAicGVySW5zdGFuY2VEZWZhdWx0cyIsICJERUZBVUxUX0NPTkZJRyIsICJ0YXJnZXQiLCAicmVjb25maWd1cmVMaW1pdHMiLCAiX2UiLCAiX2YiLCAiX2ciLCAiX2giLCAiX2oiLCAiX2siLCAiX2wiLCAiX20iLCAic3BhbkxpbWl0cyIsICJwYXJzZWRFbnZDb25maWciLCAiQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSIsICJfZXhwb3J0ZXIiLCAiX3NwYW4iLCAiX3BhcmVudENvbnRleHQiLCAic3BhbiIsICJyZXNvbHZlIiwgInJlamVjdCIsICJwcm9taXNlcyIsICJjb3VudCIsICJqIiwgInRpbWVyIiwgInNwYW5zIiwgImRvRXhwb3J0IiwgInJlc3VsdCIsICJwZW5kaW5nUmVzb3VyY2VzIiwgImxlbiIsICJlcnIiLCAiZmx1c2giLCAiX19leHRlbmRzIiwgImV4dGVuZFN0YXRpY3MiLCAiZCIsICJiIiwgIl9fIiwgIkJhdGNoU3BhblByb2Nlc3NvciIsICJfc3VwZXIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJUcmFjZXIiLCAiaW5zdHJ1bWVudGF0aW9uTGlicmFyeSIsICJfdHJhY2VyUHJvdmlkZXIiLCAibG9jYWxDb25maWciLCAib3B0aW9ucyIsICJjb250ZXh0JDEiLCAicGFyZW50U3BhbiIsICJub25SZWNvcmRpbmdTcGFuIiwgInBhcmVudFNwYW5Db250ZXh0IiwgInNwYW5JZCIsICJ0cmFjZVN0YXRlIiwgInNhbXBsaW5nUmVzdWx0IiwgInRyYWNlRmxhZ3MiLCAiaW5pdEF0dHJpYnV0ZXMiLCAiYXJnMiIsICJhcmczIiwgImFyZzQiLCAib3B0cyIsICJjdHgiLCAiZm4iLCAiY29udGV4dFdpdGhTcGFuU2V0IiwgIl9fdmFsdWVzJDEiLCAiTXVsdGlTcGFuUHJvY2Vzc29yIiwgIl9zcGFuUHJvY2Vzc29ycyIsICJzcGFuUHJvY2Vzc29yIiwgImVfMiIsICJlXzJfMSIsICJlXzMiLCAiZV8zXzEiLCAiZV80IiwgImVfNF8xIiwgIk5vb3BTcGFuUHJvY2Vzc29yIiwgIl9jb250ZXh0IiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==
|