bry-biometric-collector 2.2.20 → 2.2.21-RC01

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.
@@ -0,0 +1,132 @@
1
+ import { u as D, $ as m, n as C, g as b, i as y, s as l, a as F, F as U, b as M, c, v as x, d as P, A as B, e as I, h as g, f as v, j as W, k as R, l as $, m as k, o as w, p as V } from "./main_21278475_2.2.21-RC01.js";
2
+ const f = D(m);
3
+ var X = /* @__PURE__ */ ((n) => (n.EXTENSION_MISSING = "EXTENSION_MISSING", n.USER_CANCELLED = "USER_CANCELLED", n.UNAUTHORIZED_EXTENSION = "UNAUTHORIZED_EXTENSION", n.SCANNER_NOT_FOUND = "SCANNER_NOT_FOUND", n.EXTENSION_MODULE_NOT_INSTALLED = "EXTENSION_MODULE_NOT_INSTALLED", n.FINGER_NOT_REMOVED = "FINGER_NOT_REMOVED", n.UNKNOWN_ERROR = "UNKNOWN_ERROR", n.EVALUATE_BIOMETRICS_TIMEOUT = "EVALUATE_BIOMETRICS_TIMEOUT", n.EVALUATE_BIOMETRICS_NETWORK_ISSUE = "EVALUATE_BIOMETRICS_NETWORK_ISSUE", n))(X || {});
4
+ class r extends Error {
5
+ constructor(a, d) {
6
+ super(a), this.status = d;
7
+ }
8
+ }
9
+ async function Q(n, a) {
10
+ const d = C([n])[0], T = b();
11
+ if (y(T))
12
+ throw new r(
13
+ "Attempting to capture finger but the extension apparently hasn't been properly injected. Received: " + T,
14
+ "EXTENSION_MISSING"
15
+ /* EXTENSION_MISSING */
16
+ );
17
+ if (l(!0), F())
18
+ throw l(!1), w(!1), new r(
19
+ "User cancelled",
20
+ "USER_CANCELLED"
21
+ /* USER_CANCELLED */
22
+ );
23
+ let E = null;
24
+ try {
25
+ E = await T.getFingerprint(
26
+ // @ts-ignore TODO: Alex has to fix this functions signature to accept pojo
27
+ JSON.stringify(
28
+ a ?? { outputFormat: "BASE64", imageFormat: "BMP", nonce: "webCollector", timeout: 3 }
29
+ )
30
+ );
31
+ } catch (e) {
32
+ console.error(e);
33
+ const t = e;
34
+ throw l(!1), t.key === "fingerprint.scanner.timeout" ? new r(
35
+ "Fingerprint scan timed out (didn't read a finger.)",
36
+ "USER_CANCELLED"
37
+ /* USER_CANCELLED */
38
+ ) : t.key === "extension.authorization.canceled" ? new r(
39
+ "Extension wasn't given authorization.",
40
+ "UNAUTHORIZED_EXTENSION"
41
+ /* UNAUTHORIZED_EXTENSION */
42
+ ) : t.key === "fingerprint.scanner.not.found" ? new r(
43
+ "Couldn't find fingerprint scanner.",
44
+ "SCANNER_NOT_FOUND"
45
+ /* SCANNER_NOT_FOUND */
46
+ ) : t.key === "signer.not.installed" ? new r(
47
+ "The extension module isn't installed.",
48
+ "EXTENSION_MODULE_NOT_INSTALLED"
49
+ /* EXTENSION_MODULE_NOT_INSTALLED */
50
+ ) : new r(
51
+ "Couldn't capture fingerprint: " + t.description,
52
+ "UNKNOWN_ERROR"
53
+ /* UNKNOWN_ERROR */
54
+ );
55
+ }
56
+ if (F())
57
+ throw l(!1), w(!1), new r(
58
+ "User cancelled",
59
+ "USER_CANCELLED"
60
+ /* USER_CANCELLED */
61
+ );
62
+ const i = q(d);
63
+ i.image = E?.content.image?.data, i.base64WSQ = E?.content.fingerprint.data, i.nfiqRating = (E?.content.score || 0) + 98, i.status = U.AVAILABLE;
64
+ const L = M(c());
65
+ let s, O = !1;
66
+ try {
67
+ s = await x(L, i);
68
+ } catch (e) {
69
+ if (i.nfiqRating = -1, i.base64WSQ = "", i.image = "", console.warn("caught while validating fingerprint: ", e.toString()), P(e) && "message" in e && e.message === "error.template.extraction")
70
+ O = !0;
71
+ else if (e instanceof XMLHttpRequest) {
72
+ const t = e;
73
+ "response" in t && "data" in t.response.data && t.response.data.message === "error.template.extraction" && (O = !0);
74
+ } else {
75
+ if (e instanceof B)
76
+ throw e.code === "ECONNABORTED" ? (console.log("The evaluate biometrics request took too long to answer!"), new r(
77
+ "Evaluate biometrics took too long to reply",
78
+ "EVALUATE_BIOMETRICS_TIMEOUT"
79
+ /* EVALUATE_BIOMETRICS_TIMEOUT */
80
+ )) : (console.error("Error evaluating biometrics!", e), I(c()), l(!1), new r(
81
+ "Network issue while validating biometrics, check logs",
82
+ "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
83
+ /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
84
+ ));
85
+ I(c()), l(!1);
86
+ }
87
+ }
88
+ let S, N, _, A, u, o = g.LOW_QUALITY;
89
+ if (s) {
90
+ const e = s.bodyParts.find(
91
+ (t) => t.bodyPart === i.bodyPart
92
+ );
93
+ i.nfiqRating = e.quality, (e.quality > v() || e.status === "LOW_QUALITY") && (S = !0, o = g.LOW_QUALITY), s.bodyParts.find((t) => t.status === "DUPLICATE") && (N = !0, o = g.DUPLICATE), s.bodyParts.find((t) => t.status === "FORBIDDEN") && (_ = !0, o = g.FORBIDDEN), s.bodyParts.find((t) => t.status === "AGR") && (A = !0, o = g.AGR_DETECTED), s.bodyParts.find((t) => t.status === "AGR_NOT_MATCH") && (u = !0, o = g.AGR_NO_MATCH);
94
+ }
95
+ if (N || S || _ || u || A || O) {
96
+ i.nfiqRating = -1, i.base64WSQ = "", i.image = "", i.status = U.AVAILABLE;
97
+ let e = "badFingerQualitySwal";
98
+ N ? e = "unknownDuplicateFingerSwal" : _ ? e = "forbiddenFingerSwal" : A ? e = "agrFinger" : u && (e = "agrFingerNotMatched");
99
+ let t = f(`${e}.text`);
100
+ if (W(V) && N) {
101
+ e = "duplicateFingerSwal", t = f(`${e}.text`, {
102
+ values: {
103
+ finger1: f(`${e}.${s.matchingFingers?.[0]}`),
104
+ finger2: f(`${e}.${s.matchingFingers?.[1]}`)
105
+ }
106
+ });
107
+ const h = R();
108
+ return {
109
+ returnCode: o,
110
+ bodyParts: h,
111
+ matchingFingers: s.matchingFingers,
112
+ message: t
113
+ };
114
+ }
115
+ const p = R();
116
+ return { returnCode: o, bodyParts: p, message: t };
117
+ }
118
+ return I(c()), l(!1), $(), { returnCode: g.CAPTURED, bodyParts: R() };
119
+ }
120
+ function q(n) {
121
+ k();
122
+ for (const a of c())
123
+ if (a.index === n)
124
+ return a.selected = !0, a;
125
+ throw new Error(`Finger ${n} not found`);
126
+ }
127
+ export {
128
+ r as CaptureApiError,
129
+ X as CaptureErrorStatusEnum,
130
+ Q as captureSingleFinger
131
+ };
132
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2Vyc0FwaV81ODVjNmE3ZF8yLjIuMjEtUkMwMS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS9maW5nZXJzQXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF4aW9zRXJyb3IgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgdHlwZSB7IENhcHR1cmVQYXJhbXMsIEZpbmdlcnByaW50U2NhbiB9IGZyb20gJy4uL2luY2x1ZGUvRXh0ZW5zaW9uJztcbmltcG9ydCB7IGlzQ2FuY2VsbGluZywgc2V0Q2FuY2VsbGluZywgc2V0Q2FwdHVyaW5nIH0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvYnV0dG9ucy9jYXB0dXJlL2NhcHR1cmVTdG9yZSc7XG5pbXBvcnQgeyBnZXRFeHRlbnNpb24sIGhhc0Zpbmdlck9uQW5kT2ZmLCBpc0V2ZXJ5dGhpbmdJbnN0YWxsZWQgfSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9leHRlbnNpb24vZXh0ZW5zaW9uJztcbmltcG9ydCB7XG4gIEJvZHlQYXJ0TmFtZXMsXG4gIEZpbmdlcixcbiAgZ2V0U2VsZWN0ZWRGaW5nZXIsXG4gIG5vcm1hbGl6ZUZpbmdlck5hbWVzQW5kSW5kZXhlc1RvSW5kZXhlcyxcbiAgdHlwZSBGaW5nZXJJbmRleCxcbiAgZ2V0RmluZ2VycyxcbiAgc2VsZWN0Tm90aGluZyxcbiAgRmluZ2VyU3RhdHVzLFxuICBnZXRDb2xsZWN0ZWRGaW5nZXJzLFxuICBzZXRGaW5nZXJzLFxuICBnZXRNaW5OZmlxQWNjZXB0YWJsZSxcbn0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvaGFuZC9oYW5kUGFydHMvZmluZ2Vyc1N0b3JlJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc09iamVjdEVtcHR5IH0gZnJvbSAnLi4vbGliL3V0aWwvdXRpbCc7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUZpbmdlckJpb21ldHJpY3MsXG4gIHR5cGUgQm9keVBhcnRSZXR1cm5UeXBlLFxuICB1c2VXYXNtLFxuICB0eXBlIEJvZHlQYXJ0LFxufSBmcm9tICcuLi9saWIvdmFsaWRhdG9ycy9iaW9tZXRyaWNzVmFsaWRhdG9yJztcbmltcG9ydCB7XG4gIGNvbGxlY3RGaW5nZXJzLFxuICBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLFxuICBub3RpZnlGaW5nZXJDb2xsZWN0ZWQsXG59IGZyb20gJy4uL2xpYi9maW5nZXJzVGFiL2J1dHRvbnMvYnV0dG9uSGFuZGxlcnMnO1xuaW1wb3J0IHsgZm9ybWF0LCB1bndyYXBGdW5jdGlvblN0b3JlIH0gZnJvbSAnc3ZlbHRlLWkxOG4nO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnc3ZlbHRlL3N0b3JlJztcbmNvbnN0ICRmb3JtYXQgPSB1bndyYXBGdW5jdGlvblN0b3JlKGZvcm1hdCk7XG5cbmV4cG9ydCB7IGNhcHR1cmVTaW5nbGVGaW5nZXIgfTtcblxuZXhwb3J0IGNvbnN0IGVudW0gQ2FwdHVyZUVycm9yU3RhdHVzRW51bSB7XG4gIEVYVEVOU0lPTl9NSVNTSU5HID0gJ0VYVEVOU0lPTl9NSVNTSU5HJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAnVVNFUl9DQU5DRUxMRUQnLFxuICBVTkFVVEhPUklaRURfRVhURU5TSU9OID0gJ1VOQVVUSE9SSVpFRF9FWFRFTlNJT04nLFxuICBTQ0FOTkVSX05PVF9GT1VORCA9ICdTQ0FOTkVSX05PVF9GT1VORCcsXG4gIEVYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRCA9ICdFWFRFTlNJT05fTU9EVUxFX05PVF9JTlNUQUxMRUQnLFxuICBGSU5HRVJfTk9UX1JFTU9WRUQgPSAnRklOR0VSX05PVF9SRU1PVkVEJyxcbiAgVU5LTk9XTl9FUlJPUiA9ICdVTktOT1dOX0VSUk9SJyxcbiAgRVZBTFVBVEVfQklPTUVUUklDU19USU1FT1VUID0gJ0VWQUxVQVRFX0JJT01FVFJJQ1NfVElNRU9VVCcsXG4gIEVWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRSA9ICdFVkFMVUFURV9CSU9NRVRSSUNTX05FVFdPUktfSVNTVUUnLFxufVxuXG5leHBvcnQgY2xhc3MgQ2FwdHVyZUFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyBzdGF0dXM6IENhcHR1cmVFcnJvclN0YXR1c0VudW0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2dyYW1tYXRpY2FsbHkgY2FwdHVyZSBzaW5nbGUgZmluZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhcHR1cmVTaW5nbGVGaW5nZXIoXG4gIGZpbmdlck5hbWVPckluZGV4OiBudW1iZXIgfCBCb2R5UGFydE5hbWVzLFxuICBnZXRGaW5nZXJwcmludFBhcmFtczogQ2FwdHVyZVBhcmFtc1xuKTogUHJvbWlzZTx7XG4gIHJldHVybkNvZGU6IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXM7XG4gIGJvZHlQYXJ0czogQm9keVBhcnRbXTtcbiAgbWF0Y2hpbmdGaW5nZXJzPzogQm9keVBhcnROYW1lc1tdO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufT4ge1xuICBjb25zdCBmaW5nZXJJbmRleCA9IG5vcm1hbGl6ZUZpbmdlck5hbWVzQW5kSW5kZXhlc1RvSW5kZXhlcyhbZmluZ2VyTmFtZU9ySW5kZXhdKVswXTtcbiAgLy8gdHJ5IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCk7XG4gIC8vIGNoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgaWYgKGlzT2JqZWN0RW1wdHkoZXh0ZW5zaW9uKSkge1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICBcIkF0dGVtcHRpbmcgdG8gY2FwdHVyZSBmaW5nZXIgYnV0IHRoZSBleHRlbnNpb24gYXBwYXJlbnRseSBoYXNuJ3QgYmVlbiBwcm9wZXJseSBpbmplY3RlZC4gUmVjZWl2ZWQ6IFwiICsgZXh0ZW5zaW9uLFxuICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5FWFRFTlNJT05fTUlTU0lOR1xuICAgICk7XG4gIH1cblxuICBzZXRDYXB0dXJpbmcodHJ1ZSk7XG5cbiAgLy8gaWYgc29tZWhvdyB0aGV5IG1hbmFnZWQgdG8gYXNrIGZvciBjYW5jZWxsYXRpb24gcmlnaHQgYmVmb3JlIHRoZSBzY2FuLCB0aGlzIGNhdGNoZXMgdGhhdFxuICBpZiAoaXNDYW5jZWxsaW5nKCkpIHtcbiAgICBzZXRDYXB0dXJpbmcoZmFsc2UpO1xuICAgIHNldENhbmNlbGxpbmcoZmFsc2UpO1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoJ1VzZXIgY2FuY2VsbGVkJywgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VU0VSX0NBTkNFTExFRCk7XG4gIH1cblxuICAvLyBwcm9tcHQgdXNlciB0byBjb2xsZWN0IHRoZSBmaW5nZXJcbiAgbGV0IGNhcHR1cmU6IEZpbmdlcnByaW50U2NhbiB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIGNhcHR1cmUgdGhlIGZpbmdlclxuICAgIC8vICppbXBsZW1lbnRhdGlvbiBjb25zaWRlcmluZyB3ZSBvbmx5IGhhdmUgdGhlIGdldEZpbmdlcnByaW50IG1ldGhvZCBhdmFpbGFibGVcbiAgICBjYXB0dXJlID0gYXdhaXQgZXh0ZW5zaW9uLmdldEZpbmdlcnByaW50KFxuICAgICAgLy8gQHRzLWlnbm9yZSBUT0RPOiBBbGV4IGhhcyB0byBmaXggdGhpcyBmdW5jdGlvbnMgc2lnbmF0dXJlIHRvIGFjY2VwdCBwb2pvXG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgZ2V0RmluZ2VycHJpbnRQYXJhbXMgPz8geyBvdXRwdXRGb3JtYXQ6ICdCQVNFNjQnLCBpbWFnZUZvcm1hdDogJ0JNUCcsIG5vbmNlOiAnd2ViQ29sbGVjdG9yJywgdGltZW91dDogMyB9XG4gICAgICApXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIGNvbnN0IGUgPSBlcnIgYXMgeyBrZXk6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9O1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgLy8gVE9ETzogdHlwZSB0aGlzIGFuZCBjcmVhdGUgZW51bSBmb3IgZXJyb3JzXG4gICAgaWYgKGUua2V5ID09PSAnZmluZ2VycHJpbnQuc2Nhbm5lci50aW1lb3V0Jykge1xuICAgICAgLy8gaWYgdGltZWRvdXQganVzdCB0cnkgYWdhaW4sIHVubGVzcyB0cnlpbmcgdG8gY2FuY2VsXG4gICAgICAvLyBUT0RPOiBtYXliZSBzdG9wIGFmdGVyIHNvIG1hbnkgdHJpZXNcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgIFwiRmluZ2VycHJpbnQgc2NhbiB0aW1lZCBvdXQgKGRpZG4ndCByZWFkIGEgZmluZ2VyLilcIixcbiAgICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VU0VSX0NBTkNFTExFRFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnZXh0ZW5zaW9uLmF1dGhvcml6YXRpb24uY2FuY2VsZWQnKSB7XG4gICAgICAvLyB1c2VyIGRpZG4ndCBhdXRob3JpemUgdGhlIGRvbWFpbiwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gc28gc3RvcC5cbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXCJFeHRlbnNpb24gd2Fzbid0IGdpdmVuIGF1dGhvcml6YXRpb24uXCIsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uVU5BVVRIT1JJWkVEX0VYVEVOU0lPTik7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ2ZpbmdlcnByaW50LnNjYW5uZXIubm90LmZvdW5kJykge1xuICAgICAgLy8gdXNlciBkb2Vzbid0IGhhdmUgYSBzY2FubmVyIGNvbm5lY3RlZCwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gc28gc3RvcC5cbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGZpbmdlcnByaW50IHNjYW5uZXIuXCIsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uU0NBTk5FUl9OT1RfRk9VTkQpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdzaWduZXIubm90Lmluc3RhbGxlZCcpIHtcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgIFwiVGhlIGV4dGVuc2lvbiBtb2R1bGUgaXNuJ3QgaW5zdGFsbGVkLlwiLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIkNvdWxkbid0IGNhcHR1cmUgZmluZ2VycHJpbnQ6IFwiICsgZS5kZXNjcmlwdGlvbiwgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VTktOT1dOX0VSUk9SKTtcbiAgICB9XG4gIH1cbiAgLy8gaWYgc29tZWhvdyB0aGV5IG1hbmFnZWQgdG8gYXNrIGZvciBjYW5jZWxsYXRpb24gcmlnaHQgYmVmb3JlIHRoZSBzY2FuLCB0aGlzIGNhdGNoZXMgdGhhdFxuICBpZiAoaXNDYW5jZWxsaW5nKCkpIHtcbiAgICBzZXRDYXB0dXJpbmcoZmFsc2UpO1xuICAgIHNldENhbmNlbGxpbmcoZmFsc2UpO1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoJ1VzZXIgY2FuY2VsbGVkJywgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VU0VSX0NBTkNFTExFRCk7XG4gIH1cblxuICAvLyBzZWxlY3QgYW5kIGdldCBmaW5nZXJcbiAgY29uc3QgZmluZ2VyID0gc2VsZWN0RmluZ2VyQXBpKGZpbmdlckluZGV4KTtcbiAgLy8gc2V0IHRoaXMgZmluZ2VycyBhdHRyaWJ1dGVzIHRvIHRoZSByZWNlbnRseSBjb2xsZWN0ZWQgZmluZ2VyXG4gIGZpbmdlci5pbWFnZSA9IGNhcHR1cmU/LmNvbnRlbnQuaW1hZ2U/LmRhdGEgYXMgc3RyaW5nO1xuICBmaW5nZXIuYmFzZTY0V1NRID0gY2FwdHVyZT8uY29udGVudC5maW5nZXJwcmludC5kYXRhIGFzIHN0cmluZztcbiAgZmluZ2VyLm5maXFSYXRpbmcgPSAoY2FwdHVyZT8uY29udGVudC5zY29yZSB8fCAwKSArIDk4O1xuICBmaW5nZXIuc3RhdHVzID0gRmluZ2VyU3RhdHVzLkFWQUlMQUJMRTtcbiAgLy8gR2V0IEFMTCB0aGUgY29sbGVjdGVkIGZpbmdlcnNcbiAgY29uc3QgY29sbGVjdGVkRmluZ2VycyA9IGdldENvbGxlY3RlZEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcblxuICAvLyBzZW5kIHRvIHJlbW90ZVxuICBsZXQgcmVzcG9uc2UsXG4gICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IGF3YWl0IHZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyhjb2xsZWN0ZWRGaW5nZXJzLCBmaW5nZXIpO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgLy8gY2xlYXIgdGhlIGZpbmdlclxuICAgIGZpbmdlci5uZmlxUmF0aW5nID0gLTE7XG4gICAgZmluZ2VyLmJhc2U2NFdTUSA9ICcnO1xuICAgIGZpbmdlci5pbWFnZSA9ICcnO1xuICAgIC8vIHdhcm4gZXJyb3JcbiAgICBjb25zb2xlLndhcm4oJ2NhdWdodCB3aGlsZSB2YWxpZGF0aW5nIGZpbmdlcnByaW50OiAnLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAvLyBlcnJvciB3aGlsZSBleHRyYWN0aW5nLCBzaG93IGEgbG93IHF1YWxpdHkgc3dhbFxuICAgIGlmIChpc09iamVjdChlcnJvcikgJiYgJ21lc3NhZ2UnIGluIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09ICdlcnJvci50ZW1wbGF0ZS5leHRyYWN0aW9uJykge1xuICAgICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkge1xuICAgICAgY29uc3QgZSA9IGVycm9yO1xuICAgICAgaWYgKCdyZXNwb25zZScgaW4gZSAmJiAnZGF0YScgaW4gZS5yZXNwb25zZS5kYXRhICYmIGUucmVzcG9uc2UuZGF0YS5tZXNzYWdlID09PSAnZXJyb3IudGVtcGxhdGUuZXh0cmFjdGlvbicpIHtcbiAgICAgICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBeGlvc0Vycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VDT05OQUJPUlRFRCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1RoZSBldmFsdWF0ZSBiaW9tZXRyaWNzIHJlcXVlc3QgdG9vayB0b28gbG9uZyB0byBhbnN3ZXIhJyk7XG4gICAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgICAgJ0V2YWx1YXRlIGJpb21ldHJpY3MgdG9vayB0b28gbG9uZyB0byByZXBseScsXG4gICAgICAgICAgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5FVkFMVUFURV9CSU9NRVRSSUNTX1RJTUVPVVRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGV2YWx1YXRpbmcgYmlvbWV0cmljcyEnLCBlcnJvcik7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIHVwZGF0ZXMgdGhlIHN0YXVzIGluIGNhc2UgdGhlIGZpbmdlciBoYWQgYSBzdGF0dXNcbiAgICAgIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcbiAgICAgIC8vIG5vIGxvbmdlciBjYXB0dXJpbmdcbiAgICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFxuICAgICAgICAnTmV0d29yayBpc3N1ZSB3aGlsZSB2YWxpZGF0aW5nIGJpb21ldHJpY3MsIGNoZWNrIGxvZ3MnLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcyBjaGFuZ2VzIHVwZGF0ZXMgdGhlIHN0YXVzIGluIGNhc2UgdGhlIGZpbmdlciBoYWQgYSBzdGF0dXNcbiAgICAgIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcbiAgICAgIC8vIG5vIGxvbmdlciBjYXB0dXJpbmdcbiAgICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgfVxuICB9XG4gIGxldCBpc0Zpbmdlckxvd1F1YWxpdHksXG4gICAgaXNEdXBsaWNhdGVGaW5nZXIsXG4gICAgaXNGb3JiaWRkZW5GaW5nZXIsXG4gICAgaXNBZ3JGaW5nZXJEZXRlY3RlZCxcbiAgICBpc0Fnck5vdE1hdGNoZWRGaW5nZXIsXG4gICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuTE9XX1FVQUxJVFk7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIC8vIGdldCB0aGUgY3VycmVudCBmaW5nZXIgZnJvbSB0aGUgcmV0dXJuIGxpc3RcbiAgICBjb25zdCB2YWxpZGF0ZWRGaW5nZXIgPSByZXNwb25zZS5ib2R5UGFydHMuZmluZChcbiAgICAgICh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5ib2R5UGFydCA9PT0gZmluZ2VyLmJvZHlQYXJ0XG4gICAgKSBhcyBCb2R5UGFydFJldHVyblR5cGU7XG4gICAgLy8gc2V0IHRoaXMgZmluZ2VyJ3MgcXVhbGl0eSBhbmQgaW1hZ2VcbiAgICBmaW5nZXIubmZpcVJhdGluZyA9IHZhbGlkYXRlZEZpbmdlci5xdWFsaXR5O1xuICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGUgYW5kIGxvdyBxdWFsaXR5XG4gICAgaWYgKHZhbGlkYXRlZEZpbmdlci5xdWFsaXR5ID4gZ2V0TWluTmZpcUFjY2VwdGFibGUoKSB8fCB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnTE9XX1FVQUxJVFknKSB7XG4gICAgICBpc0Zpbmdlckxvd1F1YWxpdHkgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuTE9XX1FVQUxJVFk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS5ib2R5UGFydHMuZmluZCgodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnRFVQTElDQVRFJykpIHtcbiAgICAgIGlzRHVwbGljYXRlRmluZ2VyID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkRVUExJQ0FURTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKCh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdGT1JCSURERU4nKSkge1xuICAgICAgaXNGb3JiaWRkZW5GaW5nZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuRk9SQklEREVOO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0FHUicpKSB7XG4gICAgICBpc0FnckZpbmdlckRldGVjdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkFHUl9ERVRFQ1RFRDtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKCh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdBR1JfTk9UX01BVENIJykpIHtcbiAgICAgIGlzQWdyTm90TWF0Y2hlZEZpbmdlciA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5BR1JfTk9fTUFUQ0g7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhpcyBmaW5nZXIgaXMgbG93IHF1YWxpdHkgb3IgZHVwbGljYXRlXG4gIC8vIChpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSwgaXQgaGFzIHRvIGJlIHRoaXMgZmluZ2VyKVxuICBpZiAoXG4gICAgaXNEdXBsaWNhdGVGaW5nZXIgfHxcbiAgICBpc0Zpbmdlckxvd1F1YWxpdHkgfHxcbiAgICBpc0ZvcmJpZGRlbkZpbmdlciB8fFxuICAgIGlzQWdyTm90TWF0Y2hlZEZpbmdlciB8fFxuICAgIGlzQWdyRmluZ2VyRGV0ZWN0ZWQgfHxcbiAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvblxuICApIHtcbiAgICAvLyBjbGVhciB0aGlzIGZpbmdlclxuICAgIGZpbmdlci5uZmlxUmF0aW5nID0gLTE7XG4gICAgZmluZ2VyLmJhc2U2NFdTUSA9ICcnO1xuICAgIGZpbmdlci5pbWFnZSA9ICcnO1xuICAgIGZpbmdlci5zdGF0dXMgPSBGaW5nZXJTdGF0dXMuQVZBSUxBQkxFO1xuICAgIC8vIHNldCB0aGUgYXBwcm9wcmlhdGUgc3dhbCBwcmVmaXhcbiAgICBsZXQgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdiYWRGaW5nZXJRdWFsaXR5U3dhbCc7XG4gICAgaWYgKGlzRHVwbGljYXRlRmluZ2VyKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ3Vua25vd25EdXBsaWNhdGVGaW5nZXJTd2FsJztcbiAgICB9IGVsc2UgaWYgKGlzRm9yYmlkZGVuRmluZ2VyKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2ZvcmJpZGRlbkZpbmdlclN3YWwnO1xuICAgIH0gZWxzZSBpZiAoaXNBZ3JGaW5nZXJEZXRlY3RlZCkge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdhZ3JGaW5nZXInO1xuICAgIH0gZWxzZSBpZiAoaXNBZ3JOb3RNYXRjaGVkRmluZ2VyKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2FnckZpbmdlck5vdE1hdGNoZWQnO1xuICAgIH1cbiAgICBsZXQgaHRtbCA9ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0udGV4dGApO1xuICAgIC8vIGlmIHdlIGFyZSB1c2luZyB3YXNtLCB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggZmluZ2VycyB3ZXJlIHRoZSBpc3N1ZVxuICAgIGlmIChnZXQodXNlV2FzbSkgJiYgaXNEdXBsaWNhdGVGaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnZHVwbGljYXRlRmluZ2VyU3dhbCc7XG4gICAgICBodG1sID0gJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS50ZXh0YCwge1xuICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICBmaW5nZXIxOiAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LiR7KHJlc3BvbnNlIGFzIGFueSkubWF0Y2hpbmdGaW5nZXJzPy5bMF19YCksXG4gICAgICAgICAgZmluZ2VyMjogJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS4keyhyZXNwb25zZSBhcyBhbnkpLm1hdGNoaW5nRmluZ2Vycz8uWzFdfWApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBjb2xsZWN0RmluZ2VycygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmV0dXJuQ29kZSxcbiAgICAgICAgYm9keVBhcnRzOiBvdXRwdXQsXG4gICAgICAgIG1hdGNoaW5nRmluZ2VyczogKHJlc3BvbnNlIGFzIGFueSkubWF0Y2hpbmdGaW5nZXJzIGFzIEJvZHlQYXJ0TmFtZXNbXSxcbiAgICAgICAgbWVzc2FnZTogaHRtbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IGNvbGxlY3RGaW5nZXJzKCk7XG4gICAgcmV0dXJuIHsgcmV0dXJuQ29kZSwgYm9keVBhcnRzOiBvdXRwdXQsIG1lc3NhZ2U6IGh0bWwgfTtcbiAgfVxuICAvLyBzaG93IHRoZSBjb2xsZWN0ZWQgZmluZ2VyXG4gIHNldEZpbmdlcnMoZ2V0RmluZ2VycygpKTtcblxuICBzZXRDYXB0dXJpbmcoZmFsc2UpO1xuICAvLyBzZW5kIGNvbGxlY3RlZCBmaW5nZXIgbWVzc2FnZVxuICBub3RpZnlGaW5nZXJDb2xsZWN0ZWQoKTtcblxuICByZXR1cm4geyByZXR1cm5Db2RlOiBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkNBUFRVUkVELCBib2R5UGFydHM6IGNvbGxlY3RGaW5nZXJzKCkgfTtcbn1cblxuLyoqXG4gKiBTZWxlY3QgZmluZ2VyIHByb2dyYW1tYXRpY2FsbHkgKHdpdGhvdXQgdXNlciBjbGljaylcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RmluZ2VyQXBpKGluZGV4OiBGaW5nZXJJbmRleCk6IEZpbmdlciB7XG4gIC8vIHVuc2VsZWN0IGV2ZXJ5dGhpbmdcbiAgc2VsZWN0Tm90aGluZygpO1xuICBmb3IgKGNvbnN0IGZpbmdlciBvZiBnZXRGaW5nZXJzKCkpIHtcbiAgICBpZiAoZmluZ2VyLmluZGV4ID09PSBpbmRleCkge1xuICAgICAgZmluZ2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmaW5nZXI7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmluZ2VyICR7aW5kZXh9IG5vdCBmb3VuZGApO1xufVxuIl0sIm5hbWVzIjpbIiRmb3JtYXQiLCJ1bndyYXBGdW5jdGlvblN0b3JlIiwiZm9ybWF0IiwiQ2FwdHVyZUVycm9yU3RhdHVzRW51bSIsIkNhcHR1cmVBcGlFcnJvciIsIm1lc3NhZ2UiLCJzdGF0dXMiLCJjYXB0dXJlU2luZ2xlRmluZ2VyIiwiZmluZ2VyTmFtZU9ySW5kZXgiLCJnZXRGaW5nZXJwcmludFBhcmFtcyIsImZpbmdlckluZGV4Iiwibm9ybWFsaXplRmluZ2VyTmFtZXNBbmRJbmRleGVzVG9JbmRleGVzIiwiZXh0ZW5zaW9uIiwiZ2V0RXh0ZW5zaW9uIiwiaXNPYmplY3RFbXB0eSIsInNldENhcHR1cmluZyIsImlzQ2FuY2VsbGluZyIsInNldENhbmNlbGxpbmciLCJjYXB0dXJlIiwiZXJyIiwiZSIsImZpbmdlciIsInNlbGVjdEZpbmdlckFwaSIsIkZpbmdlclN0YXR1cyIsImNvbGxlY3RlZEZpbmdlcnMiLCJnZXRDb2xsZWN0ZWRGaW5nZXJzIiwiZ2V0RmluZ2VycyIsInJlc3BvbnNlIiwiZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb24iLCJ2YWxpZGF0ZUZpbmdlckJpb21ldHJpY3MiLCJlcnJvciIsImlzT2JqZWN0IiwiQXhpb3NFcnJvciIsInNldEZpbmdlcnMiLCJpc0Zpbmdlckxvd1F1YWxpdHkiLCJpc0R1cGxpY2F0ZUZpbmdlciIsImlzRm9yYmlkZGVuRmluZ2VyIiwiaXNBZ3JGaW5nZXJEZXRlY3RlZCIsImlzQWdyTm90TWF0Y2hlZEZpbmdlciIsInJldHVybkNvZGUiLCJoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzIiwidmFsaWRhdGVkRmluZ2VyIiwiZ2V0TWluTmZpcUFjY2VwdGFibGUiLCJzd2FsVHJhbnNsYXRlUHJlZml4IiwiaHRtbCIsImdldCIsInVzZVdhc20iLCJvdXRwdXQiLCJjb2xsZWN0RmluZ2VycyIsIm5vdGlmeUZpbmdlckNvbGxlY3RlZCIsImluZGV4Iiwic2VsZWN0Tm90aGluZyJdLCJtYXBwaW5ncyI6IjtBQStCQSxNQUFNQSxJQUFVQyxFQUFvQkMsQ0FBTTtBQUl4QixJQUFBQyxzQkFBQUEsT0FDaEJBLEVBQUEsb0JBQW9CLHFCQUNwQkEsRUFBQSxpQkFBaUIsa0JBQ2pCQSxFQUFBLHlCQUF5QiwwQkFDekJBLEVBQUEsb0JBQW9CLHFCQUNwQkEsRUFBQSxpQ0FBaUMsa0NBQ2pDQSxFQUFBLHFCQUFxQixzQkFDckJBLEVBQUEsZ0JBQWdCLGlCQUNoQkEsRUFBQSw4QkFBOEIsK0JBQzlCQSxFQUFBLG9DQUFvQyxxQ0FUcEJBLElBQUFBLEtBQUEsQ0FBQSxDQUFBO0FBWVgsTUFBTUMsVUFBd0IsTUFBTTtBQUFBLEVBQ3pDLFlBQVlDLEdBQXdCQyxHQUFnQztBQUNsRSxVQUFNRCxDQUFPLEdBRHFCLEtBQUEsU0FBQUM7QUFBQSxFQUVwQztBQUNGO0FBS0EsZUFBZUMsRUFDYkMsR0FDQUMsR0FNQztBQUNELFFBQU1DLElBQWNDLEVBQXdDLENBQUNILENBQWlCLENBQUMsRUFBRSxD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