bry-biometric-collector 2.2.16-RC03 → 2.2.16-RC05

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