@getopenpay/openpay-js 0.5.14 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/{ExportResult-B-YLKMaU.js → ExportResult-BacsqwKA.js} +1 -1
  2. package/dist/{Resource-qJjZ52YV.js → Resource-Ds5bbQ3b.js} +4 -4
  3. package/dist/SimpleSpanProcessor-0bSccE1S.js +910 -0
  4. package/dist/_commonjsHelpers-CdLE1o9f.js +30 -0
  5. package/dist/detect-resources-UwRkF4Xd.js +862 -0
  6. package/dist/{diag-api-CCLNzlUs.js → diag-api-CMlZXyyv.js} +2 -2
  7. package/dist/index-1jECpTsg.js +147 -0
  8. package/dist/index-BZEpD-f0.js +6718 -0
  9. package/dist/index-BhZy-TW3.js +430 -0
  10. package/dist/index-BmKZeOoc.js +1619 -0
  11. package/dist/index-CDdbDQxQ.js +6 -0
  12. package/dist/index-CWTkU3J-.js +18 -0
  13. package/dist/index-DFO-DCsT.js +127 -0
  14. package/dist/index-DsxDp11a.js +28 -0
  15. package/dist/index-JNJd_YS1.js +1012 -0
  16. package/dist/index-j7i6AeZa.js +7005 -0
  17. package/dist/index.d.ts +26 -1
  18. package/dist/index.es.js +2 -2
  19. package/dist/index.umd.js +40 -40
  20. package/dist/lifecycle-D1BdEbZs.js +119 -0
  21. package/dist/{metrics-api-DtBUlvdW.js → metrics-api-C9pRFfr-.js} +2 -2
  22. package/dist/sdk-info-ChuKu8zW.js +285 -0
  23. package/dist/suppress-tracing-B94rObkn.js +17 -0
  24. package/dist/url-CdPstDG9.js +798 -0
  25. package/dist/utils--M6ihaNw.js +101 -0
  26. package/dist/utils-De78ey-v.js +12 -0
  27. package/dist/utils-VJ-0MC7c.js +270 -0
  28. package/package.json +4 -4
  29. package/dist/SimpleSpanProcessor-BwonVfHA.js +0 -957
  30. package/dist/_commonjsHelpers-f76XedMs.js +0 -25
  31. package/dist/detect-resources-Bi3A_QRE.js +0 -854
  32. package/dist/index-BIZrcIxl.js +0 -19
  33. package/dist/index-Bs_K1BID.js +0 -431
  34. package/dist/index-CRez6biP.js +0 -150
  35. package/dist/index-Cmp0890G.js +0 -1599
  36. package/dist/index-DCgcMBKE.js +0 -52
  37. package/dist/index-DDPV-DRN.js +0 -7040
  38. package/dist/index-SVnUIdm3.js +0 -130
  39. package/dist/index-UHBeywOG.js +0 -330
  40. package/dist/index-sp5MCjj0.js +0 -6685
  41. package/dist/index-wETKGbBW.js +0 -830
  42. package/dist/lifecycle-BjQ-7GLm.js +0 -119
  43. package/dist/sdk-info-Ved2vK62.js +0 -484
  44. package/dist/url-C-ZmHCbX.js +0 -797
  45. package/dist/utils-CX5YT7yI.js +0 -14
  46. package/dist/utils-DwFEBfnB.js +0 -142
  47. 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-j7i6AeZa.js";
2
+ import { d } from "./diag-api-CMlZXyyv.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-CdPstDG9.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-JNJd_YS1.js";
5
+ import { s as At, i as bt } from "./suppress-tracing-B94rObkn.js";
6
+ import { R as Q } from "./Resource-Ds5bbQ3b.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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WCxFQUFFO0FBQUE7IiwKICAibmFtZXMiOiBbIlNwYW5TdGF0dXNDb2RlIiwgInRyYWNlIiwgImlzU3BhbkNvbnRleHRWYWxpZCIsICJUcmFjZUZsYWdzIiwgImlzVmFsaWRUcmFjZUlkIiwgImNvbnRleHQiLCAiSU5WQUxJRF9TUEFOX0NPTlRFWFQiLCAiU3BhbktpbmQiLCAib3RwZXJmb3JtYW5jZSIsICJnZXRUaW1lT3JpZ2luIiwgImlzVGltZUlucHV0IiwgImhyVGltZUR1cmF0aW9uIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFIiwgInByb3BhZ2F0aW9uIiwgImhyVGltZVRvTWljcm9zZWNvbmRzIiwgImlzQXR0cmlidXRlVmFsdWUiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJnZXRFbnYiLCAiVHJhY2VzU2FtcGxlclZhbHVlcyIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgInVucmVmVGltZXIiLCAiQmluZE9uY2VGdXR1cmUiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJzdXBwcmVzc1RyYWNpbmciLCAiaXNUcmFjaW5nU3VwcHJlc3NlZCIsICJSZXNvdXJjZSIsICJFeHBvcnRSZXN1bHRDb2RlIiwgIkV4Y2VwdGlvbkV2ZW50TmFtZSIsICJfX2Fzc2lnbiIsICJ0IiwgInMiLCAiaSIsICJwIiwgIl9fdmFsdWVzJDIiLCAibyIsICJtIiwgIl9fcmVhZCQxIiwgIm4iLCAiciIsICJhciIsICJlIiwgImVycm9yIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJTcGFuIiwgInBhcmVudFRyYWNlciIsICJzcGFuTmFtZSIsICJzcGFuQ29udGV4dCIsICJraW5kIiwgInBhcmVudFNwYW5JZCIsICJsaW5rcyIsICJzdGFydFRpbWUiLCAiX2RlcHJlY2F0ZWRDbG9jayIsICJhdHRyaWJ1dGVzIiwgIm5vdyIsICJrZXkiLCAidmFsdWUiLCAiZGlhZyIsICJlXzEiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiayIsICJ2IiwgImVfMV8xIiwgIm5hbWUiLCAiYXR0cmlidXRlc09yU3RhcnRUaW1lIiwgInRpbWVTdGFtcCIsICJsaW5rIiwgInN0YXR1cyIsICJlbmRUaW1lIiwgImlucCIsICJtc0R1cmF0aW9uIiwgImV4Y2VwdGlvbiIsICJ0aW1lIiwgImxpbWl0IiwgIl90aGlzIiwgInZhbCIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkFsd2F5c09mZlNhbXBsZXIiLCAiQWx3YXlzT25TYW1wbGVyIiwgIlBhcmVudEJhc2VkU2FtcGxlciIsICJjb25maWciLCAidHJhY2VJZCIsICJzcGFuS2luZCIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJwYXJ0IiwgIkZBTExCQUNLX09URUxfVFJBQ0VTX1NBTVBMRVIiLCAiREVGQVVMVF9SQVRJTyIsICJsb2FkRGVmYXVsdENvbmZpZyIsICJlbnYiLCAiYnVpbGRTYW1wbGVyRnJvbUVudiIsICJlbnZpcm9ubWVudCIsICJnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52IiwgInByb2JhYmlsaXR5IiwgIm1lcmdlQ29uZmlnIiwgInVzZXJDb25maWciLCAicGVySW5zdGFuY2VEZWZhdWx0cyIsICJERUZBVUxUX0NPTkZJRyIsICJ0YXJnZXQiLCAicmVjb25maWd1cmVMaW1pdHMiLCAiX2UiLCAiX2YiLCAiX2ciLCAiX2giLCAiX2oiLCAiX2siLCAiX2wiLCAiX20iLCAic3BhbkxpbWl0cyIsICJwYXJzZWRFbnZDb25maWciLCAiQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSIsICJfZXhwb3J0ZXIiLCAiX3NwYW4iLCAiX3BhcmVudENvbnRleHQiLCAic3BhbiIsICJyZXNvbHZlIiwgInJlamVjdCIsICJwcm9taXNlcyIsICJjb3VudCIsICJqIiwgInRpbWVyIiwgInNwYW5zIiwgImRvRXhwb3J0IiwgInJlc3VsdCIsICJwZW5kaW5nUmVzb3VyY2VzIiwgImxlbiIsICJlcnIiLCAiZmx1c2giLCAiX19leHRlbmRzIiwgImV4dGVuZFN0YXRpY3MiLCAiZCIsICJiIiwgIl9fIiwgIkJhdGNoU3BhblByb2Nlc3NvciIsICJfc3VwZXIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJUcmFjZXIiLCAiaW5zdHJ1bWVudGF0aW9uTGlicmFyeSIsICJfdHJhY2VyUHJvdmlkZXIiLCAibG9jYWxDb25maWciLCAib3B0aW9ucyIsICJjb250ZXh0JDEiLCAicGFyZW50U3BhbiIsICJub25SZWNvcmRpbmdTcGFuIiwgInBhcmVudFNwYW5Db250ZXh0IiwgInNwYW5JZCIsICJ0cmFjZVN0YXRlIiwgInNhbXBsaW5nUmVzdWx0IiwgInRyYWNlRmxhZ3MiLCAiaW5pdEF0dHJpYnV0ZXMiLCAiYXJnMiIsICJhcmczIiwgImFyZzQiLCAib3B0cyIsICJjdHgiLCAiZm4iLCAiY29udGV4dFdpdGhTcGFuU2V0IiwgIl9fdmFsdWVzJDEiLCAiTXVsdGlTcGFuUHJvY2Vzc29yIiwgIl9zcGFuUHJvY2Vzc29ycyIsICJzcGFuUHJvY2Vzc29yIiwgImVfMiIsICJlXzJfMSIsICJlXzMiLCAiZV8zXzEiLCAiZV80IiwgImVfNF8xIiwgIk5vb3BTcGFuUHJvY2Vzc29yIiwgIl9jb250ZXh0IiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==