@getopenpay/openpay-js 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +38 -2
- package/dist/index.es.js +684 -552
- package/dist/index.umd.js +9 -9
- package/package.json +1 -1
package/dist/index.es.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { z as t } from "zod";
|
|
2
|
-
import { v4 as
|
|
3
|
-
import { connectToChild as
|
|
4
|
-
import
|
|
5
|
-
const
|
|
2
|
+
import { v4 as De } from "uuid";
|
|
3
|
+
import { connectToChild as de } from "penpal";
|
|
4
|
+
import L from "chalk";
|
|
5
|
+
const xe = "https://cde.getopenpay.com", Ue = t.object({
|
|
6
6
|
type: t.string(),
|
|
7
7
|
loc: t.array(t.string()),
|
|
8
8
|
msg: t.string(),
|
|
9
9
|
url: t.string()
|
|
10
|
-
}),
|
|
10
|
+
}), $e = t.array(Ue), qe = t.object({
|
|
11
11
|
code: t.string(),
|
|
12
12
|
message: t.string(),
|
|
13
13
|
path: t.array(t.string())
|
|
14
|
-
}),
|
|
14
|
+
}), ze = t.array(qe), Ve = {
|
|
15
15
|
"failed to fetch": "Connection error: please double check if you are connected to the internet, then try again"
|
|
16
|
-
},
|
|
16
|
+
}, K = (n) => {
|
|
17
17
|
const e = n.toLowerCase().trim();
|
|
18
|
-
return
|
|
19
|
-
},
|
|
18
|
+
return Ve[e] ?? n;
|
|
19
|
+
}, He = (n) => {
|
|
20
20
|
try {
|
|
21
21
|
return typeof JSON.parse(n) == "object";
|
|
22
22
|
} catch {
|
|
23
23
|
return !1;
|
|
24
24
|
}
|
|
25
|
-
},
|
|
26
|
-
${n.map((r) => `• ${
|
|
27
|
-
`)}`,
|
|
25
|
+
}, Ke = (n) => n.length === 1 ? K(n[0].msg) : `Please fix the following errors:
|
|
26
|
+
${n.map((r) => `• ${K(r.msg)}`).join(`
|
|
27
|
+
`)}`, Ye = (n) => `Encountered the following errors:
|
|
28
28
|
${n.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
|
|
29
|
-
`)}`,
|
|
29
|
+
`)}`, me = (n) => {
|
|
30
30
|
if (n instanceof Error)
|
|
31
|
-
if (
|
|
31
|
+
if (He(n.message)) {
|
|
32
32
|
const e = JSON.parse(n.message);
|
|
33
|
-
return
|
|
33
|
+
return $e.safeParse(e).success ? Ke(e) : ze.safeParse(e).success ? Ye(e) : n.message;
|
|
34
34
|
} else
|
|
35
|
-
return
|
|
35
|
+
return K(n.message);
|
|
36
36
|
if (typeof n == "object")
|
|
37
37
|
try {
|
|
38
38
|
return JSON.stringify(n);
|
|
@@ -41,42 +41,42 @@ ${n.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
|
|
|
41
41
|
}
|
|
42
42
|
else
|
|
43
43
|
return n + "";
|
|
44
|
-
},
|
|
44
|
+
}, O = (n, e) => (...r) => {
|
|
45
45
|
try {
|
|
46
46
|
return e(...r);
|
|
47
47
|
} catch {
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
|
-
},
|
|
51
|
-
var
|
|
52
|
-
const
|
|
53
|
-
var
|
|
54
|
-
const
|
|
55
|
-
var
|
|
56
|
-
const
|
|
50
|
+
}, g = t.string().trim().min(1, { message: "Cannot be blank" }), _ = t.string().trim().optional(), D = (n) => t.nullable(n.optional());
|
|
51
|
+
var m = /* @__PURE__ */ ((n) => (n.FIRST_NAME = "firstName", n.LAST_NAME = "lastName", n.EMAIL = "email", n.ZIP_CODE = "zipCode", n.CITY = "city", n.STATE = "state", n.COUNTRY = "country", n.ADDRESS = "address", n.PHONE = "phone", n.PROMOTION_CODE = "promotionCode", n))(m || {});
|
|
52
|
+
const pe = t.nativeEnum(m);
|
|
53
|
+
var fe = /* @__PURE__ */ ((n) => (n.CARD_NUMBER = "cardNumber", n.CARD_EXPIRY = "cardExpiry", n.CARD_CVC = "cardCvc", n))(fe || {});
|
|
54
|
+
const ye = t.nativeEnum(fe), he = t.union([pe, ye]);
|
|
55
|
+
var _e = /* @__PURE__ */ ((n) => (n.CARD = "card", n.CARD_NUMBER = "card-number", n.CARD_EXPIRY = "card-expiry", n.CARD_CVC = "card-cvc", n))(_e || {});
|
|
56
|
+
const Be = t.nativeEnum(_e), $ = t.object({
|
|
57
57
|
provider: t.string(),
|
|
58
|
-
processor_name:
|
|
59
|
-
metadata:
|
|
60
|
-
}),
|
|
58
|
+
processor_name: D(t.string()),
|
|
59
|
+
metadata: D(t.record(t.string(), t.any()))
|
|
60
|
+
}), Ze = t.object({
|
|
61
61
|
id: t.string()
|
|
62
62
|
});
|
|
63
63
|
t.object({
|
|
64
|
-
cardNumber:
|
|
65
|
-
expiry:
|
|
66
|
-
cvc:
|
|
64
|
+
cardNumber: _,
|
|
65
|
+
expiry: _,
|
|
66
|
+
cvc: _
|
|
67
67
|
});
|
|
68
68
|
t.object({
|
|
69
|
-
backgroundColor:
|
|
70
|
-
color:
|
|
71
|
-
fontFamily:
|
|
72
|
-
fontSize:
|
|
73
|
-
fontWeight:
|
|
74
|
-
margin:
|
|
75
|
-
padding:
|
|
76
|
-
letterSpacing:
|
|
77
|
-
lineHeight:
|
|
69
|
+
backgroundColor: _,
|
|
70
|
+
color: _,
|
|
71
|
+
fontFamily: _,
|
|
72
|
+
fontSize: _,
|
|
73
|
+
fontWeight: _,
|
|
74
|
+
margin: _,
|
|
75
|
+
padding: _,
|
|
76
|
+
letterSpacing: _,
|
|
77
|
+
lineHeight: _
|
|
78
78
|
});
|
|
79
|
-
const
|
|
79
|
+
const C = t.enum([
|
|
80
80
|
// Element -> Form
|
|
81
81
|
"LAYOUT",
|
|
82
82
|
"LOADED",
|
|
@@ -97,83 +97,83 @@ const w = t.enum([
|
|
|
97
97
|
"TOKENIZE",
|
|
98
98
|
"CHECKOUT",
|
|
99
99
|
"START_PAYMENT_FLOW"
|
|
100
|
-
]),
|
|
101
|
-
type:
|
|
102
|
-
elementType:
|
|
100
|
+
]), Je = C.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), We = t.object({ type: Je }), Ge = C.extract(["BLUR", "FOCUS", "CHANGE"]), Qe = t.object({
|
|
101
|
+
type: Ge,
|
|
102
|
+
elementType: ye,
|
|
103
103
|
errors: t.array(t.string()).optional()
|
|
104
|
-
}),
|
|
105
|
-
type:
|
|
106
|
-
message:
|
|
104
|
+
}), Xe = C.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), et = t.object({
|
|
105
|
+
type: Xe,
|
|
106
|
+
message: g,
|
|
107
107
|
headers: t.record(t.string(), t.string()).optional()
|
|
108
|
-
}),
|
|
109
|
-
type:
|
|
110
|
-
elementType:
|
|
108
|
+
}), tt = C.extract(["VALIDATION_ERROR"]), nt = t.object({
|
|
109
|
+
type: tt,
|
|
110
|
+
elementType: he,
|
|
111
111
|
errors: t.array(t.string())
|
|
112
|
-
}),
|
|
113
|
-
type: t.literal(
|
|
114
|
-
height:
|
|
115
|
-
}),
|
|
116
|
-
type: t.literal(
|
|
117
|
-
sessionId:
|
|
112
|
+
}), rt = t.object({
|
|
113
|
+
type: t.literal(C.enum.LAYOUT),
|
|
114
|
+
height: g
|
|
115
|
+
}), ot = t.object({
|
|
116
|
+
type: t.literal(C.enum.LOADED),
|
|
117
|
+
sessionId: g,
|
|
118
118
|
totalAmountAtoms: t.number(),
|
|
119
|
-
currency:
|
|
120
|
-
checkoutPaymentMethods: t.array(
|
|
121
|
-
}),
|
|
122
|
-
type: t.literal(
|
|
119
|
+
currency: _,
|
|
120
|
+
checkoutPaymentMethods: t.array($)
|
|
121
|
+
}), st = t.object({
|
|
122
|
+
type: t.literal(C.enum.PAYMENT_FLOW_STARTED),
|
|
123
123
|
nextActionMetadata: t.record(t.string(), t.any()),
|
|
124
124
|
paymentFlowMetadata: t.any().optional(),
|
|
125
125
|
startPFMetadata: t.optional(t.record(t.string(), t.any()))
|
|
126
|
-
}),
|
|
127
|
-
type: t.literal(
|
|
126
|
+
}), it = t.object({
|
|
127
|
+
type: t.literal(C.enum.SETUP_PAYMENT_METHOD_SUCCESS),
|
|
128
128
|
paymentMethodId: t.string()
|
|
129
|
-
}),
|
|
130
|
-
firstName:
|
|
131
|
-
lastName:
|
|
132
|
-
email:
|
|
133
|
-
zipCode:
|
|
134
|
-
country:
|
|
135
|
-
promotionCode:
|
|
136
|
-
}),
|
|
137
|
-
email:
|
|
138
|
-
zipCode:
|
|
139
|
-
country:
|
|
140
|
-
promotionCode:
|
|
141
|
-
}),
|
|
142
|
-
type:
|
|
143
|
-
sessionId:
|
|
144
|
-
checkoutPaymentMethod:
|
|
129
|
+
}), T = t.object({
|
|
130
|
+
firstName: g,
|
|
131
|
+
lastName: g,
|
|
132
|
+
email: g,
|
|
133
|
+
zipCode: g,
|
|
134
|
+
country: g,
|
|
135
|
+
promotionCode: _
|
|
136
|
+
}), at = t.object({
|
|
137
|
+
email: g,
|
|
138
|
+
zipCode: g,
|
|
139
|
+
country: g,
|
|
140
|
+
promotionCode: _
|
|
141
|
+
}), ct = C.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), lt = t.object({
|
|
142
|
+
type: ct,
|
|
143
|
+
sessionId: g,
|
|
144
|
+
checkoutPaymentMethod: $,
|
|
145
145
|
paymentFlowMetadata: t.any().optional(),
|
|
146
146
|
doNotUseLegacyCCFlow: t.boolean().optional(),
|
|
147
|
-
existingCCPMId:
|
|
148
|
-
}).extend(
|
|
149
|
-
type: t.literal(
|
|
147
|
+
existingCCPMId: _
|
|
148
|
+
}).extend(T.shape), ut = t.object({
|
|
149
|
+
type: t.literal(C.enum.TOKENIZE_SUCCESS),
|
|
150
150
|
isReadyForCheckout: t.boolean()
|
|
151
|
-
}),
|
|
152
|
-
type: t.literal(
|
|
151
|
+
}), dt = t.object({
|
|
152
|
+
type: t.literal(C.enum.CHECKOUT_SUCCESS),
|
|
153
153
|
invoiceUrls: t.array(t.string()),
|
|
154
154
|
subscriptionIds: t.array(t.string()),
|
|
155
155
|
customerId: t.string()
|
|
156
|
-
}),
|
|
157
|
-
Ve,
|
|
158
|
-
Ke,
|
|
159
|
-
Ye,
|
|
160
|
-
Ge,
|
|
161
|
-
Je,
|
|
156
|
+
}), mt = t.discriminatedUnion("type", [
|
|
162
157
|
We,
|
|
158
|
+
Qe,
|
|
159
|
+
et,
|
|
163
160
|
nt,
|
|
164
161
|
rt,
|
|
165
162
|
ot,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
163
|
+
lt,
|
|
164
|
+
ut,
|
|
165
|
+
dt,
|
|
166
|
+
st,
|
|
167
|
+
it
|
|
168
|
+
]), pt = t.object({
|
|
169
|
+
payload: mt,
|
|
170
|
+
nonce: g,
|
|
171
|
+
formId: g,
|
|
172
|
+
elementId: g
|
|
173
173
|
});
|
|
174
174
|
t.object({
|
|
175
175
|
amountAtom: t.number(),
|
|
176
|
-
currency:
|
|
176
|
+
currency: g
|
|
177
177
|
});
|
|
178
178
|
t.object({
|
|
179
179
|
secure_token: t.string(),
|
|
@@ -181,83 +181,89 @@ t.object({
|
|
|
181
181
|
});
|
|
182
182
|
t.object({
|
|
183
183
|
secure_token: t.string(),
|
|
184
|
-
existing_cc_pm_id:
|
|
184
|
+
existing_cc_pm_id: D(t.string())
|
|
185
185
|
});
|
|
186
|
-
const
|
|
187
|
-
payment_methods: t.array(
|
|
188
|
-
}),
|
|
186
|
+
const ft = t.object({
|
|
187
|
+
payment_methods: t.array(Ze)
|
|
188
|
+
}), yt = t.object({
|
|
189
189
|
elementType: t.string(),
|
|
190
190
|
errors: t.array(t.string())
|
|
191
191
|
});
|
|
192
192
|
t.object({
|
|
193
193
|
session_id: t.string()
|
|
194
194
|
});
|
|
195
|
-
const
|
|
195
|
+
const ht = t.object({
|
|
196
196
|
success: t.literal(!1),
|
|
197
197
|
error_type: t.literal("validation_error"),
|
|
198
|
-
errors: t.array(
|
|
199
|
-
}),
|
|
198
|
+
errors: t.array(yt)
|
|
199
|
+
}), _t = t.discriminatedUnion("success", [
|
|
200
200
|
t.object({ success: t.literal(!0) }),
|
|
201
|
-
|
|
201
|
+
ht
|
|
202
202
|
]);
|
|
203
203
|
t.object({
|
|
204
204
|
session_id: t.string(),
|
|
205
|
-
checkout_payment_method:
|
|
206
|
-
non_cde_form_fields:
|
|
205
|
+
checkout_payment_method: $,
|
|
206
|
+
non_cde_form_fields: T,
|
|
207
207
|
do_not_use_legacy_cc_flow: t.boolean().optional(),
|
|
208
|
-
existing_cc_pm_id:
|
|
208
|
+
existing_cc_pm_id: D(t.string())
|
|
209
209
|
});
|
|
210
210
|
t.object({
|
|
211
211
|
session_id: t.string(),
|
|
212
|
-
checkout_payment_method:
|
|
213
|
-
non_cde_form_fields:
|
|
212
|
+
checkout_payment_method: $,
|
|
213
|
+
non_cde_form_fields: T
|
|
214
214
|
});
|
|
215
|
-
var
|
|
216
|
-
const
|
|
215
|
+
var x = /* @__PURE__ */ ((n) => (n.SUCCESS = "success", n.FAILURE = "failure", n.CANCELLED = "cancelled", n))(x || {});
|
|
216
|
+
const gt = t.object({
|
|
217
217
|
status: t.enum([
|
|
218
218
|
"success",
|
|
219
219
|
"failure",
|
|
220
220
|
"cancelled"
|
|
221
221
|
/* CANCELLED */
|
|
222
222
|
])
|
|
223
|
-
}),
|
|
223
|
+
}), wt = t.object({
|
|
224
224
|
type: t.string(),
|
|
225
225
|
redirect_url: t.string(),
|
|
226
226
|
initial_intent_id: t.string(),
|
|
227
227
|
consent_id: t.string()
|
|
228
|
-
}),
|
|
228
|
+
}), Et = (n) => {
|
|
229
229
|
const e = {};
|
|
230
230
|
return Object.entries(n).forEach(([r, o]) => {
|
|
231
231
|
try {
|
|
232
|
-
const s =
|
|
232
|
+
const s = pe.parse(r);
|
|
233
233
|
Array.isArray(o) ? e[s] = o : Array.isArray(o._errors) && (e[s] = o._errors);
|
|
234
234
|
} catch {
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
237
237
|
}), e;
|
|
238
|
-
},
|
|
238
|
+
}, bt = t.object({
|
|
239
239
|
stripe_pk: t.string(),
|
|
240
240
|
client_secret: t.string(),
|
|
241
241
|
stripe_pm_id: t.string()
|
|
242
|
-
}),
|
|
242
|
+
}), Ct = t.object({
|
|
243
243
|
type: t.string(),
|
|
244
244
|
client_secret: t.string(),
|
|
245
245
|
stripe_pk: t.string()
|
|
246
|
-
}),
|
|
246
|
+
}), St = {
|
|
247
247
|
usd: "usd",
|
|
248
248
|
brl: "brl"
|
|
249
|
-
},
|
|
249
|
+
}, q = async (n) => {
|
|
250
250
|
for (let r = 0; r < 10; r++)
|
|
251
|
-
|
|
252
|
-
if (!
|
|
251
|
+
ee() || await kt(500);
|
|
252
|
+
if (!ee())
|
|
253
253
|
throw new Error("Stripe JS not found.");
|
|
254
254
|
return new Stripe(n);
|
|
255
|
-
},
|
|
256
|
-
const
|
|
255
|
+
}, Pt = async (n, e) => {
|
|
256
|
+
const r = await q(n);
|
|
257
|
+
return {
|
|
258
|
+
elements: r.elements(e),
|
|
259
|
+
stripe: r
|
|
260
|
+
};
|
|
261
|
+
}, vt = async (n, e, r, o, s) => {
|
|
262
|
+
const i = await q(n), c = St[r.toLowerCase().trim()];
|
|
257
263
|
return i.paymentRequest({
|
|
258
264
|
// TODO: replace this with stripe account country as soon as we support it
|
|
259
265
|
country: "US",
|
|
260
|
-
currency:
|
|
266
|
+
currency: c,
|
|
261
267
|
total: {
|
|
262
268
|
label: "Total",
|
|
263
269
|
amount: e,
|
|
@@ -267,9 +273,9 @@ const dt = t.object({
|
|
|
267
273
|
requestPayerEmail: !0,
|
|
268
274
|
disableWallets: []
|
|
269
275
|
});
|
|
270
|
-
},
|
|
276
|
+
}, kt = (n) => new Promise((e) => {
|
|
271
277
|
setTimeout(e, n);
|
|
272
|
-
}),
|
|
278
|
+
}), ee = () => "Stripe" in window, Rt = async (n) => new Promise((e, r) => {
|
|
273
279
|
try {
|
|
274
280
|
n.on("paymentmethod", async (o) => {
|
|
275
281
|
e(o);
|
|
@@ -279,41 +285,41 @@ const dt = t.object({
|
|
|
279
285
|
} catch (o) {
|
|
280
286
|
r(o);
|
|
281
287
|
}
|
|
282
|
-
}),
|
|
288
|
+
}), Ot = async (n, e) => {
|
|
283
289
|
if (!n.stripe_pk || !n.client_secret)
|
|
284
290
|
throw new Error(`Invalid next action metadata format: ${JSON.stringify(n)}`);
|
|
285
|
-
const o = await (await
|
|
291
|
+
const o = await (await q(n.stripe_pk)).confirmCardSetup(n.client_secret, {
|
|
286
292
|
payment_method: e.paymentMethod.id
|
|
287
293
|
});
|
|
288
294
|
if (o.error)
|
|
289
295
|
throw e.complete("fail"), new Error(`Payment failed: ${o.error.message ?? "unknown"}`);
|
|
290
296
|
return e.complete("success"), o;
|
|
291
|
-
},
|
|
292
|
-
var s, i,
|
|
293
|
-
const r = await (await
|
|
297
|
+
}, At = async (n) => {
|
|
298
|
+
var s, i, c, a;
|
|
299
|
+
const r = await (await q(n.stripe_pk)).confirmCardSetup(n.client_secret, {
|
|
294
300
|
payment_method: n.stripe_pm_id
|
|
295
301
|
}), o = (s = r.setupIntent) == null ? void 0 : s.status;
|
|
296
302
|
if (o !== "succeeded") throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
|
|
297
|
-
`${((i = r.error) == null ? void 0 : i.message) ?? ((
|
|
303
|
+
`${((i = r.error) == null ? void 0 : i.message) ?? ((a = (c = r.setupIntent) == null ? void 0 : c.last_setup_error) == null ? void 0 : a.message) ?? "Payment failed, please click submit again to pay."}`
|
|
298
304
|
);
|
|
299
|
-
},
|
|
300
|
-
const
|
|
301
|
-
return
|
|
302
|
-
}, {}),
|
|
305
|
+
}, It = (n) => JSON.stringify(n), Y = (n, e) => Array.from(n.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
|
|
306
|
+
const c = i.getAttribute("data-opid");
|
|
307
|
+
return c ? { ...s, [c]: i.value } : s;
|
|
308
|
+
}, {}), Tt = (n) => {
|
|
303
309
|
try {
|
|
304
|
-
return
|
|
310
|
+
return pt.parse(n);
|
|
305
311
|
} catch (e) {
|
|
306
312
|
throw e;
|
|
307
313
|
}
|
|
308
|
-
},
|
|
314
|
+
}, jt = (n, e, r, o, s) => {
|
|
309
315
|
const i = {
|
|
310
316
|
payload: o,
|
|
311
|
-
nonce:
|
|
317
|
+
nonce: De(),
|
|
312
318
|
formId: e,
|
|
313
319
|
elementId: r
|
|
314
320
|
};
|
|
315
321
|
n.postMessage(JSON.stringify(i), s);
|
|
316
|
-
},
|
|
322
|
+
}, Mt = async (n) => {
|
|
317
323
|
if (typeof n != "object" || !n) return !1;
|
|
318
324
|
try {
|
|
319
325
|
const e = { type: "ping" }, r = await n.send(e);
|
|
@@ -323,105 +329,105 @@ const dt = t.object({
|
|
|
323
329
|
} catch {
|
|
324
330
|
return !1;
|
|
325
331
|
}
|
|
326
|
-
},
|
|
332
|
+
}, Lt = (n, e) => !!n && e, y = (n) => t.nullable(n.optional());
|
|
327
333
|
t.string().trim().min(1, { message: "Cannot be blank" });
|
|
328
|
-
const
|
|
334
|
+
const Ft = t.object({
|
|
329
335
|
cde_response_type: t.literal("error"),
|
|
330
336
|
message: t.string(),
|
|
331
337
|
headers: t.record(t.string(), t.string()).optional()
|
|
332
338
|
});
|
|
333
339
|
t.enum(["usd", "brl"]);
|
|
334
|
-
const
|
|
340
|
+
const ge = t.object({
|
|
335
341
|
name: t.string(),
|
|
336
|
-
amount_atom_off:
|
|
337
|
-
percent_off:
|
|
338
|
-
currency:
|
|
342
|
+
amount_atom_off: y(t.number()),
|
|
343
|
+
percent_off: y(t.number()),
|
|
344
|
+
currency: y(t.string()),
|
|
339
345
|
duration: t.string(),
|
|
340
|
-
duration_in_months:
|
|
341
|
-
}),
|
|
346
|
+
duration_in_months: y(t.number())
|
|
347
|
+
}), we = t.object({
|
|
342
348
|
amount_subtotal_atom: t.number().int(),
|
|
343
349
|
amount_total_atom: t.number().int(),
|
|
344
350
|
currency: t.string(),
|
|
345
|
-
description:
|
|
351
|
+
description: y(t.string()),
|
|
346
352
|
price_id: t.string(),
|
|
347
|
-
billing_interval:
|
|
348
|
-
billing_interval_count:
|
|
353
|
+
billing_interval: y(t.string()),
|
|
354
|
+
billing_interval_count: y(t.number().int()),
|
|
349
355
|
quantity: t.number().int()
|
|
350
|
-
}),
|
|
356
|
+
}), Nt = t.record(t.string(), t.any()), Dt = t.object({
|
|
351
357
|
name: t.string(),
|
|
352
|
-
settings:
|
|
353
|
-
}),
|
|
358
|
+
settings: y(Nt)
|
|
359
|
+
}), j = t.object({
|
|
354
360
|
provider: t.string(),
|
|
355
|
-
processor_name:
|
|
356
|
-
metadata:
|
|
357
|
-
}),
|
|
361
|
+
processor_name: y(t.string()),
|
|
362
|
+
metadata: y(t.record(t.string(), t.any()))
|
|
363
|
+
}), xt = t.object({
|
|
358
364
|
quantity: t.number()
|
|
359
|
-
}),
|
|
360
|
-
id:
|
|
361
|
-
billing_interval:
|
|
362
|
-
billing_interval_count:
|
|
363
|
-
subscription_items: t.array(
|
|
364
|
-
trial_start:
|
|
365
|
-
trial_end:
|
|
366
|
-
}),
|
|
365
|
+
}), Ut = t.object({
|
|
366
|
+
id: y(t.string()),
|
|
367
|
+
billing_interval: y(t.string()),
|
|
368
|
+
billing_interval_count: y(t.number().int()),
|
|
369
|
+
subscription_items: t.array(xt),
|
|
370
|
+
trial_start: y(t.string()),
|
|
371
|
+
trial_end: y(t.string())
|
|
372
|
+
}), Ee = t.object({
|
|
367
373
|
amount_atom: t.number()
|
|
368
|
-
}),
|
|
374
|
+
}), $t = t.object({
|
|
369
375
|
amount_atom: t.number(),
|
|
370
376
|
amount_atom_considering_discount_applied: t.number(),
|
|
371
377
|
currency: t.string(),
|
|
372
|
-
discount_amount_atoms: t.array(
|
|
378
|
+
discount_amount_atoms: t.array(Ee),
|
|
373
379
|
subscription_item_id: t.string()
|
|
374
|
-
}),
|
|
375
|
-
coupon:
|
|
376
|
-
}),
|
|
380
|
+
}), qt = t.object({
|
|
381
|
+
coupon: ge
|
|
382
|
+
}), zt = t.object({
|
|
377
383
|
currency: t.string(),
|
|
378
|
-
discounts: t.array(
|
|
379
|
-
hosted_invoice_url:
|
|
380
|
-
lines: t.array(
|
|
384
|
+
discounts: t.array(qt),
|
|
385
|
+
hosted_invoice_url: y(t.string()),
|
|
386
|
+
lines: t.array($t),
|
|
381
387
|
remaining_amount_atom: t.number(),
|
|
382
388
|
tax_amount_atom: t.number(),
|
|
383
389
|
total_amount_atom: t.number(),
|
|
384
|
-
total_discount_amount_atoms: t.array(
|
|
385
|
-
}),
|
|
386
|
-
created: t.array(
|
|
387
|
-
invoices: t.array(
|
|
388
|
-
}),
|
|
389
|
-
preview:
|
|
390
|
-
preview_post_trial:
|
|
391
|
-
coupons: t.array(
|
|
392
|
-
}),
|
|
390
|
+
total_discount_amount_atoms: t.array(Ee)
|
|
391
|
+
}), te = t.object({
|
|
392
|
+
created: t.array(Ut),
|
|
393
|
+
invoices: t.array(zt)
|
|
394
|
+
}), be = t.object({
|
|
395
|
+
preview: te,
|
|
396
|
+
preview_post_trial: y(te),
|
|
397
|
+
coupons: t.array(ge)
|
|
398
|
+
}), ne = t.object({
|
|
393
399
|
status: t.literal("open"),
|
|
394
400
|
token: t.string(),
|
|
395
|
-
email:
|
|
396
|
-
line_items: t.array(
|
|
401
|
+
email: y(t.string()),
|
|
402
|
+
line_items: t.array(we),
|
|
397
403
|
amount_subtotal_atom: t.number().int(),
|
|
398
404
|
amount_total_atom: t.number().int(),
|
|
399
|
-
brand:
|
|
400
|
-
subs_preview:
|
|
405
|
+
brand: Dt,
|
|
406
|
+
subs_preview: y(be),
|
|
401
407
|
// Null in setup mode
|
|
402
|
-
methods_available: t.array(
|
|
403
|
-
}),
|
|
408
|
+
methods_available: t.array(j)
|
|
409
|
+
}), Ce = t.discriminatedUnion("mode", [
|
|
404
410
|
t.object({
|
|
405
411
|
mode: t.literal("setup"),
|
|
406
412
|
currency: t.nullable(t.undefined())
|
|
407
|
-
}).extend(
|
|
413
|
+
}).extend(ne.shape),
|
|
408
414
|
t.object({
|
|
409
415
|
mode: t.enum(["payment", "subscription"]),
|
|
410
416
|
currency: t.string()
|
|
411
|
-
}).extend(
|
|
412
|
-
]),
|
|
417
|
+
}).extend(ne.shape)
|
|
418
|
+
]), Vt = t.object({
|
|
413
419
|
status: t.literal("complete")
|
|
414
|
-
}),
|
|
420
|
+
}), Ht = t.object({
|
|
415
421
|
status: t.literal("expired")
|
|
416
422
|
});
|
|
417
|
-
t.union([
|
|
423
|
+
t.union([Ce, Vt, Ht]);
|
|
418
424
|
t.object({
|
|
419
425
|
logo: t.string(),
|
|
420
426
|
icon: t.string(),
|
|
421
427
|
primary_color: t.string(),
|
|
422
428
|
secondary_color: t.string()
|
|
423
429
|
});
|
|
424
|
-
const
|
|
430
|
+
const Se = t.object({
|
|
425
431
|
invoice_urls: t.array(t.string()),
|
|
426
432
|
subscription_ids: t.array(t.string()),
|
|
427
433
|
customer_id: t.string()
|
|
@@ -433,63 +439,71 @@ t.object({
|
|
|
433
439
|
customer_email: t.string(),
|
|
434
440
|
customer_zip_code: t.string(),
|
|
435
441
|
customer_country: t.string(),
|
|
436
|
-
line_items: t.array(
|
|
442
|
+
line_items: t.array(we),
|
|
437
443
|
total_amount_atom: t.number().int(),
|
|
438
444
|
cancel_at_end: t.boolean(),
|
|
439
|
-
checkout_payment_method:
|
|
445
|
+
checkout_payment_method: j,
|
|
440
446
|
promotion_code: t.string().optional(),
|
|
441
447
|
do_not_use_legacy_cc_flow: t.boolean().optional()
|
|
442
448
|
});
|
|
443
|
-
const
|
|
449
|
+
const Kt = t.object({
|
|
444
450
|
payment_method_id: t.string()
|
|
445
451
|
});
|
|
446
452
|
t.object({
|
|
447
453
|
id: t.string(),
|
|
448
454
|
return_url: t.string()
|
|
449
455
|
});
|
|
450
|
-
const
|
|
456
|
+
const Yt = t.object({
|
|
451
457
|
type: t.string(),
|
|
452
458
|
loc: t.array(t.string()),
|
|
453
459
|
msg: t.string(),
|
|
454
460
|
url: t.string()
|
|
455
461
|
});
|
|
456
|
-
t.array(
|
|
457
|
-
|
|
462
|
+
t.array(Yt);
|
|
463
|
+
t.object({
|
|
464
|
+
new_customer_email: t.string().optional(),
|
|
465
|
+
new_customer_address: t.record(t.string(), t.any()).optional(),
|
|
466
|
+
payment_provider: t.string(),
|
|
467
|
+
checkout_payment_method: j,
|
|
468
|
+
existing_cc_pm_id: t.string().optional(),
|
|
469
|
+
their_existing_pm_id: t.string().optional()
|
|
470
|
+
});
|
|
471
|
+
const Pe = t.object({
|
|
458
472
|
required_user_actions: t.array(t.record(t.string(), t.any()))
|
|
459
473
|
});
|
|
460
474
|
t.object({
|
|
461
|
-
fields:
|
|
462
|
-
checkoutPaymentMethod:
|
|
475
|
+
fields: at,
|
|
476
|
+
checkoutPaymentMethod: j
|
|
463
477
|
});
|
|
464
478
|
t.object({
|
|
465
479
|
session_id: t.string(),
|
|
466
|
-
non_cde_form_fields:
|
|
467
|
-
checkout_payment_method:
|
|
480
|
+
non_cde_form_fields: T,
|
|
481
|
+
checkout_payment_method: j
|
|
468
482
|
});
|
|
469
|
-
const
|
|
483
|
+
const Bt = t.object({
|
|
470
484
|
required_user_actions: t.array(t.record(t.string(), t.any())),
|
|
471
485
|
cc_pm_id: t.string()
|
|
472
486
|
});
|
|
473
487
|
t.record(t.any());
|
|
474
|
-
const
|
|
475
|
-
function
|
|
488
|
+
const Zt = (n) => n.reduce((e, r) => e + r, 0);
|
|
489
|
+
function Jt(n, e) {
|
|
476
490
|
var r = Object.setPrototypeOf;
|
|
477
491
|
r ? r(n, e) : n.__proto__ = e;
|
|
478
492
|
}
|
|
479
|
-
function
|
|
493
|
+
function Wt(n, e) {
|
|
480
494
|
e === void 0 && (e = n.constructor);
|
|
481
495
|
var r = Error.captureStackTrace;
|
|
482
496
|
r && r(n, e);
|
|
483
497
|
}
|
|
484
|
-
var
|
|
498
|
+
var Gt = /* @__PURE__ */ function() {
|
|
485
499
|
var n = function(r, o) {
|
|
486
500
|
return n = Object.setPrototypeOf || {
|
|
487
501
|
__proto__: []
|
|
488
502
|
} instanceof Array && function(s, i) {
|
|
489
503
|
s.__proto__ = i;
|
|
490
504
|
} || function(s, i) {
|
|
491
|
-
for (var
|
|
492
|
-
Object.prototype.hasOwnProperty.call(i,
|
|
505
|
+
for (var c in i)
|
|
506
|
+
Object.prototype.hasOwnProperty.call(i, c) && (s[c] = i[c]);
|
|
493
507
|
}, n(r, o);
|
|
494
508
|
};
|
|
495
509
|
return function(e, r) {
|
|
@@ -500,19 +514,19 @@ var Kt = /* @__PURE__ */ function() {
|
|
|
500
514
|
}
|
|
501
515
|
e.prototype = r === null ? Object.create(r) : (o.prototype = r.prototype, new o());
|
|
502
516
|
};
|
|
503
|
-
}(),
|
|
504
|
-
|
|
517
|
+
}(), Qt = function(n) {
|
|
518
|
+
Gt(e, n);
|
|
505
519
|
function e(r, o) {
|
|
506
520
|
var s = this.constructor, i = n.call(this, r, o) || this;
|
|
507
521
|
return Object.defineProperty(i, "name", {
|
|
508
522
|
value: s.name,
|
|
509
523
|
enumerable: !1,
|
|
510
524
|
configurable: !0
|
|
511
|
-
}),
|
|
525
|
+
}), Jt(i, s.prototype), Wt(i), i;
|
|
512
526
|
}
|
|
513
527
|
return e;
|
|
514
528
|
}(Error);
|
|
515
|
-
class
|
|
529
|
+
class ve extends Qt {
|
|
516
530
|
constructor(e) {
|
|
517
531
|
const r = `[cde-client] Error querying CDE: ${e.message}`;
|
|
518
532
|
super(r), this.response = e;
|
|
@@ -521,63 +535,239 @@ class ge extends Bt {
|
|
|
521
535
|
return this.response.message;
|
|
522
536
|
}
|
|
523
537
|
}
|
|
524
|
-
const
|
|
538
|
+
const S = async (n, e, r) => {
|
|
525
539
|
const o = await n.send(e);
|
|
526
|
-
if (
|
|
527
|
-
throw new
|
|
528
|
-
if (!
|
|
540
|
+
if (en(o))
|
|
541
|
+
throw new ve(o);
|
|
542
|
+
if (!Xt(o, r)) {
|
|
529
543
|
const s = r.safeParse(o);
|
|
530
544
|
throw s.success ? new Error("Invalid state") : s.error;
|
|
531
545
|
}
|
|
532
546
|
return o;
|
|
533
|
-
},
|
|
534
|
-
const o = await
|
|
547
|
+
}, Xt = (n, e) => e.safeParse(n).success, en = (n) => Ft.safeParse(n).success, tn = async (n, e) => await S(n, { type: "get_checkout_preview", payload: e }, be), M = async (n) => await S(n, { type: "get_prefill", payload: {} }, Ce), nn = async (n, e) => await S(n, { type: "v2_start_payment_flow", payload: e }, Pe), rn = async (n, e) => await S(n, { type: "start_payment_flow_for_cc", payload: e }, Bt), on = async (n, e) => await S(n, { type: "start_payment_flow_for_pr", payload: e }, Pe), J = async (n, e) => await S(n, { type: "confirm_payment_flow", payload: e }, ft), sn = async (n, e, r) => {
|
|
548
|
+
const o = await tn(n, {
|
|
535
549
|
secure_token: e,
|
|
536
550
|
promotion_code: r
|
|
537
|
-
}), s = new Set(o.preview.invoices.map((
|
|
551
|
+
}), s = new Set(o.preview.invoices.map((a) => a.currency));
|
|
538
552
|
if (s.size !== 1)
|
|
539
553
|
throw new Error(`Expected exactly one currency, got ${s.size}`);
|
|
540
|
-
const i = s.values().next().value ?? "usd",
|
|
554
|
+
const i = s.values().next().value ?? "usd", c = Zt(o.preview.invoices.map((a) => a.remaining_amount_atom));
|
|
541
555
|
return {
|
|
542
556
|
currency: i,
|
|
543
|
-
amountAtom:
|
|
557
|
+
amountAtom: c
|
|
544
558
|
};
|
|
545
|
-
},
|
|
559
|
+
}, ke = async (n, e, r, o) => {
|
|
546
560
|
if (r)
|
|
547
561
|
return { amountAtom: 0, currency: "usd" };
|
|
548
562
|
{
|
|
549
563
|
o = o || void 0;
|
|
550
|
-
const s = await
|
|
564
|
+
const s = await sn(n, e, o);
|
|
551
565
|
return { amountAtom: s.amountAtom, currency: s.currency };
|
|
552
566
|
}
|
|
553
|
-
},
|
|
567
|
+
}, an = async (n, e) => {
|
|
554
568
|
if (n.size === 0)
|
|
555
569
|
throw new Error("No CDE connections found");
|
|
556
570
|
return await Promise.all(
|
|
557
571
|
Array.from(n.values()).map(
|
|
558
|
-
(o) =>
|
|
572
|
+
(o) => S(o, { type: "tokenize_card", payload: e }, _t)
|
|
559
573
|
)
|
|
560
574
|
);
|
|
561
|
-
},
|
|
575
|
+
}, re = async (n, e) => {
|
|
562
576
|
try {
|
|
563
|
-
return await
|
|
577
|
+
return await S(n, { type: "checkout_card_elements", payload: e }, Se);
|
|
564
578
|
} catch (r) {
|
|
565
579
|
throw r;
|
|
566
580
|
}
|
|
567
|
-
},
|
|
568
|
-
const o = await
|
|
581
|
+
}, cn = async (n, e) => await S(n, { type: "setup_payment_method", payload: e }, Kt), Re = async (n, e) => await S(n, { type: "checkout", payload: e }, Se), Oe = 1e3, ln = async (n, e) => {
|
|
582
|
+
const o = await de({
|
|
569
583
|
iframe: n,
|
|
570
584
|
debug: !0,
|
|
571
|
-
timeout:
|
|
585
|
+
timeout: Oe,
|
|
572
586
|
childOrigin: "*"
|
|
573
587
|
// TODO: use with proper childOrigin
|
|
574
588
|
}).promise;
|
|
575
|
-
return (await
|
|
576
|
-
},
|
|
589
|
+
return (await S(o, { type: "ping-3ds-status" }, gt)).status;
|
|
590
|
+
}, W = (n) => async (e) => {
|
|
591
|
+
try {
|
|
592
|
+
e.flowCallbacks.onCheckoutStarted();
|
|
593
|
+
const r = await n(e);
|
|
594
|
+
if (r.mode === "setup")
|
|
595
|
+
e.flowCallbacks.onSetupPaymentMethodSuccess(r.result.payment_method_id);
|
|
596
|
+
else if (r.mode === "checkout")
|
|
597
|
+
e.flowCallbacks.onCheckoutSuccess(
|
|
598
|
+
r.result.invoice_urls,
|
|
599
|
+
r.result.subscription_ids,
|
|
600
|
+
r.result.customer_id
|
|
601
|
+
);
|
|
602
|
+
else
|
|
603
|
+
throw new Error(`Unhandled mode: ${r}`);
|
|
604
|
+
} catch (r) {
|
|
605
|
+
throw e.flowCallbacks.onCheckoutError(me(r)), r;
|
|
606
|
+
}
|
|
607
|
+
}, Ae = (n) => async (e) => {
|
|
608
|
+
try {
|
|
609
|
+
return await n(e);
|
|
610
|
+
} catch (r) {
|
|
611
|
+
const { err__: o } = v("init-error-catcher");
|
|
612
|
+
return o(r), { isAvailable: !1, reason: me(r) };
|
|
613
|
+
}
|
|
614
|
+
}, v = (n) => {
|
|
615
|
+
const e = (...o) => {
|
|
616
|
+
window.console.log(`${L.green.bold("ojs/")}${L.bold.gray(`${n}`)} `, ...o);
|
|
617
|
+
}, r = (...o) => {
|
|
618
|
+
window.console.error(`${L.red.bold("ojs/")}${L.bold.gray(`${n}`)} `, ...o);
|
|
619
|
+
};
|
|
620
|
+
return {
|
|
621
|
+
log: e,
|
|
622
|
+
err: r,
|
|
623
|
+
log__: e,
|
|
624
|
+
err__: r
|
|
625
|
+
};
|
|
626
|
+
}, { log__: tr, err__: un } = v("common"), G = (n) => {
|
|
627
|
+
if (n.payment_methods.length !== 1)
|
|
628
|
+
throw new Error(`Expected exactly one payment method, got ${n.payment_methods.length}`);
|
|
629
|
+
return { payment_method_id: n.payment_methods[0].id };
|
|
630
|
+
}, Ie = (n, e) => {
|
|
631
|
+
const r = n.find((o) => e.safeParse(o).success);
|
|
632
|
+
if (!r)
|
|
633
|
+
throw un("No CPMs found for model. All models:", n), new Error("No CPMs found for model");
|
|
634
|
+
return e.parse(r);
|
|
635
|
+
}, { log__: dn, err__: Te } = v("common-cc"), Q = (n, e) => {
|
|
636
|
+
const r = T.safeParse(n);
|
|
637
|
+
if (!r.success) {
|
|
638
|
+
const o = r.error.format(), s = Et(o);
|
|
639
|
+
for (const [i, c] of Object.entries(s))
|
|
640
|
+
e(i, c, i);
|
|
641
|
+
throw Te("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
|
|
642
|
+
}
|
|
643
|
+
return r.data;
|
|
644
|
+
}, mn = (n, e) => {
|
|
645
|
+
for (const r of n)
|
|
646
|
+
if (r.success === !1)
|
|
647
|
+
throw r.errors.forEach((o) => {
|
|
648
|
+
const s = he.safeParse(o.elementType);
|
|
649
|
+
if (!s.success)
|
|
650
|
+
Te(`Unknown field name in onValidationError: ${o.elementType}`);
|
|
651
|
+
else {
|
|
652
|
+
const i = s.data;
|
|
653
|
+
e(i, o.errors);
|
|
654
|
+
}
|
|
655
|
+
}), dn(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
|
|
656
|
+
}, pn = "ojs-stripe-link-btn", { log__: E, err__: fn } = v("stripe-link"), yn = t.object({
|
|
657
|
+
provider: t.literal("stripe_link"),
|
|
658
|
+
processor_name: t.literal("stripe"),
|
|
659
|
+
metadata: t.object({
|
|
660
|
+
stripe_pk: t.string()
|
|
661
|
+
})
|
|
662
|
+
}), hn = t.array(
|
|
663
|
+
t.object({
|
|
664
|
+
our_existing_pm_id: t.string()
|
|
665
|
+
})
|
|
666
|
+
).length(1), _n = Ae(
|
|
667
|
+
async ({ context: n, flowCallbacks: e }) => {
|
|
668
|
+
var d;
|
|
669
|
+
E("Checking if there are any CPMs for Stripe PR...");
|
|
670
|
+
const r = Ie(n.checkoutPaymentMethods, yn);
|
|
671
|
+
E("Starting stripe link flow...");
|
|
672
|
+
const o = Array.from(n.cdeConnections.values())[0], s = await M(o), i = s.mode === "setup";
|
|
673
|
+
E("Creating stripe elements...");
|
|
674
|
+
const c = await ke(o, s.token, i, void 0), { elements: a, stripe: l } = await Pt(r.metadata.stripe_pk, {
|
|
675
|
+
mode: "setup",
|
|
676
|
+
currency: c.currency,
|
|
677
|
+
setup_future_usage: "off_session",
|
|
678
|
+
paymentMethodCreation: "manual"
|
|
679
|
+
});
|
|
680
|
+
E("Mounting payment element...");
|
|
681
|
+
const u = a.create("expressCheckout", {
|
|
682
|
+
buttonHeight: (d = n.customInitParams.stripeLink) == null ? void 0 : d.buttonHeight,
|
|
683
|
+
paymentMethods: {
|
|
684
|
+
amazonPay: "never",
|
|
685
|
+
applePay: "never",
|
|
686
|
+
googlePay: "never",
|
|
687
|
+
paypal: "never"
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
return u.mount(`#${pn}`), u.on("click", async (f) => {
|
|
691
|
+
var p;
|
|
692
|
+
if (E("Stripe Link button clicked"), (p = n.customInitParams.stripeLink) != null && p.overrideLinkSubmit && !await n.customInitParams.stripeLink.overrideLinkSubmit()) {
|
|
693
|
+
E("Stripe Link submit aborted by overrideLinkSubmit");
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
f.resolve();
|
|
697
|
+
}), u.on("confirm", async (f) => {
|
|
698
|
+
E("Stripe Link window confirmed", f);
|
|
699
|
+
const p = await l.createPaymentMethod({
|
|
700
|
+
elements: a,
|
|
701
|
+
params: {
|
|
702
|
+
billing_details: f.billingDetails
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
p.error ? (fn("error", p.error), e.onCheckoutError(p.error.message ?? "Stripe Link unknown error")) : (E("paymentMethod", p.paymentMethod), k.stripeLink.run({
|
|
706
|
+
context: n,
|
|
707
|
+
checkoutPaymentMethod: r,
|
|
708
|
+
nonCdeFormInputs: Y(n.formDiv),
|
|
709
|
+
flowCallbacks: e,
|
|
710
|
+
customParams: { stripePM: p.paymentMethod },
|
|
711
|
+
initResult: { isAvailable: !0 }
|
|
712
|
+
}));
|
|
713
|
+
}), { isAvailable: !0 };
|
|
714
|
+
}
|
|
715
|
+
), gn = W(
|
|
716
|
+
async ({
|
|
717
|
+
context: n,
|
|
718
|
+
checkoutPaymentMethod: e,
|
|
719
|
+
nonCdeFormInputs: r,
|
|
720
|
+
flowCallbacks: o,
|
|
721
|
+
customParams: s
|
|
722
|
+
}) => {
|
|
723
|
+
E("Running Stripe PR flow...");
|
|
724
|
+
const i = Array.from(n.cdeConnections.values())[0];
|
|
725
|
+
E("Merging PM fields with form fields...");
|
|
726
|
+
const c = wn(r, s.stripePM), a = Q(c, o.onValidationError);
|
|
727
|
+
E("Starting payment flow...");
|
|
728
|
+
const l = await nn(i, {
|
|
729
|
+
payment_provider: e.provider,
|
|
730
|
+
checkout_payment_method: e,
|
|
731
|
+
their_existing_pm_id: s.stripePM.id
|
|
732
|
+
});
|
|
733
|
+
E("Start payment flow response", l);
|
|
734
|
+
const d = hn.parse(l.required_user_actions)[0].our_existing_pm_id, f = await M(i);
|
|
735
|
+
if (f.mode === "setup") {
|
|
736
|
+
E("Doing payment setup...");
|
|
737
|
+
const p = await J(i, {
|
|
738
|
+
secure_token: f.token,
|
|
739
|
+
existing_cc_pm_id: d
|
|
740
|
+
});
|
|
741
|
+
return { mode: "setup", result: G(p) };
|
|
742
|
+
} else {
|
|
743
|
+
E("Doing checkout...");
|
|
744
|
+
const p = {
|
|
745
|
+
secure_token: f.token,
|
|
746
|
+
payment_input: {
|
|
747
|
+
provider_type: e.provider
|
|
748
|
+
},
|
|
749
|
+
customer_email: a[m.EMAIL],
|
|
750
|
+
customer_zip_code: a[m.ZIP_CODE],
|
|
751
|
+
customer_country: a[m.COUNTRY],
|
|
752
|
+
promotion_code: a[m.PROMOTION_CODE],
|
|
753
|
+
line_items: f.line_items,
|
|
754
|
+
total_amount_atom: f.amount_total_atom,
|
|
755
|
+
cancel_at_end: !1,
|
|
756
|
+
checkout_payment_method: e
|
|
757
|
+
};
|
|
758
|
+
return { mode: "checkout", result: await Re(i, p) };
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
), wn = (n, e) => {
|
|
762
|
+
var c, a, l, u, d;
|
|
763
|
+
const r = { ...n }, [o, ...s] = ((a = (c = e.billing_details.name) == null ? void 0 : c.trim()) == null ? void 0 : a.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
|
|
764
|
+
return r[m.FIRST_NAME] = r[m.FIRST_NAME] || o || "_OP_UNKNOWN", r[m.LAST_NAME] = r[m.LAST_NAME] || i || "_OP_UNKNOWN", r[m.EMAIL] = r[m.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
765
|
+
((l = e.link) == null ? void 0 : l.email) || e.billing_details.email || "op_unfilled@getopenpay.com", r[m.ZIP_CODE] = r[m.ZIP_CODE] || ((u = e.billing_details.address) == null ? void 0 : u.postal_code) || "00000", r[m.COUNTRY] = r[m.COUNTRY] || ((d = e.billing_details.address) == null ? void 0 : d.country) || "US", E("Final form inputs:", r), r;
|
|
766
|
+
}, En = "@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}", bn = (n) => {
|
|
577
767
|
const e = document.createElement("template");
|
|
578
768
|
e.innerHTML = `
|
|
579
769
|
<style>
|
|
580
|
-
${
|
|
770
|
+
${En}
|
|
581
771
|
</style>
|
|
582
772
|
<div class="overlay">
|
|
583
773
|
<div class="container">
|
|
@@ -591,218 +781,152 @@ const C = async (n, e, r) => {
|
|
|
591
781
|
const s = o.querySelector("#three-ds-iframe"), i = o.querySelector(".cancel-button");
|
|
592
782
|
return document.body.appendChild(r), { host: r, iframe: s, cancelButton: i };
|
|
593
783
|
};
|
|
594
|
-
function
|
|
784
|
+
function Cn(n, e, r) {
|
|
595
785
|
const o = async () => {
|
|
596
786
|
try {
|
|
597
|
-
const i = await
|
|
787
|
+
const i = await ln(n, r);
|
|
598
788
|
i && (clearInterval(s), e(i));
|
|
599
789
|
} catch {
|
|
600
790
|
}
|
|
601
791
|
};
|
|
602
792
|
o();
|
|
603
|
-
const s = setInterval(o,
|
|
793
|
+
const s = setInterval(o, Oe);
|
|
604
794
|
return s;
|
|
605
795
|
}
|
|
606
|
-
function
|
|
796
|
+
function Sn({
|
|
607
797
|
elements: n,
|
|
608
798
|
pollingInterval: e,
|
|
609
799
|
resolve: r
|
|
610
800
|
}) {
|
|
611
801
|
const o = () => {
|
|
612
|
-
clearInterval(e), n.host.remove(), r(
|
|
802
|
+
clearInterval(e), n.host.remove(), r(x.CANCELLED);
|
|
613
803
|
};
|
|
614
804
|
return n.cancelButton.addEventListener("click", o), () => {
|
|
615
805
|
n.cancelButton.removeEventListener("click", o);
|
|
616
806
|
};
|
|
617
807
|
}
|
|
618
|
-
async function
|
|
808
|
+
async function Pn({
|
|
619
809
|
url: n,
|
|
620
810
|
baseUrl: e
|
|
621
811
|
}) {
|
|
622
|
-
const r =
|
|
812
|
+
const r = bn(n);
|
|
623
813
|
return new Promise((o) => {
|
|
624
|
-
const s = (
|
|
814
|
+
const s = (a) => {
|
|
625
815
|
setTimeout(() => {
|
|
626
816
|
r.host.remove();
|
|
627
|
-
}, 1e3), o(
|
|
628
|
-
}, i =
|
|
817
|
+
}, 1e3), o(a), c == null || c();
|
|
818
|
+
}, i = Cn(r.iframe, s, new URL(e).origin), c = Sn({
|
|
629
819
|
elements: r,
|
|
630
820
|
pollingInterval: i,
|
|
631
821
|
resolve: o
|
|
632
822
|
});
|
|
633
823
|
});
|
|
634
824
|
}
|
|
635
|
-
const
|
|
636
|
-
try {
|
|
637
|
-
e.flowCallbacks.onCheckoutStarted();
|
|
638
|
-
const r = await n(e);
|
|
639
|
-
if (r.mode === "setup")
|
|
640
|
-
e.flowCallbacks.onSetupPaymentMethodSuccess(r.result.payment_method_id);
|
|
641
|
-
else if (r.mode === "checkout")
|
|
642
|
-
e.flowCallbacks.onCheckoutSuccess(
|
|
643
|
-
r.result.invoice_urls,
|
|
644
|
-
r.result.subscription_ids,
|
|
645
|
-
r.result.customer_id
|
|
646
|
-
);
|
|
647
|
-
else
|
|
648
|
-
throw new Error(`Unhandled mode: ${r}`);
|
|
649
|
-
} catch (r) {
|
|
650
|
-
throw e.flowCallbacks.onCheckoutError(ie(r)), r;
|
|
651
|
-
}
|
|
652
|
-
}, un = (n) => async (e) => {
|
|
653
|
-
try {
|
|
654
|
-
return await n(e);
|
|
655
|
-
} catch (r) {
|
|
656
|
-
const { err__: o } = P("init-error-catcher");
|
|
657
|
-
return o(r), { isAvailable: !1, reason: ie(r) };
|
|
658
|
-
}
|
|
659
|
-
}, P = (n) => {
|
|
660
|
-
const e = (...o) => {
|
|
661
|
-
window.console.log(`${T.green.bold("ojs/")}${T.bold.gray(`${n}`)} `, ...o);
|
|
662
|
-
}, r = (...o) => {
|
|
663
|
-
window.console.error(`${T.red.bold("ojs/")}${T.bold.gray(`${n}`)} `, ...o);
|
|
664
|
-
};
|
|
665
|
-
return {
|
|
666
|
-
log: e,
|
|
667
|
-
err: r,
|
|
668
|
-
log__: e,
|
|
669
|
-
err__: r
|
|
670
|
-
};
|
|
671
|
-
}, { log__: dn, err__: Ce } = P("common-cc"), Se = (n, e) => {
|
|
672
|
-
const r = A.safeParse(n);
|
|
673
|
-
if (!r.success) {
|
|
674
|
-
const o = r.error.format(), s = pt(o);
|
|
675
|
-
for (const [i, a] of Object.entries(s))
|
|
676
|
-
e(i, a, i);
|
|
677
|
-
throw Ce("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
|
|
678
|
-
}
|
|
679
|
-
return r.data;
|
|
680
|
-
}, mn = (n, e) => {
|
|
681
|
-
for (const r of n)
|
|
682
|
-
if (r.success === !1)
|
|
683
|
-
throw r.errors.forEach((o) => {
|
|
684
|
-
const s = ue.safeParse(o.elementType);
|
|
685
|
-
if (!s.success)
|
|
686
|
-
Ce(`Unknown field name in onValidationError: ${o.elementType}`);
|
|
687
|
-
else {
|
|
688
|
-
const i = s.data;
|
|
689
|
-
e(i, o.errors);
|
|
690
|
-
}
|
|
691
|
-
}), dn(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
|
|
692
|
-
}, { err__: q } = P("commmon"), Pe = (n) => {
|
|
693
|
-
if (n.payment_methods.length !== 1)
|
|
694
|
-
throw new Error(`Expected exactly one payment method, got ${n.payment_methods.length}`);
|
|
695
|
-
return { payment_method_id: n.payment_methods[0].id };
|
|
696
|
-
}, pn = (n, e) => {
|
|
697
|
-
const r = n.find((o) => e.safeParse(o).success);
|
|
698
|
-
if (!r)
|
|
699
|
-
throw q(`No CPMs found for model ${e}`), q(n), q("zodModel"), new Error(`No CPMs found for model ${e}`);
|
|
700
|
-
return e.parse(r);
|
|
701
|
-
}, { log__: p, err__: X } = P("common-cc"), { log__: ee } = P("stripe-cc"), fn = be(
|
|
825
|
+
const { log__: h, err__: oe } = v("common-cc"), { log__: se } = v("stripe-cc"), vn = W(
|
|
702
826
|
async ({ context: n, checkoutPaymentMethod: e, nonCdeFormInputs: r, flowCallbacks: o }) => {
|
|
703
827
|
var u;
|
|
704
|
-
|
|
705
|
-
const s = Array.from(n.cdeConnections.values())[0], i = await
|
|
706
|
-
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
const
|
|
828
|
+
h("├ Running common CC flow...", { checkoutPaymentMethod: e });
|
|
829
|
+
const s = Array.from(n.cdeConnections.values())[0], i = await M(s);
|
|
830
|
+
h(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
|
|
831
|
+
const c = Q(r, o.onValidationError);
|
|
832
|
+
h(`├ Tokenizing card info in CDE [Session: ${n.elementsSessionId}]`);
|
|
833
|
+
const a = await an(n.cdeConnections, {
|
|
710
834
|
session_id: n.elementsSessionId
|
|
711
835
|
});
|
|
712
|
-
mn(
|
|
836
|
+
mn(a, o.onValidationError);
|
|
713
837
|
const l = {
|
|
714
838
|
session_id: n.elementsSessionId,
|
|
715
839
|
checkout_payment_method: e,
|
|
716
|
-
non_cde_form_fields:
|
|
840
|
+
non_cde_form_fields: c
|
|
717
841
|
};
|
|
718
842
|
try {
|
|
719
843
|
if (i.mode === "setup") {
|
|
720
|
-
|
|
721
|
-
const d = await
|
|
722
|
-
return
|
|
844
|
+
h(`├ Setting up payment method in CDE [Token: ${i.token}]`);
|
|
845
|
+
const d = await cn(s, l);
|
|
846
|
+
return h(`╰ Setup completed successfully [PM ID: ${d.payment_method_id}]`), { mode: "setup", result: d };
|
|
723
847
|
} else {
|
|
724
|
-
|
|
725
|
-
const d = await
|
|
726
|
-
return
|
|
848
|
+
h(`├ Initial checkout flow. Checking out card info in CDE [Session: ${n.elementsSessionId}]`);
|
|
849
|
+
const d = await re(s, l);
|
|
850
|
+
return h("╰ Checkout completed successfully."), { mode: "checkout", result: d };
|
|
727
851
|
}
|
|
728
852
|
} catch (d) {
|
|
729
|
-
if (d instanceof
|
|
730
|
-
|
|
731
|
-
const
|
|
732
|
-
if (
|
|
733
|
-
|
|
734
|
-
const
|
|
853
|
+
if (d instanceof ve && d.originalErrorMessage === "3DS_REQUIRED") {
|
|
854
|
+
h("├ Card requires 3DS, starting non-legacy payment flow"), h("error.response.headers", d.response.headers);
|
|
855
|
+
const f = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", p = await rn(s, l);
|
|
856
|
+
if (h(`├ op-should-use-new-flow: ${f}`), h("├ Payment flow result:", p), f ? await On(p, n.baseUrl) : await An(p), i.mode === "setup") {
|
|
857
|
+
h(`├ Confirming payment flow [cc_pm_id: ${p.cc_pm_id}]`);
|
|
858
|
+
const b = await J(s, {
|
|
735
859
|
secure_token: i.token,
|
|
736
|
-
existing_cc_pm_id:
|
|
860
|
+
existing_cc_pm_id: p.cc_pm_id
|
|
737
861
|
});
|
|
738
|
-
|
|
739
|
-
const
|
|
740
|
-
return
|
|
862
|
+
h("├ Confirm payment flow result received Result:", b);
|
|
863
|
+
const P = G(b);
|
|
864
|
+
return h(`╰ Setup completed successfully [PM ID: ${P.payment_method_id}]`), { mode: "setup", result: P };
|
|
741
865
|
} else {
|
|
742
|
-
|
|
743
|
-
const
|
|
866
|
+
h(`├ Checking out after 3DS flow [Flow: ${f ? "new" : "legacy"}]`);
|
|
867
|
+
const b = await re(s, {
|
|
744
868
|
...l,
|
|
745
|
-
existing_cc_pm_id:
|
|
746
|
-
do_not_use_legacy_cc_flow: !
|
|
869
|
+
existing_cc_pm_id: p.cc_pm_id,
|
|
870
|
+
do_not_use_legacy_cc_flow: !f
|
|
747
871
|
});
|
|
748
|
-
return
|
|
872
|
+
return h("╰ Checkout completed successfully."), { mode: "checkout", result: b };
|
|
749
873
|
}
|
|
750
874
|
}
|
|
751
|
-
throw
|
|
875
|
+
throw oe("╰ Error checking out card info in CDE"), oe(d), d;
|
|
752
876
|
}
|
|
753
877
|
}
|
|
754
|
-
),
|
|
878
|
+
), kn = (n) => {
|
|
755
879
|
const e = n.required_user_actions.find((r) => r.type === "stripe_3ds");
|
|
756
880
|
if (!e)
|
|
757
881
|
throw new Error("No stripe 3DS action found");
|
|
758
|
-
return
|
|
759
|
-
},
|
|
882
|
+
return bt.parse(e);
|
|
883
|
+
}, Rn = (n) => {
|
|
760
884
|
const e = n.required_user_actions.find((r) => r.type === "airwallex_payment_consent");
|
|
761
885
|
if (!e)
|
|
762
886
|
throw new Error("No common 3DS action found");
|
|
763
|
-
return
|
|
764
|
-
},
|
|
765
|
-
const r =
|
|
766
|
-
|
|
767
|
-
const o = await
|
|
768
|
-
if (
|
|
887
|
+
return wt.parse(e);
|
|
888
|
+
}, On = async (n, e) => {
|
|
889
|
+
const r = Rn(n);
|
|
890
|
+
h(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);
|
|
891
|
+
const o = await Pn({ url: r.redirect_url, baseUrl: e });
|
|
892
|
+
if (h(`╰ 3DS verification completed [Status: ${o}]`), o === x.CANCELLED)
|
|
769
893
|
throw new Error("3DS verification cancelled");
|
|
770
|
-
if (o ===
|
|
894
|
+
if (o === x.FAILURE)
|
|
771
895
|
throw new Error("3DS verification failed");
|
|
772
|
-
},
|
|
773
|
-
const e =
|
|
774
|
-
|
|
775
|
-
}, { log__:
|
|
896
|
+
}, An = async (n) => {
|
|
897
|
+
const e = kn(n);
|
|
898
|
+
se(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0, 8)}...]`), await At(e), se("╰ Stripe 3DS flow completed successfully");
|
|
899
|
+
}, { log__: w, err__: In } = v("stripe-pr"), Tn = t.object({
|
|
776
900
|
provider: t.union([t.literal("apple_pay"), t.literal("google_pay")]),
|
|
777
901
|
processor_name: t.literal("stripe"),
|
|
778
902
|
metadata: t.object({
|
|
779
903
|
stripe_pk: t.string()
|
|
780
904
|
})
|
|
781
|
-
}),
|
|
905
|
+
}), jn = Ae(
|
|
782
906
|
async ({ context: n }) => {
|
|
783
|
-
|
|
784
|
-
const e =
|
|
785
|
-
|
|
786
|
-
const r = Array.from(n.cdeConnections.values())[0], o = await
|
|
787
|
-
|
|
788
|
-
const i = await
|
|
907
|
+
w("Checking if there are any CPMs for Stripe PR...");
|
|
908
|
+
const e = Ie(n.checkoutPaymentMethods, Tn);
|
|
909
|
+
w("Initializing Stripe PR flow...");
|
|
910
|
+
const r = Array.from(n.cdeConnections.values())[0], o = await M(r), s = o.mode === "setup";
|
|
911
|
+
w("Getting initial preview amount");
|
|
912
|
+
const i = await ke(r, o.token, s, void 0), c = await vt(
|
|
789
913
|
e.metadata.stripe_pk,
|
|
790
914
|
i.amountAtom,
|
|
791
915
|
i.currency,
|
|
792
916
|
s
|
|
793
917
|
);
|
|
794
|
-
|
|
795
|
-
const
|
|
796
|
-
return
|
|
918
|
+
w("Checking if can make payment");
|
|
919
|
+
const a = await c.canMakePayment();
|
|
920
|
+
return a === null ? (In("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (w("Stripe PR flow initialized successfully. Can make payment", a), {
|
|
797
921
|
isAvailable: !0,
|
|
798
|
-
pr:
|
|
922
|
+
pr: c,
|
|
799
923
|
availableProviders: {
|
|
800
|
-
applePay:
|
|
801
|
-
googlePay:
|
|
924
|
+
applePay: a.applePay,
|
|
925
|
+
googlePay: a.googlePay
|
|
802
926
|
}
|
|
803
927
|
});
|
|
804
928
|
}
|
|
805
|
-
),
|
|
929
|
+
), Mn = W(
|
|
806
930
|
async ({
|
|
807
931
|
context: n,
|
|
808
932
|
checkoutPaymentMethod: e,
|
|
@@ -811,54 +935,54 @@ const be = (n) => async (e) => {
|
|
|
811
935
|
customParams: s,
|
|
812
936
|
initResult: i
|
|
813
937
|
}) => {
|
|
814
|
-
if (
|
|
938
|
+
if (w("Running Stripe PR flow..."), s.provider !== e.provider)
|
|
815
939
|
throw new Error(`Provider mismatch. Expected ${s.provider}, got ${e.provider}`);
|
|
816
|
-
const
|
|
940
|
+
const c = Array.from(n.cdeConnections.values())[0], a = i.pr;
|
|
817
941
|
if (s != null && s.overridePaymentRequest) {
|
|
818
|
-
const
|
|
819
|
-
|
|
942
|
+
const P = s.overridePaymentRequest;
|
|
943
|
+
w("Overriding PR amount with", P), Fn(a, P.amount, P.pending);
|
|
820
944
|
}
|
|
821
|
-
|
|
822
|
-
const l = await
|
|
823
|
-
|
|
824
|
-
const u =
|
|
825
|
-
|
|
826
|
-
const
|
|
945
|
+
w("Showing PR dialog..."), a.show();
|
|
946
|
+
const l = await Rt(a);
|
|
947
|
+
w("Stripe PM added event:", l), w("Merging PM fields with form fields...");
|
|
948
|
+
const u = Ln(r, l), d = Q(u, o.onValidationError);
|
|
949
|
+
w("PR dialog finished. Starting payment flow...");
|
|
950
|
+
const f = await on(c, {
|
|
827
951
|
fields: d,
|
|
828
952
|
checkoutPaymentMethod: e
|
|
829
|
-
}),
|
|
830
|
-
|
|
831
|
-
const
|
|
832
|
-
if (
|
|
833
|
-
|
|
834
|
-
const
|
|
835
|
-
secure_token:
|
|
953
|
+
}), p = Nn(f);
|
|
954
|
+
w("Confirming PR with Stripe..."), await Ot(p, l);
|
|
955
|
+
const b = await M(c);
|
|
956
|
+
if (b.mode === "setup") {
|
|
957
|
+
w("Confirming payment flow for setup...");
|
|
958
|
+
const P = await J(c, {
|
|
959
|
+
secure_token: b.token
|
|
836
960
|
});
|
|
837
|
-
return { mode: "setup", result:
|
|
961
|
+
return { mode: "setup", result: G(P) };
|
|
838
962
|
} else {
|
|
839
|
-
|
|
840
|
-
const
|
|
841
|
-
secure_token:
|
|
963
|
+
w("Performing checkout...");
|
|
964
|
+
const P = {
|
|
965
|
+
secure_token: b.token,
|
|
842
966
|
payment_input: {
|
|
843
967
|
provider_type: e.provider
|
|
844
968
|
},
|
|
845
|
-
customer_email: d[
|
|
846
|
-
customer_zip_code: d[
|
|
847
|
-
customer_country: d[
|
|
848
|
-
promotion_code: d[
|
|
849
|
-
line_items:
|
|
850
|
-
total_amount_atom:
|
|
969
|
+
customer_email: d[m.EMAIL],
|
|
970
|
+
customer_zip_code: d[m.ZIP_CODE],
|
|
971
|
+
customer_country: d[m.COUNTRY],
|
|
972
|
+
promotion_code: d[m.PROMOTION_CODE],
|
|
973
|
+
line_items: b.line_items,
|
|
974
|
+
total_amount_atom: b.amount_total_atom,
|
|
851
975
|
cancel_at_end: !1,
|
|
852
976
|
checkout_payment_method: e
|
|
853
977
|
};
|
|
854
|
-
return { mode: "checkout", result: await
|
|
978
|
+
return { mode: "checkout", result: await Re(c, P) };
|
|
855
979
|
}
|
|
856
980
|
}
|
|
857
|
-
),
|
|
858
|
-
var
|
|
859
|
-
const r = { ...n }, [o, ...s] = ((
|
|
860
|
-
return r[
|
|
861
|
-
},
|
|
981
|
+
), Ln = (n, e) => {
|
|
982
|
+
var c, a, l, u;
|
|
983
|
+
const r = { ...n }, [o, ...s] = ((a = (c = e.payerName) == null ? void 0 : c.trim()) == null ? void 0 : a.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
|
|
984
|
+
return r[m.FIRST_NAME] = r[m.FIRST_NAME] || o || "_OP_UNKNOWN", r[m.LAST_NAME] = r[m.LAST_NAME] || i || "_OP_UNKNOWN", r[m.EMAIL] = r[m.EMAIL] || e.payerEmail || "op_unfilled@getopenpay.com", r[m.ZIP_CODE] = r[m.ZIP_CODE] || ((l = e.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[m.COUNTRY] = r[m.COUNTRY] || ((u = e.shippingAddress) == null ? void 0 : u.country) || "US", w("Final form inputs:", r), r;
|
|
985
|
+
}, Fn = (n, e, r) => {
|
|
862
986
|
n.update({
|
|
863
987
|
total: {
|
|
864
988
|
amount: e.amountAtom,
|
|
@@ -867,116 +991,121 @@ const be = (n) => async (e) => {
|
|
|
867
991
|
},
|
|
868
992
|
currency: e.currency
|
|
869
993
|
});
|
|
870
|
-
},
|
|
994
|
+
}, Nn = (n) => {
|
|
871
995
|
if (n.required_user_actions.length !== 1)
|
|
872
996
|
throw new Error(`Error occurred.
|
|
873
997
|
Details: got ${n.required_user_actions.length} required user actions`);
|
|
874
|
-
return
|
|
875
|
-
},
|
|
998
|
+
return Ct.parse(n.required_user_actions[0]);
|
|
999
|
+
}, ie = (n, e, r) => {
|
|
876
1000
|
const o = n.filter((s) => s.provider === e);
|
|
877
1001
|
if (o.length === 0)
|
|
878
1002
|
throw new Error(`No CPMs found with provider '${e}' and processor '${r}'`);
|
|
879
1003
|
if (o.length !== 1)
|
|
880
1004
|
throw new Error(`More than one CPM found with provider '${e}' and processor '${r}'`);
|
|
881
1005
|
return o[0];
|
|
882
|
-
},
|
|
1006
|
+
}, k = {
|
|
883
1007
|
// ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
|
|
884
|
-
//
|
|
1008
|
+
// Common
|
|
885
1009
|
commonCC: {
|
|
886
|
-
run:
|
|
1010
|
+
run: vn
|
|
887
1011
|
},
|
|
1012
|
+
// Stripe
|
|
888
1013
|
stripePR: {
|
|
889
|
-
init:
|
|
890
|
-
run:
|
|
1014
|
+
init: jn,
|
|
1015
|
+
run: Mn
|
|
1016
|
+
},
|
|
1017
|
+
stripeLink: {
|
|
1018
|
+
init: _n,
|
|
1019
|
+
run: gn
|
|
891
1020
|
}
|
|
892
1021
|
// 👉 Add more flows here
|
|
893
1022
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
894
1023
|
};
|
|
895
|
-
function
|
|
1024
|
+
function Dn(n) {
|
|
896
1025
|
return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, "default") ? n.default : n;
|
|
897
1026
|
}
|
|
898
|
-
var
|
|
899
|
-
Object.defineProperty(
|
|
1027
|
+
var z = {};
|
|
1028
|
+
Object.defineProperty(z, "__esModule", {
|
|
900
1029
|
value: !0
|
|
901
1030
|
});
|
|
902
|
-
|
|
903
|
-
const
|
|
904
|
-
function
|
|
1031
|
+
z.Observable = void 0;
|
|
1032
|
+
const je = (n) => !!Symbol[n], X = (n) => je(n) ? Symbol[n] : "@@" + n, xn = X("iterator"), B = X("observable"), Me = X("species");
|
|
1033
|
+
function U(n, e) {
|
|
905
1034
|
let r = n[e];
|
|
906
1035
|
if (r != null) {
|
|
907
1036
|
if (typeof r != "function") throw new TypeError(r + " is not a function");
|
|
908
1037
|
return r;
|
|
909
1038
|
}
|
|
910
1039
|
}
|
|
911
|
-
function
|
|
1040
|
+
function A(n) {
|
|
912
1041
|
let e = n.constructor;
|
|
913
|
-
return e !== void 0 && (e = e[
|
|
1042
|
+
return e !== void 0 && (e = e[Me], e === null && (e = void 0)), e !== void 0 ? e : V;
|
|
914
1043
|
}
|
|
915
|
-
function
|
|
916
|
-
return n instanceof
|
|
1044
|
+
function Un(n) {
|
|
1045
|
+
return n instanceof V;
|
|
917
1046
|
}
|
|
918
|
-
function
|
|
919
|
-
|
|
1047
|
+
function R(n) {
|
|
1048
|
+
R.log ? R.log(n) : setTimeout(() => {
|
|
920
1049
|
throw n;
|
|
921
1050
|
});
|
|
922
1051
|
}
|
|
923
|
-
function
|
|
1052
|
+
function F(n) {
|
|
924
1053
|
Promise.resolve().then(() => {
|
|
925
1054
|
try {
|
|
926
1055
|
n();
|
|
927
1056
|
} catch (e) {
|
|
928
|
-
|
|
1057
|
+
R(e);
|
|
929
1058
|
}
|
|
930
1059
|
});
|
|
931
1060
|
}
|
|
932
|
-
function
|
|
1061
|
+
function Le(n) {
|
|
933
1062
|
let e = n._cleanup;
|
|
934
1063
|
if (e !== void 0 && (n._cleanup = void 0, !!e))
|
|
935
1064
|
try {
|
|
936
1065
|
if (typeof e == "function")
|
|
937
1066
|
e();
|
|
938
1067
|
else {
|
|
939
|
-
let r =
|
|
1068
|
+
let r = U(e, "unsubscribe");
|
|
940
1069
|
r && r.call(e);
|
|
941
1070
|
}
|
|
942
1071
|
} catch (r) {
|
|
943
|
-
|
|
1072
|
+
R(r);
|
|
944
1073
|
}
|
|
945
1074
|
}
|
|
946
|
-
function
|
|
1075
|
+
function Z(n) {
|
|
947
1076
|
n._observer = void 0, n._queue = void 0, n._state = "closed";
|
|
948
1077
|
}
|
|
949
|
-
function
|
|
1078
|
+
function $n(n) {
|
|
950
1079
|
let e = n._queue;
|
|
951
1080
|
if (e) {
|
|
952
1081
|
n._queue = void 0, n._state = "ready";
|
|
953
|
-
for (let r = 0; r < e.length && (
|
|
1082
|
+
for (let r = 0; r < e.length && (Fe(n, e[r].type, e[r].value), n._state !== "closed"); ++r)
|
|
954
1083
|
;
|
|
955
1084
|
}
|
|
956
1085
|
}
|
|
957
|
-
function
|
|
1086
|
+
function Fe(n, e, r) {
|
|
958
1087
|
n._state = "running";
|
|
959
1088
|
let o = n._observer;
|
|
960
1089
|
try {
|
|
961
|
-
let s =
|
|
1090
|
+
let s = U(o, e);
|
|
962
1091
|
switch (e) {
|
|
963
1092
|
case "next":
|
|
964
1093
|
s && s.call(o, r);
|
|
965
1094
|
break;
|
|
966
1095
|
case "error":
|
|
967
|
-
if (
|
|
1096
|
+
if (Z(n), s) s.call(o, r);
|
|
968
1097
|
else throw r;
|
|
969
1098
|
break;
|
|
970
1099
|
case "complete":
|
|
971
|
-
|
|
1100
|
+
Z(n), s && s.call(o);
|
|
972
1101
|
break;
|
|
973
1102
|
}
|
|
974
1103
|
} catch (s) {
|
|
975
|
-
|
|
1104
|
+
R(s);
|
|
976
1105
|
}
|
|
977
|
-
n._state === "closed" ?
|
|
1106
|
+
n._state === "closed" ? Le(n) : n._state === "running" && (n._state = "ready");
|
|
978
1107
|
}
|
|
979
|
-
function
|
|
1108
|
+
function H(n, e, r) {
|
|
980
1109
|
if (n._state !== "closed") {
|
|
981
1110
|
if (n._state === "buffering") {
|
|
982
1111
|
n._queue.push({
|
|
@@ -989,13 +1118,13 @@ function z(n, e, r) {
|
|
|
989
1118
|
n._state = "buffering", n._queue = [{
|
|
990
1119
|
type: e,
|
|
991
1120
|
value: r
|
|
992
|
-
}],
|
|
1121
|
+
}], F(() => $n(n));
|
|
993
1122
|
return;
|
|
994
1123
|
}
|
|
995
|
-
|
|
1124
|
+
Fe(n, e, r);
|
|
996
1125
|
}
|
|
997
1126
|
}
|
|
998
|
-
class
|
|
1127
|
+
class qn {
|
|
999
1128
|
constructor(e, r) {
|
|
1000
1129
|
this._cleanup = void 0, this._observer = e, this._queue = void 0, this._state = "initializing";
|
|
1001
1130
|
let o = this, s = {
|
|
@@ -1003,13 +1132,13 @@ class Tn {
|
|
|
1003
1132
|
return o._state === "closed";
|
|
1004
1133
|
},
|
|
1005
1134
|
next(i) {
|
|
1006
|
-
|
|
1135
|
+
H(o, "next", i);
|
|
1007
1136
|
},
|
|
1008
1137
|
error(i) {
|
|
1009
|
-
|
|
1138
|
+
H(o, "error", i);
|
|
1010
1139
|
},
|
|
1011
1140
|
complete() {
|
|
1012
|
-
|
|
1141
|
+
H(o, "complete");
|
|
1013
1142
|
}
|
|
1014
1143
|
};
|
|
1015
1144
|
try {
|
|
@@ -1023,12 +1152,12 @@ class Tn {
|
|
|
1023
1152
|
return this._state === "closed";
|
|
1024
1153
|
}
|
|
1025
1154
|
unsubscribe() {
|
|
1026
|
-
this._state !== "closed" && (
|
|
1155
|
+
this._state !== "closed" && (Z(this), Le(this));
|
|
1027
1156
|
}
|
|
1028
1157
|
}
|
|
1029
|
-
let
|
|
1158
|
+
let V = class N {
|
|
1030
1159
|
constructor(e) {
|
|
1031
|
-
if (!(this instanceof
|
|
1160
|
+
if (!(this instanceof N)) throw new TypeError("Observable cannot be called as a function");
|
|
1032
1161
|
if (typeof e != "function") throw new TypeError("Observable initializer must be a function");
|
|
1033
1162
|
this._subscriber = e;
|
|
1034
1163
|
}
|
|
@@ -1037,7 +1166,7 @@ let $ = class F {
|
|
|
1037
1166
|
next: e,
|
|
1038
1167
|
error: arguments[1],
|
|
1039
1168
|
complete: arguments[2]
|
|
1040
|
-
}), new
|
|
1169
|
+
}), new qn(e, this._subscriber);
|
|
1041
1170
|
}
|
|
1042
1171
|
forEach(e) {
|
|
1043
1172
|
return new Promise((r, o) => {
|
|
@@ -1049,11 +1178,11 @@ let $ = class F {
|
|
|
1049
1178
|
i.unsubscribe(), r();
|
|
1050
1179
|
}
|
|
1051
1180
|
let i = this.subscribe({
|
|
1052
|
-
next(
|
|
1181
|
+
next(c) {
|
|
1053
1182
|
try {
|
|
1054
|
-
e(
|
|
1055
|
-
} catch (
|
|
1056
|
-
o(
|
|
1183
|
+
e(c, s);
|
|
1184
|
+
} catch (a) {
|
|
1185
|
+
o(a), i.unsubscribe();
|
|
1057
1186
|
}
|
|
1058
1187
|
},
|
|
1059
1188
|
error: o,
|
|
@@ -1063,7 +1192,7 @@ let $ = class F {
|
|
|
1063
1192
|
}
|
|
1064
1193
|
map(e) {
|
|
1065
1194
|
if (typeof e != "function") throw new TypeError(e + " is not a function");
|
|
1066
|
-
let r =
|
|
1195
|
+
let r = A(this);
|
|
1067
1196
|
return new r((o) => this.subscribe({
|
|
1068
1197
|
next(s) {
|
|
1069
1198
|
try {
|
|
@@ -1083,7 +1212,7 @@ let $ = class F {
|
|
|
1083
1212
|
}
|
|
1084
1213
|
filter(e) {
|
|
1085
1214
|
if (typeof e != "function") throw new TypeError(e + " is not a function");
|
|
1086
|
-
let r =
|
|
1215
|
+
let r = A(this);
|
|
1087
1216
|
return new r((o) => this.subscribe({
|
|
1088
1217
|
next(s) {
|
|
1089
1218
|
try {
|
|
@@ -1103,25 +1232,25 @@ let $ = class F {
|
|
|
1103
1232
|
}
|
|
1104
1233
|
reduce(e) {
|
|
1105
1234
|
if (typeof e != "function") throw new TypeError(e + " is not a function");
|
|
1106
|
-
let r =
|
|
1107
|
-
return new r((
|
|
1235
|
+
let r = A(this), o = arguments.length > 1, s = !1, c = arguments[1];
|
|
1236
|
+
return new r((a) => this.subscribe({
|
|
1108
1237
|
next(l) {
|
|
1109
1238
|
let u = !s;
|
|
1110
1239
|
if (s = !0, !u || o)
|
|
1111
1240
|
try {
|
|
1112
|
-
|
|
1241
|
+
c = e(c, l);
|
|
1113
1242
|
} catch (d) {
|
|
1114
|
-
return
|
|
1243
|
+
return a.error(d);
|
|
1115
1244
|
}
|
|
1116
1245
|
else
|
|
1117
|
-
|
|
1246
|
+
c = l;
|
|
1118
1247
|
},
|
|
1119
1248
|
error(l) {
|
|
1120
|
-
|
|
1249
|
+
a.error(l);
|
|
1121
1250
|
},
|
|
1122
1251
|
complete() {
|
|
1123
|
-
if (!s && !o) return
|
|
1124
|
-
|
|
1252
|
+
if (!s && !o) return a.error(new TypeError("Cannot reduce an empty sequence"));
|
|
1253
|
+
a.next(c), a.complete();
|
|
1125
1254
|
}
|
|
1126
1255
|
}));
|
|
1127
1256
|
}
|
|
@@ -1130,11 +1259,11 @@ let $ = class F {
|
|
|
1130
1259
|
return await this.forEach((r) => e.push(r)), e;
|
|
1131
1260
|
}
|
|
1132
1261
|
concat(...e) {
|
|
1133
|
-
let r =
|
|
1262
|
+
let r = A(this);
|
|
1134
1263
|
return new r((o) => {
|
|
1135
1264
|
let s, i = 0;
|
|
1136
|
-
function a
|
|
1137
|
-
s =
|
|
1265
|
+
function c(a) {
|
|
1266
|
+
s = a.subscribe({
|
|
1138
1267
|
next(l) {
|
|
1139
1268
|
o.next(l);
|
|
1140
1269
|
},
|
|
@@ -1142,28 +1271,28 @@ let $ = class F {
|
|
|
1142
1271
|
o.error(l);
|
|
1143
1272
|
},
|
|
1144
1273
|
complete() {
|
|
1145
|
-
i === e.length ? (s = void 0, o.complete()) :
|
|
1274
|
+
i === e.length ? (s = void 0, o.complete()) : c(r.from(e[i++]));
|
|
1146
1275
|
}
|
|
1147
1276
|
});
|
|
1148
1277
|
}
|
|
1149
|
-
return
|
|
1278
|
+
return c(this), () => {
|
|
1150
1279
|
s && (s.unsubscribe(), s = void 0);
|
|
1151
1280
|
};
|
|
1152
1281
|
});
|
|
1153
1282
|
}
|
|
1154
1283
|
flatMap(e) {
|
|
1155
1284
|
if (typeof e != "function") throw new TypeError(e + " is not a function");
|
|
1156
|
-
let r =
|
|
1285
|
+
let r = A(this);
|
|
1157
1286
|
return new r((o) => {
|
|
1158
1287
|
let s = [], i = this.subscribe({
|
|
1159
|
-
next(
|
|
1288
|
+
next(a) {
|
|
1160
1289
|
if (e)
|
|
1161
1290
|
try {
|
|
1162
|
-
|
|
1291
|
+
a = e(a);
|
|
1163
1292
|
} catch (u) {
|
|
1164
1293
|
return o.error(u);
|
|
1165
1294
|
}
|
|
1166
|
-
let l = r.from(
|
|
1295
|
+
let l = r.from(a).subscribe({
|
|
1167
1296
|
next(u) {
|
|
1168
1297
|
o.next(u);
|
|
1169
1298
|
},
|
|
@@ -1172,41 +1301,41 @@ let $ = class F {
|
|
|
1172
1301
|
},
|
|
1173
1302
|
complete() {
|
|
1174
1303
|
let u = s.indexOf(l);
|
|
1175
|
-
u >= 0 && s.splice(u, 1),
|
|
1304
|
+
u >= 0 && s.splice(u, 1), c();
|
|
1176
1305
|
}
|
|
1177
1306
|
});
|
|
1178
1307
|
s.push(l);
|
|
1179
1308
|
},
|
|
1180
|
-
error(
|
|
1181
|
-
o.error(
|
|
1309
|
+
error(a) {
|
|
1310
|
+
o.error(a);
|
|
1182
1311
|
},
|
|
1183
1312
|
complete() {
|
|
1184
|
-
|
|
1313
|
+
c();
|
|
1185
1314
|
}
|
|
1186
1315
|
});
|
|
1187
|
-
function
|
|
1316
|
+
function c() {
|
|
1188
1317
|
i.closed && s.length === 0 && o.complete();
|
|
1189
1318
|
}
|
|
1190
1319
|
return () => {
|
|
1191
|
-
s.forEach((
|
|
1320
|
+
s.forEach((a) => a.unsubscribe()), i.unsubscribe();
|
|
1192
1321
|
};
|
|
1193
1322
|
});
|
|
1194
1323
|
}
|
|
1195
|
-
[
|
|
1324
|
+
[B]() {
|
|
1196
1325
|
return this;
|
|
1197
1326
|
}
|
|
1198
1327
|
static from(e) {
|
|
1199
|
-
let r = typeof this == "function" ? this :
|
|
1328
|
+
let r = typeof this == "function" ? this : N;
|
|
1200
1329
|
if (e == null) throw new TypeError(e + " is not an object");
|
|
1201
|
-
let o =
|
|
1330
|
+
let o = U(e, B);
|
|
1202
1331
|
if (o) {
|
|
1203
1332
|
let s = o.call(e);
|
|
1204
1333
|
if (Object(s) !== s) throw new TypeError(s + " is not an object");
|
|
1205
|
-
return
|
|
1334
|
+
return Un(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
|
|
1206
1335
|
}
|
|
1207
|
-
if (
|
|
1336
|
+
if (je("iterator") && (o = U(e, xn), o))
|
|
1208
1337
|
return new r((s) => {
|
|
1209
|
-
|
|
1338
|
+
F(() => {
|
|
1210
1339
|
if (!s.closed) {
|
|
1211
1340
|
for (let i of o.call(e))
|
|
1212
1341
|
if (s.next(i), s.closed) return;
|
|
@@ -1216,7 +1345,7 @@ let $ = class F {
|
|
|
1216
1345
|
});
|
|
1217
1346
|
if (Array.isArray(e))
|
|
1218
1347
|
return new r((s) => {
|
|
1219
|
-
|
|
1348
|
+
F(() => {
|
|
1220
1349
|
if (!s.closed) {
|
|
1221
1350
|
for (let i = 0; i < e.length; ++i)
|
|
1222
1351
|
if (s.next(e[i]), s.closed) return;
|
|
@@ -1227,9 +1356,9 @@ let $ = class F {
|
|
|
1227
1356
|
throw new TypeError(e + " is not observable");
|
|
1228
1357
|
}
|
|
1229
1358
|
static of(...e) {
|
|
1230
|
-
let r = typeof this == "function" ? this :
|
|
1359
|
+
let r = typeof this == "function" ? this : N;
|
|
1231
1360
|
return new r((o) => {
|
|
1232
|
-
|
|
1361
|
+
F(() => {
|
|
1233
1362
|
if (!o.closed) {
|
|
1234
1363
|
for (let s = 0; s < e.length; ++s)
|
|
1235
1364
|
if (o.next(e[s]), o.closed) return;
|
|
@@ -1238,25 +1367,30 @@ let $ = class F {
|
|
|
1238
1367
|
});
|
|
1239
1368
|
});
|
|
1240
1369
|
}
|
|
1241
|
-
static get [
|
|
1370
|
+
static get [Me]() {
|
|
1242
1371
|
return this;
|
|
1243
1372
|
}
|
|
1244
1373
|
};
|
|
1245
|
-
|
|
1246
|
-
Object.defineProperty(
|
|
1374
|
+
z.Observable = V;
|
|
1375
|
+
Object.defineProperty(V, Symbol("extensions"), {
|
|
1247
1376
|
value: {
|
|
1248
|
-
symbol:
|
|
1249
|
-
hostReportError:
|
|
1377
|
+
symbol: B,
|
|
1378
|
+
hostReportError: R
|
|
1250
1379
|
},
|
|
1251
1380
|
configurable: !0
|
|
1252
1381
|
});
|
|
1253
|
-
var
|
|
1254
|
-
const
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1382
|
+
var zn = z.Observable;
|
|
1383
|
+
const Vn = /* @__PURE__ */ Dn(zn), { log__: Hn, err__: Kn } = v("init-flows"), Yn = () => ("ojs_init_results" in window || (window.ojs_init_results = {}), window.ojs_init_results), Bn = (n, e) => {
|
|
1384
|
+
const r = { context: n, flowCallbacks: e };
|
|
1385
|
+
return {
|
|
1386
|
+
// Stripe PR
|
|
1387
|
+
stripePR: ae("stripePR", k.stripePR.init(r)),
|
|
1388
|
+
// Stripe Link
|
|
1389
|
+
stripeLink: ae("stripeLink", k.stripeLink.init(r))
|
|
1390
|
+
// 👉 Add initialization flows here
|
|
1391
|
+
};
|
|
1392
|
+
}, ae = (n, e) => {
|
|
1393
|
+
const r = new Vn((o) => {
|
|
1260
1394
|
o.next({ status: "loading" }), e.then((s) => {
|
|
1261
1395
|
o.next({ status: "loaded", result: s });
|
|
1262
1396
|
}).catch((s) => {
|
|
@@ -1265,35 +1399,35 @@ const jn = /* @__PURE__ */ kn(In), { log__: Fn, err__: Mn } = P("init-flows"), L
|
|
|
1265
1399
|
});
|
|
1266
1400
|
return r.subscribe({
|
|
1267
1401
|
next: (o) => {
|
|
1268
|
-
|
|
1402
|
+
Hn(`${n} flow result`, o), Yn()[n] = o;
|
|
1269
1403
|
},
|
|
1270
1404
|
error: (o) => {
|
|
1271
|
-
throw
|
|
1405
|
+
throw Kn(`${n} flow initialization error:
|
|
1272
1406
|
${JSON.stringify(o)}`), o;
|
|
1273
1407
|
}
|
|
1274
1408
|
}), r;
|
|
1275
|
-
},
|
|
1409
|
+
}, ce = {
|
|
1276
1410
|
isLoading: !0,
|
|
1277
1411
|
isAvailable: !1,
|
|
1278
1412
|
startFlow: async () => {
|
|
1279
1413
|
}
|
|
1280
|
-
},
|
|
1414
|
+
}, le = {
|
|
1281
1415
|
isLoading: !1,
|
|
1282
1416
|
isAvailable: !1,
|
|
1283
1417
|
startFlow: async () => {
|
|
1284
1418
|
}
|
|
1285
1419
|
};
|
|
1286
|
-
class
|
|
1420
|
+
class Zn {
|
|
1287
1421
|
constructor(e) {
|
|
1288
1422
|
this.formInstance = e, this.config = e.config, this.formId = e.formId, this.eventTargets = {}, this.nonces = /* @__PURE__ */ new Set();
|
|
1289
1423
|
}
|
|
1290
1424
|
handleMessage(e) {
|
|
1291
|
-
var
|
|
1425
|
+
var a;
|
|
1292
1426
|
if (!e.source)
|
|
1293
1427
|
throw new Error("No source found");
|
|
1294
|
-
if (e.origin !== ((
|
|
1428
|
+
if (e.origin !== ((a = this.formInstance.config._frameUrl) == null ? void 0 : a.origin) || typeof e.data == "object" && e.data.penpal)
|
|
1295
1429
|
return;
|
|
1296
|
-
const r =
|
|
1430
|
+
const r = Tt(JSON.parse(e.data));
|
|
1297
1431
|
if (!this.validateEvent(r)) return;
|
|
1298
1432
|
const { elementId: s, payload: i } = r;
|
|
1299
1433
|
switch (i.type) {
|
|
@@ -1433,20 +1567,20 @@ class Nn {
|
|
|
1433
1567
|
// }
|
|
1434
1568
|
// }
|
|
1435
1569
|
postEventToFrame(e, r, o) {
|
|
1436
|
-
|
|
1570
|
+
jt(e, this.formId, r, o, this.config.baseUrl);
|
|
1437
1571
|
}
|
|
1438
1572
|
}
|
|
1439
|
-
async function
|
|
1440
|
-
const o = await
|
|
1573
|
+
async function Jn(n, e) {
|
|
1574
|
+
const o = await de({
|
|
1441
1575
|
iframe: n,
|
|
1442
1576
|
debug: !1,
|
|
1443
1577
|
childOrigin: e
|
|
1444
|
-
}).promise, s = await
|
|
1445
|
-
if (!
|
|
1578
|
+
}).promise, s = await Mt(o);
|
|
1579
|
+
if (!Lt(o, s))
|
|
1446
1580
|
throw new Error("Got invalid CDE connection object");
|
|
1447
1581
|
return o;
|
|
1448
1582
|
}
|
|
1449
|
-
class
|
|
1583
|
+
class Wn {
|
|
1450
1584
|
constructor() {
|
|
1451
1585
|
this.connections = /* @__PURE__ */ new Map();
|
|
1452
1586
|
}
|
|
@@ -1463,51 +1597,51 @@ class Un {
|
|
|
1463
1597
|
return this.connections;
|
|
1464
1598
|
}
|
|
1465
1599
|
}
|
|
1466
|
-
const
|
|
1600
|
+
const I = class I {
|
|
1467
1601
|
constructor(e) {
|
|
1468
1602
|
this.tryInitOjsFlows = () => {
|
|
1469
|
-
this.ojsFlowsInitialization === null && this.cdeLoadedPayload && this.connectionManager.getAllConnections().size !== 0 && (this.ojsFlowsInitialization =
|
|
1603
|
+
this.ojsFlowsInitialization === null && this.cdeLoadedPayload && this.connectionManager.getAllConnections().size !== 0 && (this.ojsFlowsInitialization = Bn(this.createOjsFlowContext(), this.createOjsFlowCallbacks()), this.ojsFlowsInitialization.stripePR.subscribe((r) => this.onStripePRStatusChange(r)));
|
|
1470
1604
|
}, this.onCdeLoaded = (r) => {
|
|
1471
1605
|
this.cdeLoadedPayload || (this.cdeLoadedPayload = r, this.tryInitOjsFlows());
|
|
1472
1606
|
}, this.onStripePRStatusChange = (r) => {
|
|
1473
|
-
var o, s, i,
|
|
1607
|
+
var o, s, i, c, a, l;
|
|
1474
1608
|
if (r.status === "loading")
|
|
1475
|
-
(s = (o = this.config).onPaymentRequestLoad) == null || s.call(o, { apple_pay:
|
|
1609
|
+
(s = (o = this.config).onPaymentRequestLoad) == null || s.call(o, { apple_pay: ce, google_pay: ce });
|
|
1476
1610
|
else if (r.status === "error")
|
|
1477
|
-
(
|
|
1611
|
+
(c = (i = this.config).onPaymentRequestLoad) == null || c.call(i, { apple_pay: le, google_pay: le });
|
|
1478
1612
|
else if (r.status === "loaded") {
|
|
1479
|
-
const u = r.result, d = u.isAvailable && u.availableProviders.applePay,
|
|
1480
|
-
(l = (
|
|
1613
|
+
const u = r.result, d = u.isAvailable && u.availableProviders.applePay, f = u.isAvailable && u.availableProviders.googlePay;
|
|
1614
|
+
(l = (a = this.config).onPaymentRequestLoad) == null || l.call(a, {
|
|
1481
1615
|
apple_pay: {
|
|
1482
1616
|
isLoading: !1,
|
|
1483
1617
|
isAvailable: d,
|
|
1484
|
-
startFlow: async (
|
|
1618
|
+
startFlow: async (p) => d ? this.submitPaymentRequest("apple_pay", u, p) : void 0
|
|
1485
1619
|
},
|
|
1486
1620
|
google_pay: {
|
|
1487
1621
|
isLoading: !1,
|
|
1488
|
-
isAvailable:
|
|
1489
|
-
startFlow: async (
|
|
1622
|
+
isAvailable: f,
|
|
1623
|
+
startFlow: async (p) => f ? this.submitPaymentRequest("google_pay", u, p) : void 0
|
|
1490
1624
|
}
|
|
1491
1625
|
});
|
|
1492
1626
|
}
|
|
1493
1627
|
}, this.submitPaymentRequest = (r, o, s) => {
|
|
1494
1628
|
const i = this.createOjsFlowContext();
|
|
1495
|
-
return
|
|
1629
|
+
return k.stripePR.run({
|
|
1496
1630
|
context: i,
|
|
1497
|
-
checkoutPaymentMethod:
|
|
1498
|
-
nonCdeFormInputs:
|
|
1631
|
+
checkoutPaymentMethod: ie(i.checkoutPaymentMethods, r),
|
|
1632
|
+
nonCdeFormInputs: Y(i.formDiv),
|
|
1499
1633
|
flowCallbacks: this.createOjsFlowCallbacks(),
|
|
1500
1634
|
customParams: { provider: r, overridePaymentRequest: s == null ? void 0 : s.overridePaymentRequest },
|
|
1501
1635
|
initResult: o
|
|
1502
1636
|
});
|
|
1503
|
-
},
|
|
1637
|
+
}, I.assignAsSingleton(this), this.config = { ...e, baseUrl: e.baseUrl ?? "https://cde.getopenpay.com" }, this.elements = null, this.formId = `opjs-form-${window.crypto.randomUUID()}`, this.referer = window.location.origin, this.formTarget = e.formTarget ?? "body", this.formProperties = { height: "1px" }, this.cdeLoadedPayload = null, this.ojsFlowsInitialization = null, this.checkoutFired = !1, this.connectionManager = new Wn(), this.eventHandler = new Zn(this), this.ojsVersion = "0.1.8", this.ojsReleaseVersion = "0.1.8", window.addEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler));
|
|
1504
1638
|
}
|
|
1505
1639
|
/**
|
|
1506
1640
|
* Assign the instance to the window as a singleton
|
|
1507
1641
|
* @param form - The OpenPayForm instance
|
|
1508
1642
|
*/
|
|
1509
1643
|
static assignAsSingleton(e) {
|
|
1510
|
-
if (
|
|
1644
|
+
if (I.getInstance())
|
|
1511
1645
|
throw new Error("OpenPay instance already exists. Only one instance is allowed.");
|
|
1512
1646
|
window.ojs = e;
|
|
1513
1647
|
}
|
|
@@ -1528,11 +1662,11 @@ const O = class O {
|
|
|
1528
1662
|
}
|
|
1529
1663
|
createElement(e, r = {}) {
|
|
1530
1664
|
if (!this.config) throw new Error("OpenPay form not initialized");
|
|
1531
|
-
const o =
|
|
1665
|
+
const o = Be.parse(e), s = document.createElement("iframe"), i = this.buildQueryString(r);
|
|
1532
1666
|
s.name = `${o}-element`;
|
|
1533
|
-
const
|
|
1534
|
-
|
|
1535
|
-
const
|
|
1667
|
+
const c = new URL(`/app/v1/${s.name}`, this.config.baseUrl);
|
|
1668
|
+
c.search = i.toString(), s.src = c.href, this.config._frameUrl = c, s.style.border = "none", s.style.width = "100%";
|
|
1669
|
+
const a = {
|
|
1536
1670
|
type: o,
|
|
1537
1671
|
node: s,
|
|
1538
1672
|
mount: (l) => {
|
|
@@ -1540,14 +1674,14 @@ const O = class O {
|
|
|
1540
1674
|
return (u = document.querySelector(l)) == null ? void 0 : u.appendChild(s);
|
|
1541
1675
|
}
|
|
1542
1676
|
};
|
|
1543
|
-
return this.connectToElement(
|
|
1677
|
+
return this.connectToElement(a), this.elements ? this.elements[o] = a : this.elements = { [o]: a }, a;
|
|
1544
1678
|
}
|
|
1545
1679
|
buildQueryString(e) {
|
|
1546
1680
|
const r = new URLSearchParams();
|
|
1547
|
-
return r.append("referer", this.referer), r.append("formId", this.formId), e.styles && r.append("styles",
|
|
1681
|
+
return r.append("referer", this.referer), r.append("formId", this.formId), e.styles && r.append("styles", It(e.styles)), r.append("secureToken", this.config.checkoutSecureToken), r;
|
|
1548
1682
|
}
|
|
1549
1683
|
connectToElement(e) {
|
|
1550
|
-
|
|
1684
|
+
Jn(e.node).then((r) => {
|
|
1551
1685
|
this.connectionManager.addConnection(e.type, r), this.tryInitOjsFlows();
|
|
1552
1686
|
}).catch((r) => {
|
|
1553
1687
|
});
|
|
@@ -1562,36 +1696,34 @@ const O = class O {
|
|
|
1562
1696
|
if (e.size === 0)
|
|
1563
1697
|
throw new Error("No CDE connections found");
|
|
1564
1698
|
return {
|
|
1565
|
-
baseUrl: new URL(this.config.baseUrl ??
|
|
1699
|
+
baseUrl: new URL(this.config.baseUrl ?? xe).origin,
|
|
1566
1700
|
formDiv: this.getFormDiv(),
|
|
1567
1701
|
elementsSessionId: this.cdeLoadedPayload.sessionId,
|
|
1568
1702
|
checkoutPaymentMethods: this.cdeLoadedPayload.checkoutPaymentMethods,
|
|
1569
|
-
cdeConnections: e
|
|
1703
|
+
cdeConnections: e,
|
|
1704
|
+
customInitParams: this.config.customInitParams ?? {}
|
|
1570
1705
|
};
|
|
1571
1706
|
}
|
|
1572
|
-
getNonCdeFormInputs() {
|
|
1573
|
-
return St(this.getFormDiv());
|
|
1574
|
-
}
|
|
1575
1707
|
createOjsFlowCallbacks() {
|
|
1576
1708
|
const e = () => {
|
|
1577
1709
|
};
|
|
1578
1710
|
return {
|
|
1579
|
-
onCheckoutError:
|
|
1580
|
-
onCheckoutStarted:
|
|
1581
|
-
onCheckoutSuccess:
|
|
1582
|
-
onSetupPaymentMethodSuccess:
|
|
1711
|
+
onCheckoutError: O("onCheckoutError", this.config.onCheckoutError ?? e),
|
|
1712
|
+
onCheckoutStarted: O("onCheckoutStarted", this.config.onCheckoutStarted ?? e),
|
|
1713
|
+
onCheckoutSuccess: O("onCheckoutSuccess", this.config.onCheckoutSuccess ?? e),
|
|
1714
|
+
onSetupPaymentMethodSuccess: O(
|
|
1583
1715
|
"onSetupPaymentMethodSuccess",
|
|
1584
1716
|
this.config.onSetupPaymentMethodSuccess ?? e
|
|
1585
1717
|
),
|
|
1586
|
-
onValidationError:
|
|
1718
|
+
onValidationError: O("onValidationError", this.config.onValidationError ?? e)
|
|
1587
1719
|
};
|
|
1588
1720
|
}
|
|
1589
1721
|
submit() {
|
|
1590
1722
|
const e = this.createOjsFlowContext();
|
|
1591
|
-
|
|
1723
|
+
k.commonCC.run({
|
|
1592
1724
|
context: e,
|
|
1593
|
-
checkoutPaymentMethod:
|
|
1594
|
-
nonCdeFormInputs:
|
|
1725
|
+
checkoutPaymentMethod: ie(e.checkoutPaymentMethods, "credit_card"),
|
|
1726
|
+
nonCdeFormInputs: Y(e.formDiv),
|
|
1595
1727
|
flowCallbacks: this.createOjsFlowCallbacks(),
|
|
1596
1728
|
customParams: void 0,
|
|
1597
1729
|
// This flow requires no custom params
|
|
@@ -1608,10 +1740,10 @@ const O = class O {
|
|
|
1608
1740
|
window.removeEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler));
|
|
1609
1741
|
}
|
|
1610
1742
|
};
|
|
1611
|
-
|
|
1612
|
-
let
|
|
1743
|
+
I.ojsFlows = k;
|
|
1744
|
+
let ue = I;
|
|
1613
1745
|
export {
|
|
1614
|
-
|
|
1615
|
-
|
|
1746
|
+
m as FieldName,
|
|
1747
|
+
ue as OpenPayForm
|
|
1616
1748
|
};
|
|
1617
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguZXMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGNvbm5lY3RUb0NoaWxkIH0gZnJvbSAncGVucGFsJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmNvbnN0IEZSQU1FX0JBU0VfVVJMID0gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiO1xuXG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBsb2M6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIG1zZzogei5zdHJpbmcoKSxcbiAgdXJsOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UgPSB6LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEpO1xuY29uc3QgWm9kRmllbGRFcnJvciA9IHoub2JqZWN0KHtcbiAgY29kZTogei5zdHJpbmcoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgcGF0aDogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBab2RGaWVsZEVycm9ycyA9IHouYXJyYXkoWm9kRmllbGRFcnJvcik7XG5jb25zdCBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFID0ge1xuICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxufTtcbmNvbnN0IGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlID0gKG9nRXJyb3JNZXNzYWdlKSA9PiB7XG4gIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICByZXR1cm4gTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRVtrZXldID8/IG9nRXJyb3JNZXNzYWdlO1xufTtcbmNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShyZXNwb25zZVswXS5tc2cpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBgJHtgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczpgfVxuJHtidWxsZXRlZH1gO1xuICB9XG59O1xuY29uc3QgY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgY29uc3QgbGlzdE9mRXJyb3JzID0gZXJyb3JzLm1hcCgoZXJyKSA9PiBgLSAke2Vyci5wYXRoLmpvaW4oXCIvXCIpfTogJHtlcnIubWVzc2FnZX1gKS5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbn07XG5jb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAoZSkgPT4ge1xuICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGlzU3RyaW5naWZpZWRKc29uT2JqZWN0KGUubWVzc2FnZSkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZS5tZXNzYWdlKTtcbiAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3Iob2JqKTtcbiAgICAgIH0gZWxzZSBpZiAoWm9kRmllbGRFcnJvcnMuc2FmZVBhcnNlKG9iaikuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlICsgXCJcIjtcbiAgfVxufTtcbmNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IFJlcXVpcmVkU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBPcHRpb25hbFN0cmluZyA9IHouc3RyaW5nKCkudHJpbSgpLm9wdGlvbmFsKCk7XG5jb25zdCBudWxsT3JVbmRlZk9yJDEgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG52YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICBGaWVsZE5hbWUyW1wiRklSU1RfTkFNRVwiXSA9IFwiZmlyc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJFTUFJTFwiXSA9IFwiZW1haWxcIjtcbiAgRmllbGROYW1lMltcIlpJUF9DT0RFXCJdID0gXCJ6aXBDb2RlXCI7XG4gIEZpZWxkTmFtZTJbXCJDSVRZXCJdID0gXCJjaXR5XCI7XG4gIEZpZWxkTmFtZTJbXCJTVEFURVwiXSA9IFwic3RhdGVcIjtcbiAgRmllbGROYW1lMltcIkNPVU5UUllcIl0gPSBcImNvdW50cnlcIjtcbiAgRmllbGROYW1lMltcIkFERFJFU1NcIl0gPSBcImFkZHJlc3NcIjtcbiAgRmllbGROYW1lMltcIlBIT05FXCJdID0gXCJwaG9uZVwiO1xuICBGaWVsZE5hbWUyW1wiUFJPTU9USU9OX0NPREVcIl0gPSBcInByb21vdGlvbkNvZGVcIjtcbiAgcmV0dXJuIEZpZWxkTmFtZTI7XG59KShGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgRmllbGROYW1lRW51bSA9IHoubmF0aXZlRW51bShGaWVsZE5hbWUpO1xudmFyIFByaXZhdGVGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChQcml2YXRlRmllbGROYW1lMikgPT4ge1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfTlVNQkVSXCJdID0gXCJjYXJkTnVtYmVyXCI7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmRFeHBpcnlcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0NWQ1wiXSA9IFwiY2FyZEN2Y1wiO1xuICByZXR1cm4gUHJpdmF0ZUZpZWxkTmFtZTI7XG59KShQcml2YXRlRmllbGROYW1lIHx8IHt9KTtcbmNvbnN0IFByaXZhdGVGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuY29uc3QgQWxsRmllbGROYW1lcyA9IHoudW5pb24oW0ZpZWxkTmFtZUVudW0sIFByaXZhdGVGaWVsZE5hbWVFbnVtXSk7XG52YXIgRWxlbWVudFR5cGVFbnVtID0gLyogQF9fUFVSRV9fICovICgoRWxlbWVudFR5cGVFbnVtMikgPT4ge1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRFwiXSA9IFwiY2FyZFwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmQtbnVtYmVyXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZC1leHBpcnlcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkLWN2Y1wiO1xuICByZXR1cm4gRWxlbWVudFR5cGVFbnVtMjtcbn0pKEVsZW1lbnRUeXBlRW51bSB8fCB7fSk7XG5jb25zdCBFbGVtZW50VHlwZSA9IHoubmF0aXZlRW51bShFbGVtZW50VHlwZUVudW0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpLFxuICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBQYXltZW50TWV0aG9kTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBjYXJkTnVtYmVyOiBPcHRpb25hbFN0cmluZyxcbiAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgY3ZjOiBPcHRpb25hbFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGJhY2tncm91bmRDb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gIGNvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gIGZvbnRTaXplOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFdlaWdodDogT3B0aW9uYWxTdHJpbmcsXG4gIG1hcmdpbjogT3B0aW9uYWxTdHJpbmcsXG4gIHBhZGRpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsZXR0ZXJTcGFjaW5nOiBPcHRpb25hbFN0cmluZyxcbiAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgRXZlbnRUeXBlID0gei5lbnVtKFtcbiAgLy8gRWxlbWVudCAtPiBGb3JtXG4gIFwiTEFZT1VUXCIsXG4gIFwiTE9BREVEXCIsXG4gIFwiQkxVUlwiLFxuICBcIkZPQ1VTXCIsXG4gIFwiQ0hBTkdFXCIsXG4gIFwiVE9LRU5JWkVfU1RBUlRFRFwiLFxuICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICBcIlRPS0VOSVpFX1NVQ0NFU1NcIixcbiAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gIFwiTE9BRF9FUlJPUlwiLFxuICBcIlZBTElEQVRJT05fRVJST1JcIixcbiAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gIFwiU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTU1wiLFxuICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgXCJUT0tFTklaRVwiLFxuICBcIkNIRUNLT1VUXCIsXG4gIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFX1NUQVJURURcIiwgXCJDSEVDS09VVF9TVEFSVEVEXCJdKTtcbmNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7IHR5cGU6IEdlbmVyaWNFdmVudFR5cGUgfSk7XG5jb25zdCBJbnB1dEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkJMVVJcIiwgXCJGT0NVU1wiLCBcIkNIQU5HRVwiXSk7XG5jb25zdCBJbnB1dEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogSW5wdXRFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBQcml2YXRlRmllbGROYW1lRW51bSxcbiAgZXJyb3JzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJMT0FEX0VSUk9SXCIsIFwiVE9LRU5JWkVfRVJST1JcIiwgXCJDSEVDS09VVF9FUlJPUlwiXSk7XG5jb25zdCBFcnJvckV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogRXJyb3JFdmVudFR5cGUsXG4gIG1lc3NhZ2U6IFJlcXVpcmVkU3RyaW5nLFxuICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlZBTElEQVRJT05fRVJST1JcIl0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgTGF5b3V0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTEFZT1VUKSxcbiAgaGVpZ2h0OiBSZXF1aXJlZFN0cmluZ1xufSk7XG5jb25zdCBMb2FkZWRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICB0b3RhbEFtb3VudEF0b21zOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogT3B0aW9uYWxTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHouYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEpXG59KTtcbmNvbnN0IFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSxcbiAgbmV4dEFjdGlvbk1ldGFkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgcGF5bWVudEZsb3dNZXRhZGF0YTogei5hbnkoKS5vcHRpb25hbCgpLFxuICBzdGFydFBGTWV0YWRhdGE6IHoub3B0aW9uYWwoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTUyksXG4gIHBheW1lbnRNZXRob2RJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wibGFzdE5hbWVcIiAvKiBMQVNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiY291bnRyeVwiIC8qIENPVU5UUlkgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgUFJGb3JtRmllbGRzID0gei5vYmplY3Qoe1xuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBTdWJtaXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRVwiLCBcIkNIRUNLT1VUXCIsIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJdKTtcbmNvbnN0IFN1Ym1pdEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogU3VibWl0RXZlbnRUeXBlLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIGRvTm90VXNlTGVnYWN5Q0NGbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ0NDUE1JZDogT3B0aW9uYWxTdHJpbmdcbn0pLmV4dGVuZChSZXF1aXJlZEZvcm1GaWVsZHMuc2hhcGUpO1xuY29uc3QgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyksXG4gIGlzUmVhZHlGb3JDaGVja291dDogei5ib29sZWFuKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUyksXG4gIGludm9pY2VVcmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25JZHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIGN1c3RvbWVySWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgRXZlbnRQYXlsb2FkID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgR2VuZXJpY0V2ZW50UGF5bG9hZCxcbiAgSW5wdXRFdmVudFBheWxvYWQsXG4gIEVycm9yRXZlbnRQYXlsb2FkLFxuICBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQsXG4gIExheW91dEV2ZW50UGF5bG9hZCxcbiAgTG9hZGVkRXZlbnRQYXlsb2FkLFxuICBTdWJtaXRFdmVudFBheWxvYWQsXG4gIFRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCxcbiAgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQsXG4gIFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkXG5dKTtcbmNvbnN0IEVsZW1lbnRFdmVudCA9IHoub2JqZWN0KHtcbiAgcGF5bG9hZDogRXZlbnRQYXlsb2FkLFxuICBub25jZTogUmVxdWlyZWRTdHJpbmcsXG4gIGZvcm1JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGVsZW1lbnRJZDogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBhbW91bnRBdG9tOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHByb21vdGlvbl9jb2RlOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kczogei5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbClcbn0pO1xuY29uc3QgRmllbGRWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGVsZW1lbnRUeXBlOiB6LnN0cmluZygpLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN1Y2Nlc3M6IHoubGl0ZXJhbChmYWxzZSksXG4gIGVycm9yX3R5cGU6IHoubGl0ZXJhbChcInZhbGlkYXRpb25fZXJyb3JcIiksXG4gIGVycm9yczogei5hcnJheShGaWVsZFZhbGlkYXRpb25FcnJvcilcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkUmVzcG9uc2UgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN1Y2Nlc3NcIiwgW1xuICB6Lm9iamVjdCh7IHN1Y2Nlc3M6IHoubGl0ZXJhbCh0cnVlKSB9KSxcbiAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuXSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpXG59KTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHNcbn0pO1xudmFyIFRocmVlRFNTdGF0dXMgPSAvKiBAX19QVVJFX18gKi8gKChUaHJlZURTU3RhdHVzMikgPT4ge1xuICBUaHJlZURTU3RhdHVzMltcIlNVQ0NFU1NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJGQUlMVVJFXCJdID0gXCJmYWlsdXJlXCI7XG4gIFRocmVlRFNTdGF0dXMyW1wiQ0FOQ0VMTEVEXCJdID0gXCJjYW5jZWxsZWRcIjtcbiAgcmV0dXJuIFRocmVlRFNTdGF0dXMyO1xufSkoVGhyZWVEU1N0YXR1cyB8fCB7fSk7XG5jb25zdCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5lbnVtKFtcInN1Y2Nlc3NcIiAvKiBTVUNDRVNTICovLCBcImZhaWx1cmVcIiAvKiBGQUlMVVJFICovLCBcImNhbmNlbGxlZFwiIC8qIENBTkNFTExFRCAqL10pXG59KTtcbmNvbnN0IENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgcmVkaXJlY3RfdXJsOiB6LnN0cmluZygpLFxuICBpbml0aWFsX2ludGVudF9pZDogei5zdHJpbmcoKSxcbiAgY29uc2VudF9pZDogei5zdHJpbmcoKVxufSk7XG5cbmNvbnN0IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZCA9IChlcnJvcikgPT4ge1xuICBjb25zdCBpc3N1ZXNQZXJGaWVsZCA9IHt9O1xuICBPYmplY3QuZW50cmllcyhlcnJvcikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IEZpZWxkTmFtZUVudW0ucGFyc2Uoa2V5KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUuX2Vycm9ycykpIHtcbiAgICAgICAgaXNzdWVzUGVyRmllbGRbZmllbGROYW1lXSA9IHZhbHVlLl9lcnJvcnM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzc3Vlc1BlckZpZWxkO1xufTtcblxuY29uc3QgU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICBzdHJpcGVfcGs6IHouc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHouc3RyaW5nKCksXG4gIHN0cmlwZV9wbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IG91ckN1cnJlbmN5VG9UaGVpcnMgPSB7XG4gIHVzZDogXCJ1c2RcIixcbiAgYnJsOiBcImJybFwiXG59O1xuY29uc3QgZ2V0TG9hZGVkU3RyaXBlID0gYXN5bmMgKHB1Ymxpc2hhYmxlS2V5KSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpcGUgSlMgbm90IGZvdW5kLmApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IG5ldyBTdHJpcGUocHVibGlzaGFibGVLZXkpO1xuICByZXR1cm4gc3RyaXBlO1xufTtcbmNvbnN0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0ID0gYXN5bmMgKHN0cmlwZVB1YktleSwgdG90YWxBbW91bnRBdG9tLCBjdXJyZW5jeSwgaXNBbW91bnRQZW5kaW5nLCBpc0xpbmtPbmx5KSA9PiB7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICBjb25zdCBwYXltZW50UmVxdWVzdCA9IHN0cmlwZS5wYXltZW50UmVxdWVzdCh7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc3RyaXBlIGFjY291bnQgY291bnRyeSBhcyBzb29uIGFzIHdlIHN1cHBvcnQgaXRcbiAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgY3VycmVuY3k6IHN0cmlwZUN1cnJlbmN5LFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudEF0b20sXG4gICAgICBwZW5kaW5nOiBpc0Ftb3VudFBlbmRpbmdcbiAgICB9LFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICB9KTtcbiAgcmV0dXJuIHBheW1lbnRSZXF1ZXN0O1xufTtcbmNvbnN0IHNsZWVwID0gKHRpbWVvdXRNcykgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gIH0pO1xufTtcbmNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICByZXR1cm4gXCJTdHJpcGVcIiBpbiB3aW5kb3c7XG59O1xuY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShldnQpO1xuICAgICAgfSk7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGNvbmZpcm1TdHJpcGVQclBNID0gYXN5bmMgKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG0pID0+IHtcbiAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXh0IGFjdGlvbiBtZXRhZGF0YSBmb3JtYXQ6ICR7SlNPTi5zdHJpbmdpZnkobmV4dEFjdGlvbk1ldGFkYXRhKX1gKTtcbiAgfVxuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpcGVQbS5wYXltZW50TWV0aG9kLmlkXG4gIH0pO1xuICBpZiAoY29uZmlybVJlc3VsdC5lcnJvcikge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwiZmFpbFwiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gIH0gZWxzZSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJzdWNjZXNzXCIpO1xuICB9XG4gIHJldHVybiBjb25maXJtUmVzdWx0O1xufTtcbmNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdFN0YXR1cyA9IGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQ/LnN0YXR1cztcbiAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikgOyBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gIGNvbnN0IGV4dHJhRGF0YSA9IGluY2x1ZGVkSW5wdXRzLnJlZHVjZSgoYWNjLCBpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICByZXR1cm4geyAuLi5hY2MsIFtrZXldOiBpbnB1dC52YWx1ZSB9O1xuICB9LCB7fSk7XG4gIHJldHVybiBleHRyYURhdGE7XG59O1xuY29uc3QgcGFyc2VFdmVudFBheWxvYWQgPSAoZXZlbnREYXRhKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVsZW1lbnRFdmVudC5wYXJzZShldmVudERhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3QgZW1pdEV2ZW50ID0gKHRhcmdldCwgZm9ybUlkLCBlbGVtZW50SWQsIHBheWxvYWQsIGJhc2VVcmwpID0+IHtcbiAgY29uc3QgZXZlbnQgPSB7XG4gICAgcGF5bG9hZCxcbiAgICBub25jZTogdjQoKSxcbiAgICBmb3JtSWQsXG4gICAgZWxlbWVudElkXG4gIH07XG4gIHRhcmdldC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShldmVudCksIGJhc2VVcmwpO1xufTtcblxuY29uc3QgY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCA9IGFzeW5jIChvYmopID0+IHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgIW9iaikgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHBpbmcgPSB7IHR5cGU6IFwicGluZ1wiIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2JqLnNlbmQocGluZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAndHJ1ZScgYWZ0ZXIgcGluZywgZ290ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICByZXR1cm4gISFvYmogJiYgaXNWYWxpZDtcbn07XG5cbmNvbnN0IG51bGxPclVuZGVmT3IgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG56LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IENERVJlc3BvbnNlRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNkZV9yZXNwb25zZV90eXBlOiB6LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG56LmVudW0oW1widXNkXCIsIFwiYnJsXCJdKTtcbmNvbnN0IENvdXBvbk1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGFtb3VudF9hdG9tX29mZjogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKSxcbiAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIGN1cnJlbmN5OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBkdXJhdGlvbjogei5zdHJpbmcoKSxcbiAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpXG59KTtcbmNvbnN0IExpbmVJdGVtID0gei5vYmplY3Qoe1xuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGN1cnJlbmN5OiB6LnN0cmluZygpLFxuICBkZXNjcmlwdGlvbjogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgcHJpY2VfaWQ6IHouc3RyaW5nKCksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHF1YW50aXR5OiB6Lm51bWJlcigpLmludCgpXG59KTtcbmNvbnN0IEJyYW5kU2V0dGluZ3MgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKTtcbmNvbnN0IEJyYW5kID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxufSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3Ioei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBxdWFudGl0eTogei5udW1iZXIoKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbF9jb3VudDogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpLmludCgpKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1zOiB6LmFycmF5KFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsKSxcbiAgdHJpYWxfc3RhcnQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHRyaWFsX2VuZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKVxufSk7XG5jb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpXG59KTtcbmNvbnN0IEludm9pY2VMaW5lSXRlbU1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCksXG4gIHN1YnNjcmlwdGlvbl9pdGVtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IERpc2NvdW50TWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY291cG9uOiBDb3Vwb25NaW5pbWFsXG59KTtcbmNvbnN0IEludm9pY2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRzOiB6LmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbGluZXM6IHouYXJyYXkoSW52b2ljZUxpbmVJdGVtTWluaW1hbCksXG4gIHJlbWFpbmluZ19hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdGF4X2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICB0b3RhbF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbn0pO1xuY29uc3QgQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjcmVhdGVkOiB6LmFycmF5KFN1YnNjcmlwdGlvbk1pbmltYWwpLFxuICBpbnZvaWNlczogei5hcnJheShJbnZvaWNlTWluaW1hbClcbn0pO1xuY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHByZXZpZXc6IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCxcbiAgcHJldmlld19wb3N0X3RyaWFsOiBudWxsT3JVbmRlZk9yKENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCksXG4gIGNvdXBvbnM6IHouYXJyYXkoQ291cG9uTWluaW1hbClcbn0pO1xuY29uc3QgX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJvcGVuXCIpLFxuICB0b2tlbjogei5zdHJpbmcoKSxcbiAgZW1haWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVfaXRlbXM6IHouYXJyYXkoTGluZUl0ZW0pLFxuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGJyYW5kOiBCcmFuZCxcbiAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgLy8gTnVsbCBpbiBzZXR1cCBtb2RlXG4gIG1ldGhvZHNfYXZhaWxhYmxlOiB6LmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZClcbn0pO1xuY29uc3QgUGF5bWVudEZvcm1QcmVmaWxsID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHoubGl0ZXJhbChcInNldHVwXCIpLFxuICAgIGN1cnJlbmN5OiB6Lm51bGxhYmxlKHoudW5kZWZpbmVkKCkpXG4gIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKSxcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHouZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICBjdXJyZW5jeTogei5zdHJpbmcoKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSlcbl0pO1xuY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVcIilcbn0pO1xuY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImV4cGlyZWRcIilcbn0pO1xuei51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG56Lm9iamVjdCh7XG4gIGxvZ286IHouc3RyaW5nKCksXG4gIGljb246IHouc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHouc3RyaW5nKCksXG4gIHNlY29uZGFyeV9jb2xvcjogei5zdHJpbmcoKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgaW52b2ljZV91cmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25faWRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBjdXN0b21lcl9pZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcGF5bWVudF9pbnB1dDogei5hbnkoKSxcbiAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgY3VzdG9tZXJfZW1haWw6IHouc3RyaW5nKCksXG4gIGN1c3RvbWVyX3ppcF9jb2RlOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl9jb3VudHJ5OiB6LnN0cmluZygpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHouYm9vbGVhbigpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBwcm9tb3Rpb25fY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgcmV0dXJuX3VybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbmNvbnN0IFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG56Lm9iamVjdCh7XG4gIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKSxcbiAgY2NfcG1faWQ6IHouc3RyaW5nKClcbn0pO1xuei5yZWNvcmQoei5hbnkoKSk7XG5cbmNvbnN0IHN1bSA9IChhcnIpID0+IHtcbiAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn07XG5cbmZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7XG4gIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlO1xufVxuZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICBpZiAoZm4gPT09IHZvaWQgMCkge1xuICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB9XG5cbiAgdmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG4gIGNhcHR1cmVTdGFja1RyYWNlICYmIGNhcHR1cmVTdGFja1RyYWNlKHRhcmdldCwgZm4pO1xufVxuXG52YXIgX19leHRlbmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsICduYW1lJywge1xuICAgICAgdmFsdWU6IF9uZXdUYXJnZXQubmFtZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICBmaXhTdGFjayhfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEN1c3RvbUVycm9yO1xufShFcnJvcik7XG5cbmNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIGNvbnN0IGZyaWVuZGx5TWVzc2FnZSA9IGBbY2RlLWNsaWVudF0gRXJyb3IgcXVlcnlpbmcgQ0RFOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YDtcbiAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgfVxuICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2UubWVzc2FnZTtcbiAgfVxufVxuY29uc3QgcXVlcnlDREUgPSBhc3luYyAoY2RlQ29ubiwgZGF0YSwgcmVzcG9uc2VTY2hlbWEpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gIGlmIChpc0NERVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IENkZUVycm9yKHJlc3BvbnNlKTtcbiAgfVxuICBpZiAoIWNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hKHJlc3BvbnNlLCByZXNwb25zZVNjaGVtYSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbmNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgcmV0dXJuIHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG59O1xuY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIHJldHVybiBDREVSZXNwb25zZUVycm9yLnNhZmVQYXJzZShyZXNwb25zZSkuc3VjY2Vzcztcbn07XG5jb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9jaGVja291dF9wcmV2aWV3XCIsIHBheWxvYWQ6IHJlcXVlc3QgfSwgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9wcmVmaWxsXCIsIHBheWxvYWQ6IHt9IH0sIFBheW1lbnRGb3JtUHJlZmlsbCk7XG59O1xuY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRDaGVja291dFZhbHVlID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpID0+IHtcbiAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3KGNkZUNvbm4sIHtcbiAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgIHByb21vdGlvbl9jb2RlOiBwcm9tb0NvZGVcbiAgfSk7XG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgaWYgKGN1cnJlbmNpZXMuc2l6ZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgY3VycmVuY3ksIGdvdCAke2N1cnJlbmNpZXMuc2l6ZX1gKTtcbiAgfVxuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IFwidXNkXCI7XG4gIGNvbnN0IGFtb3VudEF0b20gPSBzdW0oY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5yZW1haW5pbmdfYW1vdW50X2F0b20pKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW5jeSxcbiAgICBhbW91bnRBdG9tXG4gIH07XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50ID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBpc1NldHVwTW9kZSwgcHJvbW9Db2RlKSA9PiB7XG4gIGlmIChpc1NldHVwTW9kZSkge1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IDAsIGN1cnJlbmN5OiBcInVzZFwiIH07XG4gIH0gZWxzZSB7XG4gICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFZhbHVlKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpO1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IGNoZWNrb3V0UHJldmlldy5hbW91bnRBdG9tLCBjdXJyZW5jeTogY2hlY2tvdXRQcmV2aWV3LmN1cnJlbmN5IH07XG4gIH1cbn07XG5jb25zdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zID0gYXN5bmMgKGFsbENkZUNvbm5lY3Rpb25zLCBwYXlsb2FkKSA9PiB7XG4gIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oYWxsQ2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpLm1hcChcbiAgICAgIChjZGVDb25uKSA9PiBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwidG9rZW5pemVfY2FyZFwiLCBwYXlsb2FkIH0sIFRva2VuaXplQ2FyZFJlc3BvbnNlKVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlc3BvbnNlcztcbn07XG5jb25zdCBjaGVja291dENhcmRFbGVtZW50cyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgdGltZW91dDogQ0RFX1BPTExJTkdfSU5URVJWQUwsXG4gICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgLy8gVE9ETzogdXNlIHdpdGggcHJvcGVyIGNoaWxkT3JpZ2luXG4gIH0pO1xuICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeUNERShjb25uZWN0aW9uT2JqLCB7IHR5cGU6IFwicGluZy0zZHMtc3RhdHVzXCIgfSwgUGluZzNEU1N0YXR1c1Jlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3VsdC5zdGF0dXM7XG59O1xuXG5jb25zdCBzdHlsZXMgPSBcIkBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjkpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSl9fS5vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjE0NzQ4MzY0OCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDgwfS5jb250YWluZXJ7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOmZhZGVJbiAuM3MgZWFzZS1vdXR9LmZyYW1le21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmV9LmNhbmNlbC1idXR0b257cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MXJlbTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RvcDotMS41cmVtO3BhZGRpbmc6MDtyaWdodDowfVwiO1xuXG5jb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBgXG4gICAgPHN0eWxlPlxuICAgICAgJHtzdHlsZXN9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8aWZyYW1lIHNyYz1cIiR7dXJsfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cInRocmVlLWRzLWlmcmFtZVwiIHRpdGxlPVwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwiIGFsbG93PVwicGF5bWVudFwiPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xufTtcblxuZnVuY3Rpb24gc3RhcnRQb2xsaW5nKGlmcmFtZSwgb25TdWNjZXNzLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBwaW5nQ2RlRm9yM2RzU3RhdHVzKGlmcmFtZSwgY2hpbGRPcmlnaW4pO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgIG9uU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9O1xuICBoYW5kbGVQb2xsaW5nKCk7XG4gIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGhhbmRsZVBvbGxpbmcsIENERV9QT0xMSU5HX0lOVEVSVkFMKTtcbiAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50cyh7XG4gIGVsZW1lbnRzLFxuICBwb2xsaW5nSW50ZXJ2YWwsXG4gIHJlc29sdmVcbn0pIHtcbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICB9O1xuICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIH07XG4gIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG59XG5hc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gIHVybCxcbiAgYmFzZVVybFxufSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIH0sIDFlMyk7XG4gICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM/LigpO1xuICAgIH07XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gaGFuZGxlRXZlbnRzKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMgPSAoc2ltcGxlT2pzRmxvdykgPT4ge1xuICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MoZmxvd1Jlc3VsdC5yZXN1bHQucGF5bWVudF9tZXRob2RfaWQpO1xuICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3VjY2VzcyhcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5pbnZvaWNlX3VybHMsXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5jdXN0b21lcl9pZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbW9kZTogJHtmbG93UmVzdWx0fWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHsgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1lcnJvci1jYXRjaGVyXCIpO1xuICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IGdldEVycm9yTWVzc2FnZShlcnJvcikgfTtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgY3JlYXRlT2pzRmxvd0xvZ2dlcnMgPSAocHJlZml4KSA9PiB7XG4gIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5sb2coYCR7Y2hhbGsuZ3JlZW4uYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5lcnJvcihgJHtjaGFsay5yZWQuYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbG9nLFxuICAgIGVycixcbiAgICBsb2dfXzogbG9nLFxuICAgIGVycl9fOiBlcnJcbiAgfTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDMsIGVycl9fOiBlcnJfXyQ0IH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDID0gKG5vbkNkZUZvcm1JbnB1dHMsIG9uVmFsaWRhdGlvbkVycm9yKSA9PiB7XG4gIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICBpZiAoIXBheWxvYWQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHBheWxvYWQuZXJyb3IuZm9ybWF0KCk7XG4gICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBlcnJvcnNdIG9mIE9iamVjdC5lbnRyaWVzKGlzc3VlcykpIHtcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yKGZpZWxkTmFtZSwgZXJyb3JzLCBmaWVsZE5hbWUpO1xuICAgIH1cbiAgICBlcnJfXyQ0KGBHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc2AsIGlzc3Vlcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIGluIG5vbi1DREUgZm9ybSBmaWVsZHNcIik7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQuZGF0YTtcbn07XG5jb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICBmb3IgKGNvbnN0IHRva2VuaXplUmVzdWx0IG9mIHRva2VuaXplUmVzdWx0cykge1xuICAgIGlmICh0b2tlbml6ZVJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEFsbEZpZWxkTmFtZXMuc2FmZVBhcnNlKGVycm9yLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXJzZWQuZGF0YTtcbiAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nX18kMyhgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyB3aGlsZSB0b2tlbml6aW5nIGNhcmRcIik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCB7IGVycl9fOiBlcnJfXyQzIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1tb25cIik7XG5jb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwYXltZW50IG1ldGhvZCwgZ290ICR7cmVzcG9uc2UucGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4geyBwYXltZW50X21ldGhvZF9pZDogcmVzcG9uc2UucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG59O1xuY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICBjb25zdCBjcG0gPSBhbGxDUE1zLmZpbmQoKGNwbTIpID0+IHpvZE1vZGVsLnNhZmVQYXJzZShjcG0yKS5zdWNjZXNzKTtcbiAgaWYgKCFjcG0pIHtcbiAgICBlcnJfXyQzKGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbCAke3pvZE1vZGVsfWApO1xuICAgIGVycl9fJDMoYWxsQ1BNcyk7XG4gICAgZXJyX18kMyhgem9kTW9kZWxgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsICR7em9kTW9kZWx9YCk7XG4gIH1cbiAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQyLCBlcnJfXzogZXJyX18kMiB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCB7IGxvZ19fOiBzdHJpcGVMb2dfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtY2NcIik7XG5jb25zdCBydW5Db21tb25DY0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHsgY29udGV4dCwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICBsb2dfXyQyKGDilJwgUnVubmluZyBjb21tb24gQ0MgZmxvdy4uLmAsIHsgY2hlY2tvdXRQYXltZW50TWV0aG9kIH0pO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGxvZ19fJDIoYOKUnCBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHMgW01vZGU6ICR7cHJlZmlsbC5tb2RlfV1gKTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0Mobm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMihg4pScIFRva2VuaXppbmcgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICBjb25zdCB0b2tlbml6ZUNhcmRSZXN1bHRzID0gYXdhaXQgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyhjb250ZXh0LmNkZUNvbm5lY3Rpb25zLCB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkXG4gICAgfSk7XG4gICAgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzKHRva2VuaXplQ2FyZFJlc3VsdHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbW1vbkNoZWNrb3V0UGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBub25DZGVGb3JtRmllbGRzXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBTZXR0aW5nIHVwIHBheW1lbnQgbWV0aG9kIGluIENERSBbVG9rZW46ICR7cHJlZmlsbC50b2tlbn1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldHVwQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7cmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBJbml0aWFsIGNoZWNrb3V0IGZsb3cuIENoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDZGVFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93YCk7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkVXNlTmV3RmxvdyA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnM/LltcIm9wLXNob3VsZC11c2UtbmV3LWZsb3dcIl0gPT09IFwidHJ1ZVwiO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBvcC1zaG91bGQtdXNlLW5ldy1mbG93OiAke3Nob3VsZFVzZU5ld0Zsb3d9YCk7XG4gICAgICAgICAgbG9nX18kMihg4pScIFBheW1lbnQgZmxvdyByZXN1bHQ6YCwgc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbW1vbkNDM0RTRmxvdyhzdGFydFBmUmVzdWx0LCBjb250ZXh0LmJhc2VVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OmAsIGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke2NyZWF0ZWRQYXltZW50TWV0aG9kLnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ2hlY2tpbmcgb3V0IGFmdGVyIDNEUyBmbG93IFtGbG93OiAke3Nob3VsZFVzZU5ld0Zsb3cgPyBcIm5ld1wiIDogXCJsZWdhY3lcIn1dYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogc3RhcnRQZlJlc3VsdC5jY19wbV9pZCxcbiAgICAgICAgICAgICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogIXNob3VsZFVzZU5ld0Zsb3dcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICBlcnJfXyQyKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IHN0cmlwZUFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcInN0cmlwZV8zZHNcIik7XG4gIGlmICghc3RyaXBlQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShzdHJpcGVBY3Rpb24pO1xufTtcbmNvbnN0IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IGNvbW1vbkFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIik7XG4gIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbW9uIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xufTtcbmNvbnN0IGNvbW1vbkNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0LCBiYXNlVXJsKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICBsb2dfXyQyKGDilJwgVXNpbmcgY29tbW9uIDNEUyBmbG93IFtVUkw6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybH1dYCk7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiBuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsLCBiYXNlVXJsIH0pO1xuICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkNBTkNFTExFRCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gY2FuY2VsbGVkXCIpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuRkFJTFVSRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICB9XG59O1xuY29uc3Qgc3RyaXBlQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIHN0cmlwZUxvZ19fKGDilJwgVXNpbmcgc3RyaXBlIDNEUyBmbG93IFtDbGllbnQgU2VjcmV0OiAke25leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LnN1YnN0cmluZygwLCA4KX0uLi5dYCk7XG4gIGF3YWl0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cobmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQxLCBlcnJfXzogZXJyX18kMSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtcHJcIik7XG5jb25zdCBTdHJpcGVQckNwbSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHoudW5pb24oW3oubGl0ZXJhbChcImFwcGxlX3BheVwiKSwgei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICBwcm9jZXNzb3JfbmFtZTogei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogei5zdHJpbmcoKVxuICB9KVxufSk7XG5jb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgYXN5bmMgKHsgY29udGV4dCB9KSA9PiB7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgIGxvZ19fJDEoYEluaXRpYWxpemluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgbG9nX18kMShgR2V0dGluZyBpbml0aWFsIHByZXZpZXcgYW1vdW50YCk7XG4gICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgY29uc3QgcHIgPSBhd2FpdCBjcmVhdGVTdHJpcGVQYXltZW50UmVxdWVzdChcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZC5tZXRhZGF0YS5zdHJpcGVfcGssXG4gICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgaW5pdGlhbFByZXZpZXcuY3VycmVuY3ksXG4gICAgICBpc1NldHVwTW9kZVxuICAgICk7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgY2FuIG1ha2UgcGF5bWVudGApO1xuICAgIGNvbnN0IGNhbk1ha2VQYXltZW50ID0gYXdhaXQgcHIuY2FuTWFrZVBheW1lbnQoKTtcbiAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgIGVycl9fJDEoYGNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxgKTtcbiAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBcImNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxcIiB9O1xuICAgIH1cbiAgICBsb2dfXyQxKGBTdHJpcGUgUFIgZmxvdyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuIENhbiBtYWtlIHBheW1lbnRgLCBjYW5NYWtlUGF5bWVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgcHIsXG4gICAgICBhdmFpbGFibGVQcm92aWRlcnM6IHtcbiAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICBnb29nbGVQYXk6IGNhbk1ha2VQYXltZW50Lmdvb2dsZVBheVxuICAgICAgfVxuICAgIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0LFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBub25DZGVGb3JtSW5wdXRzLFxuICAgIGZsb3dDYWxsYmFja3MsXG4gICAgY3VzdG9tUGFyYW1zLFxuICAgIGluaXRSZXN1bHRcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBpZiAoY3VzdG9tUGFyYW1zLnByb3ZpZGVyICE9PSBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZXIgbWlzbWF0Y2guIEV4cGVjdGVkICR7Y3VzdG9tUGFyYW1zLnByb3ZpZGVyfSwgZ290ICR7Y2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyfWApO1xuICAgIH1cbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwciA9IGluaXRSZXN1bHQucHI7XG4gICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBjdXN0b21QYXJhbXMub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgUFIgYW1vdW50IHdpdGhgLCBvdmVycmlkZSk7XG4gICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgfVxuICAgIGxvZ19fJDEoYFNob3dpbmcgUFIgZGlhbG9nLi4uYCk7XG4gICAgcHIuc2hvdygpO1xuICAgIGNvbnN0IHN0cmlwZVBtQWRkZWRFdmVudCA9IGF3YWl0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kKHByKTtcbiAgICBsb2dfXyQxKGBTdHJpcGUgUE0gYWRkZWQgZXZlbnQ6YCwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBsb2dfXyQxKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbShub25DZGVGb3JtSW5wdXRzLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50Rmxvd0ZvclBSKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgIGZpZWxkczogbm9uQ2RlRm9ybUZpZWxkcyxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgYXdhaXQgY29uZmlybVN0cmlwZVByUE0obmV4dEFjdGlvbk1ldGFkYXRhLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgbG9nX18kMShgQ29uZmlybWluZyBwYXltZW50IGZsb3cgZm9yIHNldHVwLi4uYCk7XG4gICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dfXyQxKGBQZXJmb3JtaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbUV2dCkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG1FdnQucGF5ZXJOYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIGNvbnN0IHBheWVyTGFzdE5hbWUgPSBwYXllckxhc3ROYW1lUGFydHMuam9pbihcIiBcIikgfHwgdm9pZCAwO1xuICBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSB8fCBwYXllckZpcnN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gPSBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSB8fCBzdHJpcGVQbUV2dC5wYXllckVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICBsb2dfXyQxKGBGaW5hbCBmb3JtIGlucHV0czpgLCBpbnB1dHMpO1xuICByZXR1cm4gaW5wdXRzO1xufTtcbmNvbnN0IHVwZGF0ZVByV2l0aEFtb3VudCA9IChwciwgYW1vdW50LCBpc1BlbmRpbmcpID0+IHtcbiAgcHIudXBkYXRlKHtcbiAgICB0b3RhbDoge1xuICAgICAgYW1vdW50OiBhbW91bnQuYW1vdW50QXRvbSxcbiAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICBwZW5kaW5nOiBpc1BlbmRpbmdcbiAgICB9LFxuICAgIGN1cnJlbmN5OiBhbW91bnQuY3VycmVuY3lcbiAgfSk7XG59O1xuY29uc3QgcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBpZiAocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJyZWQuXG5EZXRhaWxzOiBnb3QgJHtyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RofSByZXF1aXJlZCB1c2VyIGFjdGlvbnNgKTtcbiAgfVxuICByZXR1cm4gUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKTtcbn07XG5cbmNvbnN0IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QgPSAoY3Btcywgd2l0aFByb3ZpZGVyLCB3aXRoUHJvY2Vzc29yKSA9PiB7XG4gIGNvbnN0IG1hdGNoZXMgPSBjcG1zLmZpbHRlcigoY3BtKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlc1Byb2Nlc3NvciA9IHRydWUgO1xuICAgIGNvbnN0IG1hdGNoZXNQcm92aWRlciA9IGNwbS5wcm92aWRlciA9PT0gd2l0aFByb3ZpZGVyO1xuICAgIHJldHVybiBtYXRjaGVzUHJvY2Vzc29yICYmIG1hdGNoZXNQcm92aWRlcjtcbiAgfSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gb25lIENQTSBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXNbMF07XG59O1xuY29uc3QgT2pzRmxvd3MgPSB7XG4gIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gIC8vIFN0cmlwZVxuICBjb21tb25DQzoge1xuICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gIH0sXG4gIHN0cmlwZVBSOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZVByRmxvd1xuICB9XG4gIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxudmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQyLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IHZvaWQgMDtcblxuLy8gPT09IFN5bWJvbCBTdXBwb3J0ID09PVxuY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbmNvbnN0IGdldFN5bWJvbCA9IG5hbWUgPT4gaGFzU3ltYm9sKG5hbWUpID8gU3ltYm9sW25hbWVdIDogJ0BAJyArIG5hbWU7XG5cbmNvbnN0IFN5bWJvbEl0ZXJhdG9yID0gZ2V0U3ltYm9sKCdpdGVyYXRvcicpO1xuY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuY29uc3QgU3ltYm9sU3BlY2llcyA9IGdldFN5bWJvbCgnc3BlY2llcycpOyAvLyA9PT0gQWJzdHJhY3QgT3BlcmF0aW9ucyA9PT1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKG9iaiwga2V5KSB7XG4gIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRTcGVjaWVzKG9iaikge1xuICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICBpZiAoY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY3RvciA9IGN0b3JbU3ltYm9sU3BlY2llc107XG5cbiAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgY3RvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3RvciAhPT0gdW5kZWZpbmVkID8gY3RvciA6IE9ic2VydmFibGUkMTtcbn1cblxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBPYnNlcnZhYmxlJDE7IC8vIFNQRUM6IEJyYW5kIGNoZWNrXG59XG5cbmZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gIGlmIChob3N0UmVwb3J0RXJyb3IubG9nKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yLmxvZyhlKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2NsZWFudXA7XG4gIGlmIChjbGVhbnVwID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gIGlmICghY2xlYW51cCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1bnN1YnNjcmliZSA9IGdldE1ldGhvZChjbGVhbnVwLCAndW5zdWJzY3JpYmUnKTtcblxuICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgIHVuc3Vic2NyaWJlLmNhbGwoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2Nsb3NlZCc7XG59XG5cbmZ1bmN0aW9uIGZsdXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBsZXQgcXVldWUgPSBzdWJzY3JpcHRpb24uX3F1ZXVlO1xuXG4gIGlmICghcXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5JztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpIHtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdydW5uaW5nJztcbiAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICB0cnkge1xuICAgIGxldCBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLCB0eXBlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtlbHNlIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAncnVubmluZycpIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xufVxuXG5mdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgcmV0dXJuO1xuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnYnVmZmVyaW5nJykge1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdidWZmZXJpbmcnO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSBbe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfV07XG4gICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG59XG5cbmNsYXNzIFN1YnNjcmlwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgLy8gQVNTRVJUOiBvYnNlcnZlciBpcyBhbiBvYmplY3RcbiAgICAvLyBBU1NFUlQ6IHN1YnNjcmliZXIgaXMgY2FsbGFibGVcbiAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX29ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgbGV0IHN1YnNjcmlwdGlvbk9ic2VydmVyID0ge1xuICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgICAgIH0sXG5cbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ25leHQnLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnZXJyb3InLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2NvbXBsZXRlJyk7XG4gICAgICB9XG5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NsZWFudXAgPSBzdWJzY3JpYmVyLmNhbGwodW5kZWZpbmVkLCBzdWJzY3JpcHRpb25PYnNlcnZlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgIH1cbiAgfVxuXG59XG5cbmxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3Ioc3Vic2NyaWJlcikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24nKTtcbiAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgdGhpcy5fc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gIH1cblxuICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgb2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICBlcnJvcjogYXJndW1lbnRzWzFdLFxuICAgICAgICBjb21wbGV0ZTogYXJndW1lbnRzWzJdXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9zdWJzY3JpYmVyKTtcbiAgfVxuXG4gIGZvckVhY2goZm4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbih2YWx1ZSwgZG9uZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hcChmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGZpbHRlcihmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgcmVkdWNlKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgbGV0IGhhc1NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMTtcbiAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBsZXQgc2VlZCA9IGFyZ3VtZW50c1sxXTtcbiAgICBsZXQgYWNjID0gc2VlZDtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICBsZXQgZmlyc3QgPSAhaGFzVmFsdWU7XG4gICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWZpcnN0IHx8IGhhc1NlZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChhY2MpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgYWxsKCkge1xuICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmZvckVhY2godmFsdWUgPT4gdmFsdWVzLnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgY29uY2F0KC4uLnNvdXJjZXMpIHtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb247XG4gICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBzdGFydE5leHQobmV4dCkge1xuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXh0LnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHYpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXJ0TmV4dChDLmZyb20oc291cmNlc1tpbmRleCsrXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RhcnROZXh0KHRoaXMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZsYXRNYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgICBsZXQgaSA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihpbm5lcik7XG4gICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY29tcGxldGVJZkRvbmUoKSB7XG4gICAgICAgIGlmIChvdXRlci5jbG9zZWQgJiYgc3Vic2NyaXB0aW9ucy5sZW5ndGggPT09IDApIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgW1N5bWJvbE9ic2VydmFibGVdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIGZyb20oeCkge1xuICAgIGxldCBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogT2JzZXJ2YWJsZTtcbiAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICBsZXQgbWV0aG9kID0gZ2V0TWV0aG9kKHgsIFN5bWJvbE9ic2VydmFibGUpO1xuXG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgIGlmIChPYmplY3Qob2JzZXJ2YWJsZSkgIT09IG9ic2VydmFibGUpIHRocm93IG5ldyBUeXBlRXJyb3Iob2JzZXJ2YWJsZSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSAmJiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgIH1cblxuICAgIGlmIChoYXNTeW1ib2woJ2l0ZXJhdG9yJykpIHtcbiAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBtZXRob2QuY2FsbCh4KSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeFtpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBvYnNlcnZhYmxlJyk7XG4gIH1cblxuICBzdGF0aWMgb2YoLi4uaXRlbXMpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbXNbaV0pO1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgW1N5bWJvbFNwZWNpZXNdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn07XG5cbk9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMSwgU3ltYm9sKCdleHRlbnNpb25zJyksIHtcbiAgdmFsdWU6IHtcbiAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgaG9zdFJlcG9ydEVycm9yXG4gIH0sXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbnZhciB6ZW5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQyLk9ic2VydmFibGU7XG5cbmNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbmNvbnN0IHsgbG9nX18sIGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZmxvd3NcIik7XG5jb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCkgPT4ge1xuICByZXR1cm4ge1xuICAgIC8vIFN0cmlwZSBQUlxuICAgIHN0cmlwZVBSOiBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZShcInN0cmlwZVBSXCIsIE9qc0Zsb3dzLnN0cmlwZVBSLmluaXQoeyBjb250ZXh0IH0pKVxuICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgfTtcbn07XG5jb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgIG9ic2VydmVyLm5leHQoeyBzdGF0dXM6IFwibG9hZGluZ1wiIH0pO1xuICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkZWRcIiwgcmVzdWx0IH0pO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgIGxvZ19fKGAke2Zsb3dOYW1lfSBmbG93IHJlc3VsdGAsIHJlc3VsdCk7XG4gICAgfSxcbiAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICBlcnJfXyhgJHtmbG93TmFtZX0gZmxvdyBpbml0aWFsaXphdGlvbiBlcnJvcjpcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9ic2VydmFibGU7XG59O1xuXG5jb25zdCBQUl9MT0FESU5HID0ge1xuICBpc0xvYWRpbmc6IHRydWUsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gIH1cbn07XG5jb25zdCBQUl9FUlJPUiA9IHtcbiAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgfVxufTtcblxuY2xhc3MgT3BlblBheUZvcm1FdmVudEhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihmb3JtSW5zdGFuY2UpIHtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZSA9IGZvcm1JbnN0YW5jZTtcbiAgICB0aGlzLmNvbmZpZyA9IGZvcm1JbnN0YW5jZS5jb25maWc7XG4gICAgdGhpcy5mb3JtSWQgPSBmb3JtSW5zdGFuY2UuZm9ybUlkO1xuICAgIHRoaXMuZXZlbnRUYXJnZXRzID0ge307XG4gICAgdGhpcy5ub25jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICB9XG4gIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLl9mcmFtZVVybD8ub3JpZ2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBldmVudC5kYXRhW1wicGVucGFsXCJdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHBhcnNlRXZlbnRQYXlsb2FkKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlRXZlbnQoZXZlbnREYXRhKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcbiAgICBjb25zdCB7IGVsZW1lbnRJZCwgcGF5bG9hZCB9ID0gZXZlbnREYXRhO1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IHBheWxvYWQudHlwZTtcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBcIkxBWU9VVFwiOlxuICAgICAgICB0aGlzLmhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGT0NVU1wiOlxuICAgICAgICB0aGlzLmhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQkxVUlwiOlxuICAgICAgICB0aGlzLmhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJDSEFOR0VcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUsIHBheWxvYWQuZXJyb3JzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiTE9BREVEXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlTG9hZGVkRXZlbnQoZXZlbnQuc291cmNlLCBlbGVtZW50SWQsIHBheWxvYWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJMT0FEX0VSUk9SXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlZBTElEQVRJT05fRVJST1JcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JFdmVudChwYXlsb2FkLCBlbGVtZW50SWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGVFdmVudChldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnREYXRhLmZvcm1JZCAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuZm9ybUlkIHx8ICFldmVudERhdGEuZWxlbWVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm5vbmNlcy5oYXMoZXZlbnREYXRhLm5vbmNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm5vbmNlcy5hZGQoZXZlbnREYXRhLm5vbmNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYW5kbGVMYXlvdXRFdmVudChwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGF5bG9hZC5oZWlnaHQgPyBgJHtwYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXRGb3JtSGVpZ2h0KGhlaWdodCk7XG4gIH1cbiAgaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRm9jdXMpIHRoaXMuY29uZmlnLm9uRm9jdXMoZWxlbWVudElkLCBmaWVsZCk7XG4gIH1cbiAgaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgZmllbGQpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25CbHVyKSB0aGlzLmNvbmZpZy5vbkJsdXIoZWxlbWVudElkLCBmaWVsZCk7XG4gIH1cbiAgaGFuZGxlQ2hhbmdlRXZlbnQoZWxlbWVudElkLCBmaWVsZCwgZXJyb3JzKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hhbmdlKSB0aGlzLmNvbmZpZy5vbkNoYW5nZShlbGVtZW50SWQsIGZpZWxkLCBlcnJvcnMpO1xuICB9XG4gIGFzeW5jIGhhbmRsZUxvYWRlZEV2ZW50KHNvdXJjZSwgZWxlbWVudElkLCBwYXlsb2FkKSB7XG4gICAgdGhpcy5ldmVudFRhcmdldHNbZWxlbWVudElkXSA9IHNvdXJjZTtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZS5vbkNkZUxvYWRlZChwYXlsb2FkKTtcbiAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkxvYWQocGF5bG9hZC50b3RhbEFtb3VudEF0b21zLCBwYXlsb2FkLmN1cnJlbmN5KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCkge1xuICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IpIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vbkxvYWRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICB9XG4gIGhhbmRsZVZhbGlkYXRpb25FcnJvckV2ZW50KHBheWxvYWQsIGVsZW1lbnRJZCkge1xuICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25WYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICB9XG4gIH1cbiAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAvLyAgIGlmIChwYXlsb2FkLm1lc3NhZ2UgPT09ICczRFNfUkVRVUlSRUQnKSB7XG4gIC8vICAgICBjb25zdCB0aHJlZURTVXJsID0gcGF5bG9hZC5oZWFkZXJzPy5bJ3gtM2RzLWF1dGgtdXJsJ10gPz8gU0lNVUxBVEVfM0RTX1VSTDtcbiAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gIC8vICAgICAvLyB3aWxsIHJldHVybiBhIHN0YXR1cyBgc3VjY2Vzc2AgfCBgZmFpbHVyZWAgfCBgY2FuY2VsbGVkYCB3aGljaCB3ZSBjYW4gY29udGludWUgd2l0aFxuICAvLyAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhcnQzZHNWZXJpZmljYXRpb24oeyB1cmw6IHRocmVlRFNVcmwsIGJhc2VVcmw6IHRoaXMuY29uZmlnLmJhc2VVcmwhIH0pO1xuICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAvLyAgICAgLy8gVE9ETzogY29udGludWUgd2l0aCBzdGF0dXNcbiAgLy8gICAgIGNvbnN0IGNhcmRDcG0gPSB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5maW5kKChjcG0pID0+IGNwbS5wcm92aWRlciA9PT0gJ2NyZWRpdF9jYXJkJyk7XG4gIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cykpIHtcbiAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAvLyAgICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gIC8vICAgICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgLy8gICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gIC8vICAgICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgLy8gICAgICAgICBmYWxzZVxuICAvLyAgICAgICApO1xuICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAvLyAgICAgICB0aGlzLnRva2VuaXplZERhdGEgPSBzdGFydFBheW1lbnRGbG93RXZlbnQ7XG4gIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgICB9XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgLy8gICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25DaGVja291dEVycm9yKHBheWxvYWQubWVzc2FnZSk7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIGhhbmRsZUZvcm1TdWJtaXQoKSB7XG4gIC8vICAgaWYgKFxuICAvLyAgICAgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fFxuICAvLyAgICAgIXRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHM/Lmxlbmd0aCB8fFxuICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gIC8vICAgKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IGNhcmRDcG0gPSB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzLmZpbmQoKGNwbSkgPT4gY3BtLnByb3ZpZGVyID09PSAnY3JlZGl0X2NhcmQnKTtcbiAgLy8gICBpZiAoIWNhcmRDcG0pIHtcbiAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgdG9rZW5pemVEYXRhID0gY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkKFxuICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gIC8vICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQhLFxuICAvLyAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1JbnN0YW5jZS5mb3JtVGFyZ2V0KSA/PyBkb2N1bWVudC5ib2R5LFxuICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gIC8vICAgICBjYXJkQ3BtLFxuICAvLyAgICAgZmFsc2VcbiAgLy8gICApO1xuICAvLyAgIGlmICghdG9rZW5pemVEYXRhKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNvbnN0cnVjdGluZyB0b2tlbml6ZSBkYXRhJyk7XG4gIC8vICAgfVxuICAvLyAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cykpIHtcbiAgLy8gICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcbiAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy50b2tlbml6ZWREYXRhID0gdG9rZW5pemVEYXRhO1xuICAvLyB9XG4gIC8vIGFzeW5jIG9uVXNlckNvbXBsZXRlUGF5bWVudFJlcXVlc3RVSShcbiAgLy8gICBzdHJpcGVQbTogUGF5bWVudFJlcXVlc3RQYXltZW50TWV0aG9kRXZlbnQsXG4gIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgLy8gKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vICAgaWYgKCF0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvciB8fCAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8ICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzKVxuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgZWxlbWVudF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMgPz8ge30pKSB7XG4gIC8vICAgICBjb25zdCBwYXltZW50Rmxvd01ldGFkYXRhID0geyBzdHJpcGVQbUlkOiBzdHJpcGVQbS5wYXltZW50TWV0aG9kLmlkIH07XG4gIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gIC8vICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkLFxuICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gIC8vICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAvLyAgICAgICBjaGVja291dFBheW1lbnRNZXRob2QsXG4gIC8vICAgICAgIGZhbHNlLFxuICAvLyAgICAgICBwYXltZW50Rmxvd01ldGFkYXRhXG4gIC8vICAgICApO1xuICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAvLyAgICAgdGhpcy5zdHJpcGVQbSA9IHN0cmlwZVBtO1xuICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZShlbGVtZW50LCBlbGVtZW50SWQsIHN0YXJ0UGF5bWVudEZsb3dFdmVudCk7XG4gIC8vICAgICAvLyBlbWl0RXZlbnQoZWxlbWVudC5ub2RlLmNvbnRlbnRXaW5kb3chLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBzdGFydFBheW1lbnRGbG93RXZlbnQsIHRoaXMuY29uZmlnLmJhc2VVcmwhKTtcbiAgLy8gICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gfVxuICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgZW1pdEV2ZW50KHNvdXJjZSwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgZGF0YSwgdGhpcy5jb25maWcuYmFzZVVybCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihpZnJhbWUsIGNoaWxkT3JpZ2luKSB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0VG9DaGlsZCh7XG4gICAgaWZyYW1lLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBjaGlsZE9yaWdpblxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgaXNWYWxpZE9iamVjdCA9IGF3YWl0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QoY29ubmVjdGlvbk9iaik7XG4gIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gIH1cbiAgcmV0dXJuIGNvbm5lY3Rpb25PYmo7XG59XG5jbGFzcyBDb25uZWN0aW9uTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGFkZENvbm5lY3Rpb24oaWQsIGNvbm5lY3Rpb24pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChpZCwgY29ubmVjdGlvbik7XG4gIH1cbiAgZ2V0Q29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIG5vdCBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gIH1cbiAgZ2V0QWxsQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnM7XG4gIH1cbn1cblxuY2xhc3MgT3BlblBheUZvcm0ge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLnRyeUluaXRPanNGbG93cyA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKS5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiA9IGluaXRpYWxpemVPanNGbG93cyh0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCkpO1xuICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uLnN0cmlwZVBSLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2Uoc3RhdHVzKSk7XG4gICAgfTtcbiAgICB0aGlzLm9uQ2RlTG9hZGVkID0gKHBheWxvYWQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jZGVMb2FkZWRQYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2UgPSAoaW5pdFN0YXR1cykgPT4ge1xuICAgICAgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9MT0FESU5HLCBnb29nbGVfcGF5OiBQUl9MT0FESU5HIH0pO1xuICAgICAgfSBlbHNlIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oeyBhcHBsZV9wYXk6IFBSX0VSUk9SLCBnb29nbGVfcGF5OiBQUl9FUlJPUiB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGluaXRTdGF0dXMucmVzdWx0O1xuICAgICAgICBjb25zdCBjYW5BcHBsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuYXBwbGVQYXk7XG4gICAgICAgIGNvbnN0IGNhbkdvb2dsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5O1xuICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHtcbiAgICAgICAgICBhcHBsZV9wYXk6IHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuQXBwbGVQYXksXG4gICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5BcHBsZVBheSA/IHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdvb2dsZV9wYXk6IHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuR29vZ2xlUGF5LFxuICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdChcImdvb2dsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdCA9IChwcm92aWRlciwgaW5pdFJlc3VsdCwgcGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIHByb3ZpZGVyKSxcbiAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogdGhpcy5nZXROb25DZGVGb3JtSW5wdXRzKCksXG4gICAgICAgIGZsb3dDYWxsYmFja3M6IHRoaXMuY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpLFxuICAgICAgICBjdXN0b21QYXJhbXM6IHsgcHJvdmlkZXIsIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCB9LFxuICAgICAgICBpbml0UmVzdWx0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIE9wZW5QYXlGb3JtLmFzc2lnbkFzU2luZ2xldG9uKHRoaXMpO1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIGJhc2VVcmw6IGNvbmZpZy5iYXNlVXJsID8/IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIiB9O1xuICAgIHRoaXMuZWxlbWVudHMgPSBudWxsO1xuICAgIHRoaXMuZm9ybUlkID0gYG9wanMtZm9ybS0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgdGhpcy5yZWZlcmVyID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB0aGlzLmZvcm1UYXJnZXQgPSBjb25maWcuZm9ybVRhcmdldCA/PyBcImJvZHlcIjtcbiAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzID0geyBoZWlnaHQ6IFwiMXB4XCIgfTtcbiAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBudWxsO1xuICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiA9IG51bGw7XG4gICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigpO1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyKHRoaXMpO1xuICAgIHRoaXMub2pzVmVyc2lvbiA9IFwiMC4xLjdcIjtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSk7XG4gIH1cbiAgc3RhdGljIHtcbiAgICB0aGlzLm9qc0Zsb3dzID0gT2pzRmxvd3M7XG4gIH1cbiAgLyoqXG4gICAqIEFzc2lnbiB0aGUgaW5zdGFuY2UgdG8gdGhlIHdpbmRvdyBhcyBhIHNpbmdsZXRvblxuICAgKiBAcGFyYW0gZm9ybSAtIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzc2lnbkFzU2luZ2xldG9uKGZvcm0pIHtcbiAgICBpZiAoT3BlblBheUZvcm0uZ2V0SW5zdGFuY2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cy4gT25seSBvbmUgaW5zdGFuY2UgaXMgYWxsb3dlZC5cIik7XG4gICAgfVxuICAgIHdpbmRvd1tcIm9qc1wiXSA9IGZvcm07XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5QYXlGb3JtXG4gICAqIEByZXR1cm5zIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIHJldHVybiB3aW5kb3dbXCJvanNcIl0gPz8gbnVsbDtcbiAgfVxuICBnZXRDb25uZWN0aW9uTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlcjtcbiAgfVxuICBzZXRGb3JtSGVpZ2h0KGhlaWdodCkge1xuICAgIHRoaXMuZm9ybVByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbWVudC5ub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjcmVhdGVFbGVtZW50KGVsZW1lbnRWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBmb3JtIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICBjb25zdCB0eXBlID0gRWxlbWVudFR5cGUucGFyc2UoZWxlbWVudFZhbHVlKTtcbiAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucyk7XG4gICAgZnJhbWUubmFtZSA9IGAke3R5cGV9LWVsZW1lbnRgO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYC9hcHAvdjEvJHtmcmFtZS5uYW1lfWAsIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgIHVybC5zZWFyY2ggPSBxdWVyeVN0cmluZy50b1N0cmluZygpO1xuICAgIGZyYW1lLnNyYyA9IHVybC5ocmVmO1xuICAgIHRoaXMuY29uZmlnLl9mcmFtZVVybCA9IHVybDtcbiAgICBmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcbiAgICBmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgICB0eXBlLFxuICAgICAgbm9kZTogZnJhbWUsXG4gICAgICBtb3VudDogKHNlbGVjdG9yKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKT8uYXBwZW5kQ2hpbGQoZnJhbWUpXG4gICAgfTtcbiAgICB0aGlzLmNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbdHlwZV0gPSBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnRzID0geyBbdHlwZV06IGVsZW1lbnQgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgYnVpbGRRdWVyeVN0cmluZyhvcHRpb25zKSB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwicmVmZXJlclwiLCB0aGlzLnJlZmVyZXIpO1xuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcImZvcm1JZFwiLCB0aGlzLmZvcm1JZCk7XG4gICAgaWYgKG9wdGlvbnMuc3R5bGVzKSB7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJzdHlsZXNcIiwgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcob3B0aW9ucy5zdHlsZXMpKTtcbiAgICB9XG4gICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xuICB9XG4gIGNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCkge1xuICAgIGNyZWF0ZUNvbm5lY3Rpb24oZWxlbWVudC5ub2RlKS50aGVuKChjb25uKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmFkZENvbm5lY3Rpb24oZWxlbWVudC50eXBlLCBjb25uKTtcbiAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4gdm9pZCAwKTtcbiAgfVxuICBnZXRGb3JtRGl2KCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keTtcbiAgfVxuICBjcmVhdGVPanNGbG93Q29udGV4dCgpIHtcbiAgICBjb25zdCBjZGVDb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKTtcbiAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGVkIGNvbnRleHQgd2hpbGUgQ0RFIG5vdCB5ZXQgbG9hZGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYmFzZVVybDogbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsID8/IEZSQU1FX0JBU0VfVVJMKS5vcmlnaW4sXG4gICAgICBmb3JtRGl2OiB0aGlzLmdldEZvcm1EaXYoKSxcbiAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICBjZGVDb25uZWN0aW9uc1xuICAgIH07XG4gIH1cbiAgZ2V0Tm9uQ2RlRm9ybUlucHV0cygpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKHRoaXMuZ2V0Rm9ybURpdigpKTtcbiAgfVxuICBjcmVhdGVPanNGbG93Q2FsbGJhY2tzKCkge1xuICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgdGhpcy5jb25maWcub25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdWNjZXNzXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFxuICAgICAgICBcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLFxuICAgICAgICB0aGlzLmNvbmZpZy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MgPz8gbm9PcFxuICAgICAgKSxcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICB9O1xuICB9XG4gIHN1Ym1pdCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIE9qc0Zsb3dzLmNvbW1vbkNDLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgXCJjcmVkaXRfY2FyZFwiKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IHRoaXMuZ2V0Tm9uQ2RlRm9ybUlucHV0cygpLFxuICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICBjdXN0b21QYXJhbXM6IHZvaWQgMCxcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBjdXN0b20gcGFyYW1zXG4gICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBpbml0aWFsaXphdGlvblxuICAgIH0pO1xuICB9XG4gIG9uUGF5bWVudFJlcXVlc3RFcnJvcihlcnJNc2cpIHtcbiAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMgPz8ge30pKSB7XG4gICAgICBlbGVtZW50Lm5vZGUucmVtb3ZlKCk7XG4gICAgfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGaWVsZE5hbWUsIE9wZW5QYXlGb3JtIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFBQSxTQUFTO0FBQ2xCLFNBQVMsTUFBQUMsVUFBVTtBQUNuQixTQUFTLGtCQUFBQyxVQUFzQjtBQUMvQixPQUFPQyxPQUFXO0FBRWxCLE1BQU1DLEtBQWlCLDhCQUVqQkMsS0FBNEJMLEVBQUUsT0FBTztBQUFBLEVBQ3pDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsS0FBS0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3ZCLEtBQUtBLEVBQUUsT0FBTztBQUFBLEVBQ2QsS0FBS0EsRUFBRSxPQUFPO0FBQ2hCLENBQUMsR0FDS00sS0FBa0NOLEVBQUUsTUFBTUssRUFBeUIsR0FDbkVFLEtBQWdCUCxFQUFFLE9BQU87QUFBQSxFQUM3QixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLFNBQVNBLEVBQUUsT0FBTztBQUFBLEVBQ2xCLE1BQU1BLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFDMUIsQ0FBQyxHQUNLUSxLQUFpQlIsRUFBRSxNQUFNTyxFQUFhLEdBQ3RDRSxLQUFrQztBQUFBLEVBQ3RDLG1CQUFtQjtBQUNyQixHQUNNQyxJQUEwQixDQUFDQyxNQUFtQjtBQUNsRCxRQUFNQyxJQUFNRCxFQUFlLFlBQVksRUFBRSxLQUFLO0FBQzlDLFNBQU9GLEdBQWdDRyxDQUFHLEtBQUtEO0FBQ2pELEdBQ01FLEtBQTBCLENBQUNDLE1BQVE7QUFDdkMsTUFBSTtBQUVGLFdBQU8sT0FEUSxLQUFLLE1BQU1BLENBQUcsS0FDSjtBQUFBLEVBQzNCLFFBQVk7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGLEdBQ01DLEtBQTJDLENBQUNDLE1BQzVDQSxFQUFTLFdBQVcsSUFDZk4sRUFBd0JNLEVBQVMsQ0FBQyxFQUFFLEdBQUcsSUFHdkM7QUFBQSxFQURVQSxFQUFTLElBQUksQ0FBQ0MsTUFBUSxLQUFLUCxFQUF3Qk8sRUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUs7QUFBQSxDQUFJLENBRW5GLElBR0pDLEtBQWtDLENBQUNDLE1BRWhDO0FBQUEsRUFEY0EsRUFBTyxJQUFJLENBQUNGLE1BQVEsS0FBS0EsRUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUtBLEVBQUksT0FBTyxFQUFFLEVBQUUsS0FBSztBQUFBLENBQUksQ0FFakYsSUFFUkcsS0FBa0IsQ0FBQ0MsTUFBTTtBQUM3QixNQUFJQSxhQUFhO0FBQ2YsUUFBSVIsR0FBd0JRLEVBQUUsT0FBTyxHQUFHO0FBQ3RDLFlBQU1DLElBQU0sS0FBSyxNQUFNRCxFQUFFLE9BQU87QUFDaEMsYUFBSWYsR0FBZ0MsVUFBVWdCLENBQUcsRUFBRSxVQUMxQ1AsR0FBeUNPLENBQUcsSUFDMUNkLEdBQWUsVUFBVWMsQ0FBRyxFQUFFLFVBQ2hDSixHQUFnQ0ksQ0FBRyxJQUVuQ0QsRUFBRTtBQUFBLElBRWI7QUFDRSxhQUFPWCxFQUF3QlcsRUFBRSxPQUFPO0FBRzVDLE1BQUksT0FBT0EsS0FBTTtBQUNmLFFBQUk7QUFDRixhQUFPLEtBQUssVUFBVUEsQ0FBQztBQUFBLElBQ3pCLFNBQVNFLEdBQUk7QUFDWCxhQUFPQSxJQUFLO0FBQUEsSUFDZDtBQUFBO0FBRUEsV0FBT0YsSUFBSTtBQUVmLEdBQ01HLElBQW1CLENBQUNDLEdBQWNDLE1BQy9CLElBQUlDLE1BQVM7QUFDbEIsTUFBSTtBQUNGLFdBQU9ELEVBQUcsR0FBR0MsQ0FBSTtBQUFBLEVBQ25CLFFBQWdCO0FBQ2Q7QUFBQSxFQUNGO0FBQ0YsR0FHSUMsSUFBaUI1QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsU0FBUyxrQkFBa0IsQ0FBQyxHQUN4RTZCLElBQWlCN0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDNUM4QixJQUFrQixDQUFDQyxNQUFVL0IsRUFBRSxTQUFTK0IsRUFBTSxTQUFTLENBQUM7QUFDOUQsSUFBSUMsSUFBNkIsa0JBQUNDLE9BQ2hDQSxFQUFXLGFBQWdCLGFBQzNCQSxFQUFXLFlBQWUsWUFDMUJBLEVBQVcsUUFBVyxTQUN0QkEsRUFBVyxXQUFjLFdBQ3pCQSxFQUFXLE9BQVUsUUFDckJBLEVBQVcsUUFBVyxTQUN0QkEsRUFBVyxVQUFhLFdBQ3hCQSxFQUFXLFVBQWEsV0FDeEJBLEVBQVcsUUFBVyxTQUN0QkEsRUFBVyxpQkFBb0IsaUJBQ3hCQSxJQUNORCxLQUFhLENBQUMsQ0FBQztBQUNsQixNQUFNRSxLQUFnQmxDLEVBQUUsV0FBV2dDLENBQVM7QUFDNUMsSUFBSUcsS0FBb0Msa0JBQUNDLE9BQ3ZDQSxFQUFrQixjQUFpQixjQUNuQ0EsRUFBa0IsY0FBaUIsY0FDbkNBLEVBQWtCLFdBQWMsV0FDekJBLElBQ05ELE1BQW9CLENBQUMsQ0FBQztBQUN6QixNQUFNRSxLQUF1QnJDLEVBQUUsV0FBV21DLEVBQWdCLEdBQ3BERyxLQUFnQnRDLEVBQUUsTUFBTSxDQUFDa0MsSUFBZUcsRUFBb0IsQ0FBQztBQUNuRSxJQUFJRSxLQUFtQyxrQkFBQ0MsT0FDdENBLEVBQWlCLE9BQVUsUUFDM0JBLEVBQWlCLGNBQWlCLGVBQ2xDQSxFQUFpQixjQUFpQixlQUNsQ0EsRUFBaUIsV0FBYyxZQUN4QkEsSUFDTkQsTUFBbUIsQ0FBQyxDQUFDO0FBQ3hCLE1BQU1FLEtBQWN6QyxFQUFFLFdBQVd1QyxFQUFlLEdBQzFDRyxJQUEwQjFDLEVBQUUsT0FBTztBQUFBLEVBQ3ZDLFVBQVVBLEVBQUUsT0FBTztBQUFBLEVBQ25CLGdCQUFnQjhCLEVBQWdCOUIsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUMxQyxVQUFVOEIsRUFBZ0I5QixFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUMsR0FDSzJDLEtBQXVCM0MsRUFBRSxPQUFPO0FBQUEsRUFDcEMsSUFBSUEsRUFBRSxPQUFPO0FBQ2YsQ0FBQztBQUNEQSxFQUFFLE9BQU87QUFBQSxFQUNQLFlBQVk2QjtBQUFBLEVBQ1osUUFBUUE7QUFBQSxFQUNSLEtBQUtBO0FBQ1AsQ0FBQztBQUNEN0IsRUFBRSxPQUFPO0FBQUEsRUFDUCxpQkFBaUI2QjtBQUFBLEVBQ2pCLE9BQU9BO0FBQUEsRUFDUCxZQUFZQTtBQUFBLEVBQ1osVUFBVUE7QUFBQSxFQUNWLFlBQVlBO0FBQUEsRUFDWixRQUFRQTtBQUFBLEVBQ1IsU0FBU0E7QUFBQSxFQUNULGVBQWVBO0FBQUEsRUFDZixZQUFZQTtBQUNkLENBQUM7QUFDRCxNQUFNZSxJQUFZNUMsRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUV2QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDLEdBQ0s2QyxLQUFtQkQsRUFBVSxRQUFRLENBQUMsb0JBQW9CLGtCQUFrQixDQUFDLEdBQzdFRSxLQUFzQjlDLEVBQUUsT0FBTyxFQUFFLE1BQU02QyxHQUFpQixDQUFDLEdBQ3pERSxLQUFpQkgsRUFBVSxRQUFRLENBQUMsUUFBUSxTQUFTLFFBQVEsQ0FBQyxHQUM5REksS0FBb0JoRCxFQUFFLE9BQU87QUFBQSxFQUNqQyxNQUFNK0M7QUFBQSxFQUNOLGFBQWFWO0FBQUEsRUFDYixRQUFRckMsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFDdkMsQ0FBQyxHQUNLaUQsS0FBaUJMLEVBQVUsUUFBUSxDQUFDLGNBQWMsa0JBQWtCLGdCQUFnQixDQUFDLEdBQ3JGTSxLQUFvQmxELEVBQUUsT0FBTztBQUFBLEVBQ2pDLE1BQU1pRDtBQUFBLEVBQ04sU0FBU3JCO0FBQUEsRUFDVCxTQUFTNUIsRUFBRSxPQUFPQSxFQUFFLE9BQU8sR0FBR0EsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQ3JELENBQUMsR0FDS21ELEtBQTJCUCxFQUFVLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUNqRVEsS0FBOEJwRCxFQUFFLE9BQU87QUFBQSxFQUMzQyxNQUFNbUQ7QUFBQSxFQUNOLGFBQWFiO0FBQUEsRUFDYixRQUFRdEMsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUM1QixDQUFDLEdBQ0txRCxLQUFxQnJELEVBQUUsT0FBTztBQUFBLEVBQ2xDLE1BQU1BLEVBQUUsUUFBUTRDLEVBQVUsS0FBSyxNQUFNO0FBQUEsRUFDckMsUUFBUWhCO0FBQ1YsQ0FBQyxHQUNLMEIsS0FBcUJ0RCxFQUFFLE9BQU87QUFBQSxFQUNsQyxNQUFNQSxFQUFFLFFBQVE0QyxFQUFVLEtBQUssTUFBTTtBQUFBLEVBQ3JDLFdBQVdoQjtBQUFBLEVBQ1gsa0JBQWtCNUIsRUFBRSxPQUFPO0FBQUEsRUFDM0IsVUFBVTZCO0FBQUEsRUFDVix3QkFBd0I3QixFQUFFLE1BQU0wQyxDQUF1QjtBQUN6RCxDQUFDLEdBQ0thLEtBQWlDdkQsRUFBRSxPQUFPO0FBQUEsRUFDOUMsTUFBTUEsRUFBRSxRQUFRNEMsRUFBVSxLQUFLLG9CQUFvQjtBQUFBLEVBQ25ELG9CQUFvQjVDLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDO0FBQUEsRUFDaEQscUJBQXFCQSxFQUFFLElBQUksRUFBRSxTQUFTO0FBQUEsRUFDdEMsaUJBQWlCQSxFQUFFLFNBQVNBLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0QsQ0FBQyxHQUNLd0QsS0FBbUN4RCxFQUFFLE9BQU87QUFBQSxFQUNoRCxNQUFNQSxFQUFFLFFBQVE0QyxFQUFVLEtBQUssNEJBQTRCO0FBQUEsRUFDM0QsaUJBQWlCNUMsRUFBRSxPQUFPO0FBQzVCLENBQUMsR0FDS3lELElBQXFCekQsRUFBRSxPQUFPO0FBQUEsRUFDakMsV0FBK0I0QjtBQUFBLEVBQy9CLFVBQTZCQTtBQUFBLEVBQzdCLE9BQXNCQTtBQUFBLEVBQ3RCLFNBQTJCQTtBQUFBLEVBQzNCLFNBQTBCQTtBQUFBLEVBQzFCLGVBQXVDQztBQUMxQyxDQUFDLEdBQ0s2QixLQUFlMUQsRUFBRSxPQUFPO0FBQUEsRUFDM0IsT0FBc0I0QjtBQUFBLEVBQ3RCLFNBQTJCQTtBQUFBLEVBQzNCLFNBQTBCQTtBQUFBLEVBQzFCLGVBQXVDQztBQUMxQyxDQUFDLEdBQ0s4QixLQUFrQmYsRUFBVSxRQUFRLENBQUMsWUFBWSxZQUFZLG9CQUFvQixDQUFDLEdBQ2xGZ0IsS0FBcUI1RCxFQUFFLE9BQU87QUFBQSxFQUNsQyxNQUFNMkQ7QUFBQSxFQUNOLFdBQVcvQjtBQUFBLEVBQ1gsdUJBQXVCYztBQUFBLEVBQ3ZCLHFCQUFxQjFDLEVBQUUsSUFBSSxFQUFFLFNBQVM7QUFBQSxFQUN0QyxzQkFBc0JBLEVBQUUsUUFBUSxFQUFFLFNBQVM7QUFBQSxFQUMzQyxnQkFBZ0I2QjtBQUNsQixDQUFDLEVBQUUsT0FBTzRCLEVBQW1CLEtBQUssR0FDNUJJLEtBQThCN0QsRUFBRSxPQUFPO0FBQUEsRUFDM0MsTUFBTUEsRUFBRSxRQUFRNEMsRUFBVSxLQUFLLGdCQUFnQjtBQUFBLEVBQy9DLG9CQUFvQjVDLEVBQUUsUUFBUTtBQUNoQyxDQUFDLEdBQ0s4RCxLQUE4QjlELEVBQUUsT0FBTztBQUFBLEVBQzNDLE1BQU1BLEVBQUUsUUFBUTRDLEVBQVUsS0FBSyxnQkFBZ0I7QUFBQSxFQUMvQyxhQUFhNUMsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQy9CLGlCQUFpQkEsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ25DLFlBQVlBLEVBQUUsT0FBTztBQUN2QixDQUFDLEdBQ0srRCxLQUFlL0QsRUFBRSxtQkFBbUIsUUFBUTtBQUFBLEVBQ2hEOEM7QUFBQSxFQUNBRTtBQUFBLEVBQ0FFO0FBQUEsRUFDQUU7QUFBQSxFQUNBQztBQUFBLEVBQ0FDO0FBQUEsRUFDQU07QUFBQSxFQUNBQztBQUFBLEVBQ0FDO0FBQUEsRUFDQVA7QUFBQSxFQUNBQztBQUNGLENBQUMsR0FDS1EsS0FBZWhFLEVBQUUsT0FBTztBQUFBLEVBQzVCLFNBQVMrRDtBQUFBLEVBQ1QsT0FBT25DO0FBQUEsRUFDUCxRQUFRQTtBQUFBLEVBQ1IsV0FBV0E7QUFDYixDQUFDO0FBQ0Q1QixFQUFFLE9BQU87QUFBQSxFQUNQLFlBQVlBLEVBQUUsT0FBTztBQUFBLEVBQ3JCLFVBQVU0QjtBQUNaLENBQUM7QUFDRDVCLEVBQUUsT0FBTztBQUFBLEVBQ1AsY0FBY0EsRUFBRSxPQUFPO0FBQUEsRUFDdkIsZ0JBQWdCQSxFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQ3RDLENBQUM7QUFDREEsRUFBRSxPQUFPO0FBQUEsRUFDUCxjQUFjQSxFQUFFLE9BQU87QUFBQSxFQUN2QixtQkFBbUI4QixFQUFnQjlCLEVBQUUsT0FBTyxDQUFDO0FBQy9DLENBQUM7QUFDRCxNQUFNaUUsS0FBNkJqRSxFQUFFLE9BQU87QUFBQSxFQUMxQyxpQkFBaUJBLEVBQUUsTUFBTTJDLEVBQW9CO0FBQy9DLENBQUMsR0FDS3VCLEtBQXVCbEUsRUFBRSxPQUFPO0FBQUEsRUFDcEMsYUFBYUEsRUFBRSxPQUFPO0FBQUEsRUFDdEIsUUFBUUEsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUM1QixDQUFDO0FBQ0RBLEVBQUUsT0FBTztBQUFBLEVBQ1AsWUFBWUEsRUFBRSxPQUFPO0FBQ3ZCLENBQUM7QUFDRCxNQUFNbUUsS0FBNEJuRSxFQUFFLE9BQU87QUFBQSxFQUN6QyxTQUFTQSxFQUFFLFFBQVEsRUFBSztBQUFBLEVBQ3hCLFlBQVlBLEVBQUUsUUFBUSxrQkFBa0I7QUFBQSxFQUN4QyxRQUFRQSxFQUFFLE1BQU1rRSxFQUFvQjtBQUN0QyxDQUFDLEdBQ0tFLEtBQXVCcEUsRUFBRSxtQkFBbUIsV0FBVztBQUFBLEVBQzNEQSxFQUFFLE9BQU8sRUFBRSxTQUFTQSxFQUFFLFFBQVEsRUFBSSxFQUFFLENBQUM7QUFBQSxFQUNyQ21FO0FBQ0YsQ0FBQztBQUNEbkUsRUFBRSxPQUFPO0FBQUEsRUFDUCxZQUFZQSxFQUFFLE9BQU87QUFBQSxFQUNyQix5QkFBeUIwQztBQUFBLEVBQ3pCLHFCQUFxQmU7QUFBQSxFQUNyQiwyQkFBMkJ6RCxFQUFFLFFBQVEsRUFBRSxTQUFTO0FBQUEsRUFDaEQsbUJBQW1COEIsRUFBZ0I5QixFQUFFLE9BQU8sQ0FBQztBQUMvQyxDQUFDO0FBQ0RBLEVBQUUsT0FBTztBQUFBLEVBQ1AsWUFBWUEsRUFBRSxPQUFPO0FBQUEsRUFDckIseUJBQXlCMEM7QUFBQSxFQUN6QixxQkFBcUJlO0FBQ3ZCLENBQUM7QUFDRCxJQUFJWSxJQUFpQyxrQkFBQ0MsT0FDcENBLEVBQWUsVUFBYSxXQUM1QkEsRUFBZSxVQUFhLFdBQzVCQSxFQUFlLFlBQWUsYUFDdkJBLElBQ05ELEtBQWlCLENBQUMsQ0FBQztBQUN0QixNQUFNRSxLQUF3QnZFLEVBQUUsT0FBTztBQUFBLEVBQ3JDLFFBQVFBLEVBQUUsS0FBSztBQUFBLElBQUM7QUFBQSxJQUF5QjtBQUFBLElBQXlCO0FBQUE7QUFBQSxFQUEyQixDQUFDO0FBQ2hHLENBQUMsR0FDS3dFLEtBQThCeEUsRUFBRSxPQUFPO0FBQUEsRUFDM0MsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixjQUFjQSxFQUFFLE9BQU87QUFBQSxFQUN2QixtQkFBbUJBLEVBQUUsT0FBTztBQUFBLEVBQzVCLFlBQVlBLEVBQUUsT0FBTztBQUN2QixDQUFDLEdBRUt5RSxLQUF3QixDQUFDQyxNQUFVO0FBQ3ZDLFFBQU1DLElBQWlCLENBQUM7QUFDeEIsZ0JBQU8sUUFBUUQsQ0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDOUQsR0FBS2dFLENBQUssTUFBTTtBQUM5QyxRQUFJO0FBQ0YsWUFBTUMsSUFBWTNDLEdBQWMsTUFBTXRCLENBQUc7QUFDekMsTUFBSSxNQUFNLFFBQVFnRSxDQUFLLElBQ3JCRCxFQUFlRSxDQUFTLElBQUlELElBQ25CLE1BQU0sUUFBUUEsRUFBTSxPQUFPLE1BQ3BDRCxFQUFlRSxDQUFTLElBQUlELEVBQU07QUFBQSxJQUV0QyxRQUFRO0FBQ047QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDLEdBQ01EO0FBQ1QsR0FFTUcsS0FBOEI5RSxFQUFFLE9BQU87QUFBQSxFQUMzQyxXQUFXQSxFQUFFLE9BQU87QUFBQSxFQUNwQixlQUFlQSxFQUFFLE9BQU87QUFBQSxFQUN4QixjQUFjQSxFQUFFLE9BQU87QUFDekIsQ0FBQyxHQUNLK0UsS0FBbUMvRSxFQUFFLE9BQU87QUFBQSxFQUNoRCxNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLGVBQWVBLEVBQUUsT0FBTztBQUFBLEVBQ3hCLFdBQVdBLEVBQUUsT0FBTztBQUN0QixDQUFDLEdBQ0tnRixLQUFzQjtBQUFBLEVBQzFCLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFDUCxHQUNNQyxJQUFrQixPQUFPQyxNQUFtQjtBQUNoRCxXQUFTQyxJQUFJLEdBQUdBLElBQUksSUFBSUE7QUFDdEIsSUFBS0MsRUFBa0IsS0FDckIsTUFBTUMsR0FBTSxHQUFHO0FBR25CLE1BQUksQ0FBQ0QsRUFBa0I7QUFDckIsVUFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBR3hDLFNBRGUsSUFBSSxPQUFPRixDQUFjO0FBRTFDLEdBQ01JLEtBQTZCLE9BQU9DLEdBQWNDLEdBQWlCQyxHQUFVQyxHQUFpQkMsTUFBZTtBQUNqSCxRQUFNQyxJQUFTLE1BQU1YLEVBQWdCTSxDQUFZLEdBQzNDTSxJQUFpQmIsR0FBb0JTLEVBQVMsWUFBWSxFQUFFLEtBQUssQ0FBQztBQWN4RSxTQWJ1QkcsRUFBTyxlQUFlO0FBQUE7QUFBQSxJQUUzQyxTQUFTO0FBQUEsSUFDVCxVQUFVQztBQUFBLElBQ1YsT0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUUw7QUFBQSxNQUNSLFNBQVNFO0FBQUEsSUFDWDtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsSUFDbEIsbUJBQW1CO0FBQUEsSUFDbkIsZ0JBQWdCLENBQUM7QUFBQSxFQUNuQixDQUFDO0FBRUgsR0FDTUwsS0FBUSxDQUFDUyxNQUNOLElBQUksUUFBUSxDQUFDQyxNQUFZO0FBQzlCLGFBQVdBLEdBQVNELENBQVM7QUFDL0IsQ0FBQyxHQUVHVixJQUFvQixNQUNqQixZQUFZLFFBRWZZLEtBQWdDLE9BQU9DLE1BQ3BDLElBQUksUUFBUSxDQUFDRixHQUFTRyxNQUFXO0FBQ3RDLE1BQUk7QUFDRixJQUFBRCxFQUFlLEdBQUcsaUJBQWlCLE9BQU9FLE1BQVE7QUFDaEQsTUFBQUosRUFBUUksQ0FBRztBQUFBLElBQ2IsQ0FBQyxHQUNERixFQUFlLEdBQUcsVUFBVSxNQUFNO0FBQ2hDLE1BQUFDLEVBQU8sSUFBSSxNQUFNLHFEQUFxRCxDQUFDO0FBQUEsSUFDekUsQ0FBQztBQUFBLEVBQ0gsU0FBUzdFLEdBQUc7QUFDVixJQUFBNkUsRUFBTzdFLENBQUM7QUFBQSxFQUNWO0FBQ0YsQ0FBQyxHQUVHK0UsS0FBb0IsT0FBT0MsR0FBb0JDLE1BQWE7QUFDaEUsTUFBSSxDQUFDRCxFQUFtQixhQUFhLENBQUNBLEVBQW1CO0FBQ3ZELFVBQU0sSUFBSSxNQUFNLHdDQUF3QyxLQUFLLFVBQVVBLENBQWtCLENBQUMsRUFBRTtBQUc5RixRQUFNRSxJQUFnQixPQURQLE1BQU10QixFQUFnQm9CLEVBQW1CLFNBQVMsR0FDOUIsaUJBQWlCQSxFQUFtQixlQUFlO0FBQUEsSUFDcEYsZ0JBQWdCQyxFQUFTLGNBQWM7QUFBQSxFQUN6QyxDQUFDO0FBQ0QsTUFBSUMsRUFBYztBQUNoQixVQUFBRCxFQUFTLFNBQVMsTUFBTSxHQUNsQixJQUFJLE1BQU0sbUJBQW1CQyxFQUFjLE1BQU0sV0FBVyxTQUFTLEVBQUU7QUFFN0UsU0FBQUQsRUFBUyxTQUFTLFNBQVMsR0FFdEJDO0FBQ1QsR0FDTUMsS0FBNEIsT0FBT0gsTUFBdUI7QUE5WmhFLE1BQUFJLEdBQUFDLEdBQUFDLEdBQUFDO0FBZ2FFLFFBQU1MLElBQWdCLE9BRFAsTUFBTXRCLEVBQWdCb0IsRUFBbUIsU0FBUyxHQUM5QixpQkFBaUJBLEVBQW1CLGVBQWU7QUFBQSxJQUNwRixnQkFBZ0JBLEVBQW1CO0FBQUEsRUFDckMsQ0FBQyxHQUNLUSxLQUFlSixJQUFBRixFQUFjLGdCQUFkLGdCQUFBRSxFQUEyQjtBQUNoRCxNQUFJSSxNQUFpQixZQUFvQixPQUFJQSxNQUFpQixhQUN0RCxJQUFJLE1BQU0scURBQXFELElBRS9ELElBQUk7QUFBQSxJQUNSLEtBQUdILElBQUFILEVBQWMsVUFBZCxnQkFBQUcsRUFBcUIsY0FBV0UsS0FBQUQsSUFBQUosRUFBYyxnQkFBZCxnQkFBQUksRUFBMkIscUJBQTNCLGdCQUFBQyxFQUE2QyxZQUFXLG1EQUFtRDtBQUFBLEVBQ2hKO0FBRUosR0FFTUUsS0FBNkIsQ0FBQ0MsTUFDVCxLQUFLLFVBQVVBLENBQU0sR0FJMUNDLEtBQTJCLENBQUNDLEdBQVNDLE1BQ2xCLE1BQU0sS0FBS0QsRUFBUSxpQkFBaUIsYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUM5QyxPQUFPLENBQUNFLEdBQUtDLE1BQVU7QUFDdEQsUUFBTXhHLElBQU13RyxFQUFNLGFBQWEsV0FBVztBQUMxQyxTQUFLeEcsSUFDRSxFQUFFLEdBQUd1RyxHQUFLLENBQUN2RyxDQUFHLEdBQUd3RyxFQUFNLE1BQU0sSUFEbkJEO0FBRW5CLEdBQUcsQ0FBQyxDQUFDLEdBR0RFLEtBQW9CLENBQUNDLE1BQWM7QUFDdkMsTUFBSTtBQUNGLFdBQU90RCxHQUFhLE1BQU1zRCxDQUFTO0FBQUEsRUFDckMsU0FBUzVDLEdBQU87QUFDZCxVQUFNQTtBQUFBLEVBQ1I7QUFDRixHQUNNNkMsS0FBWSxDQUFDQyxHQUFRQyxHQUFRQyxHQUFXQyxHQUFTQyxNQUFZO0FBQ2pFLFFBQU1DLElBQVE7QUFBQSxJQUNaLFNBQUFGO0FBQUEsSUFDQSxPQUFPMUgsR0FBRztBQUFBLElBQ1YsUUFBQXdIO0FBQUEsSUFDQSxXQUFBQztBQUFBLEVBQ0Y7QUFDQSxFQUFBRixFQUFPLFlBQVksS0FBSyxVQUFVSyxDQUFLLEdBQUdELENBQU87QUFDbkQsR0FFTUUsS0FBa0MsT0FBT3hHLE1BQVE7QUFDckQsTUFBSSxPQUFPQSxLQUFRLFlBQVksQ0FBQ0EsRUFBSyxRQUFPO0FBQzVDLE1BQUk7QUFDRixVQUFNeUcsSUFBTyxFQUFFLE1BQU0sT0FBTyxHQUN0QkMsSUFBUyxNQUFNMUcsRUFBSSxLQUFLeUcsQ0FBSTtBQUNsQyxRQUFJQyxNQUFXO0FBQ2IsWUFBTSxJQUFJLE1BQU0sbUNBQW1DLEtBQUssVUFBVUEsQ0FBTSxDQUFDLEVBQUU7QUFFN0UsV0FBTztBQUFBLEVBQ1QsUUFBWTtBQUNWLFdBQU87QUFBQSxFQUNUO0FBQ0YsR0FDTUMsS0FBZ0IsQ0FBQzNHLEdBQUs0RyxNQUNuQixDQUFDLENBQUM1RyxLQUFPNEcsR0FHWkMsSUFBZ0IsQ0FBQ3BHLE1BQVUvQixFQUFFLFNBQVMrQixFQUFNLFNBQVMsQ0FBQztBQUM1RC9CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxTQUFTLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU1vSSxLQUFtQnBJLEVBQUUsT0FBTztBQUFBLEVBQ2hDLG1CQUFtQkEsRUFBRSxRQUFRLE9BQU87QUFBQSxFQUNwQyxTQUFTQSxFQUFFLE9BQU87QUFBQSxFQUNsQixTQUFTQSxFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFDckQsQ0FBQztBQUNEQSxFQUFFLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUNyQixNQUFNcUksS0FBZ0JySSxFQUFFLE9BQU87QUFBQSxFQUM3QixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLGlCQUFpQm1JLEVBQWNuSSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3pDLGFBQWFtSSxFQUFjbkksRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNyQyxVQUFVbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDbEMsVUFBVUEsRUFBRSxPQUFPO0FBQUEsRUFDbkIsb0JBQW9CbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQzlDLENBQUMsR0FDS3NJLEtBQVd0SSxFQUFFLE9BQU87QUFBQSxFQUN4QixzQkFBc0JBLEVBQUUsT0FBTyxFQUFFLElBQUk7QUFBQSxFQUNyQyxtQkFBbUJBLEVBQUUsT0FBTyxFQUFFLElBQUk7QUFBQSxFQUNsQyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQixhQUFhbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDckMsVUFBVUEsRUFBRSxPQUFPO0FBQUEsRUFDbkIsa0JBQWtCbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDMUMsd0JBQXdCbUksRUFBY25JLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQztBQUFBLEVBQ3RELFVBQVVBLEVBQUUsT0FBTyxFQUFFLElBQUk7QUFDM0IsQ0FBQyxHQUNLdUksS0FBZ0J2SSxFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLElBQUksQ0FBQyxHQUM1Q3dJLEtBQVF4SSxFQUFFLE9BQU87QUFBQSxFQUNyQixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLFVBQVVtSSxFQUFjSSxFQUFhO0FBQ3ZDLENBQUMsR0FDS0UsSUFBd0J6SSxFQUFFLE9BQU87QUFBQSxFQUNyQyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQixnQkFBZ0JtSSxFQUFjbkksRUFBRSxPQUFPLENBQUM7QUFBQSxFQUN4QyxVQUFVbUksRUFBY25JLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQyxHQUNLMEksS0FBMEIxSSxFQUFFLE9BQU87QUFBQSxFQUN2QyxVQUFVQSxFQUFFLE9BQU87QUFDckIsQ0FBQyxHQUNLMkksS0FBc0IzSSxFQUFFLE9BQU87QUFBQSxFQUNuQyxJQUFJbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDNUIsa0JBQWtCbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDMUMsd0JBQXdCbUksRUFBY25JLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQztBQUFBLEVBQ3RELG9CQUFvQkEsRUFBRSxNQUFNMEksRUFBdUI7QUFBQSxFQUNuRCxhQUFhUCxFQUFjbkksRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNyQyxXQUFXbUksRUFBY25JLEVBQUUsT0FBTyxDQUFDO0FBQ3JDLENBQUMsR0FDSzRJLEtBQW9DNUksRUFBRSxPQUFPO0FBQUEsRUFDakQsYUFBYUEsRUFBRSxPQUFPO0FBQ3hCLENBQUMsR0FDSzZJLEtBQXlCN0ksRUFBRSxPQUFPO0FBQUEsRUFDdEMsYUFBYUEsRUFBRSxPQUFPO0FBQUEsRUFDdEIsMENBQTBDQSxFQUFFLE9BQU87QUFBQSxFQUNuRCxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQix1QkFBdUJBLEVBQUUsTUFBTTRJLEVBQWlDO0FBQUEsRUFDaEUsc0JBQXNCNUksRUFBRSxPQUFPO0FBQ2pDLENBQUMsR0FDSzhJLEtBQWtCOUksRUFBRSxPQUFPO0FBQUEsRUFDL0IsUUFBUXFJO0FBQ1YsQ0FBQyxHQUNLVSxLQUFpQi9JLEVBQUUsT0FBTztBQUFBLEVBQzlCLFVBQVVBLEVBQUUsT0FBTztBQUFBLEVBQ25CLFdBQVdBLEVBQUUsTUFBTThJLEVBQWU7QUFBQSxFQUNsQyxvQkFBb0JYLEVBQWNuSSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQzVDLE9BQU9BLEVBQUUsTUFBTTZJLEVBQXNCO0FBQUEsRUFDckMsdUJBQXVCN0ksRUFBRSxPQUFPO0FBQUEsRUFDaEMsaUJBQWlCQSxFQUFFLE9BQU87QUFBQSxFQUMxQixtQkFBbUJBLEVBQUUsT0FBTztBQUFBLEVBQzVCLDZCQUE2QkEsRUFBRSxNQUFNNEksRUFBaUM7QUFDeEUsQ0FBQyxHQUNLSSxJQUFvQ2hKLEVBQUUsT0FBTztBQUFBLEVBQ2pELFNBQVNBLEVBQUUsTUFBTTJJLEVBQW1CO0FBQUEsRUFDcEMsVUFBVTNJLEVBQUUsTUFBTStJLEVBQWM7QUFDbEMsQ0FBQyxHQUNLRSxLQUEwQmpKLEVBQUUsT0FBTztBQUFBLEVBQ3ZDLFNBQVNnSjtBQUFBLEVBQ1Qsb0JBQW9CYixFQUFjYSxDQUFpQztBQUFBLEVBQ25FLFNBQVNoSixFQUFFLE1BQU1xSSxFQUFhO0FBQ2hDLENBQUMsR0FDS2EsSUFBNEJsSixFQUFFLE9BQU87QUFBQSxFQUN6QyxRQUFRQSxFQUFFLFFBQVEsTUFBTTtBQUFBLEVBQ3hCLE9BQU9BLEVBQUUsT0FBTztBQUFBLEVBQ2hCLE9BQU9tSSxFQUFjbkksRUFBRSxPQUFPLENBQUM7QUFBQSxFQUMvQixZQUFZQSxFQUFFLE1BQU1zSSxFQUFRO0FBQUEsRUFDNUIsc0JBQXNCdEksRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUFBLEVBQ3JDLG1CQUFtQkEsRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUFBLEVBQ2xDLE9BQU93STtBQUFBLEVBQ1AsY0FBY0wsRUFBY2MsRUFBdUI7QUFBQTtBQUFBLEVBRW5ELG1CQUFtQmpKLEVBQUUsTUFBTXlJLENBQXFCO0FBQ2xELENBQUMsR0FDS1UsS0FBcUJuSixFQUFFLG1CQUFtQixRQUFRO0FBQUEsRUFDdERBLEVBQUUsT0FBTztBQUFBLElBQ1AsTUFBTUEsRUFBRSxRQUFRLE9BQU87QUFBQSxJQUN2QixVQUFVQSxFQUFFLFNBQVNBLEVBQUUsVUFBVSxDQUFDO0FBQUEsRUFDcEMsQ0FBQyxFQUFFLE9BQU9rSixFQUEwQixLQUFLO0FBQUEsRUFDekNsSixFQUFFLE9BQU87QUFBQSxJQUNQLE1BQU1BLEVBQUUsS0FBSyxDQUFDLFdBQVcsY0FBYyxDQUFDO0FBQUEsSUFDeEMsVUFBVUEsRUFBRSxPQUFPO0FBQUEsRUFDckIsQ0FBQyxFQUFFLE9BQU9rSixFQUEwQixLQUFLO0FBQzNDLENBQUMsR0FDS0UsS0FBdUJwSixFQUFFLE9BQU87QUFBQSxFQUNwQyxRQUFRQSxFQUFFLFFBQVEsVUFBVTtBQUM5QixDQUFDLEdBQ0txSixLQUFxQnJKLEVBQUUsT0FBTztBQUFBLEVBQ2xDLFFBQVFBLEVBQUUsUUFBUSxTQUFTO0FBQzdCLENBQUM7QUFDREEsRUFBRSxNQUFNLENBQUNtSixJQUFvQkMsSUFBc0JDLEVBQWtCLENBQUM7QUFDdEVySixFQUFFLE9BQU87QUFBQSxFQUNQLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixlQUFlQSxFQUFFLE9BQU87QUFBQSxFQUN4QixpQkFBaUJBLEVBQUUsT0FBTztBQUM1QixDQUFDO0FBQ0QsTUFBTXNKLEtBQTBCdEosRUFBRSxPQUFPO0FBQUEsRUFDdkMsY0FBY0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ2hDLGtCQUFrQkEsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3BDLGFBQWFBLEVBQUUsT0FBTztBQUN4QixDQUFDO0FBQ0RBLEVBQUUsT0FBTztBQUFBLEVBQ1AsY0FBY0EsRUFBRSxPQUFPO0FBQUEsRUFDdkIsZUFBZUEsRUFBRSxJQUFJO0FBQUE7QUFBQSxFQUVyQixnQkFBZ0JBLEVBQUUsT0FBTztBQUFBLEVBQ3pCLG1CQUFtQkEsRUFBRSxPQUFPO0FBQUEsRUFDNUIsa0JBQWtCQSxFQUFFLE9BQU87QUFBQSxFQUMzQixZQUFZQSxFQUFFLE1BQU1zSSxFQUFRO0FBQUEsRUFDNUIsbUJBQW1CdEksRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUFBLEVBQ2xDLGVBQWVBLEVBQUUsUUFBUTtBQUFBLEVBQ3pCLHlCQUF5QnlJO0FBQUEsRUFDekIsZ0JBQWdCekksRUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLEVBQ3BDLDJCQUEyQkEsRUFBRSxRQUFRLEVBQUUsU0FBUztBQUNsRCxDQUFDO0FBQ0QsTUFBTXVKLEtBQXdCdkosRUFBRSxPQUFPO0FBQUEsRUFDckMsbUJBQW1CQSxFQUFFLE9BQU87QUFDOUIsQ0FBQztBQUNEQSxFQUFFLE9BQU87QUFBQSxFQUNQLElBQUlBLEVBQUUsT0FBTztBQUFBLEVBQ2IsWUFBWUEsRUFBRSxPQUFPO0FBQ3ZCLENBQUM7QUFDRCxNQUFNd0osS0FBMEJ4SixFQUFFLE9BQU87QUFBQSxFQUN2QyxNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLEtBQUtBLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUN2QixLQUFLQSxFQUFFLE9BQU87QUFBQSxFQUNkLEtBQUtBLEVBQUUsT0FBTztBQUNoQixDQUFDO0FBQ0RBLEVBQUUsTUFBTXdKLEVBQXVCO0FBQy9CLE1BQU1DLEtBQTJCekosRUFBRSxPQUFPO0FBQUEsRUFDeEMsdUJBQXVCQSxFQUFFLE1BQU1BLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUNEQSxFQUFFLE9BQU87QUFBQSxFQUNQLFFBQVEwRDtBQUFBLEVBQ1IsdUJBQXVCK0U7QUFDekIsQ0FBQztBQUNEekksRUFBRSxPQUFPO0FBQUEsRUFDUCxZQUFZQSxFQUFFLE9BQU87QUFBQSxFQUNyQixxQkFBcUJ5RDtBQUFBLEVBQ3JCLHlCQUF5QmdGO0FBQzNCLENBQUM7QUFDRCxNQUFNaUIsS0FBZ0MxSixFQUFFLE9BQU87QUFBQSxFQUM3Qyx1QkFBdUJBLEVBQUUsTUFBTUEsRUFBRSxPQUFPQSxFQUFFLE9BQU8sR0FBR0EsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUFBLEVBQzVELFVBQVVBLEVBQUUsT0FBTztBQUNyQixDQUFDO0FBQ0RBLEVBQUUsT0FBT0EsRUFBRSxJQUFJLENBQUM7QUFFaEIsTUFBTTJKLEtBQU0sQ0FBQ0MsTUFDSkEsRUFBSSxPQUFPLENBQUNDLEdBQUdDLE1BQU1ELElBQUlDLEdBQUcsQ0FBQztBQUd0QyxTQUFTQyxHQUFTdkMsR0FBUXdDLEdBQVc7QUFDbkMsTUFBSUMsSUFBaUIsT0FBTztBQUM1QixFQUFBQSxJQUFpQkEsRUFBZXpDLEdBQVF3QyxDQUFTLElBQUl4QyxFQUFPLFlBQVl3QztBQUMxRTtBQUNBLFNBQVNFLEdBQVMxQyxHQUFROUYsR0FBSTtBQUM1QixFQUFJQSxNQUFPLFdBQ1RBLElBQUs4RixFQUFPO0FBR2QsTUFBSTJDLElBQW9CLE1BQU07QUFDOUIsRUFBQUEsS0FBcUJBLEVBQWtCM0MsR0FBUTlGLENBQUU7QUFDbkQ7QUFFQSxJQUFJMEksS0FBWSwyQkFBWTtBQUMxQixNQUFJQyxJQUFpQixTQUF1QkMsR0FBR1IsR0FBRztBQUNoRCxXQUFBTyxJQUFpQixPQUFPLGtCQUFrQjtBQUFBLE1BQ3hDLFdBQVcsQ0FBQztBQUFBLElBQ2QsYUFBYSxTQUFTLFNBQVVDLEdBQUdSLEdBQUc7QUFDcEMsTUFBQVEsRUFBRSxZQUFZUjtBQUFBLElBQ2hCLEtBQUssU0FBVVEsR0FBR1IsR0FBRztBQUNuQixlQUFTUyxLQUFLVDtBQUNaLFFBQUksT0FBTyxVQUFVLGVBQWUsS0FBS0EsR0FBR1MsQ0FBQyxNQUFHRCxFQUFFQyxDQUFDLElBQUlULEVBQUVTLENBQUM7QUFBQSxJQUU5RCxHQUVPRixFQUFlQyxHQUFHUixDQUFDO0FBQUEsRUFDNUI7QUFFQSxTQUFPLFNBQVVRLEdBQUdSLEdBQUc7QUFDckIsUUFBSSxPQUFPQSxLQUFNLGNBQWNBLE1BQU0sS0FBTSxPQUFNLElBQUksVUFBVSx5QkFBeUIsT0FBT0EsQ0FBQyxJQUFJLCtCQUErQjtBQUVuSSxJQUFBTyxFQUFlQyxHQUFHUixDQUFDO0FBRW5CLGFBQVNVLElBQUs7QUFDWixXQUFLLGNBQWNGO0FBQUEsSUFDckI7QUFFQSxJQUFBQSxFQUFFLFlBQVlSLE1BQU0sT0FBTyxPQUFPLE9BQU9BLENBQUMsS0FBS1UsRUFBRyxZQUFZVixFQUFFLFdBQVcsSUFBSVUsRUFBRztBQUFBLEVBQ3BGO0FBQ0YsRUFBRSxHQUVFQyxLQUFjLFNBQVVDLEdBQVE7QUFDbEMsRUFBQU4sR0FBVUssR0FBYUMsQ0FBTTtBQUU3QixXQUFTRCxFQUFZRSxHQUFTQyxHQUFTO0FBQ3JDLFFBQUlDLElBQWEsS0FBSyxhQUVsQkMsSUFBUUosRUFBTyxLQUFLLE1BQU1DLEdBQVNDLENBQU8sS0FBSztBQUVuRCxrQkFBTyxlQUFlRSxHQUFPLFFBQVE7QUFBQSxNQUNuQyxPQUFPRCxFQUFXO0FBQUEsTUFDbEIsWUFBWTtBQUFBLE1BQ1osY0FBYztBQUFBLElBQ2hCLENBQUMsR0FDRGQsR0FBU2UsR0FBT0QsRUFBVyxTQUFTLEdBQ3BDWCxHQUFTWSxDQUFLLEdBQ1BBO0FBQUEsRUFDVDtBQUVBLFNBQU9MO0FBQ1QsRUFBRSxLQUFLO0FBRVAsTUFBTU0sV0FBaUJOLEdBQVk7QUFBQSxFQUNqQyxZQUFZekosR0FBVTtBQUNwQixVQUFNZ0ssSUFBa0Isb0NBQW9DaEssRUFBUyxPQUFPO0FBQzVFLFVBQU1nSyxDQUFlLEdBQ3JCLEtBQUssV0FBV2hLO0FBQUEsRUFDbEI7QUFBQSxFQUNBLElBQUksdUJBQXVCO0FBQ3pCLFdBQU8sS0FBSyxTQUFTO0FBQUEsRUFDdkI7QUFDRjtBQUNBLE1BQU1pSyxJQUFXLE9BQU9DLEdBQVNDLEdBQU1DLE1BQW1CO0FBQ3hELFFBQU1wSyxJQUFXLE1BQU1rSyxFQUFRLEtBQUtDLENBQUk7QUFDeEMsTUFBSUUsR0FBbUJySyxDQUFRO0FBQzdCLFVBQU0sSUFBSStKLEdBQVMvSixDQUFRO0FBRTdCLE1BQUksQ0FBQ3NLLEdBQXdCdEssR0FBVW9LLENBQWMsR0FBRztBQUN0RCxVQUFNcEQsSUFBU29ELEVBQWUsVUFBVXBLLENBQVE7QUFDaEQsVUFBSWdILEVBQU8sVUFBZSxJQUFJLE1BQU0sZUFBZSxJQUM3Q0EsRUFBTztBQUFBLEVBQ2Y7QUFDQSxTQUFPaEg7QUFDVCxHQUNNc0ssS0FBMEIsQ0FBQzFHLEdBQU8yRyxNQUMvQkEsRUFBTyxVQUFVM0csQ0FBSyxFQUFFLFNBRTNCeUcsS0FBcUIsQ0FBQ3JLLE1BQ25Cb0gsR0FBaUIsVUFBVXBILENBQVEsRUFBRSxTQUV4Q3dLLEtBQXFCLE9BQU9OLEdBQVNPLE1BQ2xDLE1BQU1SLEVBQVNDLEdBQVMsRUFBRSxNQUFNLHdCQUF3QixTQUFTTyxFQUFRLEdBQUd4QyxFQUF1QixHQUV0R3lDLElBQWEsT0FBT1IsTUFDakIsTUFBTUQsRUFBU0MsR0FBUyxFQUFFLE1BQU0sZUFBZSxTQUFTLENBQUMsRUFBRSxHQUFHL0IsRUFBa0IsR0FFbkZ3QyxLQUF3QixPQUFPVCxHQUFTdkQsTUFDckMsTUFBTXNELEVBQVNDLEdBQVMsRUFBRSxNQUFNLDZCQUE2QixTQUFBdkQsRUFBUSxHQUFHK0IsRUFBNkIsR0FFeEdrQyxLQUF3QixPQUFPVixHQUFTdkQsTUFDckMsTUFBTXNELEVBQVNDLEdBQVMsRUFBRSxNQUFNLDZCQUE2QixTQUFBdkQsRUFBUSxHQUFHOEIsRUFBd0IsR0FFbkdvQyxLQUFxQixPQUFPWCxHQUFTdkQsTUFDbEMsTUFBTXNELEVBQVNDLEdBQVMsRUFBRSxNQUFNLHdCQUF3QixTQUFBdkQsRUFBUSxHQUFHMUQsRUFBMEIsR0FFaEc2SCxLQUFtQixPQUFPWixHQUFTYSxHQUFhQyxNQUFjO0FBQ2xFLFFBQU1DLElBQWtCLE1BQU1ULEdBQW1CTixHQUFTO0FBQUEsSUFDeEQsY0FBY2E7QUFBQSxJQUNkLGdCQUFnQkM7QUFBQSxFQUNsQixDQUFDLEdBQ0tFLElBQWEsSUFBSSxJQUFJRCxFQUFnQixRQUFRLFNBQVMsSUFBSSxDQUFDRSxNQUFRQSxFQUFJLFFBQVEsQ0FBQztBQUN0RixNQUFJRCxFQUFXLFNBQVM7QUFDdEIsVUFBTSxJQUFJLE1BQU0sc0NBQXNDQSxFQUFXLElBQUksRUFBRTtBQUV6RSxRQUFNekcsSUFBV3lHLEVBQVcsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLE9BQy9DRSxJQUFhekMsR0FBSXNDLEVBQWdCLFFBQVEsU0FBUyxJQUFJLENBQUNFLE1BQVFBLEVBQUkscUJBQXFCLENBQUM7QUFDL0YsU0FBTztBQUFBLElBQ0wsVUFBQTFHO0FBQUEsSUFDQSxZQUFBMkc7QUFBQSxFQUNGO0FBQ0YsR0FDTUMsS0FBMkIsT0FBT25CLEdBQVNhLEdBQWFPLEdBQWFOLE1BQWM7QUFDdkYsTUFBSU07QUFDRixXQUFPLEVBQUUsWUFBWSxHQUFHLFVBQVUsTUFBTTtBQUNuQztBQUNMLElBQUFOLElBQWFBLEtBQVk7QUFDekIsVUFBTUMsSUFBa0IsTUFBTUgsR0FBaUJaLEdBQVNhLEdBQWFDLENBQVM7QUFDOUUsV0FBTyxFQUFFLFlBQVlDLEVBQWdCLFlBQVksVUFBVUEsRUFBZ0IsU0FBUztBQUFBLEVBQ3RGO0FBQ0YsR0FDTU0sS0FBK0IsT0FBT0MsR0FBbUI3RSxNQUFZO0FBQ3pFLE1BQUk2RSxFQUFrQixTQUFTO0FBQzdCLFVBQU0sSUFBSSxNQUFNLDBCQUEwQjtBQU81QyxTQUxrQixNQUFNLFFBQVE7QUFBQSxJQUM5QixNQUFNLEtBQUtBLEVBQWtCLE9BQU8sQ0FBQyxFQUFFO0FBQUEsTUFDckMsQ0FBQ3RCLE1BQVlELEVBQVNDLEdBQVMsRUFBRSxNQUFNLGlCQUFpQixTQUFBdkQsRUFBUSxHQUFHdkQsRUFBb0I7QUFBQSxJQUN6RjtBQUFBLEVBQ0Y7QUFFRixHQUNNcUksSUFBdUIsT0FBT3ZCLEdBQVN2RCxNQUFZO0FBQ3ZELE1BQUk7QUFDRixXQUFPLE1BQU1zRCxFQUFTQyxHQUFTLEVBQUUsTUFBTSwwQkFBMEIsU0FBQXZELEVBQVEsR0FBRzJCLEVBQXVCO0FBQUEsRUFDckcsU0FBUzVFLEdBQU87QUFDZCxVQUFNQTtBQUFBLEVBQ1I7QUFDRixHQUNNZ0ksS0FBZ0IsT0FBT3hCLEdBQVN2RCxNQUM3QixNQUFNc0QsRUFBU0MsR0FBUyxFQUFFLE1BQU0sd0JBQXdCLFNBQUF2RCxFQUFRLEdBQUc0QixFQUFxQixHQUUzRm9ELEtBQWtCLE9BQU96QixHQUFTdkQsTUFDL0IsTUFBTXNELEVBQVNDLEdBQVMsRUFBRSxNQUFNLFlBQVksU0FBQXZELEVBQVEsR0FBRzJCLEVBQXVCLEdBRWpGc0QsS0FBdUIsS0FDdkJDLEtBQXNCLE9BQU9DLEdBQVFDLE1BQWdCO0FBUXpELFFBQU1DLElBQWdCLE1BUEg5TSxHQUFlO0FBQUEsSUFDaEMsUUFBQTRNO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxTQUFTRjtBQUFBLElBQ1QsYUFBYTtBQUFBO0FBQUEsRUFFZixDQUFDLEVBQ3NDO0FBRXZDLFVBRGUsTUFBTTNCLEVBQVMrQixHQUFlLEVBQUUsTUFBTSxrQkFBa0IsR0FBR3pJLEVBQXFCLEdBQ2pGO0FBQ2hCLEdBRU13QyxLQUFTLGttQkFFVGtHLEtBQXFCLENBQUNDLE1BQVE7QUFDbEMsUUFBTUMsSUFBVyxTQUFTLGNBQWMsVUFBVTtBQUNsRCxFQUFBQSxFQUFTLFlBQVk7QUFBQTtBQUFBLFFBRWZwRyxFQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFLU21HLENBQUc7QUFBQTtBQUFBO0FBQUE7QUFJeEIsUUFBTUUsSUFBTyxTQUFTLGNBQWMsS0FBSyxHQUNuQ0MsSUFBYUQsRUFBSyxhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDckQsRUFBQUMsRUFBVyxZQUFZRixFQUFTLFFBQVEsVUFBVSxFQUFJLENBQUM7QUFDdkQsUUFBTUwsSUFBU08sRUFBVyxjQUFjLGtCQUFrQixHQUNwREMsSUFBZUQsRUFBVyxjQUFjLGdCQUFnQjtBQUM5RCxrQkFBUyxLQUFLLFlBQVlELENBQUksR0FDdkIsRUFBRSxNQUFBQSxHQUFNLFFBQUFOLEdBQVEsY0FBQVEsRUFBYTtBQUN0QztBQUVBLFNBQVNDLEdBQWFULEdBQVFVLEdBQVdULEdBQWE7QUFDcEQsUUFBTVUsSUFBZ0IsWUFBWTtBQUNoQyxRQUFJO0FBQ0YsWUFBTUMsSUFBUyxNQUFNYixHQUFvQkMsR0FBUUMsQ0FBVztBQUM1RCxNQUFJVyxNQUNGLGNBQWNDLENBQWUsR0FDN0JILEVBQVVFLENBQU07QUFBQSxJQUVwQixRQUFnQjtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUNBLEVBQUFELEVBQWM7QUFDZCxRQUFNRSxJQUFrQixZQUFZRixHQUFlYixFQUFvQjtBQUN2RSxTQUFPZTtBQUNUO0FBQ0EsU0FBU0MsR0FBYTtBQUFBLEVBQ3BCLFVBQUFDO0FBQUEsRUFDQSxpQkFBQUY7QUFBQSxFQUNBLFNBQUE1SDtBQUNGLEdBQUc7QUFDRCxRQUFNK0gsSUFBZSxNQUFNO0FBQ3pCLGtCQUFjSCxDQUFlLEdBQzdCRSxFQUFTLEtBQUssT0FBTyxHQUNyQjlILEVBQVExQixFQUFjLFNBQVM7QUFBQSxFQUNqQztBQUNBLFNBQUF3SixFQUFTLGFBQWEsaUJBQWlCLFNBQVNDLENBQVksR0FDOUIsTUFBTTtBQUNsQyxJQUFBRCxFQUFTLGFBQWEsb0JBQW9CLFNBQVNDLENBQVk7QUFBQSxFQUNqRTtBQUVGO0FBQ0EsZUFBZUMsR0FBcUI7QUFBQSxFQUNsQyxLQUFBYjtBQUFBLEVBQ0EsU0FBQXRGO0FBQ0YsR0FBRztBQUNELFFBQU1pRyxJQUFXWixHQUFtQkMsQ0FBRztBQUN2QyxTQUFPLElBQUksUUFBUSxDQUFDbkgsTUFBWTtBQUM5QixVQUFNeUgsSUFBWSxDQUFDRSxNQUFXO0FBQzVCLGlCQUFXLE1BQU07QUFDZixRQUFBRyxFQUFTLEtBQUssT0FBTztBQUFBLE1BQ3ZCLEdBQUcsR0FBRyxHQUNOOUgsRUFBUTJILENBQU0sR0FDZE0sS0FBQSxRQUFBQTtBQUFBLElBQ0YsR0FDTUwsSUFBa0JKLEdBQWFNLEVBQVMsUUFBUUwsR0FBVyxJQUFJLElBQUk1RixDQUFPLEVBQUUsTUFBTSxHQUNsRm9HLElBQXdCSixHQUFhO0FBQUEsTUFDekMsVUFBQUM7QUFBQSxNQUNBLGlCQUFBRjtBQUFBLE1BQ0EsU0FBQTVIO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFFQSxNQUFNa0ksS0FBbUMsQ0FBQ0MsTUFDakMsT0FBT0MsTUFBVztBQUN2QixNQUFJO0FBQ0YsSUFBQUEsRUFBTyxjQUFjLGtCQUFrQjtBQUN2QyxVQUFNQyxJQUFhLE1BQU1GLEVBQWNDLENBQU07QUFDN0MsUUFBSUMsRUFBVyxTQUFTO0FBQ3RCLE1BQUFELEVBQU8sY0FBYyw0QkFBNEJDLEVBQVcsT0FBTyxpQkFBaUI7QUFBQSxhQUMzRUEsRUFBVyxTQUFTO0FBQzdCLE1BQUFELEVBQU8sY0FBYztBQUFBLFFBQ25CQyxFQUFXLE9BQU87QUFBQSxRQUNsQkEsRUFBVyxPQUFPO0FBQUEsUUFDbEJBLEVBQVcsT0FBTztBQUFBLE1BQ3BCO0FBQUE7QUFFQSxZQUFNLElBQUksTUFBTSxtQkFBbUJBLENBQVUsRUFBRTtBQUFBLEVBRW5ELFNBQVMxSixHQUFPO0FBQ2QsVUFBQXlKLEVBQU8sY0FBYyxnQkFBZ0IvTSxHQUFnQnNELENBQUssQ0FBQyxHQUNyREE7QUFBQSxFQUNSO0FBQ0YsR0FFSTJKLEtBQXlCLENBQUNDLE1BQ3ZCLE9BQU9ILE1BQVc7QUFDdkIsTUFBSTtBQUNGLFdBQU8sTUFBTUcsRUFBS0gsQ0FBTTtBQUFBLEVBQzFCLFNBQVN6SixHQUFPO0FBQ2QsVUFBTSxFQUFFLE9BQUE2SixFQUFNLElBQUlDLEVBQXFCLG9CQUFvQjtBQUMzRCxXQUFBRCxFQUFNN0osQ0FBSyxHQUNKLEVBQUUsYUFBYSxJQUFPLFFBQVF0RCxHQUFnQnNELENBQUssRUFBRTtBQUFBLEVBQzlEO0FBQ0YsR0FFSThKLElBQXVCLENBQUNDLE1BQVc7QUFDdkMsUUFBTUMsSUFBTSxJQUFJL00sTUFBUztBQUN2QixXQUFPLFFBQVcsSUFBSSxHQUFHeEIsRUFBTSxNQUFNLEtBQUssTUFBTSxDQUFDLEdBQUdBLEVBQU0sS0FBSyxLQUFLLEdBQUdzTyxDQUFNLEVBQUUsQ0FBQyxLQUFLLEdBQUc5TSxDQUFJO0FBQUEsRUFDOUYsR0FDTVYsSUFBTSxJQUFJVSxNQUFTO0FBQ3ZCLFdBQU8sUUFBVyxNQUFNLEdBQUd4QixFQUFNLElBQUksS0FBSyxNQUFNLENBQUMsR0FBR0EsRUFBTSxLQUFLLEtBQUssR0FBR3NPLENBQU0sRUFBRSxDQUFDLEtBQUssR0FBRzlNLENBQUk7QUFBQSxFQUM5RjtBQUNBLFNBQU87QUFBQSxJQUNMLEtBQUErTTtBQUFBLElBQ0EsS0FBQXpOO0FBQUEsSUFDQSxPQUFPeU47QUFBQSxJQUNQLE9BQU96TjtBQUFBLEVBQ1Q7QUFDRixHQUVNLEVBQUUsT0FBTzBOLElBQVMsT0FBT0MsR0FBUSxJQUFJSixFQUFxQixXQUFXLEdBQ3JFSyxLQUFnQyxDQUFDQyxHQUFrQkMsTUFBc0I7QUFDN0UsUUFBTXBILElBQVVsRSxFQUFtQixVQUFVcUwsQ0FBZ0I7QUFDN0QsTUFBSSxDQUFDbkgsRUFBUSxTQUFTO0FBQ3BCLFVBQU1xSCxJQUFZckgsRUFBUSxNQUFNLE9BQU8sR0FDakNzSCxJQUFTeEssR0FBc0J1SyxDQUFTO0FBQzlDLGVBQVcsQ0FBQ25LLEdBQVcxRCxDQUFNLEtBQUssT0FBTyxRQUFROE4sQ0FBTTtBQUNyRCxNQUFBRixFQUFrQmxLLEdBQVcxRCxHQUFRMEQsQ0FBUztBQUVoRCxVQUFBK0osR0FBUSxnREFBZ0RLLENBQU0sR0FDeEQsSUFBSSxNQUFNLDhDQUE4QztBQUFBLEVBQ2hFO0FBQ0EsU0FBT3RILEVBQVE7QUFDakIsR0FDTXVILEtBQThCLENBQUNDLEdBQWlCSixNQUFzQjtBQUMxRSxhQUFXSyxLQUFrQkQ7QUFDM0IsUUFBSUMsRUFBZSxZQUFZO0FBQzdCLFlBQUFBLEVBQWUsT0FBTyxRQUFRLENBQUMxSyxNQUFVO0FBQ3ZDLGNBQU0ySyxJQUFTL00sR0FBYyxVQUFVb0MsRUFBTSxXQUFXO0FBQ3hELFlBQUksQ0FBQzJLLEVBQU87QUFDVixVQUFBVCxHQUFRLDRDQUE0Q2xLLEVBQU0sV0FBVyxFQUFFO0FBQUEsYUFDbEU7QUFDTCxnQkFBTUcsSUFBWXdLLEVBQU87QUFDekIsVUFBQU4sRUFBa0JsSyxHQUFXSCxFQUFNLE1BQU07QUFBQSxRQUMzQztBQUFBLE1BQ0YsQ0FBQyxHQUNEaUssR0FBUSxpREFBaUQsS0FBSyxVQUFVUyxFQUFlLE1BQU0sQ0FBQyxFQUFFLEdBQzFGLElBQUksTUFBTSw2Q0FBNkM7QUFHbkUsR0FFTSxFQUFFLE9BQU9FLEVBQVEsSUFBSWQsRUFBcUIsU0FBUyxHQUNuRGUsS0FBa0MsQ0FBQ3ZPLE1BQWE7QUFDcEQsTUFBSUEsRUFBUyxnQkFBZ0IsV0FBVztBQUN0QyxVQUFNLElBQUksTUFBTSw0Q0FBNENBLEVBQVMsZ0JBQWdCLE1BQU0sRUFBRTtBQUUvRixTQUFPLEVBQUUsbUJBQW1CQSxFQUFTLGdCQUFnQixDQUFDLEVBQUUsR0FBRztBQUM3RCxHQUNNd08sS0FBc0IsQ0FBQ0MsR0FBU0MsTUFBYTtBQUNqRCxRQUFNQyxJQUFNRixFQUFRLEtBQUssQ0FBQ0csTUFBU0YsRUFBUyxVQUFVRSxDQUFJLEVBQUUsT0FBTztBQUNuRSxNQUFJLENBQUNEO0FBQ0gsVUFBQUwsRUFBUSwyQkFBMkJJLENBQVEsRUFBRSxHQUM3Q0osRUFBUUcsQ0FBTyxHQUNmSCxFQUFRLFVBQVUsR0FDWixJQUFJLE1BQU0sMkJBQTJCSSxDQUFRLEVBQUU7QUFFdkQsU0FBT0EsRUFBUyxNQUFNQyxDQUFHO0FBQzNCLEdBRU0sRUFBRSxPQUFPRSxHQUFTLE9BQU9DLEVBQVEsSUFBSXRCLEVBQXFCLFdBQVcsR0FDckUsRUFBRSxPQUFPdUIsR0FBWSxJQUFJdkIsRUFBcUIsV0FBVyxHQUN6RHdCLEtBQWtCL0I7QUFBQSxFQUN0QixPQUFPLEVBQUUsU0FBQWdDLEdBQVMsdUJBQUFDLEdBQXVCLGtCQUFBcEIsR0FBa0IsZUFBQXFCLEVBQWMsTUFBTTtBQWgrQmpGLFFBQUExSjtBQWkrQkksSUFBQW9KLEVBQVEsK0JBQStCLEVBQUUsdUJBQUFLLEVBQXNCLENBQUM7QUFDaEUsVUFBTUUsSUFBbUIsTUFBTSxLQUFLSCxFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUNoRUksSUFBVSxNQUFNM0UsRUFBVzBFLENBQWdCO0FBQ2pELElBQUFQLEVBQVEsMkNBQTJDUSxFQUFRLElBQUksR0FBRztBQUNsRSxVQUFNQyxJQUFtQnpCLEdBQThCQyxHQUFrQnFCLEVBQWMsaUJBQWlCO0FBQ3hHLElBQUFOLEVBQVEsMkNBQTJDSSxFQUFRLGlCQUFpQixHQUFHO0FBQy9FLFVBQU1NLElBQXNCLE1BQU1oRSxHQUE2QjBELEVBQVEsZ0JBQWdCO0FBQUEsTUFDckYsWUFBWUEsRUFBUTtBQUFBLElBQ3RCLENBQUM7QUFDRCxJQUFBZixHQUE0QnFCLEdBQXFCSixFQUFjLGlCQUFpQjtBQUNoRixVQUFNSyxJQUF1QjtBQUFBLE1BQzNCLFlBQVlQLEVBQVE7QUFBQSxNQUNwQix5QkFBeUJDO0FBQUEsTUFDekIscUJBQXFCSTtBQUFBLElBQ3ZCO0FBQ0EsUUFBSTtBQUNGLFVBQUlELEVBQVEsU0FBUyxTQUFTO0FBQzVCLFFBQUFSLEVBQVEsOENBQThDUSxFQUFRLEtBQUssR0FBRztBQUN0RSxjQUFNckksSUFBUyxNQUFNMEUsR0FBYzBELEdBQWtCSSxDQUFvQjtBQUN6RSxlQUFBWCxFQUFRLDBDQUEwQzdILEVBQU8saUJBQWlCLEdBQUcsR0FDdEUsRUFBRSxNQUFNLFNBQVMsUUFBQUEsRUFBTztBQUFBLE1BQ2pDLE9BQU87QUFDTCxRQUFBNkgsRUFBUSxvRUFBb0VJLEVBQVEsaUJBQWlCLEdBQUc7QUFDeEcsY0FBTWpJLElBQVMsTUFBTXlFLEVBQXFCMkQsR0FBa0JJLENBQW9CO0FBQ2hGLGVBQUFYLEVBQVEsb0NBQW9DLEdBQ3JDLEVBQUUsTUFBTSxZQUFZLFFBQUE3SCxFQUFPO0FBQUEsTUFDcEM7QUFBQSxJQUNGLFNBQVN0RCxHQUFPO0FBQ2QsVUFBSUEsYUFBaUJxRyxNQUNmckcsRUFBTSx5QkFBeUIsZ0JBQWdCO0FBQ2pELFFBQUFtTCxFQUFRLHVEQUF1RDtBQUMvRCxjQUFNWSxNQUFtQmhLLElBQUEvQixFQUFNLFNBQVMsWUFBZixnQkFBQStCLEVBQXlCLCtCQUE4QixRQUMxRWlLLElBQWdCLE1BQU0vRSxHQUFzQnlFLEdBQWtCSSxDQUFvQjtBQVF4RixZQVBBWCxFQUFRLDZCQUE2QlksQ0FBZ0IsRUFBRSxHQUN2RFosRUFBUSwwQkFBMEJhLENBQWEsR0FDM0NELElBQ0YsTUFBTUUsR0FBZ0JELEdBQWVULEVBQVEsT0FBTyxJQUVwRCxNQUFNVyxHQUFnQkYsQ0FBYSxHQUVqQ0wsRUFBUSxTQUFTLFNBQVM7QUFDNUIsVUFBQVIsRUFBUSx3Q0FBd0NhLEVBQWMsUUFBUSxHQUFHO0FBQ3pFLGdCQUFNbkssSUFBZ0IsTUFBTXNGLEdBQW1CdUUsR0FBa0I7QUFBQSxZQUMvRCxjQUFjQyxFQUFRO0FBQUEsWUFDdEIsbUJBQW1CSyxFQUFjO0FBQUEsVUFDbkMsQ0FBQztBQUNELFVBQUFiLEVBQVEsa0RBQWtEdEosQ0FBYTtBQUN2RSxnQkFBTXNLLElBQXVCdEIsR0FBZ0NoSixDQUFhO0FBQzFFLGlCQUFBc0osRUFBUSwwQ0FBMENnQixFQUFxQixpQkFBaUIsR0FBRyxHQUNwRixFQUFFLE1BQU0sU0FBUyxRQUFRQSxFQUFxQjtBQUFBLFFBQ3ZELE9BQU87QUFDTCxVQUFBaEIsRUFBUSx3Q0FBd0NZLElBQW1CLFFBQVEsUUFBUSxHQUFHO0FBQ3RGLGdCQUFNekksSUFBUyxNQUFNeUUsRUFBcUIyRCxHQUFrQjtBQUFBLFlBQzFELEdBQUdJO0FBQUEsWUFDSCxtQkFBbUJFLEVBQWM7QUFBQSxZQUNqQywyQkFBMkIsQ0FBQ0Q7QUFBQSxVQUM5QixDQUFDO0FBQ0QsaUJBQUFaLEVBQVEsb0NBQW9DLEdBQ3JDLEVBQUUsTUFBTSxZQUFZLFFBQUE3SCxFQUFPO0FBQUEsUUFDcEM7QUFBQSxNQUNGO0FBRUYsWUFBQThILEVBQVEsdUNBQXVDLEdBQy9DQSxFQUFRcEwsQ0FBSyxHQUNQQTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBQ0YsR0FDTW9NLEtBQW1DLENBQUM5UCxNQUFhO0FBQ3JELFFBQU0rUCxJQUFlL1AsRUFBUyxzQkFBc0IsS0FBSyxDQUFDZ1EsTUFBV0EsRUFBTyxTQUFTLFlBQVk7QUFDakcsTUFBSSxDQUFDRDtBQUNILFVBQU0sSUFBSSxNQUFNLDRCQUE0QjtBQUU5QyxTQUFPak0sR0FBNEIsTUFBTWlNLENBQVk7QUFDdkQsR0FDTUUsS0FBbUMsQ0FBQ2pRLE1BQWE7QUFDckQsUUFBTWtRLElBQWVsUSxFQUFTLHNCQUFzQixLQUFLLENBQUNnUSxNQUFXQSxFQUFPLFNBQVMsMkJBQTJCO0FBQ2hILE1BQUksQ0FBQ0U7QUFDSCxVQUFNLElBQUksTUFBTSw0QkFBNEI7QUFFOUMsU0FBTzFNLEdBQTRCLE1BQU0wTSxDQUFZO0FBQ3ZELEdBQ01QLEtBQWtCLE9BQU9ELEdBQWU5SSxNQUFZO0FBQ3hELFFBQU12QixJQUFxQjRLLEdBQWlDUCxDQUFhO0FBQ3pFLEVBQUFiLEVBQVEsaUNBQWlDeEosRUFBbUIsWUFBWSxHQUFHO0FBQzNFLFFBQU1xSCxJQUFTLE1BQU1LLEdBQXFCLEVBQUUsS0FBSzFILEVBQW1CLGNBQWMsU0FBQXVCLEVBQVEsQ0FBQztBQUUzRixNQURBaUksRUFBUSx5Q0FBeUNuQyxDQUFNLEdBQUcsR0FDdERBLE1BQVdySixFQUFjO0FBQzNCLFVBQU0sSUFBSSxNQUFNLDRCQUE0QjtBQUU5QyxNQUFJcUosTUFBV3JKLEVBQWM7QUFDM0IsVUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBRTdDLEdBQ011TSxLQUFrQixPQUFPRixNQUFrQjtBQUMvQyxRQUFNckssSUFBcUJ5SyxHQUFpQ0osQ0FBYTtBQUN6RSxFQUFBWCxHQUFZLDJDQUEyQzFKLEVBQW1CLGNBQWMsVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQzdHLE1BQU1HLEdBQTBCSCxDQUFrQixHQUNsRDBKLEdBQVksMENBQTBDO0FBQ3hELEdBRU0sRUFBRSxPQUFPb0IsR0FBUyxPQUFPQyxHQUFRLElBQUk1QyxFQUFxQixXQUFXLEdBQ3JFNkMsS0FBY3JSLEVBQUUsT0FBTztBQUFBLEVBQzNCLFVBQVVBLEVBQUUsTUFBTSxDQUFDQSxFQUFFLFFBQVEsV0FBVyxHQUFHQSxFQUFFLFFBQVEsWUFBWSxDQUFDLENBQUM7QUFBQSxFQUNuRSxnQkFBZ0JBLEVBQUUsUUFBUSxRQUFRO0FBQUEsRUFDbEMsVUFBVUEsRUFBRSxPQUFPO0FBQUEsSUFDakIsV0FBV0EsRUFBRSxPQUFPO0FBQUEsRUFDdEIsQ0FBQztBQUNILENBQUMsR0FDS3NSLEtBQW1CakQ7QUFBQSxFQUN2QixPQUFPLEVBQUUsU0FBQTRCLEVBQVEsTUFBTTtBQUNyQixJQUFBa0IsRUFBUSxpREFBaUQ7QUFDekQsVUFBTWpCLElBQXdCVixHQUFvQlMsRUFBUSx3QkFBd0JvQixFQUFXO0FBQzdGLElBQUFGLEVBQVEsZ0NBQWdDO0FBQ3hDLFVBQU1mLElBQW1CLE1BQU0sS0FBS0gsRUFBUSxlQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FDaEVJLElBQVUsTUFBTTNFLEVBQVcwRSxDQUFnQixHQUMzQzlELElBQWMrRCxFQUFRLFNBQVM7QUFDckMsSUFBQWMsRUFBUSxnQ0FBZ0M7QUFDeEMsVUFBTUksSUFBaUIsTUFBTWxGLEdBQXlCK0QsR0FBa0JDLEVBQVEsT0FBTy9ELEdBQWEsTUFBTSxHQUNwR2tGLElBQUssTUFBTWxNO0FBQUEsTUFDZjRLLEVBQXNCLFNBQVM7QUFBQSxNQUMvQnFCLEVBQWU7QUFBQSxNQUNmQSxFQUFlO0FBQUEsTUFDZmpGO0FBQUEsSUFDRjtBQUNBLElBQUE2RSxFQUFRLDhCQUE4QjtBQUN0QyxVQUFNTSxJQUFpQixNQUFNRCxFQUFHLGVBQWU7QUFDL0MsV0FBSUMsTUFBbUIsUUFDckJMLEdBQVEsOEJBQThCLEdBQy9CLEVBQUUsYUFBYSxJQUFPLFFBQVEsK0JBQStCLE1BRXRFRCxFQUFRLDZEQUE2RE0sQ0FBYyxHQUM1RTtBQUFBLE1BQ0wsYUFBYTtBQUFBLE1BQ2IsSUFBQUQ7QUFBQSxNQUNBLG9CQUFvQjtBQUFBLFFBQ2xCLFVBQVVDLEVBQWU7QUFBQSxRQUN6QixXQUFXQSxFQUFlO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLEdBQ01DLEtBQWtCekQ7QUFBQSxFQUN0QixPQUFPO0FBQUEsSUFDTCxTQUFBZ0M7QUFBQSxJQUNBLHVCQUFBQztBQUFBLElBQ0Esa0JBQUFwQjtBQUFBLElBQ0EsZUFBQXFCO0FBQUEsSUFDQSxjQUFBd0I7QUFBQSxJQUNBLFlBQUFDO0FBQUEsRUFDRixNQUFNO0FBRUosUUFEQVQsRUFBUSwyQkFBMkIsR0FDL0JRLEVBQWEsYUFBYXpCLEVBQXNCO0FBQ2xELFlBQU0sSUFBSSxNQUFNLCtCQUErQnlCLEVBQWEsUUFBUSxTQUFTekIsRUFBc0IsUUFBUSxFQUFFO0FBRS9HLFVBQU1FLElBQW1CLE1BQU0sS0FBS0gsRUFBUSxlQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FDaEV1QixJQUFLSSxFQUFXO0FBQ3RCLFFBQUlELEtBQUEsUUFBQUEsRUFBYyx3QkFBd0I7QUFDeEMsWUFBTUUsSUFBV0YsRUFBYTtBQUM5QixNQUFBUixFQUFRLDZCQUE2QlUsQ0FBUSxHQUM3Q0MsR0FBbUJOLEdBQUlLLEVBQVMsUUFBUUEsRUFBUyxPQUFPO0FBQUEsSUFDMUQ7QUFDQSxJQUFBVixFQUFRLHNCQUFzQixHQUM5QkssRUFBRyxLQUFLO0FBQ1IsVUFBTU8sSUFBcUIsTUFBTS9MLEdBQThCd0wsQ0FBRTtBQUNqRSxJQUFBTCxFQUFRLDBCQUEwQlksQ0FBa0IsR0FDcERaLEVBQVEsdUNBQXVDO0FBQy9DLFVBQU1hLElBQWVDLEdBQWdDbkQsR0FBa0JpRCxDQUFrQixHQUNuRnpCLElBQW1CekIsR0FBOEJtRCxHQUFjN0IsRUFBYyxpQkFBaUI7QUFDcEcsSUFBQWdCLEVBQVEsOENBQThDO0FBQ3RELFVBQU1lLElBQTJCLE1BQU10RyxHQUFzQndFLEdBQWtCO0FBQUEsTUFDN0UsUUFBUUU7QUFBQSxNQUNSLHVCQUFBSjtBQUFBLElBQ0YsQ0FBQyxHQUNLN0osSUFBcUI4TCxHQUEwQkQsQ0FBd0I7QUFDN0UsSUFBQWYsRUFBUSw4QkFBOEIsR0FDdEMsTUFBTS9LLEdBQWtCQyxHQUFvQjBMLENBQWtCO0FBQzlELFVBQU0xQixJQUFVLE1BQU0zRSxFQUFXMEUsQ0FBZ0I7QUFDakQsUUFBSUMsRUFBUSxTQUFTLFNBQVM7QUFDNUIsTUFBQWMsRUFBUSxzQ0FBc0M7QUFDOUMsWUFBTTVLLElBQWdCLE1BQU1zRixHQUFtQnVFLEdBQWtCO0FBQUEsUUFDL0QsY0FBY0MsRUFBUTtBQUFBLE1BQ3hCLENBQUM7QUFFRCxhQUFPLEVBQUUsTUFBTSxTQUFTLFFBREtkLEdBQWdDaEosQ0FBYSxFQUNyQjtBQUFBLElBQ3ZELE9BQU87QUFDTCxNQUFBNEssRUFBUSx3QkFBd0I7QUFDaEMsWUFBTWlCLElBQWtCO0FBQUEsUUFDdEIsY0FBYy9CLEVBQVE7QUFBQSxRQUN0QixlQUFlO0FBQUEsVUFDYixlQUFlSCxFQUFzQjtBQUFBLFFBQ3ZDO0FBQUEsUUFDQSxnQkFBZ0JJLEVBQWlCdE8sRUFBVSxLQUFLO0FBQUEsUUFDaEQsbUJBQW1Cc08sRUFBaUJ0TyxFQUFVLFFBQVE7QUFBQSxRQUN0RCxrQkFBa0JzTyxFQUFpQnRPLEVBQVUsT0FBTztBQUFBLFFBQ3BELGdCQUFnQnNPLEVBQWlCdE8sRUFBVSxjQUFjO0FBQUEsUUFDekQsWUFBWXFPLEVBQVE7QUFBQSxRQUNwQixtQkFBbUJBLEVBQVE7QUFBQSxRQUMzQixlQUFlO0FBQUEsUUFDZix5QkFBeUJIO0FBQUEsTUFDM0I7QUFFQSxhQUFPLEVBQUUsTUFBTSxZQUFZLFFBRFosTUFBTXZELEdBQWdCeUQsR0FBa0JnQyxDQUFlLEVBQ3BDO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQ0YsR0FDTUgsS0FBa0MsQ0FBQ0ksR0FBWUMsTUFBZ0I7QUEvcUNyRSxNQUFBN0wsR0FBQUMsR0FBQUMsR0FBQUM7QUFnckNFLFFBQU0yTCxJQUFTLEVBQUUsR0FBR0YsRUFBVyxHQUN6QixDQUFDRyxHQUFnQixHQUFHQyxDQUFrQixNQUFJL0wsS0FBQUQsSUFBQTZMLEVBQVksY0FBWixnQkFBQTdMLEVBQXVCLFdBQXZCLGdCQUFBQyxFQUErQixNQUFNLFdBQVUsQ0FBQyxHQUMxRmdNLElBQWdCRCxFQUFtQixLQUFLLEdBQUcsS0FBSztBQUN0RCxTQUFBRixFQUFPdlEsRUFBVSxVQUFVLElBQUl1USxFQUFPdlEsRUFBVSxVQUFVLEtBQUt3USxLQUFrQixlQUNqRkQsRUFBT3ZRLEVBQVUsU0FBUyxJQUFJdVEsRUFBT3ZRLEVBQVUsU0FBUyxLQUFLMFEsS0FBaUIsZUFDOUVILEVBQU92USxFQUFVLEtBQUssSUFBSXVRLEVBQU92USxFQUFVLEtBQUssS0FBS3NRLEVBQVksY0FBYyw4QkFDL0VDLEVBQU92USxFQUFVLFFBQVEsSUFBSXVRLEVBQU92USxFQUFVLFFBQVEsT0FBSzJFLElBQUEyTCxFQUFZLG9CQUFaLGdCQUFBM0wsRUFBNkIsZUFBYyxTQUN0RzRMLEVBQU92USxFQUFVLE9BQU8sSUFBSXVRLEVBQU92USxFQUFVLE9BQU8sT0FBSzRFLElBQUEwTCxFQUFZLG9CQUFaLGdCQUFBMUwsRUFBNkIsWUFBVyxNQUNqR3VLLEVBQVEsc0JBQXNCb0IsQ0FBTSxHQUM3QkE7QUFDVCxHQUNNVCxLQUFxQixDQUFDTixHQUFJbUIsR0FBUUMsTUFBYztBQUNwRCxFQUFBcEIsRUFBRyxPQUFPO0FBQUEsSUFDUixPQUFPO0FBQUEsTUFDTCxRQUFRbUIsRUFBTztBQUFBLE1BQ2YsT0FBTztBQUFBLE1BQ1AsU0FBU0M7QUFBQSxJQUNYO0FBQUEsSUFDQSxVQUFVRCxFQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNILEdBQ01SLEtBQTRCLENBQUNuUixNQUFhO0FBQzlDLE1BQUlBLEVBQVMsc0JBQXNCLFdBQVc7QUFDNUMsVUFBTSxJQUFJLE1BQU07QUFBQSxlQUNMQSxFQUFTLHNCQUFzQixNQUFNLHdCQUF3QjtBQUUxRSxTQUFPK0QsR0FBaUMsTUFBTS9ELEVBQVMsc0JBQXNCLENBQUMsQ0FBQztBQUNqRixHQUVNNlIsS0FBa0MsQ0FBQ0MsR0FBTUMsR0FBY0MsTUFBa0I7QUFDN0UsUUFBTUMsSUFBVUgsRUFBSyxPQUFPLENBQUNuRCxNQUVIQSxFQUFJLGFBQWFvRCxDQUUxQztBQUNELE1BQUlFLEVBQVEsV0FBVztBQUNyQixVQUFNLElBQUksTUFBTSxnQ0FBZ0NGLENBQVksb0JBQW9CQyxDQUFhLEdBQUc7QUFFbEcsTUFBSUMsRUFBUSxXQUFXO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBDQUEwQ0YsQ0FBWSxvQkFBb0JDLENBQWEsR0FBRztBQUU1RyxTQUFPQyxFQUFRLENBQUM7QUFDbEIsR0FDTUMsSUFBVztBQUFBO0FBQUE7QUFBQSxFQUdmLFVBQVU7QUFBQSxJQUNSLEtBQUtsRDtBQUFBLEVBQ1A7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLE1BQU1zQjtBQUFBLElBQ04sS0FBS0k7QUFBQSxFQUNQO0FBQUE7QUFBQTtBQUdGO0FBRUEsU0FBU3lCLEdBQXlCQyxHQUFHO0FBQ3BDLFNBQU9BLEtBQUtBLEVBQUUsY0FBYyxPQUFPLFVBQVUsZUFBZSxLQUFLQSxHQUFHLFNBQVMsSUFBSUEsRUFBRSxVQUFhQTtBQUNqRztBQUVBLElBQUlDLElBQWUsQ0FBQztBQUVwQixPQUFPLGVBQWVBLEdBQWMsY0FBYztBQUFBLEVBQ2hELE9BQU87QUFDVCxDQUFDO0FBQ0RBLEVBQWEsYUFBYTtBQUcxQixNQUFNQyxLQUFZLENBQUFDLE1BQVEsRUFBUSxPQUFPQSxDQUFJLEdBRXZDQyxJQUFZLENBQUFELE1BQVFELEdBQVVDLENBQUksSUFBSSxPQUFPQSxDQUFJLElBQUksT0FBT0EsR0FFNURFLEtBQWlCRCxFQUFVLFVBQVUsR0FDckNFLElBQW1CRixFQUFVLFlBQVksR0FDekNHLEtBQWdCSCxFQUFVLFNBQVM7QUFFekMsU0FBU0ksRUFBVXRTLEdBQUtWLEdBQUs7QUFDM0IsTUFBSWdFLElBQVF0RCxFQUFJVixDQUFHO0FBQ25CLE1BQUlnRSxLQUFTLE1BQ2I7QUFBQSxRQUFJLE9BQU9BLEtBQVUsV0FBWSxPQUFNLElBQUksVUFBVUEsSUFBUSxvQkFBb0I7QUFDakYsV0FBT0E7QUFBQTtBQUNUO0FBRUEsU0FBU2lQLEVBQVd2UyxHQUFLO0FBQ3ZCLE1BQUl3UyxJQUFPeFMsRUFBSTtBQUVmLFNBQUl3UyxNQUFTLFdBQ1hBLElBQU9BLEVBQUtILEVBQWEsR0FFckJHLE1BQVMsU0FDWEEsSUFBTyxVQUlKQSxNQUFTLFNBQVlBLElBQU9DO0FBQ3JDO0FBRUEsU0FBU0MsR0FBYVosR0FBRztBQUN2QixTQUFPQSxhQUFhVztBQUN0QjtBQUVBLFNBQVNFLEVBQWdCNVMsR0FBRztBQUMxQixFQUFJNFMsRUFBZ0IsTUFDbEJBLEVBQWdCLElBQUk1UyxDQUFDLElBRXJCLFdBQVcsTUFBTTtBQUNmLFVBQU1BO0FBQUEsRUFDUixDQUFDO0FBRUw7QUFFQSxTQUFTNlMsRUFBUXhTLEdBQUk7QUFDbkIsVUFBUSxRQUFRLEVBQUUsS0FBSyxNQUFNO0FBQzNCLFFBQUk7QUFDRixNQUFBQSxFQUFHO0FBQUEsSUFDTCxTQUFTLEdBQUc7QUFDVixNQUFBdVMsRUFBZ0IsQ0FBQztBQUFBLElBQ25CO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxTQUFTRSxHQUFvQkMsR0FBYztBQUN6QyxNQUFJQyxJQUFVRCxFQUFhO0FBQzNCLE1BQUlDLE1BQVksV0FDaEJELEVBQWEsV0FBVyxRQUVwQixFQUFDQztBQUlMLFFBQUk7QUFDRixVQUFJLE9BQU9BLEtBQVk7QUFDckIsUUFBQUEsRUFBUTtBQUFBLFdBQ0g7QUFDTCxZQUFJQyxJQUFjVixFQUFVUyxHQUFTLGFBQWE7QUFFbEQsUUFBSUMsS0FDRkEsRUFBWSxLQUFLRCxDQUFPO0FBQUEsTUFFNUI7QUFBQSxJQUNGLFNBQVNoVCxHQUFHO0FBQ1YsTUFBQTRTLEVBQWdCNVMsQ0FBQztBQUFBLElBQ25CO0FBQ0Y7QUFFQSxTQUFTa1QsRUFBa0JILEdBQWM7QUFDdkMsRUFBQUEsRUFBYSxZQUFZLFFBQ3pCQSxFQUFhLFNBQVMsUUFDdEJBLEVBQWEsU0FBUztBQUN4QjtBQUVBLFNBQVNJLEdBQWtCSixHQUFjO0FBQ3ZDLE1BQUlLLElBQVFMLEVBQWE7QUFFekIsTUFBS0ssR0FJTDtBQUFBLElBQUFMLEVBQWEsU0FBUyxRQUN0QkEsRUFBYSxTQUFTO0FBRXRCLGFBQVNqUCxJQUFJLEdBQUdBLElBQUlzUCxFQUFNLFdBQ3hCQyxHQUFtQk4sR0FBY0ssRUFBTXRQLENBQUMsRUFBRSxNQUFNc1AsRUFBTXRQLENBQUMsRUFBRSxLQUFLLEdBQzFEaVAsRUFBYSxXQUFXLFdBRkksRUFBRWpQO0FBRWxDO0FBQUE7QUFFSjtBQUVBLFNBQVN1UCxHQUFtQk4sR0FBY08sR0FBTS9QLEdBQU87QUFDckQsRUFBQXdQLEVBQWEsU0FBUztBQUN0QixNQUFJUSxJQUFXUixFQUFhO0FBRTVCLE1BQUk7QUFDRixRQUFJUyxJQUFJakIsRUFBVWdCLEdBQVVELENBQUk7QUFFaEMsWUFBUUEsR0FBTTtBQUFBLE1BQ1osS0FBSztBQUNILFFBQUlFLEtBQUdBLEVBQUUsS0FBS0QsR0FBVWhRLENBQUs7QUFDN0I7QUFBQSxNQUVGLEtBQUs7QUFFSCxZQURBMlAsRUFBa0JILENBQVksR0FDMUJTLEVBQUcsQ0FBQUEsRUFBRSxLQUFLRCxHQUFVaFEsQ0FBSztBQUFBLFlBQU8sT0FBTUE7QUFDMUM7QUFBQSxNQUVGLEtBQUs7QUFDSCxRQUFBMlAsRUFBa0JILENBQVksR0FDMUJTLEtBQUdBLEVBQUUsS0FBS0QsQ0FBUTtBQUN0QjtBQUFBLElBQ0o7QUFBQSxFQUNGLFNBQVN2VCxHQUFHO0FBQ1YsSUFBQTRTLEVBQWdCNVMsQ0FBQztBQUFBLEVBQ25CO0FBRUEsRUFBSStTLEVBQWEsV0FBVyxXQUFVRCxHQUFvQkMsQ0FBWSxJQUFXQSxFQUFhLFdBQVcsY0FBV0EsRUFBYSxTQUFTO0FBQzVJO0FBRUEsU0FBU1UsRUFBU1YsR0FBY08sR0FBTS9QLEdBQU87QUFDM0MsTUFBSXdQLEVBQWEsV0FBVyxVQUU1QjtBQUFBLFFBQUlBLEVBQWEsV0FBVyxhQUFhO0FBQ3ZDLE1BQUFBLEVBQWEsT0FBTyxLQUFLO0FBQUEsUUFDdkIsTUFBQU87QUFBQSxRQUNBLE9BQUEvUDtBQUFBLE1BQ0YsQ0FBQztBQUVEO0FBQUEsSUFDRjtBQUVBLFFBQUl3UCxFQUFhLFdBQVcsU0FBUztBQUNuQyxNQUFBQSxFQUFhLFNBQVMsYUFDdEJBLEVBQWEsU0FBUyxDQUFDO0FBQUEsUUFDckIsTUFBQU87QUFBQSxRQUNBLE9BQUEvUDtBQUFBLE1BQ0YsQ0FBQyxHQUNEc1AsRUFBUSxNQUFNTSxHQUFrQkosQ0FBWSxDQUFDO0FBQzdDO0FBQUEsSUFDRjtBQUVBLElBQUFNLEdBQW1CTixHQUFjTyxHQUFNL1AsQ0FBSztBQUFBO0FBQzlDO0FBRUEsTUFBTW1RLEdBQWE7QUFBQSxFQUNqQixZQUFZSCxHQUFVSSxHQUFZO0FBR2hDLFNBQUssV0FBVyxRQUNoQixLQUFLLFlBQVlKLEdBQ2pCLEtBQUssU0FBUyxRQUNkLEtBQUssU0FBUztBQUNkLFFBQUlLLElBQU8sTUFDUEMsSUFBdUI7QUFBQSxNQUN6QixJQUFJLFNBQVM7QUFDWCxlQUFPRCxFQUFLLFdBQVc7QUFBQSxNQUN6QjtBQUFBLE1BRUEsS0FBS3JRLEdBQU87QUFDVixRQUFBa1EsRUFBU0csR0FBTSxRQUFRclEsQ0FBSztBQUFBLE1BQzlCO0FBQUEsTUFFQSxNQUFNQSxHQUFPO0FBQ1gsUUFBQWtRLEVBQVNHLEdBQU0sU0FBU3JRLENBQUs7QUFBQSxNQUMvQjtBQUFBLE1BRUEsV0FBVztBQUNULFFBQUFrUSxFQUFTRyxHQUFNLFVBQVU7QUFBQSxNQUMzQjtBQUFBLElBRUY7QUFFQSxRQUFJO0FBQ0YsV0FBSyxXQUFXRCxFQUFXLEtBQUssUUFBV0UsQ0FBb0I7QUFBQSxJQUNqRSxTQUFTN1QsR0FBRztBQUNWLE1BQUE2VCxFQUFxQixNQUFNN1QsQ0FBQztBQUFBLElBQzlCO0FBRUEsSUFBSSxLQUFLLFdBQVcsbUJBQWdCLEtBQUssU0FBUztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLFNBQVM7QUFDWCxXQUFPLEtBQUssV0FBVztBQUFBLEVBQ3pCO0FBQUEsRUFFQSxjQUFjO0FBQ1osSUFBSSxLQUFLLFdBQVcsYUFDbEJrVCxFQUFrQixJQUFJLEdBQ3RCSixHQUFvQixJQUFJO0FBQUEsRUFFNUI7QUFFRjtBQUVBLElBQUlKLElBQWUsTUFBTW9CLEVBQVc7QUFBQSxFQUNsQyxZQUFZSCxHQUFZO0FBQ3RCLFFBQUksRUFBRSxnQkFBZ0JHLEdBQWEsT0FBTSxJQUFJLFVBQVUsMkNBQTJDO0FBQ2xHLFFBQUksT0FBT0gsS0FBZSxXQUFZLE9BQU0sSUFBSSxVQUFVLDJDQUEyQztBQUNyRyxTQUFLLGNBQWNBO0FBQUEsRUFDckI7QUFBQSxFQUVBLFVBQVVKLEdBQVU7QUFDbEIsWUFBSSxPQUFPQSxLQUFhLFlBQVlBLE1BQWEsVUFDL0NBLElBQVc7QUFBQSxNQUNULE1BQU1BO0FBQUEsTUFDTixPQUFPLFVBQVUsQ0FBQztBQUFBLE1BQ2xCLFVBQVUsVUFBVSxDQUFDO0FBQUEsSUFDdkIsSUFHSyxJQUFJRyxHQUFhSCxHQUFVLEtBQUssV0FBVztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxRQUFRbFQsR0FBSTtBQUNWLFdBQU8sSUFBSSxRQUFRLENBQUNxRSxHQUFTRyxNQUFXO0FBQ3RDLFVBQUksT0FBT3hFLEtBQU8sWUFBWTtBQUM1QixRQUFBd0UsRUFBTyxJQUFJLFVBQVV4RSxJQUFLLG9CQUFvQixDQUFDO0FBQy9DO0FBQUEsTUFDRjtBQUVBLGVBQVMwVCxJQUFPO0FBQ2QsUUFBQWhCLEVBQWEsWUFBWSxHQUN6QnJPLEVBQVE7QUFBQSxNQUNWO0FBRUEsVUFBSXFPLElBQWUsS0FBSyxVQUFVO0FBQUEsUUFDaEMsS0FBS3hQLEdBQU87QUFDVixjQUFJO0FBQ0YsWUFBQWxELEVBQUdrRCxHQUFPd1EsQ0FBSTtBQUFBLFVBQ2hCLFNBQVMvVCxHQUFHO0FBQ1YsWUFBQTZFLEVBQU83RSxDQUFDLEdBQ1IrUyxFQUFhLFlBQVk7QUFBQSxVQUMzQjtBQUFBLFFBQ0Y7QUFBQSxRQUVBLE9BQU9sTztBQUFBLFFBQ1AsVUFBVUg7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxJQUFJckUsR0FBSTtBQUNOLFFBQUksT0FBT0EsS0FBTyxXQUFZLE9BQU0sSUFBSSxVQUFVQSxJQUFLLG9CQUFvQjtBQUMzRSxRQUFJMlQsSUFBSXhCLEVBQVcsSUFBSTtBQUN2QixXQUFPLElBQUl3QixFQUFFLENBQUFULE1BQVksS0FBSyxVQUFVO0FBQUEsTUFDdEMsS0FBS2hRLEdBQU87QUFDVixZQUFJO0FBQ0YsVUFBQUEsSUFBUWxELEVBQUdrRCxDQUFLO0FBQUEsUUFDbEIsU0FBU3ZELEdBQUc7QUFDVixpQkFBT3VULEVBQVMsTUFBTXZULENBQUM7QUFBQSxRQUN6QjtBQUVBLFFBQUF1VCxFQUFTLEtBQUtoUSxDQUFLO0FBQUEsTUFDckI7QUFBQSxNQUVBLE1BQU12RCxHQUFHO0FBQ1AsUUFBQXVULEVBQVMsTUFBTXZULENBQUM7QUFBQSxNQUNsQjtBQUFBLE1BRUEsV0FBVztBQUNULFFBQUF1VCxFQUFTLFNBQVM7QUFBQSxNQUNwQjtBQUFBLElBRUYsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBT2xULEdBQUk7QUFDVCxRQUFJLE9BQU9BLEtBQU8sV0FBWSxPQUFNLElBQUksVUFBVUEsSUFBSyxvQkFBb0I7QUFDM0UsUUFBSTJULElBQUl4QixFQUFXLElBQUk7QUFDdkIsV0FBTyxJQUFJd0IsRUFBRSxDQUFBVCxNQUFZLEtBQUssVUFBVTtBQUFBLE1BQ3RDLEtBQUtoUSxHQUFPO0FBQ1YsWUFBSTtBQUNGLGNBQUksQ0FBQ2xELEVBQUdrRCxDQUFLLEVBQUc7QUFBQSxRQUNsQixTQUFTdkQsR0FBRztBQUNWLGlCQUFPdVQsRUFBUyxNQUFNdlQsQ0FBQztBQUFBLFFBQ3pCO0FBRUEsUUFBQXVULEVBQVMsS0FBS2hRLENBQUs7QUFBQSxNQUNyQjtBQUFBLE1BRUEsTUFBTXZELEdBQUc7QUFDUCxRQUFBdVQsRUFBUyxNQUFNdlQsQ0FBQztBQUFBLE1BQ2xCO0FBQUEsTUFFQSxXQUFXO0FBQ1QsUUFBQXVULEVBQVMsU0FBUztBQUFBLE1BQ3BCO0FBQUEsSUFFRixDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFPbFQsR0FBSTtBQUNULFFBQUksT0FBT0EsS0FBTyxXQUFZLE9BQU0sSUFBSSxVQUFVQSxJQUFLLG9CQUFvQjtBQUMzRSxRQUFJMlQsSUFBSXhCLEVBQVcsSUFBSSxHQUNuQnlCLElBQVUsVUFBVSxTQUFTLEdBQzdCQyxJQUFXLElBRVhwTyxJQURPLFVBQVUsQ0FBQztBQUV0QixXQUFPLElBQUlrTyxFQUFFLENBQUFULE1BQVksS0FBSyxVQUFVO0FBQUEsTUFDdEMsS0FBS2hRLEdBQU87QUFDVixZQUFJNFEsSUFBUSxDQUFDRDtBQUdiLFlBRkFBLElBQVcsSUFFUCxDQUFDQyxLQUFTRjtBQUNaLGNBQUk7QUFDRixZQUFBbk8sSUFBTXpGLEVBQUd5RixHQUFLdkMsQ0FBSztBQUFBLFVBQ3JCLFNBQVN2RCxHQUFHO0FBQ1YsbUJBQU91VCxFQUFTLE1BQU12VCxDQUFDO0FBQUEsVUFDekI7QUFBQTtBQUVBLFVBQUE4RixJQUFNdkM7QUFBQSxNQUVWO0FBQUEsTUFFQSxNQUFNdkQsR0FBRztBQUNQLFFBQUF1VCxFQUFTLE1BQU12VCxDQUFDO0FBQUEsTUFDbEI7QUFBQSxNQUVBLFdBQVc7QUFDVCxZQUFJLENBQUNrVSxLQUFZLENBQUNELEVBQVMsUUFBT1YsRUFBUyxNQUFNLElBQUksVUFBVSxpQ0FBaUMsQ0FBQztBQUNqRyxRQUFBQSxFQUFTLEtBQUt6TixDQUFHLEdBQ2pCeU4sRUFBUyxTQUFTO0FBQUEsTUFDcEI7QUFBQSxJQUVGLENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQU0sTUFBTTtBQUNWLFFBQUlhLElBQVMsQ0FBQztBQUNkLGlCQUFNLEtBQUssUUFBUSxDQUFBN1EsTUFBUzZRLEVBQU8sS0FBSzdRLENBQUssQ0FBQyxHQUN2QzZRO0FBQUEsRUFDVDtBQUFBLEVBRUEsVUFBVUMsR0FBUztBQUNqQixRQUFJTCxJQUFJeEIsRUFBVyxJQUFJO0FBQ3ZCLFdBQU8sSUFBSXdCLEVBQUUsQ0FBQVQsTUFBWTtBQUN2QixVQUFJUixHQUNBdUIsSUFBUTtBQUVaLGVBQVNDLEVBQVVDLEdBQU07QUFDdkIsUUFBQXpCLElBQWV5QixFQUFLLFVBQVU7QUFBQSxVQUM1QixLQUFLQyxHQUFHO0FBQ04sWUFBQWxCLEVBQVMsS0FBS2tCLENBQUM7QUFBQSxVQUNqQjtBQUFBLFVBRUEsTUFBTXpVLEdBQUc7QUFDUCxZQUFBdVQsRUFBUyxNQUFNdlQsQ0FBQztBQUFBLFVBQ2xCO0FBQUEsVUFFQSxXQUFXO0FBQ1QsWUFBSXNVLE1BQVVELEVBQVEsVUFDcEJ0QixJQUFlLFFBQ2ZRLEVBQVMsU0FBUyxLQUVsQmdCLEVBQVVQLEVBQUUsS0FBS0ssRUFBUUMsR0FBTyxDQUFDLENBQUM7QUFBQSxVQUV0QztBQUFBLFFBRUYsQ0FBQztBQUFBLE1BQ0g7QUFFQSxhQUFBQyxFQUFVLElBQUksR0FDUCxNQUFNO0FBQ1gsUUFBSXhCLE1BQ0ZBLEVBQWEsWUFBWSxHQUN6QkEsSUFBZTtBQUFBLE1BRW5CO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsUUFBUTFTLEdBQUk7QUFDVixRQUFJLE9BQU9BLEtBQU8sV0FBWSxPQUFNLElBQUksVUFBVUEsSUFBSyxvQkFBb0I7QUFDM0UsUUFBSTJULElBQUl4QixFQUFXLElBQUk7QUFDdkIsV0FBTyxJQUFJd0IsRUFBRSxDQUFBVCxNQUFZO0FBQ3ZCLFVBQUltQixJQUFnQixDQUFDLEdBQ2pCQyxJQUFRLEtBQUssVUFBVTtBQUFBLFFBQ3pCLEtBQUtwUixHQUFPO0FBQ1YsY0FBSWxEO0FBQ0YsZ0JBQUk7QUFDRixjQUFBa0QsSUFBUWxELEVBQUdrRCxDQUFLO0FBQUEsWUFDbEIsU0FBU3ZELEdBQUc7QUFDVixxQkFBT3VULEVBQVMsTUFBTXZULENBQUM7QUFBQSxZQUN6QjtBQUdGLGNBQUk0VSxJQUFRWixFQUFFLEtBQUt6USxDQUFLLEVBQUUsVUFBVTtBQUFBLFlBQ2xDLEtBQUtBLEdBQU87QUFDVixjQUFBZ1EsRUFBUyxLQUFLaFEsQ0FBSztBQUFBLFlBQ3JCO0FBQUEsWUFFQSxNQUFNdkQsR0FBRztBQUNQLGNBQUF1VCxFQUFTLE1BQU12VCxDQUFDO0FBQUEsWUFDbEI7QUFBQSxZQUVBLFdBQVc7QUFDVCxrQkFBSThELElBQUk0USxFQUFjLFFBQVFFLENBQUs7QUFDbkMsY0FBSTlRLEtBQUssS0FBRzRRLEVBQWMsT0FBTzVRLEdBQUcsQ0FBQyxHQUNyQytRLEVBQWU7QUFBQSxZQUNqQjtBQUFBLFVBRUYsQ0FBQztBQUNELFVBQUFILEVBQWMsS0FBS0UsQ0FBSztBQUFBLFFBQzFCO0FBQUEsUUFFQSxNQUFNNVUsR0FBRztBQUNQLFVBQUF1VCxFQUFTLE1BQU12VCxDQUFDO0FBQUEsUUFDbEI7QUFBQSxRQUVBLFdBQVc7QUFDVCxVQUFBNlUsRUFBZTtBQUFBLFFBQ2pCO0FBQUEsTUFFRixDQUFDO0FBRUQsZUFBU0EsSUFBaUI7QUFDeEIsUUFBSUYsRUFBTSxVQUFVRCxFQUFjLFdBQVcsS0FBR25CLEVBQVMsU0FBUztBQUFBLE1BQ3BFO0FBRUEsYUFBTyxNQUFNO0FBQ1gsUUFBQW1CLEVBQWMsUUFBUSxDQUFBSSxNQUFLQSxFQUFFLFlBQVksQ0FBQyxHQUMxQ0gsRUFBTSxZQUFZO0FBQUEsTUFDcEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxDQUFDdEMsQ0FBZ0IsSUFBSTtBQUNuQixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTyxLQUFLTixHQUFHO0FBQ2IsUUFBSWlDLElBQUksT0FBTyxRQUFTLGFBQWEsT0FBT0Y7QUFDNUMsUUFBSS9CLEtBQUssS0FBTSxPQUFNLElBQUksVUFBVUEsSUFBSSxtQkFBbUI7QUFDMUQsUUFBSWdELElBQVN4QyxFQUFVUixHQUFHTSxDQUFnQjtBQUUxQyxRQUFJMEMsR0FBUTtBQUNWLFVBQUlDLElBQWFELEVBQU8sS0FBS2hELENBQUM7QUFDOUIsVUFBSSxPQUFPaUQsQ0FBVSxNQUFNQSxFQUFZLE9BQU0sSUFBSSxVQUFVQSxJQUFhLG1CQUFtQjtBQUMzRixhQUFJckMsR0FBYXFDLENBQVUsS0FBS0EsRUFBVyxnQkFBZ0JoQixJQUFVZ0IsSUFDOUQsSUFBSWhCLEVBQUUsQ0FBQVQsTUFBWXlCLEVBQVcsVUFBVXpCLENBQVEsQ0FBQztBQUFBLElBQ3pEO0FBRUEsUUFBSXRCLEdBQVUsVUFBVSxNQUN0QjhDLElBQVN4QyxFQUFVUixHQUFHSyxFQUFjLEdBRWhDMkM7QUFDRixhQUFPLElBQUlmLEVBQUUsQ0FBQVQsTUFBWTtBQUN2QixRQUFBVixFQUFRLE1BQU07QUFDWixjQUFJLENBQUFVLEVBQVMsUUFFYjtBQUFBLHFCQUFTMEIsS0FBUUYsRUFBTyxLQUFLaEQsQ0FBQztBQUU1QixrQkFEQXdCLEVBQVMsS0FBSzBCLENBQUksR0FDZDFCLEVBQVMsT0FBUTtBQUd2QixZQUFBQSxFQUFTLFNBQVM7QUFBQTtBQUFBLFFBQ3BCLENBQUM7QUFBQSxNQUNILENBQUM7QUFJTCxRQUFJLE1BQU0sUUFBUXhCLENBQUM7QUFDakIsYUFBTyxJQUFJaUMsRUFBRSxDQUFBVCxNQUFZO0FBQ3ZCLFFBQUFWLEVBQVEsTUFBTTtBQUNaLGNBQUksQ0FBQVUsRUFBUyxRQUViO0FBQUEscUJBQVMsSUFBSSxHQUFHLElBQUl4QixFQUFFLFFBQVEsRUFBRTtBQUU5QixrQkFEQXdCLEVBQVMsS0FBS3hCLEVBQUUsQ0FBQyxDQUFDLEdBQ2R3QixFQUFTLE9BQVE7QUFHdkIsWUFBQUEsRUFBUyxTQUFTO0FBQUE7QUFBQSxRQUNwQixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBR0gsVUFBTSxJQUFJLFVBQVV4QixJQUFJLG9CQUFvQjtBQUFBLEVBQzlDO0FBQUEsRUFFQSxPQUFPLE1BQU1tRCxHQUFPO0FBQ2xCLFFBQUlsQixJQUFJLE9BQU8sUUFBUyxhQUFhLE9BQU9GO0FBQzVDLFdBQU8sSUFBSUUsRUFBRSxDQUFBVCxNQUFZO0FBQ3ZCLE1BQUFWLEVBQVEsTUFBTTtBQUNaLFlBQUksQ0FBQVUsRUFBUyxRQUViO0FBQUEsbUJBQVN6UCxJQUFJLEdBQUdBLElBQUlvUixFQUFNLFFBQVEsRUFBRXBSO0FBRWxDLGdCQURBeVAsRUFBUyxLQUFLMkIsRUFBTXBSLENBQUMsQ0FBQyxHQUNsQnlQLEVBQVMsT0FBUTtBQUd2QixVQUFBQSxFQUFTLFNBQVM7QUFBQTtBQUFBLE1BQ3BCLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxZQUFZakIsRUFBYSxJQUFJO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBRUY7QUFFQU4sRUFBYSxhQUFhVTtBQUMxQixPQUFPLGVBQWVBLEdBQWMsT0FBTyxZQUFZLEdBQUc7QUFBQSxFQUN4RCxPQUFPO0FBQUEsSUFDTCxRQUFRTDtBQUFBLElBQ1IsaUJBQUFPO0FBQUEsRUFDRjtBQUFBLEVBQ0EsY0FBYztBQUNoQixDQUFDO0FBRUQsSUFBSXVDLEtBQWdCbkQsRUFBYTtBQUVqQyxNQUFNOEIsS0FBMEIsZ0JBQUFoQyxHQUF3QnFELEVBQWEsR0FFL0QsRUFBRSxPQUFBQyxJQUFPLE9BQUFsSSxHQUFNLElBQUlDLEVBQXFCLFlBQVksR0FDcERrSSxLQUFxQixDQUFDekcsT0FDbkI7QUFBQTtBQUFBLEVBRUwsVUFBVTBHLEdBQXdCLFlBQVl6RCxFQUFTLFNBQVMsS0FBSyxFQUFFLFNBQUFqRCxFQUFRLENBQUMsQ0FBQztBQUFBO0FBRW5GLElBRUkwRyxLQUEwQixDQUFDQyxHQUFVQyxNQUFhO0FBQ3RELFFBQU1SLElBQWEsSUFBSWxCLEdBQVcsQ0FBQ1AsTUFBYTtBQUM5QyxJQUFBQSxFQUFTLEtBQUssRUFBRSxRQUFRLFVBQVUsQ0FBQyxHQUNuQ2lDLEVBQVMsS0FBSyxDQUFDN08sTUFBVztBQUN4QixNQUFBNE0sRUFBUyxLQUFLLEVBQUUsUUFBUSxVQUFVLFFBQUE1TSxFQUFPLENBQUM7QUFBQSxJQUM1QyxDQUFDLEVBQUUsTUFBTSxDQUFDdEQsTUFBVTtBQUNsQixNQUFBa1EsRUFBUyxLQUFLLEVBQUUsUUFBUSxTQUFTLFNBQVNsUSxFQUFNLFFBQVEsQ0FBQztBQUFBLElBQzNELENBQUM7QUFBQSxFQUNILENBQUM7QUFDRCxTQUFBMlIsRUFBVyxVQUFVO0FBQUEsSUFDbkIsTUFBTSxDQUFDck8sTUFBVztBQUNoQixNQUFBeU8sR0FBTSxHQUFHRyxDQUFRLGdCQUFnQjVPLENBQU07QUFBQSxJQUN6QztBQUFBLElBQ0EsT0FBTyxDQUFDdEQsTUFBVTtBQUNoQixZQUFBNkosR0FBTSxHQUFHcUksQ0FBUTtBQUFBLEVBQ3JCLEtBQUssVUFBVWxTLENBQUssQ0FBQyxFQUFFLEdBQ2JBO0FBQUEsSUFDUjtBQUFBLEVBQ0YsQ0FBQyxHQUNNMlI7QUFDVCxHQUVNUyxLQUFhO0FBQUEsRUFDakIsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsV0FBVyxZQUFZO0FBQUEsRUFDdkI7QUFDRixHQUNNQyxLQUFXO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixXQUFXLFlBQVk7QUFBQSxFQUN2QjtBQUNGO0FBRUEsTUFBTUMsR0FBd0I7QUFBQSxFQUM1QixZQUFZQyxHQUFjO0FBQ3hCLFNBQUssZUFBZUEsR0FDcEIsS0FBSyxTQUFTQSxFQUFhLFFBQzNCLEtBQUssU0FBU0EsRUFBYSxRQUMzQixLQUFLLGVBQWUsQ0FBQyxHQUNyQixLQUFLLFNBQXlCLG9CQUFJLElBQUk7QUFBQSxFQUN4QztBQUFBLEVBQ0EsY0FBY3BQLEdBQU87QUFuekR2QixRQUFBcEI7QUFvekRJLFFBQUksQ0FBQ29CLEVBQU07QUFDVCxZQUFNLElBQUksTUFBTSxpQkFBaUI7QUFLbkMsUUFISUEsRUFBTSxhQUFXcEIsSUFBQSxLQUFLLGFBQWEsT0FBTyxjQUF6QixnQkFBQUEsRUFBb0MsV0FHckQsT0FBT29CLEVBQU0sUUFBUyxZQUFZQSxFQUFNLEtBQUs7QUFDL0M7QUFFRixVQUFNUCxJQUFZRCxHQUFrQixLQUFLLE1BQU1RLEVBQU0sSUFBSSxDQUFDO0FBRTFELFFBQUksQ0FEWSxLQUFLLGNBQWNQLENBQVMsRUFDOUI7QUFDZCxVQUFNLEVBQUUsV0FBQUksR0FBVyxTQUFBQyxFQUFRLElBQUlMO0FBRS9CLFlBRGtCSyxFQUFRLE1BQ1A7QUFBQSxNQUNqQixLQUFLO0FBQ0gsYUFBSyxrQkFBa0JBLENBQU87QUFDOUI7QUFBQSxNQUNGLEtBQUs7QUFDSCxhQUFLLGlCQUFpQkQsR0FBV0MsRUFBUSxXQUFXO0FBQ3BEO0FBQUEsTUFDRixLQUFLO0FBQ0gsYUFBSyxnQkFBZ0JELEdBQVdDLEVBQVEsV0FBVztBQUNuRDtBQUFBLE1BQ0YsS0FBSztBQUNILGFBQUssa0JBQWtCRCxHQUFXQyxFQUFRLGFBQWFBLEVBQVEsTUFBTTtBQUNyRTtBQUFBLE1BQ0YsS0FBSztBQUNILGFBQUssa0JBQWtCRSxFQUFNLFFBQVFILEdBQVdDLENBQU87QUFDdkQ7QUFBQSxNQUNGLEtBQUs7QUFDSCxhQUFLLHFCQUFxQkEsQ0FBTztBQUNqQztBQUFBLE1BQ0YsS0FBSztBQUNILGFBQUssMkJBQTJCQSxHQUFTRCxDQUFTO0FBQ2xEO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGNBQWNKLEdBQVc7QUFJdkIsV0FISUEsRUFBVSxXQUFXLEtBQUssYUFBYSxVQUFVLENBQUNBLEVBQVUsYUFHNUQsS0FBSyxPQUFPLElBQUlBLEVBQVUsS0FBSyxJQUMxQixNQUVULEtBQUssT0FBTyxJQUFJQSxFQUFVLEtBQUssR0FDeEI7QUFBQSxFQUNUO0FBQUEsRUFDQSxrQkFBa0JLLEdBQVM7QUFDekIsVUFBTXVQLElBQVN2UCxFQUFRLFNBQVMsR0FBR0EsRUFBUSxNQUFNLE9BQU87QUFDeEQsU0FBSyxhQUFhLGNBQWN1UCxDQUFNO0FBQUEsRUFDeEM7QUFBQSxFQUNBLGlCQUFpQnhQLEdBQVd5UCxHQUFPO0FBQ2pDLElBQUksS0FBSyxPQUFPLFdBQVMsS0FBSyxPQUFPLFFBQVF6UCxHQUFXeVAsQ0FBSztBQUFBLEVBQy9EO0FBQUEsRUFDQSxnQkFBZ0J6UCxHQUFXeVAsR0FBTztBQUNoQyxJQUFJLEtBQUssT0FBTyxVQUFRLEtBQUssT0FBTyxPQUFPelAsR0FBV3lQLENBQUs7QUFBQSxFQUM3RDtBQUFBLEVBQ0Esa0JBQWtCelAsR0FBV3lQLEdBQU9oVyxHQUFRO0FBQzFDLElBQUksS0FBSyxPQUFPLFlBQVUsS0FBSyxPQUFPLFNBQVN1RyxHQUFXeVAsR0FBT2hXLENBQU07QUFBQSxFQUN6RTtBQUFBLEVBQ0EsTUFBTSxrQkFBa0JpVyxHQUFRMVAsR0FBV0MsR0FBUztBQUNsRCxTQUFLLGFBQWFELENBQVMsSUFBSTBQLEdBQy9CLEtBQUssYUFBYSxZQUFZelAsQ0FBTyxHQUNqQyxLQUFLLE9BQU8sVUFDZCxLQUFLLE9BQU8sT0FBT0EsRUFBUSxrQkFBa0JBLEVBQVEsUUFBUTtBQUFBLEVBRWpFO0FBQUEsRUFDQSxxQkFBcUJBLEdBQVM7QUFDNUIsSUFBSSxLQUFLLGFBQWEsT0FBTyxlQUFhLEtBQUssYUFBYSxPQUFPLFlBQVlBLEVBQVEsT0FBTztBQUFBLEVBQ2hHO0FBQUEsRUFDQSwyQkFBMkJBLEdBQVNELEdBQVc7QUFDN0MsSUFBSSxLQUFLLGFBQWEsT0FBTyxxQkFDM0IsS0FBSyxhQUFhLE9BQU8sa0JBQWtCQyxFQUFRLGFBQWFBLEVBQVEsUUFBUUQsQ0FBUztBQUFBLEVBRTdGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3RkEsaUJBQWlCMFAsR0FBUTFQLEdBQVd5RCxHQUFNO0FBQ3hDLElBQUE1RCxHQUFVNlAsR0FBUSxLQUFLLFFBQVExUCxHQUFXeUQsR0FBTSxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQ3JFO0FBQ0Y7QUFFQSxlQUFla00sR0FBaUJ2SyxHQUFRQyxHQUFhO0FBTW5ELFFBQU1DLElBQWdCLE1BTEg5TSxHQUFlO0FBQUEsSUFDaEMsUUFBQTRNO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxhQUFBQztBQUFBLEVBQ0YsQ0FBQyxFQUNzQyxTQUNqQ3VLLElBQWdCLE1BQU14UCxHQUFnQ2tGLENBQWE7QUFDekUsTUFBSSxDQUFDL0UsR0FBYytFLEdBQWVzSyxDQUFhO0FBQzdDLFVBQU0sSUFBSSxNQUFNLG1DQUFtQztBQUVyRCxTQUFPdEs7QUFDVDtBQUNBLE1BQU11SyxHQUFrQjtBQUFBLEVBQ3RCLGNBQWM7QUFDWixTQUFLLGNBQThCLG9CQUFJLElBQUk7QUFBQSxFQUM3QztBQUFBLEVBQ0EsY0FBY0MsR0FBSUMsR0FBWTtBQUM1QixTQUFLLFlBQVksSUFBSUQsR0FBSUMsQ0FBVTtBQUFBLEVBQ3JDO0FBQUEsRUFDQSxnQkFBZ0I7QUFDZCxVQUFNQSxJQUFhLEtBQUssWUFBWSxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQ3BELFFBQUksQ0FBQ0E7QUFDSCxZQUFNLElBQUksTUFBTSxzQkFBc0I7QUFFeEMsV0FBT0E7QUFBQSxFQUNUO0FBQUEsRUFDQSxvQkFBb0I7QUFDbEIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUNGO0FBRUEsTUFBTUMsSUFBTixNQUFNQSxFQUFZO0FBQUEsRUFDaEIsWUFBWUMsR0FBUTtBQUNsQixTQUFLLGtCQUFrQixNQUFNO0FBQzNCLE1BQUksS0FBSywyQkFBMkIsUUFHL0IsS0FBSyxvQkFHTixLQUFLLGtCQUFrQixrQkFBa0IsRUFBRSxTQUFTLE1BR3hELEtBQUsseUJBQXlCakIsR0FBbUIsS0FBSyxxQkFBcUIsQ0FBQyxHQUM1RSxLQUFLLHVCQUF1QixTQUFTLFVBQVUsQ0FBQ2hKLE1BQVcsS0FBSyx1QkFBdUJBLENBQU0sQ0FBQztBQUFBLElBQ2hHLEdBQ0EsS0FBSyxjQUFjLENBQUMvRixNQUFZO0FBQzlCLE1BQUksS0FBSyxxQkFHVCxLQUFLLG1CQUFtQkEsR0FDeEIsS0FBSyxnQkFBZ0I7QUFBQSxJQUN2QixHQUNBLEtBQUsseUJBQXlCLENBQUNpUSxNQUFlO0FBbGhFbEQsVUFBQW5SLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUFpUixHQUFBQztBQW1oRU0sVUFBSUYsRUFBVyxXQUFXO0FBQ3hCLFNBQUFsUixLQUFBRCxJQUFBLEtBQUssUUFBTyx5QkFBWixRQUFBQyxFQUFBLEtBQUFELEdBQW1DLEVBQUUsV0FBV3FRLElBQVksWUFBWUEsR0FBVztBQUFBLGVBQzFFYyxFQUFXLFdBQVc7QUFDL0IsU0FBQWhSLEtBQUFELElBQUEsS0FBSyxRQUFPLHlCQUFaLFFBQUFDLEVBQUEsS0FBQUQsR0FBbUMsRUFBRSxXQUFXb1EsSUFBVSxZQUFZQSxHQUFTO0FBQUEsZUFDdEVhLEVBQVcsV0FBVyxVQUFVO0FBQ3pDLGNBQU1oRyxJQUFhZ0csRUFBVyxRQUN4QkcsSUFBY25HLEVBQVcsZUFBZUEsRUFBVyxtQkFBbUIsVUFDdEVvRyxJQUFlcEcsRUFBVyxlQUFlQSxFQUFXLG1CQUFtQjtBQUM3RSxTQUFBa0csS0FBQUQsSUFBQSxLQUFLLFFBQU8seUJBQVosUUFBQUMsRUFBQSxLQUFBRCxHQUFtQztBQUFBLFVBQ2pDLFdBQVc7QUFBQSxZQUNULFdBQVc7QUFBQSxZQUNYLGFBQWFFO0FBQUEsWUFDYixXQUFXLE9BQU9FLE1BQWVGLElBQWMsS0FBSyxxQkFBcUIsYUFBYW5HLEdBQVlxRyxDQUFVLElBQUk7QUFBQSxVQUNsSDtBQUFBLFVBQ0EsWUFBWTtBQUFBLFlBQ1YsV0FBVztBQUFBLFlBQ1gsYUFBYUQ7QUFBQSxZQUNiLFdBQVcsT0FBT0MsTUFBZUQsSUFBZSxLQUFLLHFCQUFxQixjQUFjcEcsR0FBWXFHLENBQVUsSUFBSTtBQUFBLFVBQ3BIO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEdBQ0EsS0FBSyx1QkFBdUIsQ0FBQ0MsR0FBVXRHLEdBQVl6RCxNQUFXO0FBQzVELFlBQU04QixJQUFVLEtBQUsscUJBQXFCO0FBQzFDLGFBQU9pRCxFQUFTLFNBQVMsSUFBSTtBQUFBLFFBQzNCLFNBQUFqRDtBQUFBLFFBQ0EsdUJBQXVCNEMsR0FBZ0M1QyxFQUFRLHdCQUF3QmlJLENBQVE7QUFBQSxRQUMvRixrQkFBa0IsS0FBSyxvQkFBb0I7QUFBQSxRQUMzQyxlQUFlLEtBQUssdUJBQXVCO0FBQUEsUUFDM0MsY0FBYyxFQUFFLFVBQUFBLEdBQVUsd0JBQXdCL0osS0FBQSxnQkFBQUEsRUFBUSx1QkFBdUI7QUFBQSxRQUNqRixZQUFBeUQ7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILEdBQ0E4RixFQUFZLGtCQUFrQixJQUFJLEdBQ2xDLEtBQUssU0FBUyxFQUFFLEdBQUdDLEdBQVEsU0FBU0EsRUFBTyxXQUFXLDZCQUE2QixHQUNuRixLQUFLLFdBQVcsTUFDaEIsS0FBSyxTQUFTLGFBQWEsT0FBTyxPQUFPLFdBQVcsQ0FBQyxJQUNyRCxLQUFLLFVBQVUsT0FBTyxTQUFTLFFBQy9CLEtBQUssYUFBYUEsRUFBTyxjQUFjLFFBQ3ZDLEtBQUssaUJBQWlCLEVBQUUsUUFBUSxNQUFNLEdBQ3RDLEtBQUssbUJBQW1CLE1BQ3hCLEtBQUsseUJBQXlCLE1BQzlCLEtBQUssZ0JBQWdCLElBQ3JCLEtBQUssb0JBQW9CLElBQUlKLEdBQWtCLEdBQy9DLEtBQUssZUFBZSxJQUFJUCxHQUF3QixJQUFJLEdBQ3BELEtBQUssYUFBYSxTQUNsQixPQUFPLGlCQUFpQixXQUFXLEtBQUssYUFBYSxjQUFjLEtBQUssS0FBSyxZQUFZLENBQUM7QUFBQSxFQUM1RjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFPLGtCQUFrQm1CLEdBQU07QUFDN0IsUUFBSVQsRUFBWSxZQUFZO0FBQzFCLFlBQU0sSUFBSSxNQUFNLGdFQUFnRTtBQUVsRixXQUFPLE1BQVNTO0FBQUEsRUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxjQUFjO0FBQ25CLFdBQU8sT0FBTyxPQUFVO0FBQUEsRUFDMUI7QUFBQSxFQUNBLHVCQUF1QjtBQUNyQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFDQSxjQUFjakIsR0FBUTtBQUNwQixTQUFLLGVBQWUsU0FBU0EsR0FDekIsS0FBSyxZQUNQLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxRQUFRLENBQUNrQixNQUFZO0FBQ2hELE1BQUFBLEVBQVEsS0FBSyxNQUFNLFNBQVNsQjtBQUFBLElBQzlCLENBQUM7QUFBQSxFQUVMO0FBQUEsRUFDQSxjQUFjbUIsR0FBY3pOLElBQVUsQ0FBQyxHQUFHO0FBQ3hDLFFBQUksQ0FBQyxLQUFLLE9BQVEsT0FBTSxJQUFJLE1BQU0sOEJBQThCO0FBQ2hFLFVBQU0rSixJQUFPbFMsR0FBWSxNQUFNNFYsQ0FBWSxHQUNyQ0MsSUFBUSxTQUFTLGNBQWMsUUFBUSxHQUN2Q0MsSUFBYyxLQUFLLGlCQUFpQjNOLENBQU87QUFDakQsSUFBQTBOLEVBQU0sT0FBTyxHQUFHM0QsQ0FBSTtBQUNwQixVQUFNekgsSUFBTSxJQUFJLElBQUksV0FBV29MLEVBQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxPQUFPO0FBQ2hFLElBQUFwTCxFQUFJLFNBQVNxTCxFQUFZLFNBQVMsR0FDbENELEVBQU0sTUFBTXBMLEVBQUksTUFDaEIsS0FBSyxPQUFPLFlBQVlBLEdBQ3hCb0wsRUFBTSxNQUFNLFNBQVMsUUFDckJBLEVBQU0sTUFBTSxRQUFRO0FBQ3BCLFVBQU1GLElBQVU7QUFBQSxNQUNkLE1BQUF6RDtBQUFBLE1BQ0EsTUFBTTJEO0FBQUEsTUFDTixPQUFPLENBQUNFLE1BQVU7QUFqbkV4QixZQUFBL1I7QUFpbkUyQixnQkFBQUEsSUFBQSxTQUFTLGNBQWMrUixDQUFRLE1BQS9CLGdCQUFBL1IsRUFBa0MsWUFBWTZSO0FBQUE7QUFBQSxJQUNyRTtBQUNBLGdCQUFLLGlCQUFpQkYsQ0FBTyxHQUN6QixLQUFLLFdBQ1AsS0FBSyxTQUFTekQsQ0FBSSxJQUFJeUQsSUFFdEIsS0FBSyxXQUFXLEVBQUUsQ0FBQ3pELENBQUksR0FBR3lELEVBQVEsR0FFN0JBO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQWlCeE4sR0FBUztBQUN4QixVQUFNMk4sSUFBYyxJQUFJLGdCQUFnQjtBQUN4QyxXQUFBQSxFQUFZLE9BQU8sV0FBVyxLQUFLLE9BQU8sR0FDMUNBLEVBQVksT0FBTyxVQUFVLEtBQUssTUFBTSxHQUNwQzNOLEVBQVEsVUFDVjJOLEVBQVksT0FBTyxVQUFVelIsR0FBMkI4RCxFQUFRLE1BQU0sQ0FBQyxHQUV6RTJOLEVBQVksT0FBTyxlQUFlLEtBQUssT0FBTyxtQkFBbUIsR0FDMURBO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQWlCSCxHQUFTO0FBQ3hCLElBQUFmLEdBQWlCZSxFQUFRLElBQUksRUFBRSxLQUFLLENBQUNLLE1BQVM7QUFDNUMsV0FBSyxrQkFBa0IsY0FBY0wsRUFBUSxNQUFNSyxDQUFJLEdBQ3ZELEtBQUssZ0JBQWdCO0FBQUEsSUFDdkIsQ0FBQyxFQUFFLE1BQU0sQ0FBQ3hYLE1BQUs7QUFBQSxLQUFTO0FBQUEsRUFDMUI7QUFBQSxFQUNBLGFBQWE7QUFDWCxXQUFPLFNBQVMsY0FBYyxLQUFLLFVBQVUsS0FBSyxTQUFTO0FBQUEsRUFDN0Q7QUFBQSxFQUNBLHVCQUF1QjtBQUNyQixVQUFNeVgsSUFBaUIsS0FBSyxrQkFBa0Isa0JBQWtCO0FBQ2hFLFFBQUksQ0FBQyxLQUFLO0FBQ1IsWUFBTSxJQUFJLE1BQU0sNENBQTRDO0FBRTlELFFBQUlBLEVBQWUsU0FBUztBQUMxQixZQUFNLElBQUksTUFBTSwwQkFBMEI7QUFFNUMsV0FBTztBQUFBLE1BQ0wsU0FBUyxJQUFJLElBQUksS0FBSyxPQUFPLFdBQVd0WSxFQUFjLEVBQUU7QUFBQSxNQUN4RCxTQUFTLEtBQUssV0FBVztBQUFBLE1BQ3pCLG1CQUFtQixLQUFLLGlCQUFpQjtBQUFBLE1BQ3pDLHdCQUF3QixLQUFLLGlCQUFpQjtBQUFBLE1BQzlDLGdCQUFBc1k7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0Esc0JBQXNCO0FBQ3BCLFdBQU8xUixHQUF5QixLQUFLLFdBQVcsQ0FBQztBQUFBLEVBQ25EO0FBQUEsRUFDQSx5QkFBeUI7QUFDdkIsVUFBTTJSLElBQU8sTUFBTTtBQUFBLElBQ25CO0FBQ0EsV0FBTztBQUFBLE1BQ0wsaUJBQWlCblgsRUFBaUIsbUJBQW1CLEtBQUssT0FBTyxtQkFBbUJtWCxDQUFJO0FBQUEsTUFDeEYsbUJBQW1CblgsRUFBaUIscUJBQXFCLEtBQUssT0FBTyxxQkFBcUJtWCxDQUFJO0FBQUEsTUFDOUYsbUJBQW1CblgsRUFBaUIscUJBQXFCLEtBQUssT0FBTyxxQkFBcUJtWCxDQUFJO0FBQUEsTUFDOUYsNkJBQTZCblg7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsS0FBSyxPQUFPLCtCQUErQm1YO0FBQUEsTUFDN0M7QUFBQSxNQUNBLG1CQUFtQm5YLEVBQWlCLHFCQUFxQixLQUFLLE9BQU8scUJBQXFCbVgsQ0FBSTtBQUFBLElBQ2hHO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUNQLFVBQU0xSSxJQUFVLEtBQUsscUJBQXFCO0FBQzFDLElBQUFpRCxFQUFTLFNBQVMsSUFBSTtBQUFBLE1BQ3BCLFNBQUFqRDtBQUFBLE1BQ0EsdUJBQXVCNEMsR0FBZ0M1QyxFQUFRLHdCQUF3QixhQUFhO0FBQUEsTUFDcEcsa0JBQWtCLEtBQUssb0JBQW9CO0FBQUEsTUFDM0MsZUFBZSxLQUFLLHVCQUF1QjtBQUFBLE1BQzNDLGNBQWM7QUFBQTtBQUFBLE1BRWQsWUFBWTtBQUFBO0FBQUEsSUFFZCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBQ0Esc0JBQXNCMkksR0FBUTtBQUM1QixTQUFLLGdCQUFnQixJQUNqQixLQUFLLE9BQU8sbUJBQWlCLEtBQUssT0FBTyxnQkFBZ0JBLENBQU07QUFBQSxFQUNyRTtBQUFBLEVBQ0EsVUFBVTtBQUNSLGVBQVdSLEtBQVcsT0FBTyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUM7QUFDckQsTUFBQUEsRUFBUSxLQUFLLE9BQU87QUFFdEIsV0FBTyxvQkFBb0IsV0FBVyxLQUFLLGFBQWEsY0FBYyxLQUFLLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDL0Y7QUFDRjtBQWxJSVYsRUFBSyxXQUFXeEU7QUF4RXBCLElBQU0yRixLQUFObkI7IiwKICAibmFtZXMiOiBbInoiLCAidjQiLCAiY29ubmVjdFRvQ2hpbGQiLCAiY2hhbGsiLCAiRlJBTUVfQkFTRV9VUkwiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlIiwgIlpvZEZpZWxkRXJyb3IiLCAiWm9kRmllbGRFcnJvcnMiLCAiTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSIsICJnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSIsICJvZ0Vycm9yTWVzc2FnZSIsICJrZXkiLCAiaXNTdHJpbmdpZmllZEpzb25PYmplY3QiLCAic3RyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAicmVzcG9uc2UiLCAiZXJyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMiLCAiZXJyb3JzIiwgImdldEVycm9yTWVzc2FnZSIsICJlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiZXJyb3IiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInN0cmlwZVB1YktleSIsICJ0b3RhbEFtb3VudEF0b20iLCAiY3VycmVuY3kiLCAiaXNBbW91bnRQZW5kaW5nIiwgImlzTGlua09ubHkiLCAic3RyaXBlIiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiY29uZmlybVN0cmlwZVByUE0iLCAibmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtIiwgImNvbmZpcm1SZXN1bHQiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgInBheWxvYWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJudWxsT3JVbmRlZk9yIiwgIkNERVJlc3BvbnNlRXJyb3IiLCAiQ291cG9uTWluaW1hbCIsICJMaW5lSXRlbSIsICJCcmFuZFNldHRpbmdzIiwgIkJyYW5kIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJTdWJzY3JpcHRpb25JdGVtTWluaW1hbCIsICJTdWJzY3JpcHRpb25NaW5pbWFsIiwgIkludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCIsICJJbnZvaWNlTGluZUl0ZW1NaW5pbWFsIiwgIkRpc2NvdW50TWluaW1hbCIsICJJbnZvaWNlTWluaW1hbCIsICJDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwiLCAiUHJldmlld0NoZWNrb3V0UmVzcG9uc2UiLCAiX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiIsICJQYXltZW50Rm9ybVByZWZpbGwiLCAiQ29tcGxldGVkRm9ybVByZWZpbGwiLCAiRXhwaXJlZEZvcm1QcmVmaWxsIiwgIkNoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlIiwgIlNldHVwQ2hlY2tvdXRSZXNwb25zZSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJTdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAiU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UiLCAic3VtIiwgImFyciIsICJhIiwgImIiLCAiZml4UHJvdG8iLCAicHJvdG90eXBlIiwgInNldFByb3RvdHlwZU9mIiwgImZpeFN0YWNrIiwgImNhcHR1cmVTdGFja1RyYWNlIiwgIl9fZXh0ZW5kcyIsICJfZXh0ZW5kU3RhdGljcyIsICJkIiwgInAiLCAiX18iLCAiQ3VzdG9tRXJyb3IiLCAiX3N1cGVyIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJfbmV3VGFyZ2V0IiwgIl90aGlzIiwgIkNkZUVycm9yIiwgImZyaWVuZGx5TWVzc2FnZSIsICJxdWVyeUNERSIsICJjZGVDb25uIiwgImRhdGEiLCAicmVzcG9uc2VTY2hlbWEiLCAiaXNDREVSZXNwb25zZUVycm9yIiwgImNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hIiwgInNjaGVtYSIsICJnZXRDaGVja291dFByZXZpZXciLCAicmVxdWVzdCIsICJnZXRQcmVmaWxsIiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiaWZyYW1lIiwgImNoaWxkT3JpZ2luIiwgImNvbm5lY3Rpb25PYmoiLCAiY3JlYXRlQW5kT3BlbkZyYW1lIiwgInVybCIsICJ0ZW1wbGF0ZSIsICJob3N0IiwgInNoYWRvd1Jvb3QiLCAiY2FuY2VsQnV0dG9uIiwgInN0YXJ0UG9sbGluZyIsICJvblN1Y2Nlc3MiLCAiaGFuZGxlUG9sbGluZyIsICJzdGF0dXMiLCAicG9sbGluZ0ludGVydmFsIiwgImhhbmRsZUV2ZW50cyIsICJlbGVtZW50cyIsICJoYW5kbGVDYW5jZWwiLCAic3RhcnQzZHNWZXJpZmljYXRpb24iLCAiY2xlYW51cEV2ZW50TGlzdGVuZXJzIiwgImFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzIiwgInNpbXBsZU9qc0Zsb3ciLCAicGFyYW1zIiwgImZsb3dSZXN1bHQiLCAiYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCIsICJpbml0IiwgImVycl9fIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgInByZWZpeCIsICJsb2ciLCAibG9nX18kMyIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAib25WYWxpZGF0aW9uRXJyb3IiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJ2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0IiwgInBhcnNlZCIsICJlcnJfXyQzIiwgInBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UiLCAiZmluZENwbU1hdGNoaW5nVHlwZSIsICJhbGxDUE1zIiwgInpvZE1vZGVsIiwgImNwbSIsICJjcG0yIiwgImxvZ19fJDIiLCAiZXJyX18kMiIsICJzdHJpcGVMb2dfXyIsICJydW5Db21tb25DY0Zsb3ciLCAiY29udGV4dCIsICJjaGVja291dFBheW1lbnRNZXRob2QiLCAiZmxvd0NhbGxiYWNrcyIsICJhbnlDZGVDb25uZWN0aW9uIiwgInByZWZpbGwiLCAibm9uQ2RlRm9ybUZpZWxkcyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgImluaXRpYWxQcmV2aWV3IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJjdXN0b21QYXJhbXMiLCAiaW5pdFJlc3VsdCIsICJvdmVycmlkZSIsICJ1cGRhdGVQcldpdGhBbW91bnQiLCAic3RyaXBlUG1BZGRlZEV2ZW50IiwgIm1lcmdlZElucHV0cyIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgImNoZWNrb3V0UmVxdWVzdCIsICJmb3JtSW5wdXRzIiwgInN0cmlwZVBtRXZ0IiwgImlucHV0cyIsICJwYXllckZpcnN0TmFtZSIsICJwYXllckxhc3ROYW1lUGFydHMiLCAicGF5ZXJMYXN0TmFtZSIsICJhbW91bnQiLCAiaXNQZW5kaW5nIiwgImZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QiLCAiY3BtcyIsICJ3aXRoUHJvdmlkZXIiLCAid2l0aFByb2Nlc3NvciIsICJtYXRjaGVzIiwgIk9qc0Zsb3dzIiwgImdldERlZmF1bHRFeHBvcnRGcm9tQ2pzIiwgIngiLCAiT2JzZXJ2YWJsZSQyIiwgImhhc1N5bWJvbCIsICJuYW1lIiwgImdldFN5bWJvbCIsICJTeW1ib2xJdGVyYXRvciIsICJTeW1ib2xPYnNlcnZhYmxlIiwgIlN5bWJvbFNwZWNpZXMiLCAiZ2V0TWV0aG9kIiwgImdldFNwZWNpZXMiLCAiY3RvciIsICJPYnNlcnZhYmxlJDEiLCAiaXNPYnNlcnZhYmxlIiwgImhvc3RSZXBvcnRFcnJvciIsICJlbnF1ZXVlIiwgImNsZWFudXBTdWJzY3JpcHRpb24iLCAic3Vic2NyaXB0aW9uIiwgImNsZWFudXAiLCAidW5zdWJzY3JpYmUiLCAiY2xvc2VTdWJzY3JpcHRpb24iLCAiZmx1c2hTdWJzY3JpcHRpb24iLCAicXVldWUiLCAibm90aWZ5U3Vic2NyaXB0aW9uIiwgInR5cGUiLCAib2JzZXJ2ZXIiLCAibSIsICJvbk5vdGlmeSIsICJTdWJzY3JpcHRpb24iLCAic3Vic2NyaWJlciIsICJzZWxmIiwgInN1YnNjcmlwdGlvbk9ic2VydmVyIiwgIk9ic2VydmFibGUiLCAiZG9uZSIsICJDIiwgImhhc1NlZWQiLCAiaGFzVmFsdWUiLCAiZmlyc3QiLCAidmFsdWVzIiwgInNvdXJjZXMiLCAiaW5kZXgiLCAic3RhcnROZXh0IiwgIm5leHQiLCAidiIsICJzdWJzY3JpcHRpb25zIiwgIm91dGVyIiwgImlubmVyIiwgImNvbXBsZXRlSWZEb25lIiwgInMiLCAibWV0aG9kIiwgIm9ic2VydmFibGUiLCAiaXRlbSIsICJpdGVtcyIsICJ6ZW5PYnNlcnZhYmxlIiwgImxvZ19fIiwgImluaXRpYWxpemVPanNGbG93cyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgIk9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIiwgImZvcm1JbnN0YW5jZSIsICJoZWlnaHQiLCAiZmllbGQiLCAic291cmNlIiwgImNyZWF0ZUNvbm5lY3Rpb24iLCAiaXNWYWxpZE9iamVjdCIsICJDb25uZWN0aW9uTWFuYWdlciIsICJpZCIsICJjb25uZWN0aW9uIiwgIl9PcGVuUGF5Rm9ybSIsICJjb25maWciLCAiaW5pdFN0YXR1cyIsICJfZSIsICJfZiIsICJjYW5BcHBsZVBheSIsICJjYW5Hb29nbGVQYXkiLCAidXNlclBhcmFtcyIsICJwcm92aWRlciIsICJmb3JtIiwgImVsZW1lbnQiLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==
|
|
1749
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguZXMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGNvbm5lY3RUb0NoaWxkIH0gZnJvbSAncGVucGFsJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmNvbnN0IEZSQU1FX0JBU0VfVVJMID0gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiO1xuXG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBsb2M6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIG1zZzogei5zdHJpbmcoKSxcbiAgdXJsOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UgPSB6LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEpO1xuY29uc3QgWm9kRmllbGRFcnJvciA9IHoub2JqZWN0KHtcbiAgY29kZTogei5zdHJpbmcoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgcGF0aDogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBab2RGaWVsZEVycm9ycyA9IHouYXJyYXkoWm9kRmllbGRFcnJvcik7XG5jb25zdCBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFID0ge1xuICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxufTtcbmNvbnN0IGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlID0gKG9nRXJyb3JNZXNzYWdlKSA9PiB7XG4gIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICByZXR1cm4gTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRVtrZXldID8/IG9nRXJyb3JNZXNzYWdlO1xufTtcbmNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShyZXNwb25zZVswXS5tc2cpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBgJHtgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczpgfVxuJHtidWxsZXRlZH1gO1xuICB9XG59O1xuY29uc3QgY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgY29uc3QgbGlzdE9mRXJyb3JzID0gZXJyb3JzLm1hcCgoZXJyKSA9PiBgLSAke2Vyci5wYXRoLmpvaW4oXCIvXCIpfTogJHtlcnIubWVzc2FnZX1gKS5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbn07XG5jb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAoZSkgPT4ge1xuICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGlzU3RyaW5naWZpZWRKc29uT2JqZWN0KGUubWVzc2FnZSkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZS5tZXNzYWdlKTtcbiAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3Iob2JqKTtcbiAgICAgIH0gZWxzZSBpZiAoWm9kRmllbGRFcnJvcnMuc2FmZVBhcnNlKG9iaikuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlICsgXCJcIjtcbiAgfVxufTtcbmNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IFJlcXVpcmVkU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBPcHRpb25hbFN0cmluZyA9IHouc3RyaW5nKCkudHJpbSgpLm9wdGlvbmFsKCk7XG5jb25zdCBudWxsT3JVbmRlZk9yJDEgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG52YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICBGaWVsZE5hbWUyW1wiRklSU1RfTkFNRVwiXSA9IFwiZmlyc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJFTUFJTFwiXSA9IFwiZW1haWxcIjtcbiAgRmllbGROYW1lMltcIlpJUF9DT0RFXCJdID0gXCJ6aXBDb2RlXCI7XG4gIEZpZWxkTmFtZTJbXCJDSVRZXCJdID0gXCJjaXR5XCI7XG4gIEZpZWxkTmFtZTJbXCJTVEFURVwiXSA9IFwic3RhdGVcIjtcbiAgRmllbGROYW1lMltcIkNPVU5UUllcIl0gPSBcImNvdW50cnlcIjtcbiAgRmllbGROYW1lMltcIkFERFJFU1NcIl0gPSBcImFkZHJlc3NcIjtcbiAgRmllbGROYW1lMltcIlBIT05FXCJdID0gXCJwaG9uZVwiO1xuICBGaWVsZE5hbWUyW1wiUFJPTU9USU9OX0NPREVcIl0gPSBcInByb21vdGlvbkNvZGVcIjtcbiAgcmV0dXJuIEZpZWxkTmFtZTI7XG59KShGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgRmllbGROYW1lRW51bSA9IHoubmF0aXZlRW51bShGaWVsZE5hbWUpO1xudmFyIFByaXZhdGVGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChQcml2YXRlRmllbGROYW1lMikgPT4ge1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfTlVNQkVSXCJdID0gXCJjYXJkTnVtYmVyXCI7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmRFeHBpcnlcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0NWQ1wiXSA9IFwiY2FyZEN2Y1wiO1xuICByZXR1cm4gUHJpdmF0ZUZpZWxkTmFtZTI7XG59KShQcml2YXRlRmllbGROYW1lIHx8IHt9KTtcbmNvbnN0IFByaXZhdGVGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuY29uc3QgQWxsRmllbGROYW1lcyA9IHoudW5pb24oW0ZpZWxkTmFtZUVudW0sIFByaXZhdGVGaWVsZE5hbWVFbnVtXSk7XG52YXIgRWxlbWVudFR5cGVFbnVtID0gLyogQF9fUFVSRV9fICovICgoRWxlbWVudFR5cGVFbnVtMikgPT4ge1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRFwiXSA9IFwiY2FyZFwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmQtbnVtYmVyXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZC1leHBpcnlcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkLWN2Y1wiO1xuICByZXR1cm4gRWxlbWVudFR5cGVFbnVtMjtcbn0pKEVsZW1lbnRUeXBlRW51bSB8fCB7fSk7XG5jb25zdCBFbGVtZW50VHlwZSA9IHoubmF0aXZlRW51bShFbGVtZW50VHlwZUVudW0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpLFxuICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBQYXltZW50TWV0aG9kTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBjYXJkTnVtYmVyOiBPcHRpb25hbFN0cmluZyxcbiAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgY3ZjOiBPcHRpb25hbFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGJhY2tncm91bmRDb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gIGNvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gIGZvbnRTaXplOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFdlaWdodDogT3B0aW9uYWxTdHJpbmcsXG4gIG1hcmdpbjogT3B0aW9uYWxTdHJpbmcsXG4gIHBhZGRpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsZXR0ZXJTcGFjaW5nOiBPcHRpb25hbFN0cmluZyxcbiAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgRXZlbnRUeXBlID0gei5lbnVtKFtcbiAgLy8gRWxlbWVudCAtPiBGb3JtXG4gIFwiTEFZT1VUXCIsXG4gIFwiTE9BREVEXCIsXG4gIFwiQkxVUlwiLFxuICBcIkZPQ1VTXCIsXG4gIFwiQ0hBTkdFXCIsXG4gIFwiVE9LRU5JWkVfU1RBUlRFRFwiLFxuICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICBcIlRPS0VOSVpFX1NVQ0NFU1NcIixcbiAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gIFwiTE9BRF9FUlJPUlwiLFxuICBcIlZBTElEQVRJT05fRVJST1JcIixcbiAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gIFwiU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTU1wiLFxuICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgXCJUT0tFTklaRVwiLFxuICBcIkNIRUNLT1VUXCIsXG4gIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFX1NUQVJURURcIiwgXCJDSEVDS09VVF9TVEFSVEVEXCJdKTtcbmNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7IHR5cGU6IEdlbmVyaWNFdmVudFR5cGUgfSk7XG5jb25zdCBJbnB1dEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkJMVVJcIiwgXCJGT0NVU1wiLCBcIkNIQU5HRVwiXSk7XG5jb25zdCBJbnB1dEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogSW5wdXRFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBQcml2YXRlRmllbGROYW1lRW51bSxcbiAgZXJyb3JzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJMT0FEX0VSUk9SXCIsIFwiVE9LRU5JWkVfRVJST1JcIiwgXCJDSEVDS09VVF9FUlJPUlwiXSk7XG5jb25zdCBFcnJvckV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogRXJyb3JFdmVudFR5cGUsXG4gIG1lc3NhZ2U6IFJlcXVpcmVkU3RyaW5nLFxuICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlZBTElEQVRJT05fRVJST1JcIl0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgTGF5b3V0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTEFZT1VUKSxcbiAgaGVpZ2h0OiBSZXF1aXJlZFN0cmluZ1xufSk7XG5jb25zdCBMb2FkZWRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICB0b3RhbEFtb3VudEF0b21zOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogT3B0aW9uYWxTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHouYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEpXG59KTtcbmNvbnN0IFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSxcbiAgbmV4dEFjdGlvbk1ldGFkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgcGF5bWVudEZsb3dNZXRhZGF0YTogei5hbnkoKS5vcHRpb25hbCgpLFxuICBzdGFydFBGTWV0YWRhdGE6IHoub3B0aW9uYWwoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTUyksXG4gIHBheW1lbnRNZXRob2RJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wibGFzdE5hbWVcIiAvKiBMQVNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiY291bnRyeVwiIC8qIENPVU5UUlkgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgUFJGb3JtRmllbGRzID0gei5vYmplY3Qoe1xuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBTdWJtaXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRVwiLCBcIkNIRUNLT1VUXCIsIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJdKTtcbmNvbnN0IFN1Ym1pdEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogU3VibWl0RXZlbnRUeXBlLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIGRvTm90VXNlTGVnYWN5Q0NGbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ0NDUE1JZDogT3B0aW9uYWxTdHJpbmdcbn0pLmV4dGVuZChSZXF1aXJlZEZvcm1GaWVsZHMuc2hhcGUpO1xuY29uc3QgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyksXG4gIGlzUmVhZHlGb3JDaGVja291dDogei5ib29sZWFuKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUyksXG4gIGludm9pY2VVcmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25JZHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIGN1c3RvbWVySWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgRXZlbnRQYXlsb2FkID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgR2VuZXJpY0V2ZW50UGF5bG9hZCxcbiAgSW5wdXRFdmVudFBheWxvYWQsXG4gIEVycm9yRXZlbnRQYXlsb2FkLFxuICBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQsXG4gIExheW91dEV2ZW50UGF5bG9hZCxcbiAgTG9hZGVkRXZlbnRQYXlsb2FkLFxuICBTdWJtaXRFdmVudFBheWxvYWQsXG4gIFRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCxcbiAgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQsXG4gIFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkXG5dKTtcbmNvbnN0IEVsZW1lbnRFdmVudCA9IHoub2JqZWN0KHtcbiAgcGF5bG9hZDogRXZlbnRQYXlsb2FkLFxuICBub25jZTogUmVxdWlyZWRTdHJpbmcsXG4gIGZvcm1JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGVsZW1lbnRJZDogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBhbW91bnRBdG9tOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHByb21vdGlvbl9jb2RlOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kczogei5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbClcbn0pO1xuY29uc3QgRmllbGRWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGVsZW1lbnRUeXBlOiB6LnN0cmluZygpLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN1Y2Nlc3M6IHoubGl0ZXJhbChmYWxzZSksXG4gIGVycm9yX3R5cGU6IHoubGl0ZXJhbChcInZhbGlkYXRpb25fZXJyb3JcIiksXG4gIGVycm9yczogei5hcnJheShGaWVsZFZhbGlkYXRpb25FcnJvcilcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkUmVzcG9uc2UgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN1Y2Nlc3NcIiwgW1xuICB6Lm9iamVjdCh7IHN1Y2Nlc3M6IHoubGl0ZXJhbCh0cnVlKSB9KSxcbiAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuXSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpXG59KTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHNcbn0pO1xudmFyIFRocmVlRFNTdGF0dXMgPSAvKiBAX19QVVJFX18gKi8gKChUaHJlZURTU3RhdHVzMikgPT4ge1xuICBUaHJlZURTU3RhdHVzMltcIlNVQ0NFU1NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJGQUlMVVJFXCJdID0gXCJmYWlsdXJlXCI7XG4gIFRocmVlRFNTdGF0dXMyW1wiQ0FOQ0VMTEVEXCJdID0gXCJjYW5jZWxsZWRcIjtcbiAgcmV0dXJuIFRocmVlRFNTdGF0dXMyO1xufSkoVGhyZWVEU1N0YXR1cyB8fCB7fSk7XG5jb25zdCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5lbnVtKFtcInN1Y2Nlc3NcIiAvKiBTVUNDRVNTICovLCBcImZhaWx1cmVcIiAvKiBGQUlMVVJFICovLCBcImNhbmNlbGxlZFwiIC8qIENBTkNFTExFRCAqL10pXG59KTtcbmNvbnN0IENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgcmVkaXJlY3RfdXJsOiB6LnN0cmluZygpLFxuICBpbml0aWFsX2ludGVudF9pZDogei5zdHJpbmcoKSxcbiAgY29uc2VudF9pZDogei5zdHJpbmcoKVxufSk7XG5cbmNvbnN0IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZCA9IChlcnJvcikgPT4ge1xuICBjb25zdCBpc3N1ZXNQZXJGaWVsZCA9IHt9O1xuICBPYmplY3QuZW50cmllcyhlcnJvcikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IEZpZWxkTmFtZUVudW0ucGFyc2Uoa2V5KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUuX2Vycm9ycykpIHtcbiAgICAgICAgaXNzdWVzUGVyRmllbGRbZmllbGROYW1lXSA9IHZhbHVlLl9lcnJvcnM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzc3Vlc1BlckZpZWxkO1xufTtcblxuY29uc3QgU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICBzdHJpcGVfcGs6IHouc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHouc3RyaW5nKCksXG4gIHN0cmlwZV9wbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IG91ckN1cnJlbmN5VG9UaGVpcnMgPSB7XG4gIHVzZDogXCJ1c2RcIixcbiAgYnJsOiBcImJybFwiXG59O1xuY29uc3QgZ2V0TG9hZGVkU3RyaXBlID0gYXN5bmMgKHB1Ymxpc2hhYmxlS2V5KSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpcGUgSlMgbm90IGZvdW5kLmApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IG5ldyBTdHJpcGUocHVibGlzaGFibGVLZXkpO1xuICByZXR1cm4gc3RyaXBlO1xufTtcbmNvbnN0IGNyZWF0ZVN0cmlwZUVsZW1lbnRzID0gYXN5bmMgKHN0cmlwZVB1YktleSwgZWxlbWVudHNPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzOiBzdHJpcGUuZWxlbWVudHMoZWxlbWVudHNPcHRpb25zKSxcbiAgICBzdHJpcGVcbiAgfTtcbn07XG5jb25zdCBjcmVhdGVTdHJpcGVQYXltZW50UmVxdWVzdCA9IGFzeW5jIChzdHJpcGVQdWJLZXksIHRvdGFsQW1vdW50QXRvbSwgY3VycmVuY3ksIGlzQW1vdW50UGVuZGluZywgaXNMaW5rT25seSkgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgY29uc3Qgc3RyaXBlQ3VycmVuY3kgPSBvdXJDdXJyZW5jeVRvVGhlaXJzW2N1cnJlbmN5LnRvTG93ZXJDYXNlKCkudHJpbSgpXTtcbiAgY29uc3QgcGF5bWVudFJlcXVlc3QgPSBzdHJpcGUucGF5bWVudFJlcXVlc3Qoe1xuICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgY291bnRyeTogXCJVU1wiLFxuICAgIGN1cnJlbmN5OiBzdHJpcGVDdXJyZW5jeSxcbiAgICB0b3RhbDoge1xuICAgICAgbGFiZWw6IFwiVG90YWxcIixcbiAgICAgIGFtb3VudDogdG90YWxBbW91bnRBdG9tLFxuICAgICAgcGVuZGluZzogaXNBbW91bnRQZW5kaW5nXG4gICAgfSxcbiAgICByZXF1ZXN0UGF5ZXJOYW1lOiB0cnVlLFxuICAgIHJlcXVlc3RQYXllckVtYWlsOiB0cnVlLFxuICAgIGRpc2FibGVXYWxsZXRzOiBbXSBcbiAgfSk7XG4gIHJldHVybiBwYXltZW50UmVxdWVzdDtcbn07XG5jb25zdCBzbGVlcCA9ICh0aW1lb3V0TXMpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0TXMpO1xuICB9KTtcbn07XG5jb25zdCBpc1N0cmlwZUpzUHJlc2VudCA9ICgpID0+IHtcbiAgcmV0dXJuIFwiU3RyaXBlXCIgaW4gd2luZG93O1xufTtcbmNvbnN0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kID0gYXN5bmMgKHBheW1lbnRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHBheW1lbnRSZXF1ZXN0Lm9uKFwicGF5bWVudG1ldGhvZFwiLCBhc3luYyAoZXZ0KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZXZ0KTtcbiAgICAgIH0pO1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJjYW5jZWxcIiwgKCkgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBQYXltZW50IGNhbmNlbGxlZCwgcGxlYXNlIGNsaWNrIFN1Ym1pdCBhZ2FpbiB0byBwYXlgKSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuICB9KTtcbn07XG5jb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gIGlmICghbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayB8fCAhbmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV4dCBhY3Rpb24gbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KG5leHRBY3Rpb25NZXRhZGF0YSl9YCk7XG4gIH1cbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICB9KTtcbiAgaWYgKGNvbmZpcm1SZXN1bHQuZXJyb3IpIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGZhaWxlZDogJHtjb25maXJtUmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gYHVua25vd25gfWApO1xuICB9IGVsc2Uge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgfVxuICByZXR1cm4gY29uZmlybVJlc3VsdDtcbn07XG5jb25zdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93ID0gYXN5bmMgKG5leHRBY3Rpb25NZXRhZGF0YSkgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgIHBheW1lbnRfbWV0aG9kOiBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkXG4gIH0pO1xuICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gIGlmIChyZXN1bHRTdGF0dXMgPT09IFwic3VjY2VlZGVkXCIpIDsgZWxzZSBpZiAocmVzdWx0U3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NvbmZpcm1SZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgPz8gY29uZmlybVJlc3VsdC5zZXR1cEludGVudD8ubGFzdF9zZXR1cF9lcnJvcj8ubWVzc2FnZSA/PyBcIlBheW1lbnQgZmFpbGVkLCBwbGVhc2UgY2xpY2sgc3VibWl0IGFnYWluIHRvIHBheS5cIn1gXG4gICAgKTtcbiAgfVxufTtcblxuY29uc3QgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcgPSAoc3R5bGVzKSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdHlsZXMgPSBKU09OLnN0cmluZ2lmeShzdHlsZXMpO1xuICByZXR1cm4gc2VyaWFsaXplZFN0eWxlcztcbn07XG5cbmNvbnN0IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSA9IChmb3JtRGl2LCBpbml0aWFsRGljdCkgPT4ge1xuICBjb25zdCBpbmNsdWRlZElucHV0cyA9IEFycmF5LmZyb20oZm9ybURpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtb3BpZF1cIikgPz8gW10pO1xuICBjb25zdCBleHRyYURhdGEgPSBpbmNsdWRlZElucHV0cy5yZWR1Y2UoKGFjYywgaW5wdXQpID0+IHtcbiAgICBjb25zdCBrZXkgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9waWRcIik7XG4gICAgaWYgKCFrZXkpIHJldHVybiBhY2M7XG4gICAgcmV0dXJuIHsgLi4uYWNjLCBba2V5XTogaW5wdXQudmFsdWUgfTtcbiAgfSwge30pO1xuICByZXR1cm4gZXh0cmFEYXRhO1xufTtcbmNvbnN0IHBhcnNlRXZlbnRQYXlsb2FkID0gKGV2ZW50RGF0YSkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBFbGVtZW50RXZlbnQucGFyc2UoZXZlbnREYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmNvbnN0IGVtaXRFdmVudCA9ICh0YXJnZXQsIGZvcm1JZCwgZWxlbWVudElkLCBwYXlsb2FkLCBiYXNlVXJsKSA9PiB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIHBheWxvYWQsXG4gICAgbm9uY2U6IHY0KCksXG4gICAgZm9ybUlkLFxuICAgIGVsZW1lbnRJZFxuICB9O1xuICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbn07XG5cbmNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuY29uc3QgaXNSZXN1bHRWYWxpZCA9IChvYmosIGlzVmFsaWQpID0+IHtcbiAgcmV0dXJuICEhb2JqICYmIGlzVmFsaWQ7XG59O1xuXG5jb25zdCBudWxsT3JVbmRlZk9yID0gKHpUeXBlKSA9PiB6Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBDREVSZXNwb25zZUVycm9yID0gei5vYmplY3Qoe1xuICBjZGVfcmVzcG9uc2VfdHlwZTogei5saXRlcmFsKFwiZXJyb3JcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG5jb25zdCBDb3Vwb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpLFxuICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgZHVyYXRpb246IHouc3RyaW5nKCksXG4gIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKVxufSk7XG5jb25zdCBMaW5lSXRlbSA9IHoub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHByaWNlX2lkOiB6LnN0cmluZygpLFxuICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkuaW50KCkpLFxuICBxdWFudGl0eTogei5udW1iZXIoKS5pbnQoKVxufSk7XG5jb25zdCBCcmFuZFNldHRpbmdzID0gei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSk7XG5jb25zdCBCcmFuZCA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbn0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25JdGVtTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgcXVhbnRpdHk6IHoubnVtYmVyKClcbn0pO1xuY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHN1YnNjcmlwdGlvbl9pdGVtczogei5hcnJheShTdWJzY3JpcHRpb25JdGVtTWluaW1hbCksXG4gIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKVxufSk7XG5jb25zdCBJbnZvaWNlTGluZUl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgYW1vdW50X2F0b21fY29uc2lkZXJpbmdfZGlzY291bnRfYXBwbGllZDogei5udW1iZXIoKSxcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICBzdWJzY3JpcHRpb25faXRlbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBEaXNjb3VudE1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGNvdXBvbjogQ291cG9uTWluaW1hbFxufSk7XG5jb25zdCBJbnZvaWNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50czogei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICBob3N0ZWRfaW52b2ljZV91cmw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVzOiB6LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICByZW1haW5pbmdfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRheF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRvdGFsX2Rpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG59KTtcbmNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3JlYXRlZDogei5hcnJheShTdWJzY3JpcHRpb25NaW5pbWFsKSxcbiAgaW52b2ljZXM6IHouYXJyYXkoSW52b2ljZU1pbmltYWwpXG59KTtcbmNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gIHByZXZpZXdfcG9zdF90cmlhbDogbnVsbE9yVW5kZWZPcihDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwpLFxuICBjb3Vwb25zOiB6LmFycmF5KENvdXBvbk1pbmltYWwpXG59KTtcbmNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwib3BlblwiKSxcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIGVtYWlsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBicmFuZDogQnJhbmQsXG4gIHN1YnNfcHJldmlldzogbnVsbE9yVW5kZWZPcihQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSksXG4gIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICBtZXRob2RzX2F2YWlsYWJsZTogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG59KTtcbmNvbnN0IFBheW1lbnRGb3JtUHJlZmlsbCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogei5udWxsYWJsZSh6LnVuZGVmaW5lZCgpKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgY3VycmVuY3k6IHouc3RyaW5nKClcbiAgfSkuZXh0ZW5kKF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24uc2hhcGUpXG5dKTtcbmNvbnN0IENvbXBsZXRlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImNvbXBsZXRlXCIpXG59KTtcbmNvbnN0IEV4cGlyZWRGb3JtUHJlZmlsbCA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJleHBpcmVkXCIpXG59KTtcbnoudW5pb24oW1BheW1lbnRGb3JtUHJlZmlsbCwgQ29tcGxldGVkRm9ybVByZWZpbGwsIEV4cGlyZWRGb3JtUHJlZmlsbF0pO1xuei5vYmplY3Qoe1xuICBsb2dvOiB6LnN0cmluZygpLFxuICBpY29uOiB6LnN0cmluZygpLFxuICBwcmltYXJ5X2NvbG9yOiB6LnN0cmluZygpLFxuICBzZWNvbmRhcnlfY29sb3I6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIGludm9pY2VfdXJsczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgc3Vic2NyaXB0aW9uX2lkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHBheW1lbnRfaW5wdXQ6IHouYW55KCksXG4gIC8vIFNob3VsZCBmb2xsb3cgQW55UGF5bWVudElucHV0IGZyb20gQ0RFXG4gIGN1c3RvbWVyX2VtYWlsOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl96aXBfY29kZTogei5zdHJpbmcoKSxcbiAgY3VzdG9tZXJfY291bnRyeTogei5zdHJpbmcoKSxcbiAgbGluZV9pdGVtczogei5hcnJheShMaW5lSXRlbSksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjYW5jZWxfYXRfZW5kOiB6LmJvb2xlYW4oKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogei5ib29sZWFuKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTZXR1cENoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kX2lkOiB6LnN0cmluZygpXG59KTtcbnoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHJldHVybl91cmw6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHouc3RyaW5nKCksXG4gIGxvYzogei5hcnJheSh6LnN0cmluZygpKSxcbiAgbXNnOiB6LnN0cmluZygpLFxuICB1cmw6IHouc3RyaW5nKClcbn0pO1xuei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvcik7XG56Lm9iamVjdCh7XG4gIG5ld19jdXN0b21lcl9lbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBuZXdfY3VzdG9tZXJfYWRkcmVzczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkub3B0aW9uYWwoKSxcbiAgcGF5bWVudF9wcm92aWRlcjogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuei5vYmplY3Qoe1xuICBmaWVsZHM6IFBSRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuY29uc3QgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSksXG4gIGNjX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbnoucmVjb3JkKHouYW55KCkpO1xuXG5jb25zdCBzdW0gPSAoYXJyKSA9PiB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59O1xuXG5mdW5jdGlvbiBmaXhQcm90byh0YXJnZXQsIHByb3RvdHlwZSkge1xuICB2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4gIHNldFByb3RvdHlwZU9mID8gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90b3R5cGUpIDogdGFyZ2V0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGZpeFN0YWNrKHRhcmdldCwgZm4pIHtcbiAgaWYgKGZuID09PSB2b2lkIDApIHtcbiAgICBmbiA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIHZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xuICBjYXB0dXJlU3RhY2tUcmFjZSAmJiBjYXB0dXJlU3RhY2tUcmFjZSh0YXJnZXQsIGZuKTtcbn1cblxudmFyIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBDdXN0b21FcnJvciA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEN1c3RvbUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBvcHRpb25zKSB8fCB0aGlzO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAnbmFtZScsIHtcbiAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGZpeFByb3RvKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgZml4U3RhY2soX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBDdXN0b21FcnJvcjtcbn0oRXJyb3IpO1xuXG5jbGFzcyBDZGVFcnJvciBleHRlbmRzIEN1c3RvbUVycm9yIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICBjb25zdCBmcmllbmRseU1lc3NhZ2UgPSBgW2NkZS1jbGllbnRdIEVycm9yIHF1ZXJ5aW5nIENERTogJHtyZXNwb25zZS5tZXNzYWdlfWA7XG4gICAgc3VwZXIoZnJpZW5kbHlNZXNzYWdlKTtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIH1cbiAgZ2V0IG9yaWdpbmFsRXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLm1lc3NhZ2U7XG4gIH1cbn1cbmNvbnN0IHF1ZXJ5Q0RFID0gYXN5bmMgKGNkZUNvbm4sIGRhdGEsIHJlc3BvbnNlU2NoZW1hKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2RlQ29ubi5zZW5kKGRhdGEpO1xuICBpZiAoaXNDREVSZXNwb25zZUVycm9yKHJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBDZGVFcnJvcihyZXNwb25zZSk7XG4gIH1cbiAgaWYgKCFjaGVja0lmQ29uZm9ybXNUb1NjaGVtYShyZXNwb25zZSwgcmVzcG9uc2VTY2hlbWEpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlKTtcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGVcIik7XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5jb25zdCBjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSA9ICh2YWx1ZSwgc2NoZW1hKSA9PiB7XG4gIHJldHVybiBzY2hlbWEuc2FmZVBhcnNlKHZhbHVlKS5zdWNjZXNzO1xufTtcbmNvbnN0IGlzQ0RFUmVzcG9uc2VFcnJvciA9IChyZXNwb25zZSkgPT4ge1xuICByZXR1cm4gQ0RFUmVzcG9uc2VFcnJvci5zYWZlUGFyc2UocmVzcG9uc2UpLnN1Y2Nlc3M7XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3ID0gYXN5bmMgKGNkZUNvbm4sIHJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJnZXRfY2hlY2tvdXRfcHJldmlld1wiLCBwYXlsb2FkOiByZXF1ZXN0IH0sIFByZXZpZXdDaGVja291dFJlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRQcmVmaWxsID0gYXN5bmMgKGNkZUNvbm4pID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJnZXRfcHJlZmlsbFwiLCBwYXlsb2FkOiB7fSB9LCBQYXltZW50Rm9ybVByZWZpbGwpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3cgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInYyX3N0YXJ0X3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRDaGVja291dFZhbHVlID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpID0+IHtcbiAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3KGNkZUNvbm4sIHtcbiAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgIHByb21vdGlvbl9jb2RlOiBwcm9tb0NvZGVcbiAgfSk7XG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgaWYgKGN1cnJlbmNpZXMuc2l6ZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgY3VycmVuY3ksIGdvdCAke2N1cnJlbmNpZXMuc2l6ZX1gKTtcbiAgfVxuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IFwidXNkXCI7XG4gIGNvbnN0IGFtb3VudEF0b20gPSBzdW0oY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5yZW1haW5pbmdfYW1vdW50X2F0b20pKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW5jeSxcbiAgICBhbW91bnRBdG9tXG4gIH07XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50ID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBpc1NldHVwTW9kZSwgcHJvbW9Db2RlKSA9PiB7XG4gIGlmIChpc1NldHVwTW9kZSkge1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IDAsIGN1cnJlbmN5OiBcInVzZFwiIH07XG4gIH0gZWxzZSB7XG4gICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFZhbHVlKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpO1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IGNoZWNrb3V0UHJldmlldy5hbW91bnRBdG9tLCBjdXJyZW5jeTogY2hlY2tvdXRQcmV2aWV3LmN1cnJlbmN5IH07XG4gIH1cbn07XG5jb25zdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zID0gYXN5bmMgKGFsbENkZUNvbm5lY3Rpb25zLCBwYXlsb2FkKSA9PiB7XG4gIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oYWxsQ2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpLm1hcChcbiAgICAgIChjZGVDb25uKSA9PiBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwidG9rZW5pemVfY2FyZFwiLCBwYXlsb2FkIH0sIFRva2VuaXplQ2FyZFJlc3BvbnNlKVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlc3BvbnNlcztcbn07XG5jb25zdCBjaGVja291dENhcmRFbGVtZW50cyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgdGltZW91dDogQ0RFX1BPTExJTkdfSU5URVJWQUwsXG4gICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgLy8gVE9ETzogdXNlIHdpdGggcHJvcGVyIGNoaWxkT3JpZ2luXG4gIH0pO1xuICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeUNERShjb25uZWN0aW9uT2JqLCB7IHR5cGU6IFwicGluZy0zZHMtc3RhdHVzXCIgfSwgUGluZzNEU1N0YXR1c1Jlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3VsdC5zdGF0dXM7XG59O1xuXG5jb25zdCBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyA9IChzaW1wbGVPanNGbG93KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdGFydGVkKCk7XG4gICAgICBjb25zdCBmbG93UmVzdWx0ID0gYXdhaXQgc2ltcGxlT2pzRmxvdyhwYXJhbXMpO1xuICAgICAgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhmbG93UmVzdWx0LnJlc3VsdC5wYXltZW50X21ldGhvZF9pZCk7XG4gICAgICB9IGVsc2UgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJjaGVja291dFwiKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdWNjZXNzKFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0Lmludm9pY2VfdXJscyxcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5zdWJzY3JpcHRpb25faWRzLFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LmN1c3RvbWVyX2lkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke2Zsb3dSZXN1bHR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihnZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBhZGRFcnJvckNhdGNoZXJGb3JJbml0ID0gKGluaXQpID0+IHtcbiAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGluaXQocGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgeyBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWVycm9yLWNhdGNoZXJcIik7XG4gICAgICBlcnJfXyhlcnJvcik7XG4gICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB9O1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBjcmVhdGVPanNGbG93TG9nZ2VycyA9IChwcmVmaXgpID0+IHtcbiAgY29uc3QgbG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgfTtcbiAgY29uc3QgZXJyID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmVycm9yKGAke2NoYWxrLnJlZC5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBsb2csXG4gICAgZXJyLFxuICAgIGxvZ19fOiBsb2csXG4gICAgZXJyX186IGVyclxuICB9O1xufTtcblxuY29uc3QgeyBsb2dfXzogbG9nX18kNSwgZXJyX186IGVycl9fJDUgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uXCIpO1xuY29uc3QgcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IChyZXNwb25zZSkgPT4ge1xuICBpZiAocmVzcG9uc2UucGF5bWVudF9tZXRob2RzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3Jlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gIH1cbiAgcmV0dXJuIHsgcGF5bWVudF9tZXRob2RfaWQ6IHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kc1swXS5pZCB9O1xufTtcbmNvbnN0IGZpbmRDcG1NYXRjaGluZ1R5cGUgPSAoYWxsQ1BNcywgem9kTW9kZWwpID0+IHtcbiAgY29uc3QgY3BtID0gYWxsQ1BNcy5maW5kKChjcG0yKSA9PiB6b2RNb2RlbC5zYWZlUGFyc2UoY3BtMikuc3VjY2Vzcyk7XG4gIGlmICghY3BtKSB7XG4gICAgZXJyX18kNShgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWwuIEFsbCBtb2RlbHM6YCwgYWxsQ1BNcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbGApO1xuICB9XG4gIHJldHVybiB6b2RNb2RlbC5wYXJzZShjcG0pO1xufTtcblxuY29uc3QgeyBsb2dfXzogbG9nX18kNCwgZXJyX186IGVycl9fJDQgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuY29uc3QgdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MgPSAobm9uQ2RlRm9ybUlucHV0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgY29uc3QgcGF5bG9hZCA9IFJlcXVpcmVkRm9ybUZpZWxkcy5zYWZlUGFyc2Uobm9uQ2RlRm9ybUlucHV0cyk7XG4gIGlmICghcGF5bG9hZC5zdWNjZXNzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gcGF5bG9hZC5lcnJvci5mb3JtYXQoKTtcbiAgICBjb25zdCBpc3N1ZXMgPSBleHRyYWN0SXNzdWVzUGVyRmllbGQoZm9ybWF0dGVkKTtcbiAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoaXNzdWVzKSkge1xuICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvcnMsIGZpZWxkTmFtZSk7XG4gICAgfVxuICAgIGVycl9fJDQoYEdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzYCwgaXNzdWVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc1wiKTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZC5kYXRhO1xufTtcbmNvbnN0IHZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyA9ICh0b2tlbml6ZVJlc3VsdHMsIG9uVmFsaWRhdGlvbkVycm9yKSA9PiB7XG4gIGZvciAoY29uc3QgdG9rZW5pemVSZXN1bHQgb2YgdG9rZW5pemVSZXN1bHRzKSB7XG4gICAgaWYgKHRva2VuaXplUmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICB0b2tlbml6ZVJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQWxsRmllbGROYW1lcy5zYWZlUGFyc2UoZXJyb3IuZWxlbWVudFR5cGUpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgZXJyX18kNChgVW5rbm93biBmaWVsZCBuYW1lIGluIG9uVmFsaWRhdGlvbkVycm9yOiAke2Vycm9yLmVsZW1lbnRUeXBlfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHBhcnNlZC5kYXRhO1xuICAgICAgICAgIG9uVmFsaWRhdGlvbkVycm9yKGZpZWxkTmFtZSwgZXJyb3IuZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2dfXyQ0KGBFcnJvciB0b2tlbml6aW5nIGNhcmQ6IGdvdCB2YWxpZGF0aW9uIGVycm9yczogJHtKU09OLnN0cmluZ2lmeSh0b2tlbml6ZVJlc3VsdC5lcnJvcnMpfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIHdoaWxlIHRva2VuaXppbmcgY2FyZFwiKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IE9KU19TVFJJUEVfTElOS19CVE5fSUQgPSBcIm9qcy1zdHJpcGUtbGluay1idG5cIjtcbmNvbnN0IHsgbG9nX186IGxvZ19fJDMsIGVycl9fOiBlcnJfXyQzIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1saW5rXCIpO1xuY29uc3QgU3RyaXBlTGlua0NwbSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHoubGl0ZXJhbChcInN0cmlwZV9saW5rXCIpLFxuICBwcm9jZXNzb3JfbmFtZTogei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogei5zdHJpbmcoKVxuICB9KVxufSk7XG5jb25zdCBTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucyA9IHouYXJyYXkoXG4gIHoub2JqZWN0KHtcbiAgICBvdXJfZXhpc3RpbmdfcG1faWQ6IHouc3RyaW5nKClcbiAgfSlcbikubGVuZ3RoKDEpO1xuY29uc3QgaW5pdFN0cmlwZUxpbmtGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgYXN5bmMgKHsgY29udGV4dCwgZmxvd0NhbGxiYWNrcyB9KSA9PiB7XG4gICAgbG9nX18kMyhgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICBjb25zdCBzdHJpcGVMaW5rQ3BtID0gZmluZENwbU1hdGNoaW5nVHlwZShjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFN0cmlwZUxpbmtDcG0pO1xuICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHN0cmlwZSBsaW5rIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBjb25zdCBpc1NldHVwTW9kZSA9IHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgIGxvZ19fJDMoYENyZWF0aW5nIHN0cmlwZSBlbGVtZW50cy4uLmApO1xuICAgIGNvbnN0IGluaXRpYWxQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50KGFueUNkZUNvbm5lY3Rpb24sIHByZWZpbGwudG9rZW4sIGlzU2V0dXBNb2RlLCB2b2lkIDApO1xuICAgIGNvbnN0IHsgZWxlbWVudHMsIHN0cmlwZSB9ID0gYXdhaXQgY3JlYXRlU3RyaXBlRWxlbWVudHMoc3RyaXBlTGlua0NwbS5tZXRhZGF0YS5zdHJpcGVfcGssIHtcbiAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgIGN1cnJlbmN5OiBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgIHNldHVwX2Z1dHVyZV91c2FnZTogXCJvZmZfc2Vzc2lvblwiLFxuICAgICAgcGF5bWVudE1ldGhvZENyZWF0aW9uOiBcIm1hbnVhbFwiXG4gICAgfSk7XG4gICAgbG9nX18kMyhgTW91bnRpbmcgcGF5bWVudCBlbGVtZW50Li4uYCk7XG4gICAgY29uc3QgZXhwcmVzc0NoZWNrb3V0RWxlbWVudCA9IGVsZW1lbnRzLmNyZWF0ZShcImV4cHJlc3NDaGVja291dFwiLCB7XG4gICAgICBidXR0b25IZWlnaHQ6IGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rPy5idXR0b25IZWlnaHQsXG4gICAgICBwYXltZW50TWV0aG9kczoge1xuICAgICAgICBhbWF6b25QYXk6IFwibmV2ZXJcIixcbiAgICAgICAgYXBwbGVQYXk6IFwibmV2ZXJcIixcbiAgICAgICAgZ29vZ2xlUGF5OiBcIm5ldmVyXCIsXG4gICAgICAgIHBheXBhbDogXCJuZXZlclwiXG4gICAgICB9XG4gICAgfSk7XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5tb3VudChgIyR7T0pTX1NUUklQRV9MSU5LX0JUTl9JRH1gKTtcbiAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50Lm9uKFwiY2xpY2tcIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgYnV0dG9uIGNsaWNrZWRcIik7XG4gICAgICBpZiAoY29udGV4dC5jdXN0b21Jbml0UGFyYW1zLnN0cmlwZUxpbms/Lm92ZXJyaWRlTGlua1N1Ym1pdCkge1xuICAgICAgICBjb25zdCBzaG91bGRTdWJtaXQgPSBhd2FpdCBjb250ZXh0LmN1c3RvbUluaXRQYXJhbXMuc3RyaXBlTGluay5vdmVycmlkZUxpbmtTdWJtaXQoKTtcbiAgICAgICAgaWYgKCFzaG91bGRTdWJtaXQpIHtcbiAgICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgc3VibWl0IGFib3J0ZWQgYnkgb3ZlcnJpZGVMaW5rU3VibWl0XCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXZlbnQucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQub24oXCJjb25maXJtXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgbG9nX18kMyhcIlN0cmlwZSBMaW5rIHdpbmRvdyBjb25maXJtZWRcIiwgZXZlbnQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNyZWF0ZVBheW1lbnRNZXRob2Qoe1xuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgYmlsbGluZ19kZXRhaWxzOiBldmVudC5iaWxsaW5nRGV0YWlsc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgZXJyX18kMyhcImVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIGZsb3dDYWxsYmFja3Mub25DaGVja291dEVycm9yKHJlc3VsdC5lcnJvci5tZXNzYWdlID8/IFwiU3RyaXBlIExpbmsgdW5rbm93biBlcnJvclwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDMoXCJwYXltZW50TWV0aG9kXCIsIHJlc3VsdC5wYXltZW50TWV0aG9kKTtcbiAgICAgICAgT2pzRmxvd3Muc3RyaXBlTGluay5ydW4oe1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBzdHJpcGVMaW5rQ3BtLFxuICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShjb250ZXh0LmZvcm1EaXYpLFxuICAgICAgICAgIGZsb3dDYWxsYmFja3MsXG4gICAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHN0cmlwZVBNOiByZXN1bHQucGF5bWVudE1ldGhvZCB9LFxuICAgICAgICAgIGluaXRSZXN1bHQ6IHsgaXNBdmFpbGFibGU6IHRydWUgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogdHJ1ZSB9O1xuICB9XG4pO1xuY29uc3QgcnVuU3RyaXBlTGlua0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0LFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBub25DZGVGb3JtSW5wdXRzLFxuICAgIGZsb3dDYWxsYmFja3MsXG4gICAgY3VzdG9tUGFyYW1zXG4gIH0pID0+IHtcbiAgICBsb2dfXyQzKGBSdW5uaW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgbG9nX18kMyhgTWVyZ2luZyBQTSBmaWVsZHMgd2l0aCBmb3JtIGZpZWxkcy4uLmApO1xuICAgIGNvbnN0IG1lcmdlZElucHV0cyA9IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUE0obm9uQ2RlRm9ybUlucHV0cywgY3VzdG9tUGFyYW1zLnN0cmlwZVBNKTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQzKGBTdGFydGluZyBwYXltZW50IGZsb3cuLi5gKTtcbiAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgIHBheW1lbnRfcHJvdmlkZXI6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICB0aGVpcl9leGlzdGluZ19wbV9pZDogY3VzdG9tUGFyYW1zLnN0cmlwZVBNLmlkXG4gICAgfSk7XG4gICAgbG9nX18kMyhcIlN0YXJ0IHBheW1lbnQgZmxvdyByZXNwb25zZVwiLCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IFN0cmlwZUxpbmtSZXF1aXJlZFVzZXJBY3Rpb25zLnBhcnNlKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMpO1xuICAgIGNvbnN0IG91ckV4aXN0aW5nUG1JZCA9IG5leHRBY3Rpb25NZXRhZGF0YVswXS5vdXJfZXhpc3RpbmdfcG1faWQ7XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBsb2dfXyQzKGBEb2luZyBwYXltZW50IHNldHVwLi4uYCk7XG4gICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICBleGlzdGluZ19jY19wbV9pZDogb3VyRXhpc3RpbmdQbUlkXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dfXyQzKGBEb2luZyBjaGVja291dC4uLmApO1xuICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgY3VzdG9tZXJfY291bnRyeTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuQ09VTlRSWV0sXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgdG90YWxfYW1vdW50X2F0b206IHByZWZpbGwuYW1vdW50X3RvdGFsX2F0b20sXG4gICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUE0gPSAoZm9ybUlucHV0cywgc3RyaXBlUG0pID0+IHtcbiAgY29uc3QgaW5wdXRzID0geyAuLi5mb3JtSW5wdXRzIH07XG4gIGNvbnN0IFtwYXllckZpcnN0TmFtZSwgLi4ucGF5ZXJMYXN0TmFtZVBhcnRzXSA9IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5uYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIGNvbnN0IHBheWVyTGFzdE5hbWUgPSBwYXllckxhc3ROYW1lUGFydHMuam9pbihcIiBcIikgfHwgdm9pZCAwO1xuICBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSB8fCBwYXllckZpcnN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gPSBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSB8fCAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdHJpcGVQbVtcImxpbmtcIl0/LmVtYWlsIHx8IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5lbWFpbCB8fCBcIm9wX3VuZmlsbGVkQGdldG9wZW5wYXkuY29tXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LnBvc3RhbF9jb2RlIHx8IFwiMDAwMDBcIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSA9IGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICBsb2dfXyQzKGBGaW5hbCBmb3JtIGlucHV0czpgLCBpbnB1dHMpO1xuICByZXR1cm4gaW5wdXRzO1xufTtcblxuY29uc3Qgc3R5bGVzID0gXCJAa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC45KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX0ub3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjIxNDc0ODM2NDghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH0uY29udGFpbmVye21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOnJlbGF0aXZlO2FuaW1hdGlvbjpmYWRlSW4gLjNzIGVhc2Utb3V0fS5mcmFtZXttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lfS5jYW5jZWwtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFyZW07Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjt0b3A6LTEuNXJlbTtwYWRkaW5nOjA7cmlnaHQ6MH1cIjtcblxuY29uc3QgY3JlYXRlQW5kT3BlbkZyYW1lID0gKHVybCkgPT4ge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICAgIDxzdHlsZT5cbiAgICAgICR7c3R5bGVzfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGlmcmFtZSBzcmM9XCIke3VybH1cIiBjbGFzcz1cImZyYW1lXCIgaWQ9XCJ0aHJlZS1kcy1pZnJhbWVcIiB0aXRsZT1cIjNEIFNlY3VyZSB2ZXJpZmljYXRpb25cIiBhbGxvdz1cInBheW1lbnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29uc3Qgc2hhZG93Um9vdCA9IGhvc3QuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICBjb25zdCBpZnJhbWUgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCIjdGhyZWUtZHMtaWZyYW1lXCIpO1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCIuY2FuY2VsLWJ1dHRvblwiKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgcmV0dXJuIHsgaG9zdCwgaWZyYW1lLCBjYW5jZWxCdXR0b24gfTtcbn07XG5cbmZ1bmN0aW9uIHN0YXJ0UG9sbGluZyhpZnJhbWUsIG9uU3VjY2VzcywgY2hpbGRPcmlnaW4pIHtcbiAgY29uc3QgaGFuZGxlUG9sbGluZyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcGluZ0NkZUZvcjNkc1N0YXR1cyhpZnJhbWUsIGNoaWxkT3JpZ2luKTtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICBvblN1Y2Nlc3Moc3RhdHVzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIH1cbiAgfTtcbiAgaGFuZGxlUG9sbGluZygpO1xuICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVQb2xsaW5nLCBDREVfUE9MTElOR19JTlRFUlZBTCk7XG4gIHJldHVybiBwb2xsaW5nSW50ZXJ2YWw7XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudHMoe1xuICBlbGVtZW50cyxcbiAgcG9sbGluZ0ludGVydmFsLFxuICByZXNvbHZlXG59KSB7XG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHtcbiAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICByZXNvbHZlKFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKTtcbiAgfTtcbiAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICBjb25zdCBjbGVhbnVwRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICB9O1xuICByZXR1cm4gY2xlYW51cEV2ZW50TGlzdGVuZXJzO1xufVxuYXN5bmMgZnVuY3Rpb24gc3RhcnQzZHNWZXJpZmljYXRpb24oe1xuICB1cmwsXG4gIGJhc2VVcmxcbn0pIHtcbiAgY29uc3QgZWxlbWVudHMgPSBjcmVhdGVBbmRPcGVuRnJhbWUodXJsKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgb25TdWNjZXNzID0gKHN0YXR1cykgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgICB9LCAxZTMpO1xuICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgY2xlYW51cEV2ZW50TGlzdGVuZXJzPy4oKTtcbiAgICB9O1xuICAgIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHN0YXJ0UG9sbGluZyhlbGVtZW50cy5pZnJhbWUsIG9uU3VjY2VzcywgbmV3IFVSTChiYXNlVXJsKS5vcmlnaW4pO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9IGhhbmRsZUV2ZW50cyh7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIHBvbGxpbmdJbnRlcnZhbCxcbiAgICAgIHJlc29sdmVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDIsIGVycl9fOiBlcnJfXyQyIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHsgbG9nX186IHN0cmlwZUxvZ19fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1jY1wiKTtcbmNvbnN0IHJ1bkNvbW1vbkNjRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoeyBjb250ZXh0LCBjaGVja291dFBheW1lbnRNZXRob2QsIG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgIGxvZ19fJDIoYOKUnCBSdW5uaW5nIGNvbW1vbiBDQyBmbG93Li4uYCwgeyBjaGVja291dFBheW1lbnRNZXRob2QgfSk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgbG9nX18kMihg4pScIFZhbGlkYXRpbmcgbm9uLUNERSBmb3JtIGZpZWxkcyBbTW9kZTogJHtwcmVmaWxsLm1vZGV9XWApO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQyKGDilJwgVG9rZW5pemluZyBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgIGNvbnN0IHRva2VuaXplQ2FyZFJlc3VsdHMgPSBhd2FpdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMsIHtcbiAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWRcbiAgICB9KTtcbiAgICB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHModG9rZW5pemVDYXJkUmVzdWx0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgY29uc3QgY29tbW9uQ2hlY2tvdXRQYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IG5vbkNkZUZvcm1GaWVsZHNcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgbG9nX18kMihg4pScIFNldHRpbmcgdXAgcGF5bWVudCBtZXRob2QgaW4gQ0RFIFtUb2tlbjogJHtwcmVmaWxsLnRva2VufV1gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2V0dXBDaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtyZXN1bHQucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMihg4pScIEluaXRpYWwgY2hlY2tvdXQgZmxvdy4gQ2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkZUVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5vcmlnaW5hbEVycm9yTWVzc2FnZSA9PT0gXCIzRFNfUkVRVUlSRURcIikge1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBDYXJkIHJlcXVpcmVzIDNEUywgc3RhcnRpbmcgbm9uLWxlZ2FjeSBwYXltZW50IGZsb3dgKTtcbiAgICAgICAgICBsb2dfXyQyKFwiZXJyb3IucmVzcG9uc2UuaGVhZGVyc1wiLCBlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRVc2VOZXdGbG93ID0gZXJyb3IucmVzcG9uc2UuaGVhZGVycz8uW1wib3Atc2hvdWxkLXVzZS1uZXctZmxvd1wiXSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgY29uc3Qgc3RhcnRQZlJlc3VsdCA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgUGF5bWVudCBmbG93IHJlc3VsdDpgLCBzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICBpZiAoc2hvdWxkVXNlTmV3Rmxvdykge1xuICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHN0cmlwZUNDM0RTRmxvdyhzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybWluZyBwYXltZW50IGZsb3cgW2NjX3BtX2lkOiAke3N0YXJ0UGZSZXN1bHQuY2NfcG1faWR9XWApO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm0gcGF5bWVudCBmbG93IHJlc3VsdCByZWNlaXZlZCBSZXN1bHQ6YCwgY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgLi4uY29tbW9uQ2hlY2tvdXRQYXJhbXMsXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiAhc2hvdWxkVXNlTmV3Rmxvd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlcnJfXyQyKGDilbAgRXJyb3IgY2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREVgKTtcbiAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4pO1xuY29uc3QgcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgaWYgKCFzdHJpcGVBY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdHJpcGUgM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKHN0cmlwZUFjdGlvbik7XG59O1xuY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3QgY29tbW9uQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwiYWlyd2FsbGV4X3BheW1lbnRfY29uc2VudFwiKTtcbiAgaWYgKCFjb21tb25BY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKGNvbW1vbkFjdGlvbik7XG59O1xuY29uc3QgY29tbW9uQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQsIGJhc2VVcmwpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhcnQzZHNWZXJpZmljYXRpb24oeyB1cmw6IG5leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmwsIGJhc2VVcmwgfSk7XG4gIGxvZ19fJDIoYOKVsCAzRFMgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke3N0YXR1c31dYCk7XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gIH1cbn07XG5jb25zdCBzdHJpcGVDQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgYXdhaXQgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyhuZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBzdHJpcGVMb2dfXyhcIuKVsCBTdHJpcGUgM0RTIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDEsIGVycl9fOiBlcnJfXyQxIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1wclwiKTtcbmNvbnN0IFN0cmlwZVByQ3BtID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei51bmlvbihbei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6LmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG4gIH0pXG59KTtcbmNvbnN0IGluaXRTdHJpcGVQckZsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIFN0cmlwZSBQUi4uLmApO1xuICAgIGNvbnN0IGNoZWNrb3V0UGF5bWVudE1ldGhvZCA9IGZpbmRDcG1NYXRjaGluZ1R5cGUoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBTdHJpcGVQckNwbSk7XG4gICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICBsb2dfXyQxKGBHZXR0aW5nIGluaXRpYWwgcHJldmlldyBhbW91bnRgKTtcbiAgICBjb25zdCBpbml0aWFsUHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChhbnlDZGVDb25uZWN0aW9uLCBwcmVmaWxsLnRva2VuLCBpc1NldHVwTW9kZSwgdm9pZCAwKTtcbiAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLm1ldGFkYXRhLnN0cmlwZV9wayxcbiAgICAgIGluaXRpYWxQcmV2aWV3LmFtb3VudEF0b20sXG4gICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgIGlzU2V0dXBNb2RlXG4gICAgKTtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgY29uc3QgY2FuTWFrZVBheW1lbnQgPSBhd2FpdCBwci5jYW5NYWtlUGF5bWVudCgpO1xuICAgIGlmIChjYW5NYWtlUGF5bWVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IFwiY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbFwiIH07XG4gICAgfVxuICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcixcbiAgICAgIGF2YWlsYWJsZVByb3ZpZGVyczoge1xuICAgICAgICBhcHBsZVBheTogY2FuTWFrZVBheW1lbnQuYXBwbGVQYXksXG4gICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICB9XG4gICAgfTtcbiAgfVxuKTtcbmNvbnN0IHJ1blN0cmlwZVByRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXMsXG4gICAgaW5pdFJlc3VsdFxuICB9KSA9PiB7XG4gICAgbG9nX18kMShgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlciBtaXNtYXRjaC4gRXhwZWN0ZWQgJHtjdXN0b21QYXJhbXMucHJvdmlkZXJ9LCBnb3QgJHtjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByID0gaW5pdFJlc3VsdC5wcjtcbiAgICBpZiAoY3VzdG9tUGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0KSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGN1c3RvbVBhcmFtcy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0O1xuICAgICAgbG9nX18kMShgT3ZlcnJpZGluZyBQUiBhbW91bnQgd2l0aGAsIG92ZXJyaWRlKTtcbiAgICAgIHVwZGF0ZVByV2l0aEFtb3VudChwciwgb3ZlcnJpZGUuYW1vdW50LCBvdmVycmlkZS5wZW5kaW5nKTtcbiAgICB9XG4gICAgbG9nX18kMShgU2hvd2luZyBQUiBkaWFsb2cuLi5gKTtcbiAgICBwci5zaG93KCk7XG4gICAgY29uc3Qgc3RyaXBlUG1BZGRlZEV2ZW50ID0gYXdhaXQgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QocHIpO1xuICAgIGxvZ19fJDEoYFN0cmlwZSBQTSBhZGRlZCBldmVudDpgLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGxvZ19fJDEoYE1lcmdpbmcgUE0gZmllbGRzIHdpdGggZm9ybSBmaWVsZHMuLi5gKTtcbiAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtKG5vbkNkZUZvcm1JbnB1dHMsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG1lcmdlZElucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMShgUFIgZGlhbG9nIGZpbmlzaGVkLiBTdGFydGluZyBwYXltZW50IGZsb3cuLi5gKTtcbiAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yUFIoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgZmllbGRzOiBub25DZGVGb3JtRmllbGRzLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgfSk7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YShzdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgUFIgd2l0aCBTdHJpcGUuLi5gKTtcbiAgICBhd2FpdCBjb25maXJtU3RyaXBlUHJQTShuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBsb2dfXyQxKGBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBmb3Igc2V0dXAuLi5gKTtcbiAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW5cbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDEoYFBlcmZvcm1pbmcgY2hlY2tvdXQuLi5gKTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UmVxdWVzdCA9IHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgcHJvdmlkZXJfdHlwZTogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbWVyX2VtYWlsOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5FTUFJTF0sXG4gICAgICAgIGN1c3RvbWVyX3ppcF9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0sXG4gICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICBwcm9tb3Rpb25fY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICBsaW5lX2l0ZW1zOiBwcmVmaWxsLmxpbmVfaXRlbXMsXG4gICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICBjYW5jZWxfYXRfZW5kOiBmYWxzZSxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1DaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjaGVja291dFJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICB9XG4gIH1cbik7XG5jb25zdCBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtID0gKGZvcm1JbnB1dHMsIHN0cmlwZVBtRXZ0KSA9PiB7XG4gIGNvbnN0IGlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICBjb25zdCBbcGF5ZXJGaXJzdE5hbWUsIC4uLnBheWVyTGFzdE5hbWVQYXJ0c10gPSBzdHJpcGVQbUV2dC5wYXllck5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gIGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdIHx8IHBheWVyRmlyc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IHN0cmlwZVBtRXZ0LnBheWVyRW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSA9IGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdIHx8IHN0cmlwZVBtRXZ0LnNoaXBwaW5nQWRkcmVzcz8ucG9zdGFsQ29kZSB8fCBcIjAwMDAwXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gPSBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldIHx8IHN0cmlwZVBtRXZ0LnNoaXBwaW5nQWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGxvZ19fJDEoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gIHJldHVybiBpbnB1dHM7XG59O1xuY29uc3QgdXBkYXRlUHJXaXRoQW1vdW50ID0gKHByLCBhbW91bnQsIGlzUGVuZGluZykgPT4ge1xuICBwci51cGRhdGUoe1xuICAgIHRvdGFsOiB7XG4gICAgICBhbW91bnQ6IGFtb3VudC5hbW91bnRBdG9tLFxuICAgICAgbGFiZWw6IFwiVG90YWxcIixcbiAgICAgIHBlbmRpbmc6IGlzUGVuZGluZ1xuICAgIH0sXG4gICAgY3VycmVuY3k6IGFtb3VudC5jdXJyZW5jeVxuICB9KTtcbn07XG5jb25zdCBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cnJlZC5cbkRldGFpbHM6IGdvdCAke3Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICB9XG4gIHJldHVybiBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xufTtcblxuY29uc3QgZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCA9IChjcG1zLCB3aXRoUHJvdmlkZXIsIHdpdGhQcm9jZXNzb3IpID0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IGNwbXMuZmlsdGVyKChjcG0pID0+IHtcbiAgICBjb25zdCBtYXRjaGVzUHJvY2Vzc29yID0gdHJ1ZSA7XG4gICAgY29uc3QgbWF0Y2hlc1Byb3ZpZGVyID0gY3BtLnByb3ZpZGVyID09PSB3aXRoUHJvdmlkZXI7XG4gICAgcmV0dXJuIG1hdGNoZXNQcm9jZXNzb3IgJiYgbWF0Y2hlc1Byb3ZpZGVyO1xuICB9KTtcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlc1swXTtcbn07XG5jb25zdCBPanNGbG93cyA9IHtcbiAgLy8g4pyLIE5vdGU6IEZvciBmbG93cyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24sIHBsZWFzZSBhZGQgdGhlbSB0byBgaW5pdC1mbG93cy50c2BcbiAgLy8gQ29tbW9uXG4gIGNvbW1vbkNDOiB7XG4gICAgcnVuOiBydW5Db21tb25DY0Zsb3dcbiAgfSxcbiAgLy8gU3RyaXBlXG4gIHN0cmlwZVBSOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZVByRmxvd1xuICB9LFxuICBzdHJpcGVMaW5rOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZUxpbmtGbG93LFxuICAgIHJ1bjogcnVuU3RyaXBlTGlua0Zsb3dcbiAgfVxuICAvLyDwn5GJIEFkZCBtb3JlIGZsb3dzIGhlcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbnZhciBPYnNlcnZhYmxlJDIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMiwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JzZXJ2YWJsZSQyLk9ic2VydmFibGUgPSB2b2lkIDA7XG5cbi8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbmNvbnN0IGhhc1N5bWJvbCA9IG5hbWUgPT4gQm9vbGVhbihTeW1ib2xbbmFtZV0pO1xuXG5jb25zdCBnZXRTeW1ib2wgPSBuYW1lID0+IGhhc1N5bWJvbChuYW1lKSA/IFN5bWJvbFtuYW1lXSA6ICdAQCcgKyBuYW1lO1xuXG5jb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbmNvbnN0IFN5bWJvbE9ic2VydmFibGUgPSBnZXRTeW1ib2woJ29ic2VydmFibGUnKTtcbmNvbnN0IFN5bWJvbFNwZWNpZXMgPSBnZXRTeW1ib2woJ3NwZWNpZXMnKTsgLy8gPT09IEFic3RyYWN0IE9wZXJhdGlvbnMgPT09XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICBsZXQgdmFsdWUgPSBvYmpba2V5XTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgbGV0IGN0b3IgPSBvYmouY29uc3RydWN0b3I7XG5cbiAgaWYgKGN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgaWYgKGN0b3IgPT09IG51bGwpIHtcbiAgICAgIGN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN0b3IgIT09IHVuZGVmaW5lZCA/IGN0b3IgOiBPYnNlcnZhYmxlJDE7XG59XG5cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSh4KSB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSQxOyAvLyBTUEVDOiBCcmFuZCBjaGVja1xufVxuXG5mdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZSkge1xuICBpZiAoaG9zdFJlcG9ydEVycm9yLmxvZykge1xuICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWUoZm4pIHtcbiAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIGxldCBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jbGVhbnVwO1xuICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIHN1YnNjcmlwdGlvbi5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblxuICBpZiAoIWNsZWFudXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICB1bnN1YnNjcmliZS5jYWxsKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgc3Vic2NyaXB0aW9uLl9vYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICBpZiAoIXF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHF1ZXVlW2ldLnR5cGUsIHF1ZXVlW2ldLnZhbHVlKTtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gIGxldCBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXI7XG5cbiAgdHJ5IHtcbiAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtlbHNlIHRocm93IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7ZWxzZSBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ3J1bm5pbmcnKSBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5Jztcbn1cblxuZnVuY3Rpb24gb25Ob3RpZnkoc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHJldHVybjtcblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlLnB1c2goe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSAhPT0gJ3JlYWR5Jykge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAnYnVmZmVyaW5nJztcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZVxuICAgIH1dO1xuICAgIGVucXVldWUoKCkgPT4gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpO1xufVxuXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuICBjb25zdHJ1Y3RvcihvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICAgIC8vIEFTU0VSVDogb2JzZXJ2ZXIgaXMgYW4gb2JqZWN0XG4gICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgdGhpcy5fY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YXRlID0gJ2luaXRpYWxpemluZyc7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZSA9PT0gJ2Nsb3NlZCc7XG4gICAgICB9LFxuXG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICduZXh0JywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2Vycm9yJywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICdjb21wbGV0ZScpO1xuICAgICAgfVxuXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN1YnNjcmlwdGlvbk9ic2VydmVyLmVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2luaXRpYWxpemluZycpIHRoaXMuX3N0YXRlID0gJ3JlYWR5JztcbiAgfVxuXG4gIGdldCBjbG9zZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgfVxuXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICB9XG4gIH1cblxufVxuXG5sZXQgT2JzZXJ2YWJsZSQxID0gY2xhc3MgT2JzZXJ2YWJsZSB7XG4gIGNvbnN0cnVjdG9yKHN1YnNjcmliZXIpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYnNlcnZhYmxlIGluaXRpYWxpemVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICB9XG5cbiAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBvYnNlcnZlcixcbiAgICAgICAgZXJyb3I6IGFyZ3VtZW50c1sxXSxcbiAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gIH1cblxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICBmaWx0ZXIoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZm4odmFsdWUpKSByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIHJlZHVjZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgbGV0IHNlZWQgPSBhcmd1bWVudHNbMV07XG4gICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmaXJzdCB8fCBoYXNTZWVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjYyA9IGZuKGFjYywgdmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSAmJiAhaGFzU2VlZCkgcmV0dXJuIG9ic2VydmVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCByZWR1Y2UgYW4gZW1wdHkgc2VxdWVuY2UnKSk7XG4gICAgICAgIG9ic2VydmVyLm5leHQoYWNjKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGFsbCgpIHtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgZnVuY3Rpb24gc3RhcnROZXh0KG5leHQpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQodikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2KTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0TmV4dCh0aGlzKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmbGF0TWFwKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICBsZXQgb3V0ZXIgPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGlubmVyID0gQy5mcm9tKHZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICBpZiAoaSA+PSAwKSBzdWJzY3JpcHRpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChpbm5lcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlSWZEb25lKCkge1xuICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICBvdXRlci51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2xPYnNlcnZhYmxlXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHgpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgaWYgKHggPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgbGV0IG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xPYnNlcnZhYmxlKTtcblxuICAgIGlmIChtZXRob2QpIHtcbiAgICAgIGxldCBvYnNlcnZhYmxlID0gbWV0aG9kLmNhbGwoeCk7XG4gICAgICBpZiAoT2JqZWN0KG9ic2VydmFibGUpICE9PSBvYnNlcnZhYmxlKSB0aHJvdyBuZXcgVHlwZUVycm9yKG9ic2VydmFibGUgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sSXRlcmF0b3IpO1xuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHhbaV0pO1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICB9XG5cbiAgc3RhdGljIG9mKC4uLml0ZW1zKSB7XG4gICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2ldKTtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG59O1xuXG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDEsIFN5bWJvbCgnZXh0ZW5zaW9ucycpLCB7XG4gIHZhbHVlOiB7XG4gICAgc3ltYm9sOiBTeW1ib2xPYnNlcnZhYmxlLFxuICAgIGhvc3RSZXBvcnRFcnJvclxuICB9LFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG52YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG5jb25zdCBPYnNlcnZhYmxlID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHplbk9ic2VydmFibGUpO1xuXG5jb25zdCB7IGxvZ19fLCBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWZsb3dzXCIpO1xuY29uc3QgZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCA9ICgpID0+IHtcbiAgaWYgKCEoXCJvanNfaW5pdF9yZXN1bHRzXCIgaW4gd2luZG93KSkge1xuICAgIHdpbmRvd1tcIm9qc19pbml0X3Jlc3VsdHNcIl0gPSB7fTtcbiAgfVxuICByZXR1cm4gd2luZG93W1wib2pzX2luaXRfcmVzdWx0c1wiXTtcbn07XG5jb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCwgZmxvd0NhbGxiYWNrcykgPT4ge1xuICBjb25zdCBpbml0UGFyYW1zID0geyBjb250ZXh0LCBmbG93Q2FsbGJhY2tzIH07XG4gIHJldHVybiB7XG4gICAgLy8gU3RyaXBlIFBSXG4gICAgc3RyaXBlUFI6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlUFJcIiwgT2pzRmxvd3Muc3RyaXBlUFIuaW5pdChpbml0UGFyYW1zKSksXG4gICAgLy8gU3RyaXBlIExpbmtcbiAgICBzdHJpcGVMaW5rOiBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZShcInN0cmlwZUxpbmtcIiwgT2pzRmxvd3Muc3RyaXBlTGluay5pbml0KGluaXRQYXJhbXMpKVxuICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgfTtcbn07XG5jb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgIG9ic2VydmVyLm5leHQoeyBzdGF0dXM6IFwibG9hZGluZ1wiIH0pO1xuICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkZWRcIiwgcmVzdWx0IH0pO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgIGxvZ19fKGAke2Zsb3dOYW1lfSBmbG93IHJlc3VsdGAsIHJlc3VsdCk7XG4gICAgICBnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0KClbZmxvd05hbWVdID0gcmVzdWx0O1xuICAgIH0sXG4gICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYnNlcnZhYmxlO1xufTtcblxuY29uc3QgUFJfTE9BRElORyA9IHtcbiAgaXNMb2FkaW5nOiB0cnVlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICB9XG59O1xuY29uc3QgUFJfRVJST1IgPSB7XG4gIGlzTG9hZGluZzogZmFsc2UsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gIH1cbn07XG5cbmNsYXNzIE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoZm9ybUluc3RhbmNlKSB7XG4gICAgdGhpcy5mb3JtSW5zdGFuY2UgPSBmb3JtSW5zdGFuY2U7XG4gICAgdGhpcy5jb25maWcgPSBmb3JtSW5zdGFuY2UuY29uZmlnO1xuICAgIHRoaXMuZm9ybUlkID0gZm9ybUluc3RhbmNlLmZvcm1JZDtcbiAgICB0aGlzLmV2ZW50VGFyZ2V0cyA9IHt9O1xuICAgIHRoaXMubm9uY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgfVxuICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5zb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGZvdW5kYCk7XG4gICAgfVxuICAgIGlmIChldmVudC5vcmlnaW4gIT09IHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5fZnJhbWVVcmw/Lm9yaWdpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQuZGF0YVtcInBlbnBhbFwiXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudERhdGEgPSBwYXJzZUV2ZW50UGF5bG9hZChKU09OLnBhcnNlKGV2ZW50LmRhdGEpKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSk7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG4gICAgY29uc3QgeyBlbGVtZW50SWQsIHBheWxvYWQgfSA9IGV2ZW50RGF0YTtcbiAgICBjb25zdCBldmVudFR5cGUgPSBwYXlsb2FkLnR5cGU7XG4gICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgXCJMQVlPVVRcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVMYXlvdXRFdmVudChwYXlsb2FkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRk9DVVNcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVGb2N1c0V2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkJMVVJcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQ0hBTkdFXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkxPQURFRFwiOlxuICAgICAgICB0aGlzLmhhbmRsZUxvYWRlZEV2ZW50KGV2ZW50LnNvdXJjZSwgZWxlbWVudElkLCBwYXlsb2FkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiTE9BRF9FUlJPUlwiOlxuICAgICAgICB0aGlzLmhhbmRsZUxvYWRFcnJvckV2ZW50KHBheWxvYWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJWQUxJREFUSU9OX0VSUk9SXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHZhbGlkYXRlRXZlbnQoZXZlbnREYXRhKSB7XG4gICAgaWYgKGV2ZW50RGF0YS5mb3JtSWQgIT09IHRoaXMuZm9ybUluc3RhbmNlLmZvcm1JZCB8fCAhZXZlbnREYXRhLmVsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5ub25jZXMuaGFzKGV2ZW50RGF0YS5ub25jZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5ub25jZXMuYWRkKGV2ZW50RGF0YS5ub25jZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCkge1xuICAgIGNvbnN0IGhlaWdodCA9IHBheWxvYWQuaGVpZ2h0ID8gYCR7cGF5bG9hZC5oZWlnaHR9cHhgIDogXCIxMDAlXCI7XG4gICAgdGhpcy5mb3JtSW5zdGFuY2Uuc2V0Rm9ybUhlaWdodChoZWlnaHQpO1xuICB9XG4gIGhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBmaWVsZCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkZvY3VzKSB0aGlzLmNvbmZpZy5vbkZvY3VzKGVsZW1lbnRJZCwgZmllbGQpO1xuICB9XG4gIGhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uQmx1cikgdGhpcy5jb25maWcub25CbHVyKGVsZW1lbnRJZCwgZmllbGQpO1xuICB9XG4gIGhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycykge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkNoYW5nZSkgdGhpcy5jb25maWcub25DaGFuZ2UoZWxlbWVudElkLCBmaWVsZCwgZXJyb3JzKTtcbiAgfVxuICBhc3luYyBoYW5kbGVMb2FkZWRFdmVudChzb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCkge1xuICAgIHRoaXMuZXZlbnRUYXJnZXRzW2VsZW1lbnRJZF0gPSBzb3VyY2U7XG4gICAgdGhpcy5mb3JtSW5zdGFuY2Uub25DZGVMb2FkZWQocGF5bG9hZCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uTG9hZCkge1xuICAgICAgdGhpcy5jb25maWcub25Mb2FkKHBheWxvYWQudG90YWxBbW91bnRBdG9tcywgcGF5bG9hZC5jdXJyZW5jeSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUxvYWRFcnJvckV2ZW50KHBheWxvYWQpIHtcbiAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgfVxuICBoYW5kbGVWYWxpZGF0aW9uRXJyb3JFdmVudChwYXlsb2FkLCBlbGVtZW50SWQpIHtcbiAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25WYWxpZGF0aW9uRXJyb3IocGF5bG9hZC5lbGVtZW50VHlwZSwgcGF5bG9hZC5lcnJvcnMsIGVsZW1lbnRJZCk7XG4gICAgfVxuICB9XG4gIC8vIGFzeW5jIGhhbmRsZUVycm9yRXZlbnQocGF5bG9hZDogRXJyb3JFdmVudFBheWxvYWQpIHtcbiAgLy8gICBpZiAocGF5bG9hZC5tZXNzYWdlID09PSAnM0RTX1JFUVVJUkVEJykge1xuICAvLyAgICAgY29uc3QgdGhyZWVEU1VybCA9IHBheWxvYWQuaGVhZGVycz8uWyd4LTNkcy1hdXRoLXVybCddID8/IFNJTVVMQVRFXzNEU19VUkw7XG4gIC8vICAgICAvLyBUaGlzIHdpbGwgb3BlbiBhIHBvcHVwIGFuZCBwcm9jZXNzIHRoZSAzRFMgZmxvd1xuICAvLyAgICAgLy8gd2lsbCByZXR1cm4gYSBzdGF0dXMgYHN1Y2Nlc3NgIHwgYGZhaWx1cmVgIHwgYGNhbmNlbGxlZGAgd2hpY2ggd2UgY2FuIGNvbnRpbnVlIHdpdGhcbiAgLy8gICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiB0aHJlZURTVXJsLCBiYXNlVXJsOiB0aGlzLmNvbmZpZy5iYXNlVXJsISB9KTtcbiAgLy8gICAgIGNvbnNvbGUubG9nKCfwn5SQIDNEUyBzdGF0dXM6Jywgc3RhdHVzKTtcbiAgLy8gICAgIC8vIFRPRE86IGNvbnRpbnVlIHdpdGggc3RhdHVzXG4gIC8vICAgICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAvLyAgICAgaWYgKCF0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQgfHwgIXRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQgfHwgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yIHx8ICFjYXJkQ3BtKVxuICAvLyAgICAgICByZXR1cm47XG4gIC8vICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gIC8vICAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcbiAgLy8gICAgICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0V2ZW50ID0gY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkKFxuICAvLyAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgLy8gICAgICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQsXG4gIC8vICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1JbnN0YW5jZS5mb3JtVGFyZ2V0KSA/PyBkb2N1bWVudC5ib2R5LFxuICAvLyAgICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAvLyAgICAgICAgIHsgLi4uY2FyZENwbSwgcHJvY2Vzc29yX25hbWU6ICdzdHJpcGUnIH0sXG4gIC8vICAgICAgICAgZmFsc2VcbiAgLy8gICAgICAgKTtcbiAgLy8gICAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAvLyAgICAgICB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dEZpcmVkID0gdHJ1ZTtcbiAgLy8gICAgICAgdGhpcy50b2tlbml6ZWREYXRhID0gc3RhcnRQYXltZW50Rmxvd0V2ZW50O1xuICAvLyAgICAgICB0aGlzLnBvc3RFdmVudFRvRnJhbWUodGFyZ2V0LCBlbGVtZW50SWQsIHN0YXJ0UGF5bWVudEZsb3dFdmVudCk7XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgfVxuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gIC8vICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvLyBoYW5kbGVGb3JtU3VibWl0KCkge1xuICAvLyAgIGlmIChcbiAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQgfHxcbiAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5sZW5ndGggfHxcbiAgLy8gICAgICF0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvclxuICAvLyAgICkge1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcy5maW5kKChjcG0pID0+IGNwbS5wcm92aWRlciA9PT0gJ2NyZWRpdF9jYXJkJyk7XG4gIC8vICAgaWYgKCFjYXJkQ3BtKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhcmQgbm90IGF2YWlsYWJsZSBhcyBhIHBheW1lbnQgbWV0aG9kIGluIGNoZWNrb3V0Jyk7XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IHRva2VuaXplRGF0YSA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgLy8gICAgIEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFLFxuICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkISxcbiAgLy8gICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgLy8gICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAvLyAgICAgY2FyZENwbSxcbiAgLy8gICAgIGZhbHNlXG4gIC8vICAgKTtcbiAgLy8gICBpZiAoIXRva2VuaXplRGF0YSkge1xuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBjb25zdHJ1Y3RpbmcgdG9rZW5pemUgZGF0YScpO1xuICAvLyAgIH1cbiAgLy8gICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gIC8vICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gIC8vICAgICB0aGlzLnBvc3RFdmVudFRvRnJhbWUodGFyZ2V0LCBlbGVtZW50SWQsIHRva2VuaXplRGF0YSk7XG4gIC8vICAgfVxuICAvLyAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHRva2VuaXplRGF0YTtcbiAgLy8gfVxuICAvLyBhc3luYyBvblVzZXJDb21wbGV0ZVBheW1lbnRSZXF1ZXN0VUkoXG4gIC8vICAgc3RyaXBlUG06IFBheW1lbnRSZXF1ZXN0UGF5bWVudE1ldGhvZEV2ZW50LFxuICAvLyAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kXG4gIC8vICk6IFByb21pc2U8dm9pZD4ge1xuICAvLyAgIGlmICghdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcylcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzID8/IHt9KSkge1xuICAvLyAgICAgY29uc3QgcGF5bWVudEZsb3dNZXRhZGF0YSA9IHsgc3RyaXBlUG1JZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCB9O1xuICAvLyAgICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0V2ZW50ID0gY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkKFxuICAvLyAgICAgICBFdmVudFR5cGUuZW51bS5TVEFSVF9QQVlNRU5UX0ZMT1csXG4gIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgLy8gICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1JbnN0YW5jZS5mb3JtVGFyZ2V0KSA/PyBkb2N1bWVudC5ib2R5LFxuICAvLyAgICAgICB0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcixcbiAgLy8gICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAvLyAgICAgICBmYWxzZSxcbiAgLy8gICAgICAgcGF5bWVudEZsb3dNZXRhZGF0YVxuICAvLyAgICAgKTtcbiAgLy8gICAgIGlmICghc3RhcnRQYXltZW50Rmxvd0V2ZW50KSBjb250aW51ZTtcbiAgLy8gICAgIHRoaXMuc3RyaXBlUG0gPSBzdHJpcGVQbTtcbiAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAvLyAgICAgdGhpcy5zZXRUb2tlbml6ZWREYXRhKHN0YXJ0UGF5bWVudEZsb3dFdmVudCk7XG4gIC8vICAgICB0aGlzLnBvc3RFdmVudFRvRnJhbWUoZWxlbWVudCwgZWxlbWVudElkLCBzdGFydFBheW1lbnRGbG93RXZlbnQpO1xuICAvLyAgICAgLy8gZW1pdEV2ZW50KGVsZW1lbnQubm9kZS5jb250ZW50V2luZG93ISwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCB0aGlzLmNvbmZpZy5iYXNlVXJsISk7XG4gIC8vICAgICBicmVhaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgcG9zdEV2ZW50VG9GcmFtZShzb3VyY2UsIGVsZW1lbnRJZCwgZGF0YSkge1xuICAgIGVtaXRFdmVudChzb3VyY2UsIHRoaXMuZm9ybUlkLCBlbGVtZW50SWQsIGRhdGEsIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oaWZyYW1lLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgY2hpbGRPcmlnaW5cbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpb25PYmogPSBhd2FpdCBjb25uZWN0aW9uLnByb21pc2U7XG4gIGNvbnN0IGlzVmFsaWRPYmplY3QgPSBhd2FpdCBjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0KGNvbm5lY3Rpb25PYmopO1xuICBpZiAoIWlzUmVzdWx0VmFsaWQoY29ubmVjdGlvbk9iaiwgaXNWYWxpZE9iamVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCBpbnZhbGlkIENERSBjb25uZWN0aW9uIG9iamVjdGApO1xuICB9XG4gIHJldHVybiBjb25uZWN0aW9uT2JqO1xufVxuY2xhc3MgQ29ubmVjdGlvbk1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBhZGRDb25uZWN0aW9uKGlkLCBjb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoaWQsIGNvbm5lY3Rpb24pO1xuICB9XG4gIGdldENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBub3QgZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uO1xuICB9XG4gIGdldEFsbENvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zO1xuICB9XG59XG5cbmNsYXNzIE9wZW5QYXlGb3JtIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy50cnlJbml0T2pzRmxvd3MgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCkuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXplT2pzRmxvd3ModGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpLCB0aGlzLmNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSk7XG4gICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24uc3RyaXBlUFIuc3Vic2NyaWJlKChzdGF0dXMpID0+IHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZShzdGF0dXMpKTtcbiAgICB9O1xuICAgIHRoaXMub25DZGVMb2FkZWQgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgdGhpcy50cnlJbml0T2pzRmxvd3MoKTtcbiAgICB9O1xuICAgIHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZSA9IChpbml0U3RhdHVzKSA9PiB7XG4gICAgICBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oeyBhcHBsZV9wYXk6IFBSX0xPQURJTkcsIGdvb2dsZV9wYXk6IFBSX0xPQURJTkcgfSk7XG4gICAgICB9IGVsc2UgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7IGFwcGxlX3BheTogUFJfRVJST1IsIGdvb2dsZV9wYXk6IFBSX0VSUk9SIH0pO1xuICAgICAgfSBlbHNlIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkZWRcIikge1xuICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gaW5pdFN0YXR1cy5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IGNhbkFwcGxlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICAgICAgY29uc3QgY2FuR29vZ2xlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5nb29nbGVQYXk7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oe1xuICAgICAgICAgIGFwcGxlX3BheToge1xuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5BcHBsZVBheSxcbiAgICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkFwcGxlUGF5ID8gdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdChcImFwcGxlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ29vZ2xlX3BheToge1xuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5Hb29nbGVQYXksXG4gICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5Hb29nbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiZ29vZ2xlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0ID0gKHByb3ZpZGVyLCBpbml0UmVzdWx0LCBwYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgICByZXR1cm4gT2pzRmxvd3Muc3RyaXBlUFIucnVuKHtcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oY29udGV4dC5mb3JtRGl2KSxcbiAgICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICAgIGN1c3RvbVBhcmFtczogeyBwcm92aWRlciwgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0IH0sXG4gICAgICAgIGluaXRSZXN1bHRcbiAgICAgIH0pO1xuICAgIH07XG4gICAgT3BlblBheUZvcm0uYXNzaWduQXNTaW5nbGV0b24odGhpcyk7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZywgYmFzZVVybDogY29uZmlnLmJhc2VVcmwgPz8gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiIH07XG4gICAgdGhpcy5lbGVtZW50cyA9IG51bGw7XG4gICAgdGhpcy5mb3JtSWQgPSBgb3Bqcy1mb3JtLSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICB0aGlzLnJlZmVyZXIgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgIHRoaXMuZm9ybVRhcmdldCA9IGNvbmZpZy5mb3JtVGFyZ2V0ID8/IFwiYm9keVwiO1xuICAgIHRoaXMuZm9ybVByb3BlcnRpZXMgPSB7IGhlaWdodDogXCIxcHhcIiB9O1xuICAgIHRoaXMuY2RlTG9hZGVkUGF5bG9hZCA9IG51bGw7XG4gICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gbnVsbDtcbiAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25NYW5hZ2VyKCk7XG4gICAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgT3BlblBheUZvcm1FdmVudEhhbmRsZXIodGhpcyk7XG4gICAgdGhpcy5vanNWZXJzaW9uID0gXCIwLjEuOFwiO1xuICAgIHRoaXMub2pzUmVsZWFzZVZlcnNpb24gPSBcIjAuMS44XCI7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRIYW5kbGVyLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzLmV2ZW50SGFuZGxlcikpO1xuICB9XG4gIHN0YXRpYyB7XG4gICAgdGhpcy5vanNGbG93cyA9IE9qc0Zsb3dzO1xuICB9XG4gIC8qKlxuICAgKiBBc3NpZ24gdGhlIGluc3RhbmNlIHRvIHRoZSB3aW5kb3cgYXMgYSBzaW5nbGV0b25cbiAgICogQHBhcmFtIGZvcm0gLSBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3NpZ25Bc1NpbmdsZXRvbihmb3JtKSB7XG4gICAgaWYgKE9wZW5QYXlGb3JtLmdldEluc3RhbmNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMuIE9ubHkgb25lIGluc3RhbmNlIGlzIGFsbG93ZWQuXCIpO1xuICAgIH1cbiAgICB3aW5kb3dbXCJvanNcIl0gPSBmb3JtO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBPcGVuUGF5Rm9ybVxuICAgKiBAcmV0dXJucyBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gd2luZG93W1wib2pzXCJdID8/IG51bGw7XG4gIH1cbiAgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXI7XG4gIH1cbiAgc2V0Rm9ybUhlaWdodChoZWlnaHQpIHtcbiAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzLmhlaWdodCA9IGhlaWdodDtcbiAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW1lbnQubm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY3JlYXRlRWxlbWVudChlbGVtZW50VmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25maWcpIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgZm9ybSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgdHlwZSA9IEVsZW1lbnRUeXBlLnBhcnNlKGVsZW1lbnRWYWx1ZSk7XG4gICAgY29uc3QgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKG9wdGlvbnMpO1xuICAgIGZyYW1lLm5hbWUgPSBgJHt0eXBlfS1lbGVtZW50YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAvYXBwL3YxLyR7ZnJhbWUubmFtZX1gLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB1cmwuc2VhcmNoID0gcXVlcnlTdHJpbmcudG9TdHJpbmcoKTtcbiAgICBmcmFtZS5zcmMgPSB1cmwuaHJlZjtcbiAgICB0aGlzLmNvbmZpZy5fZnJhbWVVcmwgPSB1cmw7XG4gICAgZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XG4gICAgZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICBjb25zdCBlbGVtZW50ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIG5vZGU6IGZyYW1lLFxuICAgICAgbW91bnQ6IChzZWxlY3RvcikgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LmFwcGVuZENoaWxkKGZyYW1lKVxuICAgIH07XG4gICAgdGhpcy5jb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW3R5cGVdID0gZWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50cyA9IHsgW3R5cGVdOiBlbGVtZW50IH07XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInJlZmVyZXJcIiwgdGhpcy5yZWZlcmVyKTtcbiAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJmb3JtSWRcIiwgdGhpcy5mb3JtSWQpO1xuICAgIGlmIChvcHRpb25zLnN0eWxlcykge1xuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic3R5bGVzXCIsIGNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nKG9wdGlvbnMuc3R5bGVzKSk7XG4gICAgfVxuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInNlY3VyZVRva2VuXCIsIHRoaXMuY29uZmlnLmNoZWNrb3V0U2VjdXJlVG9rZW4pO1xuICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgfVxuICBjb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjcmVhdGVDb25uZWN0aW9uKGVsZW1lbnQubm9kZSkudGhlbigoY29ubikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlci5hZGRDb25uZWN0aW9uKGVsZW1lbnQudHlwZSwgY29ubik7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgIH0pLmNhdGNoKChlcnIpID0+IHZvaWQgMCk7XG4gIH1cbiAgZ2V0Rm9ybURpdigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHk7XG4gIH1cbiAgY3JlYXRlT2pzRmxvd0NvbnRleHQoKSB7XG4gICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCk7XG4gICAgaWYgKCF0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3RlZCBjb250ZXh0IHdoaWxlIENERSBub3QgeWV0IGxvYWRlZFwiKTtcbiAgICB9XG4gICAgaWYgKGNkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VVcmw6IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCA/PyBGUkFNRV9CQVNFX1VSTCkub3JpZ2luLFxuICAgICAgZm9ybURpdjogdGhpcy5nZXRGb3JtRGl2KCksXG4gICAgICBlbGVtZW50c1Nlc3Npb25JZDogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLnNlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHRoaXMuY2RlTG9hZGVkUGF5bG9hZC5jaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgY2RlQ29ubmVjdGlvbnMsXG4gICAgICBjdXN0b21Jbml0UGFyYW1zOiB0aGlzLmNvbmZpZy5jdXN0b21Jbml0UGFyYW1zID8/IHt9XG4gICAgfTtcbiAgfVxuICBjcmVhdGVPanNGbG93Q2FsbGJhY2tzKCkge1xuICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgdGhpcy5jb25maWcub25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdWNjZXNzXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFxuICAgICAgICBcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLFxuICAgICAgICB0aGlzLmNvbmZpZy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MgPz8gbm9PcFxuICAgICAgKSxcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICB9O1xuICB9XG4gIHN1Ym1pdCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIE9qc0Zsb3dzLmNvbW1vbkNDLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgXCJjcmVkaXRfY2FyZFwiKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShjb250ZXh0LmZvcm1EaXYpLFxuICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICBjdXN0b21QYXJhbXM6IHZvaWQgMCxcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBjdXN0b20gcGFyYW1zXG4gICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBpbml0aWFsaXphdGlvblxuICAgIH0pO1xuICB9XG4gIG9uUGF5bWVudFJlcXVlc3RFcnJvcihlcnJNc2cpIHtcbiAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMgPz8ge30pKSB7XG4gICAgICBlbGVtZW50Lm5vZGUucmVtb3ZlKCk7XG4gICAgfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGaWVsZE5hbWUsIE9wZW5QYXlGb3JtIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFBQSxTQUFTO0FBQ2xCLFNBQVMsTUFBQUMsVUFBVTtBQUNuQixTQUFTLGtCQUFBQyxVQUFzQjtBQUMvQixPQUFPQyxPQUFXO0FBRWxCLE1BQU1DLEtBQWlCLDhCQUVqQkMsS0FBNEJMLEVBQUUsT0FBTztBQUFBLEVBQ3pDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsS0FBS0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3ZCLEtBQUtBLEVBQUUsT0FBTztBQUFBLEVBQ2QsS0FBS0EsRUFBRSxPQUFPO0FBQ2hCLENBQUMsR0FDS00sS0FBa0NOLEVBQUUsTUFBTUssRUFBeUIsR0FDbkVFLEtBQWdCUCxFQUFFLE9BQU87QUFBQSxFQUM3QixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLFNBQVNBLEVBQUUsT0FBTztBQUFBLEVBQ2xCLE1BQU1BLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFDMUIsQ0FBQyxHQUNLUSxLQUFpQlIsRUFBRSxNQUFNTyxFQUFhLEdBQ3RDRSxLQUFrQztBQUFBLEVBQ3RDLG1CQUFtQjtBQUNyQixHQUNNQyxJQUEwQixDQUFDQyxNQUFtQjtBQUNsRCxRQUFNQyxJQUFNRCxFQUFlLFlBQVksRUFBRSxLQUFLO0FBQzlDLFNBQU9GLEdBQWdDRyxDQUFHLEtBQUtEO0FBQ2pELEdBQ01FLEtBQTBCLENBQUNDLE1BQVE7QUFDdkMsTUFB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cEcsa0JBQWtCckksRUFBeUJxSSxFQUFRLE9BQU87QUFBQSxNQUMxRCxlQUFlLEtBQUssdUJBQXVCO0FBQUEsTUFDM0MsY0FBYztBQUFBO0FBQUEsTUFFZCxZQUFZO0FBQUE7QUFBQSxJQUVkLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFDQSxzQkFBc0JzSyxHQUFRO0FBQzVCLFNBQUssZ0JBQWdCLElBQ2pCLEtBQUssT0FBTyxtQkFBaUIsS0FBSyxPQUFPLGdCQUFnQkEsQ0FBTTtBQUFBLEVBQ3JFO0FBQUEsRUFDQSxVQUFVO0FBQ1IsZUFBV1IsS0FBVyxPQUFPLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQztBQUNyRCxNQUFBQSxFQUFRLEtBQUssT0FBTztBQUV0QixXQUFPLG9CQUFvQixXQUFXLEtBQUssYUFBYSxjQUFjLEtBQUssS0FBSyxZQUFZLENBQUM7QUFBQSxFQUMvRjtBQUNGO0FBaElJVCxFQUFLLFdBQVc3STtBQXpFcEIsSUFBTStKLEtBQU5sQjsiLAogICJuYW1lcyI6IFsieiIsICJ2NCIsICJjb25uZWN0VG9DaGlsZCIsICJjaGFsayIsICJGUkFNRV9CQVNFX1VSTCIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UiLCAiWm9kRmllbGRFcnJvciIsICJab2RGaWVsZEVycm9ycyIsICJNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFIiwgImdldEh1bWFuRnJpZW5kbHlNZXNzYWdlIiwgIm9nRXJyb3JNZXNzYWdlIiwgImtleSIsICJpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCIsICJzdHIiLCAiY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJyZXNwb25zZSIsICJlcnIiLCAiY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyIsICJlcnJvcnMiLCAiZ2V0RXJyb3JNZXNzYWdlIiwgImUiLCAib2JqIiwgImUyIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImZuIiwgImFyZ3MiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkVsZW1lbnRUeXBlIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiRWxlbWVudEV2ZW50IiwgIkNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgIkZpZWxkVmFsaWRhdGlvbkVycm9yIiwgIlRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UiLCAiVG9rZW5pemVDYXJkUmVzcG9uc2UiLCAiVGhyZWVEU1N0YXR1cyIsICJUaHJlZURTU3RhdHVzMiIsICJQaW5nM0RTU3RhdHVzUmVzcG9uc2UiLCAiQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImV4dHJhY3RJc3N1ZXNQZXJGaWVsZCIsICJlcnJvciIsICJpc3N1ZXNQZXJGaWVsZCIsICJ2YWx1ZSIsICJmaWVsZE5hbWUiLCAiU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgIlBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhIiwgIm91ckN1cnJlbmN5VG9UaGVpcnMiLCAiZ2V0TG9hZGVkU3RyaXBlIiwgInB1Ymxpc2hhYmxlS2V5IiwgImkiLCAiaXNTdHJpcGVKc1ByZXNlbnQiLCAic2xlZXAiLCAiY3JlYXRlU3RyaXBlRWxlbWVudHMiLCAic3RyaXBlUHViS2V5IiwgImVsZW1lbnRzT3B0aW9ucyIsICJzdHJpcGUiLCAiY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QiLCAidG90YWxBbW91bnRBdG9tIiwgImN1cnJlbmN5IiwgImlzQW1vdW50UGVuZGluZyIsICJpc0xpbmtPbmx5IiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiY29uZmlybVN0cmlwZVByUE0iLCAibmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtIiwgImNvbmZpcm1SZXN1bHQiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgInBheWxvYWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJudWxsT3JVbmRlZk9yIiwgIkNERVJlc3BvbnNlRXJyb3IiLCAiQ291cG9uTWluaW1hbCIsICJMaW5lSXRlbSIsICJCcmFuZFNldHRpbmdzIiwgIkJyYW5kIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJTdWJzY3JpcHRpb25JdGVtTWluaW1hbCIsICJTdWJzY3JpcHRpb25NaW5pbWFsIiwgIkludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCIsICJJbnZvaWNlTGluZUl0ZW1NaW5pbWFsIiwgIkRpc2NvdW50TWluaW1hbCIsICJJbnZvaWNlTWluaW1hbCIsICJDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwiLCAiUHJldmlld0NoZWNrb3V0UmVzcG9uc2UiLCAiX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiIsICJQYXltZW50Rm9ybVByZWZpbGwiLCAiQ29tcGxldGVkRm9ybVByZWZpbGwiLCAiRXhwaXJlZEZvcm1QcmVmaWxsIiwgIkNoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlIiwgIlNldHVwQ2hlY2tvdXRSZXNwb25zZSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJTdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAiU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UiLCAic3VtIiwgImFyciIsICJhIiwgImIiLCAiZml4UHJvdG8iLCAicHJvdG90eXBlIiwgInNldFByb3RvdHlwZU9mIiwgImZpeFN0YWNrIiwgImNhcHR1cmVTdGFja1RyYWNlIiwgIl9fZXh0ZW5kcyIsICJfZXh0ZW5kU3RhdGljcyIsICJkIiwgInAiLCAiX18iLCAiQ3VzdG9tRXJyb3IiLCAiX3N1cGVyIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJfbmV3VGFyZ2V0IiwgIl90aGlzIiwgIkNkZUVycm9yIiwgImZyaWVuZGx5TWVzc2FnZSIsICJxdWVyeUNERSIsICJjZGVDb25uIiwgImRhdGEiLCAicmVzcG9uc2VTY2hlbWEiLCAiaXNDREVSZXNwb25zZUVycm9yIiwgImNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hIiwgInNjaGVtYSIsICJnZXRDaGVja291dFByZXZpZXciLCAicmVxdWVzdCIsICJnZXRQcmVmaWxsIiwgInN0YXJ0UGF5bWVudEZsb3ciLCAic3RhcnRQYXltZW50Rmxvd0ZvckNDIiwgInN0YXJ0UGF5bWVudEZsb3dGb3JQUiIsICJjb25maXJtUGF5bWVudEZsb3ciLCAiZ2V0Q2hlY2tvdXRWYWx1ZSIsICJzZWN1cmVUb2tlbiIsICJwcm9tb0NvZGUiLCAiY2hlY2tvdXRQcmV2aWV3IiwgImN1cnJlbmNpZXMiLCAiaW52IiwgImFtb3VudEF0b20iLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50IiwgImlzU2V0dXBNb2RlIiwgInRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMiLCAiYWxsQ2RlQ29ubmVjdGlvbnMiLCAiY2hlY2tvdXRDYXJkRWxlbWVudHMiLCAic2V0dXBDaGVja291dCIsICJwZXJmb3JtQ2hlY2tvdXQiLCAiQ0RFX1BPTExJTkdfSU5URVJWQUwiLCAicGluZ0NkZUZvcjNkc1N0YXR1cyIsICJpZnJhbWUiLCAiY2hpbGRPcmlnaW4iLCAiY29ubmVjdGlvbk9iaiIsICJhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyIsICJzaW1wbGVPanNGbG93IiwgInBhcmFtcyIsICJmbG93UmVzdWx0IiwgImFkZEVycm9yQ2F0Y2hlckZvckluaXQiLCAiaW5pdCIsICJlcnJfXyIsICJjcmVhdGVPanNGbG93TG9nZ2VycyIsICJwcmVmaXgiLCAibG9nIiwgImxvZ19fJDUiLCAiZXJyX18kNSIsICJwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgImZpbmRDcG1NYXRjaGluZ1R5cGUiLCAiYWxsQ1BNcyIsICJ6b2RNb2RlbCIsICJjcG0iLCAiY3BtMiIsICJsb2dfXyQ0IiwgImVycl9fJDQiLCAidmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MiLCAibm9uQ2RlRm9ybUlucHV0cyIsICJvblZhbGlkYXRpb25FcnJvciIsICJmb3JtYXR0ZWQiLCAiaXNzdWVzIiwgInZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHQiLCAicGFyc2VkIiwgIk9KU19TVFJJUEVfTElOS19CVE5fSUQiLCAibG9nX18kMyIsICJlcnJfXyQzIiwgIlN0cmlwZUxpbmtDcG0iLCAiU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMiLCAiaW5pdFN0cmlwZUxpbmtGbG93IiwgImNvbnRleHQiLCAiZmxvd0NhbGxiYWNrcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIk9qc0Zsb3dzIiwgInJ1blN0cmlwZUxpbmtGbG93IiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJjdXN0b21QYXJhbXMiLCAibWVyZ2VkSW5wdXRzIiwgImZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUE0iLCAibm9uQ2RlRm9ybUZpZWxkcyIsICJzdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAib3VyRXhpc3RpbmdQbUlkIiwgImNoZWNrb3V0UmVxdWVzdCIsICJmb3JtSW5wdXRzIiwgIl9lIiwgImlucHV0cyIsICJwYXllckZpcnN0TmFtZSIsICJwYXllckxhc3ROYW1lUGFydHMiLCAicGF5ZXJMYXN0TmFtZSIsICJjcmVhdGVBbmRPcGVuRnJhbWUiLCAidXJsIiwgInRlbXBsYXRlIiwgImhvc3QiLCAic2hhZG93Um9vdCIsICJjYW5jZWxCdXR0b24iLCAic3RhcnRQb2xsaW5nIiwgIm9uU3VjY2VzcyIsICJoYW5kbGVQb2xsaW5nIiwgInN0YXR1cyIsICJwb2xsaW5nSW50ZXJ2YWwiLCAiaGFuZGxlRXZlbnRzIiwgImhhbmRsZUNhbmNlbCIsICJzdGFydDNkc1ZlcmlmaWNhdGlvbiIsICJjbGVhbnVwRXZlbnRMaXN0ZW5lcnMiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJpbml0UmVzdWx0IiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtRXZ0IiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIm1hdGNoZXMiLCAiZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMiLCAieCIsICJPYnNlcnZhYmxlJDIiLCAiaGFzU3ltYm9sIiwgIm5hbWUiLCAiZ2V0U3ltYm9sIiwgIlN5bWJvbEl0ZXJhdG9yIiwgIlN5bWJvbE9ic2VydmFibGUiLCAiU3ltYm9sU3BlY2llcyIsICJnZXRNZXRob2QiLCAiZ2V0U3BlY2llcyIsICJjdG9yIiwgIk9ic2VydmFibGUkMSIsICJpc09ic2VydmFibGUiLCAiaG9zdFJlcG9ydEVycm9yIiwgImVucXVldWUiLCAiY2xlYW51cFN1YnNjcmlwdGlvbiIsICJzdWJzY3JpcHRpb24iLCAiY2xlYW51cCIsICJ1bnN1YnNjcmliZSIsICJjbG9zZVN1YnNjcmlwdGlvbiIsICJmbHVzaFN1YnNjcmlwdGlvbiIsICJxdWV1ZSIsICJub3RpZnlTdWJzY3JpcHRpb24iLCAidHlwZSIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInNlbGYiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJpbmRleCIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCIsICJpbml0aWFsaXplT2pzRmxvd3MiLCAiaW5pdFBhcmFtcyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgIk9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIiwgImZvcm1JbnN0YW5jZSIsICJoZWlnaHQiLCAiZmllbGQiLCAic291cmNlIiwgImNyZWF0ZUNvbm5lY3Rpb24iLCAiaXNWYWxpZE9iamVjdCIsICJDb25uZWN0aW9uTWFuYWdlciIsICJpZCIsICJjb25uZWN0aW9uIiwgIl9PcGVuUGF5Rm9ybSIsICJjb25maWciLCAiaW5pdFN0YXR1cyIsICJfZiIsICJjYW5BcHBsZVBheSIsICJjYW5Hb29nbGVQYXkiLCAidXNlclBhcmFtcyIsICJwcm92aWRlciIsICJmb3JtIiwgImVsZW1lbnQiLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==
|