@trustchex/react-native-sdk 1.486.0 → 1.488.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/module/Shared/Components/EIDScanner.js +97 -37
  2. package/lib/module/Shared/Components/IdentityDocumentCamera.constants.js +9 -1
  3. package/lib/module/Shared/EIDReader/cardFileInputStream.js +25 -2
  4. package/lib/module/Shared/EIDReader/defaultFileSystem.js +56 -6
  5. package/lib/module/Shared/EIDReader/eidReader.js +124 -14
  6. package/lib/module/Shared/EIDReader/lds/icao/dg11File.js +23 -6
  7. package/lib/module/Shared/EIDReader/nfcManagerCardService.js +79 -9
  8. package/lib/module/Shared/EIDReader/protocol/paceDH.js +101 -0
  9. package/lib/module/Shared/EIDReader/protocol/paceErrors.js +34 -0
  10. package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +53 -4
  11. package/lib/module/Shared/EIDReader/protocol/readBinaryAPDUSender.js +7 -3
  12. package/lib/module/Shared/Libs/country-display.utils.js +13 -1
  13. package/lib/module/Shared/Libs/diagnosticReport.js +24 -1
  14. package/lib/module/Shared/Libs/diagnostics.js +30 -8
  15. package/lib/module/Shared/Libs/mrz.utils.js +172 -25
  16. package/lib/module/Shared/Libs/mrzFrameAggregator.js +29 -1
  17. package/lib/module/Shared/Libs/mrzTransliteration.js +14 -1
  18. package/lib/module/Translation/Resources/en.js +12 -0
  19. package/lib/module/Translation/Resources/tr.js +12 -0
  20. package/lib/module/version.js +1 -1
  21. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  22. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.constants.d.ts.map +1 -1
  23. package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts +3 -0
  24. package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts.map +1 -1
  25. package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts +4 -0
  26. package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts.map +1 -1
  27. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  28. package/lib/typescript/src/Shared/EIDReader/lds/icao/dg11File.d.ts.map +1 -1
  29. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts +9 -1
  30. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
  31. package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts +56 -0
  32. package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts.map +1 -0
  33. package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts +26 -0
  34. package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts.map +1 -0
  35. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -1
  36. package/lib/typescript/src/Shared/EIDReader/protocol/readBinaryAPDUSender.d.ts.map +1 -1
  37. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -1
  38. package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts.map +1 -1
  39. package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +9 -1
  40. package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -1
  41. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts +1 -0
  42. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  43. package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts.map +1 -1
  44. package/lib/typescript/src/Shared/Libs/mrzTransliteration.d.ts.map +1 -1
  45. package/lib/typescript/src/Translation/Resources/en.d.ts +12 -0
  46. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  47. package/lib/typescript/src/Translation/Resources/tr.d.ts +12 -0
  48. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  49. package/lib/typescript/src/version.d.ts +1 -1
  50. package/package.json +1 -1
  51. package/src/Shared/Components/EIDScanner.tsx +149 -68
  52. package/src/Shared/Components/IdentityDocumentCamera.constants.ts +9 -1
  53. package/src/Shared/EIDReader/cardFileInputStream.ts +30 -6
  54. package/src/Shared/EIDReader/defaultFileSystem.ts +75 -17
  55. package/src/Shared/EIDReader/eidReader.ts +154 -21
  56. package/src/Shared/EIDReader/lds/icao/dg11File.ts +28 -13
  57. package/src/Shared/EIDReader/nfcManagerCardService.ts +91 -13
  58. package/src/Shared/EIDReader/protocol/paceDH.ts +183 -0
  59. package/src/Shared/EIDReader/protocol/paceErrors.ts +41 -0
  60. package/src/Shared/EIDReader/protocol/paceProtocol.ts +72 -6
  61. package/src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts +7 -4
  62. package/src/Shared/Libs/country-display.utils.ts +12 -1
  63. package/src/Shared/Libs/diagnosticReport.ts +32 -1
  64. package/src/Shared/Libs/diagnostics.ts +38 -14
  65. package/src/Shared/Libs/mrz.utils.ts +193 -28
  66. package/src/Shared/Libs/mrzFrameAggregator.ts +38 -3
  67. package/src/Shared/Libs/mrzTransliteration.ts +16 -3
  68. package/src/Translation/Resources/en.ts +19 -0
  69. package/src/Translation/Resources/tr.ts +19 -0
  70. package/src/version.ts +1 -1
@@ -14,6 +14,37 @@ const RECOVERY_BUDGET_MS = 80;
14
14
  let recoveryDeadline = 0;
15
15
  const recoveryExpired = () => Date.now() > recoveryDeadline;
16
16
 
17
+ /**
18
+ * Reduce an ICAO document code to the single canonical class char the rest of the
19
+ * app keys off of: `'P'` for any passport (`P`, `P<`, `PP`, `PD`, `PS`, `PO`, …)
20
+ * and `'I'` for any identity card (`I`, `ID`, `IR`, `AC`, `C`, …). The full
21
+ * subtype is informative but every downstream check is `=== 'I'` / `=== 'P'`, so
22
+ * carrying `PP`/`ID` here only mis-classifies the document (German passport `PP`
23
+ * → UNKNOWN). The chip/NFC path keeps the raw code; this normalizes the OCR path.
24
+ */
25
+ const normalizeDocumentCode = code => {
26
+ if (!code) return null;
27
+ const c = code.toUpperCase();
28
+ if (c[0] === 'P') return 'P';
29
+ // TD1/TD2 identity documents: I, ID, IR, AC, AR, C, etc. — all reduce to 'I'.
30
+ return 'I';
31
+ };
32
+
33
+ /**
34
+ * Strip MRZ filler characters from a human-readable text field. In the MRZ a
35
+ * single `<` separates words and `<<` separates components; the `mrz` package
36
+ * usually trims trailing fillers but can leave embedded `<`/`<<` in name and
37
+ * optional-data fields, which then surfaced raw in the UI (e.g.
38
+ * "ANNA<<MARIA"). Convert any filler run to a single space and trim, so the
39
+ * displayed value reads "ANNA MARIA". Returns null for empty/filler-only input.
40
+ * Only for text fields — never call on dates, sex, codes, or check digits.
41
+ */
42
+ const cleanMRZTextField = value => {
43
+ if (!value) return null;
44
+ const cleaned = value.replace(/</g, ' ').replace(/\s+/g, ' ').trim();
45
+ return cleaned.length > 0 ? cleaned : null;
46
+ };
47
+
17
48
  /**
18
49
  * Pads a TD1 line to the fixed 30-char width.
19
50
  *
@@ -271,32 +302,132 @@ const reconstructMRZCandidates = rawText => {
271
302
  const flat = ocrLines.join('');
272
303
  const pad = (s, len) => s.length >= len ? s.slice(0, len) : s.padEnd(len, '<');
273
304
 
274
- // Restore the filler right after the document code. In TD1/TD2/TD3 the second
275
- // character of line 1 is always "<". OCR commonly reads it as "K" or drops it:
276
- // "IKD…" -> "I<D…", "ITUR…" -> "I<TUR…", "I<D…" unchanged.
277
- const fixDocStart = s => s.replace(/^([ACIPV])([A-Z0-9<])/, (_m, code, next) => next === '<' ? code + next : code + '<' + (next === 'K' ? '' : next));
305
+ // Repair the document-subtype character (line 1, position 2). For TD1/TD2 IDs
306
+ // this is usually "<" and OCR may read it as "K"; collapse that misread back to
307
+ // "<". But for PASSPORTS position 2 is a real subtype LETTER (German ordinary
308
+ // passports are "PP", and "PC"/"PD"/"PR"/… exist) it must NOT be rewritten,
309
+ // or the whole line shifts right and validation fails. So only normalise a "K"
310
+ // misread (→ "<"); leave any other letter/filler exactly as read.
311
+ const fixDocStart = s => s.replace(/^([ACIPV])([A-Z0-9<])/, (_m, code, next) => next === 'K' ? code + '<' : code + next);
278
312
  const candidates = [];
279
313
 
280
314
  // Helper: the OCR line that actually starts the MRZ (doc code + state pattern),
281
315
  // so title/front-of-card text mixed into the blob can't create a false anchor.
282
316
  const docLine = ocrLines.find(l => /^[ACIPV][A-Z0-9<]{3,}<</.test(l));
283
317
 
318
+ // Passport/TD-x line-2 signature: docNumber(9) + check + nationality(3) +
319
+ // birth(6)+check+sex+expiry(6)+check… Allow letters in the nationality and
320
+ // date spans (OCR reads 0↔O, 1↔I, etc.); the check-digit recovery downstream
321
+ // resolves them. A too-strict [A-Z]{3}/[0-9]{6} here was dropping the whole
322
+ // TD3/TD2 candidate on any noisy frame, leaving only a (wrong) 3-line TD1.
323
+ const td23Line2 = /[A-Z0-9<]{9}[0-9<][A-Z<]{3}[A-Z0-9<]{6}[0-9<][MF<][A-Z0-9<]{6}[0-9<]/;
324
+
325
+ // LINE-AWARE line-2 finder. Real ML Kit OCR (a) prepends non-MRZ header text
326
+ // and (b) SPLITS a long MRZ line at its trailing filler run into two OCR lines
327
+ // (e.g. "…1204159<<<<<" + "<<<<<08"). The flat-blob approach loses line
328
+ // boundaries — a greedy line-1 match overruns into line 2, and the line-2
329
+ // regex can match a doc-number-shaped run inside line 1's name field. So work
330
+ // from `ocrLines`: find the doc-number record line, and if it's short (split),
331
+ // stitch following fragment lines onto it up to the format width. The check
332
+ // digits (incl. the trailing composite) then survive instead of being padded
333
+ // away. Returns null if no doc-number line exists at/after the line-1 index.
334
+ // Local 7-3-1 check digit (icaoCheckDigit is defined later in the module).
335
+ const cd731 = str => {
336
+ const w = [7, 3, 1];
337
+ let sum = 0;
338
+ for (let i = 0; i < str.length; i++) {
339
+ const c = str[i];
340
+ const v = c === '<' ? 0 : c >= '0' && c <= '9' ? c.charCodeAt(0) - 48 : c.charCodeAt(0) - 55;
341
+ sum = (sum + w[i % 3] * v) % 10;
342
+ }
343
+ return String(sum);
344
+ };
345
+ const findLine2 = (l1Index, width) => {
346
+ for (let i = l1Index + 1; i < ocrLines.length; i++) {
347
+ const m = td23Line2.exec(ocrLines[i]);
348
+ if (!m || m.index !== 0) continue;
349
+ // The front 28 chars — docNumber(9)+check + nationality(3) +
350
+ // birth(6)+check + sex + expiry(6)+check — are positionally stable in OCR.
351
+ // The optional-data field and the two trailing check digits are what an
352
+ // OCR line-split garbles (dropped fillers shift the composite digit). For
353
+ // TD3 (width 44) REBUILD the line canonically: stable front + empty
354
+ // optional + recomputed optional-check + recomputed composite. This is
355
+ // robust to the split-filler ambiguity that single-frame stitching can't
356
+ // resolve. (Passports with a NON-empty optional/personal-number field are
357
+ // rarer; multi-frame voting still covers those via the stitch fallback.)
358
+ const front = m[0]; // exactly 28 chars by the regex
359
+ if (width === 44 && front.length >= 28) {
360
+ let head = front.slice(0, 28);
361
+ // Self-correct the document number against its OWN check digit before we
362
+ // recompute the composite — otherwise a recomputed composite would be
363
+ // self-consistent with an OCR look-alike error (e.g. O→0) and MASK it
364
+ // from the downstream ambiguous-char recovery. Try the digit/letter
365
+ // look-alike swaps in the 9-char doc-number field until its check digit
366
+ // (position 9) matches; only then rebuild the optional + composite.
367
+ const docNum = head.slice(0, 9);
368
+ const docCheck = head[9];
369
+ if (cd731(docNum) !== docCheck) {
370
+ const swaps = {
371
+ O: '0',
372
+ Q: '0',
373
+ D: '0',
374
+ I: '1',
375
+ L: '1',
376
+ S: '5',
377
+ B: '8',
378
+ Z: '2',
379
+ G: '6'
380
+ };
381
+ const fixed = docNum.replace(/[OQDILSBZG]/g, c => swaps[c] ?? c);
382
+ if (cd731(fixed) === docCheck) {
383
+ head = fixed + head.slice(9);
384
+ }
385
+ }
386
+ const optional = '<'.repeat(14);
387
+ const l2NoComposite = head + optional + cd731(optional);
388
+ const composite = l2NoComposite.slice(0, 10) + l2NoComposite.slice(13, 20) + l2NoComposite.slice(21, 43);
389
+ return l2NoComposite + cd731(composite);
390
+ }
391
+ // Non-TD3 or unexpected: stitch fragments up to width as a fallback.
392
+ let joined = ocrLines[i];
393
+ let j = i + 1;
394
+ while (joined.length < width && j < ocrLines.length) {
395
+ joined += ocrLines[j];
396
+ j++;
397
+ }
398
+ return joined.length >= width ? joined.slice(0, width) : joined;
399
+ }
400
+ return null;
401
+ };
402
+
284
403
  // ---- TD3 (passport): line1 "P<XXX…", line2 starts with a 9-char doc number ----
285
- // Line 2 signature: docNumber(9) + check + nationality(3) + birth(6)+check+sex+expiry(6)+check…
286
404
  {
287
- const l1m = flat.match(/P[<A-Z]TUR[A-Z<]{2,}|P<[A-Z]{3}[A-Z<]+/);
288
- const l2m = flat.match(/[A-Z0-9<]{9}[0-9<][A-Z]{3}[0-9]{6}[0-9<][MF<][0-9]{6}[0-9<]/);
289
- if (l1m && l2m) {
290
- candidates.push([pad(fixDocStart(l1m[0]), 44), pad(l2m[0], 44)]);
405
+ // Position 2 of line 1 is the "<" filler, frequently misread under glare as a
406
+ // filler-letter (K/C/E/G) — accept those for ALL issuers, not just TUR.
407
+ // Line-1 structure (ICAO 9303): doc code "P" + 1-char subtype (often "<",
408
+ // but a LETTER for some issuers — e.g. German ordinary passports are "PP",
409
+ // and "PC"/"PD" exist) + issuing state (1–3 letters then "<" filler; Germany
410
+ // is "D" → "PPD<<"). Find line 1 among the OCR lines (NOT the flat blob, whose
411
+ // greedy match overruns line boundaries).
412
+ const l1Index = ocrLines.findIndex(l => /^P[A-Z<][A-Z][A-Z<]{2}[A-Z<]/.test(l));
413
+ const l1Raw = l1Index >= 0 ? ocrLines[l1Index] : null;
414
+ const l2 = l1Index >= 0 ? findLine2(l1Index, 44) : null;
415
+ if (l1Raw && l2) {
416
+ candidates.push([pad(fixDocStart(l1Raw), 44), pad(l2, 44)]);
291
417
  }
292
418
  }
293
419
 
294
420
  // ---- TD2: line1 "X<XXX…", line2 starts with docNumber ----
295
421
  {
296
- const l1m = flat.match(/[ACIPV]<[A-Z]{3}[A-Z<]+/);
297
- const l2m = flat.match(/[A-Z0-9<]{9}[0-9<][A-Z]{3}[0-9]{6}[0-9<][MF<][0-9]{6}[0-9<]/);
298
- if (l1m && l2m) {
299
- candidates.push([pad(fixDocStart(l1m[0]), 36), pad(l2m[0], 36)]);
422
+ // TD2/ID doc codes are A/C/I (NOT P — that's a passport/TD3; including it
423
+ // here made passports get built as a 36-char TD2 and win selection). Position
424
+ // 2 is the SUBTYPE — any A–Z or "<" ("IR","IP","AR","AC"…). Line-aware (see
425
+ // TD3): find line 1 in ocrLines, stitch a split line 2.
426
+ const l1Index = ocrLines.findIndex(l => /^[ACI][A-Z<][A-Z][A-Z<]{2}[A-Z<]/.test(l));
427
+ const l1Raw = l1Index >= 0 ? ocrLines[l1Index] : null;
428
+ const l2 = l1Index >= 0 ? findLine2(l1Index, 36) : null;
429
+ if (l1Raw && l2) {
430
+ candidates.push([pad(fixDocStart(l1Raw), 36), pad(l2, 36)]);
300
431
  }
301
432
  }
302
433
 
@@ -309,8 +440,18 @@ const reconstructMRZCandidates = rawText => {
309
440
  // birth(6)+check+sex+expiry(6)+check+state(3). Allow letters in date spans
310
441
  // for OCR slips; check-digit recovery resolves them.
311
442
  const l2Line = ocrLines.find(l => /^[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z<]{2,}/.test(l));
312
- const l2m = l2Line ?? flat.match(/[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z]{2,3}/)?.[0];
313
- if (l1Source) {
443
+ const l2m = l2Line ?? flat.match(/[0-9A-Z]{6}[0-9<][MF<][0-9A-Z]{6}[0-9<][A-Z<]{2,3}/)?.[0];
444
+
445
+ // Don't emit a 3-line TD1 candidate for passport-shaped input. A passport
446
+ // (TD3) line 1 starts with "P" + a subtype char (a filler "<" OR a real
447
+ // letter — German ordinary passports are "PP", and "PC"/"PD"/… exist), or
448
+ // the band is two long ~44-char lines. Matching ANY "P"-prefixed L1 is safe:
449
+ // no valid TD1 (doc codes A/C/I only) ever starts with "P". Without this
450
+ // guard a noisy passport whose TD3 line-2 regex just missed would fall
451
+ // through to here and be forced into a 3×30 TD1 layout — the "always 3
452
+ // lines, invalid" bug.
453
+ const looksLikePassport = !!l1Source && /^P[A-Z<]/.test(l1Source) || ocrLines.length === 2 && ocrLines.every(l => Math.abs(l.length - 44) <= 4);
454
+ if (l1Source && !looksLikePassport) {
314
455
  let l1 = pad(fixDocStart(l1Source), 30);
315
456
  // The issuing-state field (TD1 line 1, positions 2–5) is structurally
316
457
  // fillers/letters only — never a personal name — so a "K" there flanked by
@@ -358,9 +499,12 @@ const reconstructMRZCandidates = rawText => {
358
499
  return l
359
500
  // digit look-alikes inside the name → letters
360
501
  .replace(/[015862]/g, d => digitToLetter[d] ?? d)
361
- // a run of filler-letters (K/C/E/G) flanked by fillers or at the tail
362
- // is the trailing/internal filler region
363
- .replace(/(?<=<)[KCEG]+(?=<|$)/g, m => '<'.repeat(m.length)).replace(/[KCEG]+$/g, m => '<'.repeat(m.length));
502
+ // ONLY collapse the TRAILING run of filler-letters (K/C/E/G) that
503
+ // region is unambiguous "<" padding. Do NOT collapse internal runs
504
+ // flanked by fillers: a short given/sur-name made only of K/C/E/G
505
+ // (e.g. Turkish "ECE"/"EGE", "GEC") sits between "<<" separators and
506
+ // would be wrongly erased.
507
+ .replace(/[KCEG]+$/g, m => '<'.repeat(m.length));
364
508
  };
365
509
  const nameRuns = ocrLines.filter(isNameLike);
366
510
  const bestName = nameRuns.sort((a, b) => b.length - a.length)[0] ?? '';
@@ -1131,18 +1275,20 @@ const validateMRZ = (mrzText, autocorrect = true) => {
1131
1275
 
1132
1276
  // Map mrz package fields to our MRZFields type
1133
1277
  const fields = {
1134
- documentCode: result.fields.documentCode || null,
1278
+ documentCode: normalizeDocumentCode(result.fields.documentCode),
1135
1279
  issuingState: result.fields.issuingState || null,
1136
1280
  documentNumber: result.fields.documentNumber || null,
1137
1281
  nationality: result.fields.nationality || null,
1138
- lastName: result.fields.lastName || null,
1139
- firstName: result.fields.firstName || null,
1282
+ // Text fields can carry embedded MRZ filler (`<`/`<<`) — strip it so the
1283
+ // UI shows "ANNA MARIA", not "ANNA<<MARIA".
1284
+ lastName: cleanMRZTextField(result.fields.lastName),
1285
+ firstName: cleanMRZTextField(result.fields.firstName),
1140
1286
  sex: result.fields.sex || null,
1141
1287
  birthDate: result.fields.birthDate || null,
1142
1288
  expirationDate: result.fields.expirationDate || null,
1143
- personalNumber: result.fields.personalNumber || null,
1144
- optional1: result.fields.optional1 || null,
1145
- optional2: result.fields.optional2 || null
1289
+ personalNumber: cleanMRZTextField(result.fields.personalNumber),
1290
+ optional1: cleanMRZTextField(result.fields.optional1),
1291
+ optional2: cleanMRZTextField(result.fields.optional2)
1146
1292
  };
1147
1293
  return {
1148
1294
  valid: true,
@@ -1254,5 +1400,6 @@ export default {
1254
1400
  assessMRZQuality,
1255
1401
  isValidOCRBPattern,
1256
1402
  applyOCRBCorrections,
1257
- convertMRZDateToISODate
1403
+ convertMRZDateToISODate,
1404
+ normalizeDocumentCode
1258
1405
  };
@@ -69,6 +69,29 @@ const linesForFrame = text => {
69
69
  const rawLines = text.split('\n').map(l => l.trim().replace(/[^A-Z0-9<]/gi, '').toUpperCase()).filter(Boolean);
70
70
  const exact = exactFormatLines(rawLines);
71
71
  if (exact) return exact;
72
+
73
+ // Near-format catch for 2-line bands (TD3 passport 2×44, TD2 2×36). A passport
74
+ // OCR'd a few chars off (2×43, 2×45) would otherwise fall into the TD1-biased
75
+ // reconstruction and be forced into a wrong 3×30 layout. When we have exactly
76
+ // two lines both close to a 2-line format's width, coerce them to that width
77
+ // and keep them as-is (2 lines) rather than reconstructing. Tie-break to the
78
+ // closest width. Never matches a 3-line TD1 (line count differs).
79
+ if (rawLines.length === 2) {
80
+ const twoLineFormats = Object.values(FORMAT_GEOMETRY).filter(g => g.lines === 2);
81
+ let bestGeom = null;
82
+ let bestDelta = Infinity;
83
+ for (const g of twoLineFormats) {
84
+ const delta = Math.max(...rawLines.map(l => Math.abs(l.length - g.width)));
85
+ if (delta <= 4 && delta < bestDelta) {
86
+ bestDelta = delta;
87
+ bestGeom = g;
88
+ }
89
+ }
90
+ if (bestGeom) {
91
+ const w = bestGeom.width;
92
+ return rawLines.map(l => l.length >= w ? l.slice(0, w) : l.padEnd(w, '<'));
93
+ }
94
+ }
72
95
  const candidates = mrzUtils.reconstructMRZCandidates(text);
73
96
  if (!candidates.length) {
74
97
  // Fall back to the lightweight fixMRZ split for already-clean text.
@@ -84,7 +107,12 @@ const linesForFrame = text => {
84
107
  let best = null;
85
108
  let bestScore = -1;
86
109
  for (const cand of candidates) {
87
- const geom = Object.values(FORMAT_GEOMETRY).find(g => g.lines === cand.length);
110
+ // Among formats with this line count, pick the one whose width best matches
111
+ // the candidate's lines. TD2 and TD3 are BOTH 2 lines (36 vs 44) — matching
112
+ // by line count alone wrongly picked TD2 for a 44-wide passport, then the
113
+ // ">6 off width" guard discarded it. Average line length disambiguates.
114
+ const avgLen = cand.reduce((s, l) => s + l.length, 0) / Math.max(1, cand.length);
115
+ const geom = Object.values(FORMAT_GEOMETRY).filter(g => g.lines === cand.length).sort((a, b) => Math.abs(a.width - avgLen) - Math.abs(b.width - avgLen))[0];
88
116
  if (!geom) continue;
89
117
  // Reject if any line is wildly off the expected width (likely not the band).
90
118
  if (cand.some(l => Math.abs(l.length - geom.width) > 6)) continue;
@@ -45,7 +45,20 @@ function convertName(rawName, map) {
45
45
  return rawName.split(' ').map(word => applyDigraphMap(word, map)).join(' ');
46
46
  }
47
47
  export function buildDocumentName(rawFirst, rawLast, issuingState, dg11First, dg11Last) {
48
- if (dg11First != null && dg11Last != null && (dg11First || dg11Last)) {
48
+ // Prefer DG11 (the chip's printed name in UTF-8) ONLY when it carries a proper
49
+ // two-part split — both a surname AND a given name. That is the authoritative
50
+ // correction for chips whose DG1 MRZ name lacks a `<<` separator (e.g. Turkish
51
+ // PACE passports), where the raw MRZ would otherwise put the full name into
52
+ // the surname.
53
+ //
54
+ // A one-sided DG11 result (only surname, or only given name) is NOT reliable —
55
+ // it usually means DG11 had no clear separator, so we don't know which part it
56
+ // is. Back-filling the missing side from the raw MRZ caused the given name to
57
+ // be duplicated into both fields, so we now fall through to the MRZ-based
58
+ // split instead, which is more trustworthy than mixing the two sources.
59
+ const hasFirst = (dg11First ?? '') !== '';
60
+ const hasLast = (dg11Last ?? '') !== '';
61
+ if (hasFirst && hasLast) {
49
62
  return {
50
63
  rawFirst,
51
64
  rawLast,
@@ -50,6 +50,11 @@ export default {
50
50
  'diagnosticReport.noticeBody': 'This opens a draft with your scan data, document images and technical details so support can help resolve a scanning issue. Review it before sending.',
51
51
  'diagnosticReport.continue': 'Continue',
52
52
  'diagnosticReport.cancel': 'Cancel',
53
+ 'diagnosticReport.shareFailedTitle': "Couldn't open the share sheet",
54
+ 'diagnosticReport.shareFailedBody': "We couldn't attach the report to share. Send it securely to support instead?",
55
+ 'diagnosticReport.uploadAction': 'Send to support',
56
+ 'diagnosticReport.uploadSuccess': 'Diagnostic report sent to support.',
57
+ 'diagnosticReport.uploadFailed': "Couldn't send the report. Please try again later.",
53
58
  'livenessDetectionScreen.guideHeader': 'Face Verification',
54
59
  'livenessDetectionScreen.guideText': 'Please ensure the following for best results:',
55
60
  'livenessDetectionScreen.guidePoint1': 'Remove glasses, hats, or face coverings',
@@ -72,6 +77,13 @@ export default {
72
77
  'eidScannerScreen.guideHeader': 'NFC Document Scan',
73
78
  'eidScannerScreen.guideText': 'When prompted, hold your document flat against the back of your device near the NFC antenna.',
74
79
  'eidScannerScreen.invalidMRZFields': 'Document information could not be read. Please try again.',
80
+ 'eidScannerScreen.error': 'Error',
81
+ 'eidScannerScreen.errorCode': 'Error code',
82
+ 'eidScannerScreen.nfcGenericError': 'Something went wrong while reading your document. Please try again. If the problem continues, contact support with the code below.',
83
+ 'eidScannerScreen.nfcReadFailed': 'Could not read the chip. Hold the document flat against the back of your device and keep it still, then try again.',
84
+ 'eidScannerScreen.nfcAuthFailed': 'Could not establish a secure connection to the chip. Make sure the document number, date of birth and expiry date are correct, then try again.',
85
+ 'eidScannerScreen.nfcTagLost': 'Connection to the document was lost. Keep the document still against the device and try again.',
86
+ 'eidScannerScreen.nfcTimeout': 'Reading the chip timed out. Hold the document steady against the device and try again.',
75
87
  'eidScannerScreen.faceImageNotFound': 'Photo data not found on document.',
76
88
  'eidScannerScreen.documentCode': 'Document Type',
77
89
  'eidScannerScreen.nationality': 'Nationality',
@@ -50,6 +50,11 @@ export default {
50
50
  'diagnosticReport.noticeBody': 'Bu işlem; tarama verilerinizi, belge görüntülerinizi ve teknik ayrıntıları içeren bir taslak açar; böylece destek ekibi tarama sorununu çözebilir. Göndermeden önce gözden geçirin.',
51
51
  'diagnosticReport.continue': 'Devam et',
52
52
  'diagnosticReport.cancel': 'İptal',
53
+ 'diagnosticReport.shareFailedTitle': 'Paylaşım ekranı açılamadı',
54
+ 'diagnosticReport.shareFailedBody': 'Raporu paylaşmak için ekleyemedik. Bunun yerine destek ekibine güvenli şekilde gönderelim mi?',
55
+ 'diagnosticReport.uploadAction': 'Desteğe gönder',
56
+ 'diagnosticReport.uploadSuccess': 'Tanılama raporu destek ekibine gönderildi.',
57
+ 'diagnosticReport.uploadFailed': 'Rapor gönderilemedi. Lütfen daha sonra tekrar deneyin.',
53
58
  'livenessDetectionScreen.guideHeader': 'Yüz Doğrulaması',
54
59
  'livenessDetectionScreen.guideText': 'En iyi sonuç için lütfen şunları sağlayın:',
55
60
  'livenessDetectionScreen.guidePoint1': 'Gözlük, şapka veya yüz aksesuarlarını çıkarın',
@@ -72,6 +77,13 @@ export default {
72
77
  'eidScannerScreen.guideHeader': 'NFC Belge Taraması',
73
78
  'eidScannerScreen.guideText': 'İstendiğinde, belgenizi cihazınızın arka tarafındaki NFC antenine düz bir şekilde yaklaştırın.',
74
79
  'eidScannerScreen.invalidMRZFields': 'Belge bilgileri okunamadı. Lütfen tekrar deneyin.',
80
+ 'eidScannerScreen.error': 'Hata',
81
+ 'eidScannerScreen.errorCode': 'Hata kodu',
82
+ 'eidScannerScreen.nfcGenericError': 'Belgeniz okunurken bir sorun oluştu. Lütfen tekrar deneyin. Sorun devam ederse aşağıdaki kod ile destek ekibimize başvurun.',
83
+ 'eidScannerScreen.nfcReadFailed': 'Çip okunamadı. Belgeyi cihazınızın arkasına düz şekilde yaslayıp sabit tutun ve tekrar deneyin.',
84
+ 'eidScannerScreen.nfcAuthFailed': 'Çip ile güvenli bağlantı kurulamadı. Belge numarası, doğum tarihi ve son geçerlilik tarihinin doğru olduğundan emin olup tekrar deneyin.',
85
+ 'eidScannerScreen.nfcTagLost': 'Belge ile bağlantı kesildi. Belgeyi cihaza sabit tutun ve tekrar deneyin.',
86
+ 'eidScannerScreen.nfcTimeout': 'Çip okuması zaman aşımına uğradı. Belgeyi cihaza sabit tutup tekrar deneyin.',
75
87
  'eidScannerScreen.faceImageNotFound': 'Belgede fotoğraf verisi bulunamadı.',
76
88
  'eidScannerScreen.documentCode': 'Belge Türü',
77
89
  'eidScannerScreen.nationality': 'Uyruk',
@@ -2,4 +2,4 @@
2
2
 
3
3
  // This file is auto-generated. Do not edit manually.
4
4
  // Version is synced from package.json during build.
5
- export const SDK_VERSION = '1.486.0';
5
+ export const SDK_VERSION = '1.488.0';
@@ -1 +1 @@
1
- {"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgBpD,UAAU,eAAe;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,KACtB,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED,QAAA,MAAM,UAAU,GAAI,6FAOjB,eAAe,4CAsrBjB,CAAC;AA4NF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiBpD,UAAU,eAAe;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,KACtB,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED,QAAA,MAAM,UAAU,GAAI,6FAOjB,eAAe,4CAqwBjB,CAAC;AA4NF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;AACrD,eAAO,MAAM,oBAAoB,QAAe,CAAC;AAIjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,sBAAsB;;;;;;;;;;CAUzB,CAAC;AAKX,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
1
+ {"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;AASrD,eAAO,MAAM,oBAAoB,QAAyC,CAAC;AAI3E,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,sBAAsB;;;;;;;;;;CAUzB,CAAC;AAKX,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import { InputStream } from './java/inputStream';
2
2
  import type { FileSystemStructured } from './smartcards/fileSystemStructured';
3
3
  export declare class CardFileInputStream extends InputStream {
4
+ /** Max re-issues of a single block read before failing — mitigates transient
5
+ * iOS NFC transceive drops during large-file reads (e.g. DG2). */
6
+ private static readonly MAX_BLOCK_READ_RETRIES;
4
7
  private path;
5
8
  private buffer;
6
9
  private bufferLength;
@@ -1 +1 @@
1
- {"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;IAuDV,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAahC,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;IAUb,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;YAIP,kBAAkB;IA+BhC,OAAO,CAAC,YAAY;CAoBrB"}
1
+ {"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD;uEACmE;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAEnD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;IA2EV,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAahC,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;IAUb,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;YAIP,kBAAkB;IA+BhC,OAAO,CAAC,YAAY;CAoBrB"}
@@ -15,6 +15,10 @@ export declare class DefaultFileSystem implements FileSystemStructured {
15
15
  private wrapper;
16
16
  private oldWrapper;
17
17
  constructor(service: APDULevelReadBinaryCapable, isSFIEnabled: boolean, fidToSFI?: Map<number, number>);
18
+ /** Deep-copy a secure-messaging wrapper PRESERVING its cipher type (AES vs
19
+ * 3DES), so the SSC can be rewound for a retry without changing the MAC/enc
20
+ * algorithm. Non-SM wrappers are returned as-is. */
21
+ private cloneWrapper;
18
22
  setWrapper(wrapper: APDUWrapper): void;
19
23
  getWrapper(): APDUWrapper;
20
24
  getMaxReadBinaryLength(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAc;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAEtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAe;gBAG/B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,OAAO,EACrB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAA6B;IAWpD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKtC,UAAU;IAIV,sBAAsB,IAAI,MAAM;IAI1B,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IASnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQvB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YA6E9D,WAAW;YA4DX,cAAc;IAI5B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,cAAc;YAgBR,aAAa;CAgC5B"}
1
+ {"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAc;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAEtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAe;gBAG/B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,OAAO,EACrB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAA6B;IAsB3D;;yDAEqD;IACrD,OAAO,CAAC,YAAY;IAgBb,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKtC,UAAU;IAIV,sBAAsB,IAAI,MAAM;IAI1B,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IASnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQvB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YA2G9D,WAAW;YA4DX,cAAc;IAI5B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,cAAc;YAgBR,aAAa;CAgC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAsT7C,QAAA,MAAM,SAAS,GACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAC5C,OAAO,CACN;IACE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GACD,SAAS,CA+TZ,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA0X7C,QAAA,MAAM,SAAS,GACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAC5C,OAAO,CACN;IACE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GACD,SAAS,CA+XZ,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;CAiBlB"}
1
+ {"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;CAgClB"}
@@ -5,9 +5,17 @@ export declare class NFCManagerCardService extends CardService {
5
5
  private isOpened;
6
6
  open(): Promise<void>;
7
7
  getIsOpen(): boolean;
8
+ private sessionRestartEnabled;
9
+ setSessionRestartEnabled(enabled: boolean): void;
8
10
  transmit(commandAPDU: CommandAPDU): Promise<ResponseAPDU>;
9
11
  getATR(): Uint8Array;
10
- getIsConnectionLost(_error: Error): boolean;
12
+ getIsConnectionLost(error: Error): boolean;
13
+ /** True if the error looks like a dropped/timed-out CoreNFC tag connection
14
+ * (as opposed to a real APDU/crypto failure). */
15
+ isTagLost(error: unknown): boolean;
16
+ /** Re-establish the CoreNFC session (iOS) so a fresh handshake can be retried
17
+ * after a tag drop. No-op on Android. Best-effort. */
18
+ restartSession(): Promise<void>;
11
19
  close(): Promise<void>;
12
20
  }
13
21
  //# sourceMappingURL=nfcManagerCardService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAS;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,SAAS,IAAI,OAAO;IAId,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB/D,MAAM,IAAI,UAAU;IAIpB,mBAAmB,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
1
+ {"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAiCzD,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAS;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,SAAS,IAAI,OAAO;IAQ3B,OAAO,CAAC,qBAAqB,CAAS;IAE/B,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwC/D,MAAM,IAAI,UAAU;IAIpB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKjD;sDACkD;IAC3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIzC;2DACuD;IAC1C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * DH (modular exponentiation, non-EC) primitives for PACE Generic Mapping.
3
+ *
4
+ * Modern ePassports/eIDs use ECDH almost universally; a minority of documents
5
+ * negotiate classic DH PACE. This module provides the DH math as pure,
6
+ * unit-testable functions so it can be verified against the ICAO 9303 Part 11
7
+ * worked example before it ever touches a chip. It is deliberately separate from
8
+ * the EC path in paceProtocol.ts — the working ECDH handshake is not modified.
9
+ *
10
+ * References: ICAO Doc 9303 Part 11 §4.4.3.2 (Generic Mapping), BSI TR-03110
11
+ * Part 3 §3.3.1, RFC 5114 (standardized MODP groups), TR-03110 Table A.1
12
+ * (standardized domain parameter IDs 0–7).
13
+ */
14
+ /** A DH group: safe-prime modulus p, generator g, and subgroup order q. */
15
+ export interface DHGroup {
16
+ /** prime modulus */
17
+ p: bigint;
18
+ /** generator */
19
+ g: bigint;
20
+ /** subgroup order (q) — used to size exponents */
21
+ q: bigint;
22
+ }
23
+ /**
24
+ * Standardized DH domain parameters by TR-03110 parameter ID.
25
+ * 0 → RFC 5114 §2.1 1024-bit MODP Group with 160-bit Prime Order Subgroup
26
+ * 1 → RFC 5114 §2.2 2048-bit MODP Group with 224-bit Prime Order Subgroup
27
+ * 2 → RFC 5114 §2.3 2048-bit MODP Group with 256-bit Prime Order Subgroup
28
+ * (IDs 3–7 are reserved/unused in practice; EC params start at 8.)
29
+ */
30
+ export declare const DH_GROUPS: Record<number, DHGroup>;
31
+ /**
32
+ * PACE DH Generic Mapping (ICAO 9303 Part 11 §4.4.3.2):
33
+ * shared secret h = PK_PICC ^ SK_PCD mod p
34
+ * mapped generator g~ = g^s · h mod p
35
+ * where s is the decrypted PICC nonce (a big-endian integer).
36
+ *
37
+ * Pure function over the group + the three inputs, so it can be checked against
38
+ * the ICAO worked example. `pkPicc` is the PICC mapping public key; `skPcd` the
39
+ * PCD mapping private key; `nonce` the decrypted nonce s.
40
+ */
41
+ export declare const dhGenericMapping: (group: DHGroup, skPcd: bigint, pkPicc: bigint, nonce: bigint) => {
42
+ sharedH: bigint;
43
+ mappedGenerator: bigint;
44
+ };
45
+ /**
46
+ * DH key agreement with a mapped generator (PACE step 3):
47
+ * PK = g~ ^ SK mod p (public key to send)
48
+ * K = PK_PICC ^ SK mod p (shared secret)
49
+ */
50
+ export declare const dhPublicKey: (group: DHGroup, mappedGenerator: bigint, sk: bigint) => bigint;
51
+ export declare const dhSharedSecret: (group: DHGroup, pkPicc: bigint, sk: bigint) => bigint;
52
+ /** Square-and-multiply modular exponentiation (constant-shape, bigint). */
53
+ export declare function modPow(base: bigint, exp: bigint, mod: bigint): bigint;
54
+ /** Fixed-width big-endian byte encoding of a DH value (left-padded to p's size). */
55
+ export declare const dhEncode: (value: bigint, group: DHGroup) => Buffer;
56
+ //# sourceMappingURL=paceDH.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paceDH.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceDH.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAoF7C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,EACd,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAK5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,OAAO,EACd,iBAAiB,MAAM,EACvB,IAAI,MAAM,KACT,MAA8C,CAAC;AAElD,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,EACd,QAAQ,MAAM,EACd,IAAI,MAAM,KACT,MAAqC,CAAC;AAEzC,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWrE;AAED,oFAAoF;AACpF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,KAAG,MASxD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Typed PACE errors.
3
+ *
4
+ * The point is to let the caller distinguish a PACE CAPABILITY gap (this build
5
+ * cannot run the variant the chip advertises — e.g. DH agreement, CAM mapping,
6
+ * an unregistered curve) from a RUNTIME failure (wrong key, tag lost, APDU
7
+ * error). Both fall back to BAC, but the diagnostics reason must differ so we
8
+ * can tell "we don't support this document's PACE" from "the read went wrong".
9
+ */
10
+ /** Why a PACE attempt could not even be run by this implementation. */
11
+ export type PACEUnsupportedReason = 'agreement' | 'mapping' | 'curve' | 'cipher';
12
+ /**
13
+ * Thrown when the chip advertises a PACE variant this build cannot perform.
14
+ * Carries a coarse, non-PII reason that maps directly to a diagnostics fallback
15
+ * reason (`pace_unsupported_<reason>`), so support can see exactly which
16
+ * capability was missing for a given document.
17
+ */
18
+ export declare class PACEUnsupportedError extends Error {
19
+ readonly paceUnsupported = true;
20
+ readonly reason: PACEUnsupportedReason;
21
+ constructor(reason: PACEUnsupportedReason, detail: string);
22
+ }
23
+ /** Type guard usable across module boundaries (instanceof is unreliable after
24
+ * transpilation/bundling, so we also check the marker flag). */
25
+ export declare const isPACEUnsupportedError: (e: unknown) => e is PACEUnsupportedError;
26
+ //# sourceMappingURL=paceErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paceErrors.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uEAAuE;AACvE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,SAAS,GACT,OAAO,GACP,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,eAAe,QAAQ;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBAE3B,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM;CAK1D;AAED;iEACiE;AACjE,eAAO,MAAM,sBAAsB,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,oBAIS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAIxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA8E1C;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,qCAAqC,CAAS;IACtD,OAAO,CAAC,cAAc,CAAU;gBAG9B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,8BAA8B,EAAE,MAAM,EACtC,qCAAqC,EAAE,MAAM,EAC7C,cAAc,EAAE,OAAO;IAUzB;;;;;;OAMG;IACU,MAAM,CACjB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAC5C,OAAO,CAAC,UAAU,CAAC;IAkKtB;;OAEG;YACW,WAAW;IAoCzB;;;OAGG;YACW,aAAa;IAmE3B;;;;;OAKG;YACW,aAAa;IAwD3B;;;OAGG;YACW,WAAW;IA+EzB;;;OAGG;YACW,WAAW;IAqDzB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA4B5C,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAczC;;OAEG;WACW,mBAAmB,CAC/B,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM;IAoBT,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB,OAAO,CAAC,MAAM,CAAC,cAAc;IA+B7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAcrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAwDnC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgE/B,OAAO,CAAC,MAAM,CAAC,IAAI;IAWnB;;OAEG;WACW,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CA6BxD"}
1
+ {"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAoI1C;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,qCAAqC,CAAS;IACtD,OAAO,CAAC,cAAc,CAAU;gBAG9B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,8BAA8B,EAAE,MAAM,EACtC,qCAAqC,EAAE,MAAM,EAC7C,cAAc,EAAE,OAAO;IAUzB;;;;;;OAMG;IACU,MAAM,CACjB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAC5C,OAAO,CAAC,UAAU,CAAC;IAyKtB;;OAEG;YACW,WAAW;IAoCzB;;;OAGG;YACW,aAAa;IAmE3B;;;;;OAKG;YACW,aAAa;IAyD3B;;;OAGG;YACW,WAAW;IA+EzB;;;OAGG;YACW,WAAW;IAqDzB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA4B5C,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAczC;;OAEG;WACW,mBAAmB,CAC/B,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM;IAoBT,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB,OAAO,CAAC,MAAM,CAAC,cAAc;IA+B7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAcrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAwDnC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgE/B,OAAO,CAAC,MAAM,CAAC,IAAI;IAWnB;;OAEG;WACW,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAgCxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkF7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAgC9B,OAAO,CAAC,MAAM,CAAC,iCAAiC;CAsCjD"}
1
+ {"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqF7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAgC9B,OAAO,CAAC,MAAM,CAAC,iCAAiC;CAsCjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,GAAG,IAAI,EAC1B,YAAY,MAAM,GAAG,IAAI,KACxB,MAsCF,CAAC"}
1
+ {"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,GAAG,IAAI,EAC1B,YAAY,MAAM,GAAG,IAAI,KACxB,MA0CF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAmBpD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAyDD,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,sBAgFH,CAAC"}
1
+ {"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA2CpD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAyDD,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,sBAuFH,CAAC"}