eyeling 1.16.2 → 1.16.4

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 (51) hide show
  1. package/HANDBOOK.md +4 -0
  2. package/README.md +0 -1
  3. package/examples/ershov-mixed-computation.n3 +106 -0
  4. package/examples/output/ershov-mixed-computation.n3 +15 -0
  5. package/eyeling.js +510 -263
  6. package/lib/cli.js +22 -12
  7. package/lib/engine.js +488 -251
  8. package/package.json +2 -3
  9. package/arctifacts/README.md +0 -59
  10. package/arctifacts/ackermann.html +0 -678
  11. package/arctifacts/auroracare.html +0 -1297
  12. package/arctifacts/bike-trip.html +0 -752
  13. package/arctifacts/binomial-theorem.html +0 -631
  14. package/arctifacts/bmi.html +0 -511
  15. package/arctifacts/building-performance.html +0 -750
  16. package/arctifacts/clinical-care.html +0 -726
  17. package/arctifacts/collatz.html +0 -403
  18. package/arctifacts/complex.html +0 -321
  19. package/arctifacts/control-system.html +0 -482
  20. package/arctifacts/delfour.html +0 -849
  21. package/arctifacts/earthquake-epicenter.html +0 -982
  22. package/arctifacts/eco-route.html +0 -662
  23. package/arctifacts/euclid-infinitude.html +0 -564
  24. package/arctifacts/euler-identity.html +0 -667
  25. package/arctifacts/exoplanet-transit.html +0 -1000
  26. package/arctifacts/faltings-theorem.html +0 -1046
  27. package/arctifacts/fibonacci.html +0 -299
  28. package/arctifacts/fundamental-theorem-arithmetic.html +0 -398
  29. package/arctifacts/godel-numbering.html +0 -743
  30. package/arctifacts/gps-bike.html +0 -759
  31. package/arctifacts/gps-clinical-bench.html +0 -792
  32. package/arctifacts/graph-french.html +0 -449
  33. package/arctifacts/grass-molecular.html +0 -592
  34. package/arctifacts/group-theory.html +0 -740
  35. package/arctifacts/health-info.html +0 -833
  36. package/arctifacts/kaprekar-constant.html +0 -576
  37. package/arctifacts/lee.html +0 -805
  38. package/arctifacts/linked-lists.html +0 -502
  39. package/arctifacts/lldm.html +0 -612
  40. package/arctifacts/matrix-multiplication.html +0 -502
  41. package/arctifacts/matrix.html +0 -651
  42. package/arctifacts/newton-raphson.html +0 -944
  43. package/arctifacts/peano-factorial.html +0 -456
  44. package/arctifacts/pi.html +0 -363
  45. package/arctifacts/polynomial.html +0 -646
  46. package/arctifacts/prime.html +0 -366
  47. package/arctifacts/pythagorean-theorem.html +0 -468
  48. package/arctifacts/rest-path.html +0 -469
  49. package/arctifacts/roots-of-unity.html +0 -363
  50. package/arctifacts/turing.html +0 -409
  51. package/arctifacts/wind-turbines.html +0 -726
@@ -1,576 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Kaprekar’s Constant (4‑digit)</title>
7
- <style>
8
- :root {
9
- --bg: #f6f8fb;
10
- --card: #ffffff;
11
- --text: #1f2937;
12
- --muted: #6b7280;
13
- --accent: #0ea5e9;
14
- --ring: rgba(14, 165, 233, 0.25);
15
- --border: #e5e7eb;
16
- }
17
- * {
18
- box-sizing: border-box;
19
- }
20
- html,
21
- body {
22
- height: 100%;
23
- }
24
- body {
25
- margin: 0;
26
- font:
27
- 16px/1.6 ui-sans-serif,
28
- system-ui,
29
- -apple-system,
30
- Segoe UI,
31
- Roboto,
32
- Ubuntu,
33
- Cantarell,
34
- Noto Sans,
35
- 'Helvetica Neue',
36
- Arial,
37
- 'Apple Color Emoji',
38
- 'Segoe UI Emoji';
39
- color: var(--text);
40
- background: radial-gradient(1400px 700px at 20% -10%, #ffffff 0, #f5fbff 40%, var(--bg) 100%);
41
- }
42
- .container {
43
- max-width: 980px;
44
- margin: 24px auto 80px;
45
- padding: 0 16px;
46
- }
47
- header {
48
- margin: 8px 0 22px;
49
- }
50
- h1 {
51
- font-size: clamp(24px, 3.6vw, 34px);
52
- margin: 0 0 6px;
53
- letter-spacing: -0.02em;
54
- }
55
- .subtitle {
56
- color: var(--muted);
57
- font-size: 14px;
58
- }
59
-
60
- /* Vertical cards */
61
- .card {
62
- background: var(--card);
63
- border: 1px solid var(--border);
64
- border-radius: 18px;
65
- padding: 20px clamp(16px, 2vw, 26px);
66
- margin: 14px 0;
67
- box-shadow:
68
- 0 10px 24px rgba(2, 8, 23, 0.04),
69
- 0 2px 6px rgba(2, 8, 23, 0.03);
70
- }
71
- .card h2 {
72
- display: flex;
73
- align-items: center;
74
- gap: 10px;
75
- font-size: clamp(18px, 2.6vw, 22px);
76
- margin: 0 0 10px;
77
- }
78
- .k-pill {
79
- display: inline-flex;
80
- align-items: center;
81
- gap: 8px;
82
- padding: 6px 10px;
83
- border-radius: 999px;
84
- background: #eaf6fe;
85
- color: #0369a1;
86
- border: 1px solid #d7eefc;
87
- font-size: 12px;
88
- text-transform: uppercase;
89
- letter-spacing: 0.06em;
90
- font-weight: 650;
91
- }
92
- .stats {
93
- display: grid;
94
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
95
- gap: 12px;
96
- margin-top: 10px;
97
- }
98
- .stat {
99
- background: #fcfdff;
100
- border: 1px solid var(--border);
101
- border-radius: 14px;
102
- padding: 10px 14px;
103
- }
104
- .stat .label {
105
- color: var(--muted);
106
- font-size: 12px;
107
- text-transform: uppercase;
108
- letter-spacing: 0.06em;
109
- }
110
- .stat .value {
111
- font-size: 20px;
112
- font-weight: 700;
113
- margin-top: 2px;
114
- }
115
-
116
- .muted {
117
- color: var(--muted);
118
- }
119
- .mono {
120
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
121
- }
122
- .codebox {
123
- background: #0b1220;
124
- color: #d7e2ff;
125
- border-radius: 14px;
126
- padding: 14px 16px;
127
- overflow: auto;
128
- border: 1px solid #1e2a44;
129
- }
130
- .proofbox {
131
- background: #fbfdff;
132
- border: 1px dashed var(--border);
133
- border-radius: 12px;
134
- padding: 12px 14px;
135
- }
136
-
137
- table {
138
- width: 100%;
139
- border-collapse: collapse;
140
- }
141
- th,
142
- td {
143
- padding: 8px 10px;
144
- text-align: left;
145
- border-bottom: 1px dashed var(--border);
146
- }
147
- th {
148
- font-size: 12px;
149
- color: var(--muted);
150
- text-transform: uppercase;
151
- letter-spacing: 0.06em;
152
- }
153
- tbody tr:hover {
154
- background: #fafcff;
155
- }
156
-
157
- details {
158
- border: 1px dashed var(--border);
159
- border-radius: 12px;
160
- padding: 10px 12px;
161
- background: #fbfdff;
162
- }
163
- details + details {
164
- margin-top: 10px;
165
- }
166
- summary {
167
- cursor: pointer;
168
- font-weight: 600;
169
- }
170
-
171
- .chips {
172
- display: flex;
173
- flex-wrap: wrap;
174
- gap: 8px;
175
- margin: 8px 0 0;
176
- }
177
- .chip {
178
- background: #f1f5f9;
179
- border: 1px solid var(--border);
180
- padding: 6px 10px;
181
- border-radius: 999px;
182
- font-variant-numeric: tabular-nums;
183
- }
184
- .footer-note {
185
- font-size: 12px;
186
- color: var(--muted);
187
- margin-top: 8px;
188
- }
189
- .small {
190
- font-size: 13px;
191
- }
192
- .accent {
193
- color: var(--accent);
194
- font-weight: 700;
195
- }
196
- .sep {
197
- height: 8px;
198
- }
199
- .kbd {
200
- font-weight: 650;
201
- border: 1px solid var(--border);
202
- background: #fff;
203
- padding: 2px 6px;
204
- border-radius: 6px;
205
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.05);
206
- }
207
-
208
- .badge {
209
- display: inline-flex;
210
- align-items: center;
211
- gap: 6px;
212
- padding: 2px 8px;
213
- border-radius: 999px;
214
- border: 1px solid var(--border);
215
- font-size: 12px;
216
- font-weight: 700;
217
- }
218
- .badge.pass {
219
- background: #ecfdf5;
220
- border-color: #bbf7d0;
221
- color: #065f46;
222
- }
223
- .badge.fail {
224
- background: #fef2f2;
225
- border-color: #fecaca;
226
- color: #7f1d1d;
227
- }
228
- </style>
229
- </head>
230
- <body>
231
- <div class="container">
232
- <header>
233
- <h1>Kaprekar’s Constant on 4‑digit States</h1>
234
- <div class="subtitle">
235
- An exhaustive, client‑side sweep of every 4‑digit state (keeping leading zeros) that runs Kaprekar’s routine,
236
- summarizes the results, and verifies them with reproducible checks.
237
- </div>
238
- </header>
239
-
240
- <!-- 1/ Answer -->
241
- <section class="card" aria-labelledby="answer-title">
242
- <h2 id="answer-title"><span class="k-pill">1/ Answer</span> Concise results</h2>
243
- <div class="stats">
244
- <div class="stat">
245
- <div class="label">Universe size</div>
246
- <div class="value mono" id="total">—</div>
247
- </div>
248
- <div class="stat">
249
- <div class="label">Converge to 6174</div>
250
- <div class="value mono">
251
- <span id="convergeCount">—</span> <span class="muted small">(<span id="convergePct">—</span>%)</span>
252
- </div>
253
- </div>
254
- <div class="stat">
255
- <div class="label">Don’t converge (rep‑digits)</div>
256
- <div class="value mono">
257
- <span id="nonCount">—</span> <span class="muted small">(<span id="nonPct">—</span>%)</span>
258
- </div>
259
- </div>
260
- <div class="stat">
261
- <div class="label">Max iterations to reach 6174</div>
262
- <div class="value mono" id="maxIter">—</div>
263
- </div>
264
- <div class="stat">
265
- <div class="label">Average iterations (convergers)</div>
266
- <div class="value mono" id="avgIter">—</div>
267
- </div>
268
- </div>
269
- <div class="footer-note">
270
- Iterations count how many routine steps are needed until the state first equals
271
- <span class="mono">6174</span>; starting at <span class="mono">6174</span> counts as
272
- <span class="mono">0</span>.
273
- </div>
274
- </section>
275
-
276
- <!-- 2/ Reason why -->
277
- <section class="card" aria-labelledby="reason-title">
278
- <h2 id="reason-title"><span class="k-pill">2/ Reason why</span> Mathematical explanation</h2>
279
- <div class="proofbox small">
280
- <p>
281
- <strong>Definition.</strong> Let <em>K</em> act on 4‑digit strings (leading zeros kept) as follows: write
282
- the digits in descending and ascending order to form two 4‑digit numbers, then subtract and pad with leading
283
- zeros to 4 digits. We denote the result by <em>K</em>(<em>x</em>).
284
- </p>
285
- <p>
286
- <strong>Fixed points and traps.</strong> (i) <span class="mono">6174</span> is a fixed point:
287
- <em>K</em>(6174) = 6174. (ii) For every rep‑digit <span class="mono">aaaa</span>, the ascending and
288
- descending sorts coincide, so <em>K</em>(<span class="mono">aaaa</span>) =
289
- <span class="mono">0000</span> and then <em>K</em>(<span class="mono">0000</span>) =
290
- <span class="mono">0000</span>. Thus the only non‑converging starts are the ten rep‑digits, which fall into
291
- the absorbing state <span class="mono">0000</span>.
292
- </p>
293
- <p>
294
- <strong>Claim.</strong> Every non‑rep‑digit 4‑digit state reaches <span class="mono">6174</span> in finitely
295
- many steps. The map <em>K</em> acts on the finite set of 10,000 states. Aside from the trap at
296
- <span class="mono">0000</span> (reached exactly by rep‑digits), there are no other cycles; consequently
297
- every orbit that avoids <span class="mono">0000</span> must flow into the fixed point
298
- <span class="mono">6174</span>. Our harness below confirms this by exhaustive enumeration and shows that the
299
- worst‑case time‑to‑reach is 7 steps.
300
- </p>
301
- </div>
302
- <p class="small muted">
303
- In short: rep‑digits collapse to <span class="mono">0000</span>; everything else flows to the unique fixed
304
- point <span class="mono">6174</span>.
305
- </p>
306
- </section>
307
-
308
- <!-- 3/ Checks (five, uncollapsed) -->
309
- <section class="card" aria-labelledby="check-title">
310
- <h2 id="check-title"><span class="k-pill">3/ Checks (harness)</span> Exhaustive sweep 0000–9999</h2>
311
-
312
- <details open id="check1">
313
- <summary>Check 1 — Universe accounting <span class="badge" id="chk1badge">—</span></summary>
314
- <p class="small">Do convergers + non‑convergers add up to 10,000?</p>
315
- <div class="chips">
316
- <span class="chip mono">Convergers: <span id="chk1conv">—</span></span>
317
- <span class="chip mono">Non‑convergers: <span id="chk1non">—</span></span>
318
- <span class="chip mono">Sum: <span id="chk1sum">—</span></span>
319
- </div>
320
- </details>
321
-
322
- <div class="sep"></div>
323
-
324
- <details open id="check2">
325
- <summary>Check 2 — Only rep‑digits fail to converge <span class="badge" id="chk2badge">—</span></summary>
326
- <p class="footer-note">Should be exactly: {0000,1111,2222,3333,4444,5555,6666,7777,8888,9999}.</p>
327
- <div id="non-list" class="chips"></div>
328
- </details>
329
-
330
- <div class="sep"></div>
331
-
332
- <details open id="check3">
333
- <summary>Check 3 — Max iterations equals 7 <span class="badge" id="chk3badge">—</span></summary>
334
- <p class="footer-note">
335
- First few starting states that achieve the maximum are shown. Click to toggle a full path.
336
- </p>
337
- <div class="chips">
338
- <span class="chip mono">max = <span id="maxIterAgain">—</span></span
339
- ><span class="chip mono">avg = <span id="avgIter">—</span></span>
340
- </div>
341
- <div id="max-list" class="chips"></div>
342
- <div id="max-paths"></div>
343
- </details>
344
-
345
- <div class="sep"></div>
346
-
347
- <details open id="check4">
348
- <summary>
349
- Check 4 — Distribution sums to converger count; includes k=0 <span class="badge" id="chk4badge">—</span>
350
- </summary>
351
- <div class="footer-note">
352
- Each row shows how many starting states first hit <span class="mono">6174</span> after exactly
353
- <span class="mono">k</span> steps.
354
- </div>
355
- <div class="sep"></div>
356
- <table aria-describedby="dist-caption">
357
- <caption id="dist-caption" class="visually-hidden">
358
- Iteration distribution
359
- </caption>
360
- <thead>
361
- <tr>
362
- <th>k steps</th>
363
- <th>count</th>
364
- <th>percent</th>
365
- <th>example path</th>
366
- </tr>
367
- </thead>
368
- <tbody id="distribution-body"></tbody>
369
- </table>
370
- </details>
371
-
372
- <div class="sep"></div>
373
-
374
- <details open id="check5">
375
- <summary>Check 5 — Fixed point & zero‑padding invariant <span class="badge" id="chk5badge">—</span></summary>
376
- <ul class="small">
377
- <li><span class="mono">step(6174)</span> = <span class="mono" id="fpResult">—</span></li>
378
- <li>All intermediate states are 4‑digit strings: <span id="padCheck">—</span></li>
379
- </ul>
380
- </details>
381
- </section>
382
-
383
- <section class="card" aria-labelledby="how-title">
384
- <h2 id="how-title"><span class="k-pill">Appendix</span> How this page checks things</h2>
385
- <p class="small">
386
- Everything is computed on page load by sweeping all 10,000 states with leading zeros kept. You can view source
387
- to see the tiny harness.
388
- </p>
389
- </section>
390
- </div>
391
-
392
- <script>
393
- // ——— Helpers ———
394
- const pad4 = (n) => String(n).padStart(4, '0');
395
- const isRepDigit = (s) => /^([0-9])\1{3}$/.test(s);
396
- function step(s) {
397
- const digits = s.split('');
398
- const desc = [...digits].sort((a, b) => Number(b) - Number(a)).join('');
399
- const asc = [...digits].sort((a, b) => Number(a) - Number(b)).join('');
400
- const diff = String(Number(desc) - Number(asc));
401
- return pad4(diff);
402
- }
403
-
404
- function pathTo6174(start) {
405
- // Returns { iter, path, converges }
406
- if (isRepDigit(start)) return { iter: null, path: [start, '0000'], converges: false };
407
- if (start === '6174') return { iter: 0, path: ['6174'], converges: true };
408
- const path = [start];
409
- let s = start,
410
- i = 0;
411
- const seen = new Set([start]);
412
- while (s !== '6174' && i < 50) {
413
- s = step(s);
414
- i++;
415
- path.push(s);
416
- if (seen.has(s)) break; // safety
417
- seen.add(s);
418
- }
419
- return { iter: s === '6174' ? i : null, path, converges: s === '6174' };
420
- }
421
-
422
- // ——— Exhaustive sweep ———
423
- const TOTAL = 10000;
424
- const dist = new Map(); // iter -> count
425
- const examplePath = new Map(); // iter -> path array (one example)
426
- const maxExamples = []; // list of starting states achieving max
427
- const convergerStarts = [];
428
- const nonConvergers = [];
429
-
430
- let maxIter = 0;
431
- let iterSum = 0;
432
-
433
- for (let n = 0; n < TOTAL; n++) {
434
- const s = pad4(n);
435
- if (isRepDigit(s)) {
436
- nonConvergers.push(s);
437
- continue;
438
- }
439
- const { iter, path, converges } = pathTo6174(s);
440
- if (!converges) {
441
- continue;
442
- }
443
- convergerStarts.push(s);
444
- iterSum += iter;
445
- if (!dist.has(iter)) dist.set(iter, 0);
446
- dist.set(iter, dist.get(iter) + 1);
447
- if (!examplePath.has(iter)) examplePath.set(iter, path);
448
- if (iter > maxIter) maxIter = iter;
449
- }
450
-
451
- // Gather a few examples for the max-iteration set
452
- for (let n = 0; n < TOTAL && maxExamples.length < 24; n++) {
453
- const s = pad4(n);
454
- if (isRepDigit(s)) continue;
455
- const { iter } = pathTo6174(s);
456
- if (iter === maxIter) maxExamples.push(s);
457
- }
458
-
459
- // ——— Render Answer ———
460
- const convergeCount = convergerStarts.length;
461
- const nonCount = nonConvergers.length;
462
- const convergePct = ((convergeCount / TOTAL) * 100).toFixed(1);
463
- const nonPct = ((nonCount / TOTAL) * 100).toFixed(1);
464
- const avgIter = (iterSum / convergeCount).toFixed(3);
465
-
466
- document.getElementById('total').textContent = TOTAL.toLocaleString();
467
- document.getElementById('convergeCount').textContent = convergeCount.toLocaleString();
468
- document.getElementById('convergePct').textContent = convergePct;
469
- document.getElementById('nonCount').textContent = nonCount.toLocaleString();
470
- document.getElementById('nonPct').textContent = nonPct;
471
- document.getElementById('maxIter').textContent = String(maxIter);
472
- document.getElementById('avgIter').textContent = avgIter;
473
- document.getElementById('maxIterAgain').textContent = String(maxIter);
474
-
475
- // ——— Render Distribution table ———
476
- const tbody = document.getElementById('distribution-body');
477
- const maxK = Math.max(...Array.from(dist.keys()));
478
- for (let k = 0; k <= maxK; k++) {
479
- const count = dist.get(k) || 0;
480
- const pct = ((count / convergeCount) * 100).toFixed(2);
481
- const tr = document.createElement('tr');
482
- const tdK = document.createElement('td');
483
- tdK.textContent = k;
484
- const tdC = document.createElement('td');
485
- tdC.textContent = count.toLocaleString();
486
- const tdP = document.createElement('td');
487
- tdP.textContent = pct + '%';
488
- const tdE = document.createElement('td');
489
- const ex = examplePath.get(k);
490
- tdE.textContent = ex ? ex.join(' → ') : '—';
491
- [tdK, tdC, tdP, tdE].forEach((td) => tr.appendChild(td));
492
- tbody.appendChild(tr);
493
- }
494
-
495
- // ——— Render max-iteration examples (chips + expandable paths) ———
496
- const maxList = document.getElementById('max-list');
497
- const maxPaths = document.getElementById('max-paths');
498
- maxExamples.forEach((s) => {
499
- const chip = document.createElement('button');
500
- chip.className = 'chip mono';
501
- chip.textContent = s;
502
- chip.setAttribute('aria-label', `Show path for ${s}`);
503
- chip.style.cursor = 'pointer';
504
- chip.addEventListener('click', () => {
505
- const { path } = pathTo6174(s);
506
- const boxId = `path-${s}`;
507
- let box = document.getElementById(boxId);
508
- if (box) {
509
- box.remove();
510
- return;
511
- }
512
- box = document.createElement('div');
513
- box.id = boxId;
514
- box.className = 'codebox mono small';
515
- box.style.marginTop = '8px';
516
- box.textContent = path.join(' → ');
517
- maxPaths.appendChild(box);
518
- });
519
- maxList.appendChild(chip);
520
- });
521
-
522
- // ——— Render non-convergers ———
523
- const nonList = document.getElementById('non-list');
524
- nonConvergers.forEach((s) => {
525
- const chip = document.createElement('span');
526
- chip.className = 'chip mono';
527
- chip.textContent = s;
528
- nonList.appendChild(chip);
529
- });
530
-
531
- // ——— Checks & badges ———
532
- function setBadge(id, ok) {
533
- const el = document.getElementById(id + 'badge');
534
- if (!el) return;
535
- el.textContent = ok ? 'PASS' : 'FAIL';
536
- el.className = 'badge ' + (ok ? 'pass' : 'fail');
537
- }
538
-
539
- // Check 1: universe accounting
540
- document.getElementById('chk1conv').textContent = convergerStarts.length.toLocaleString();
541
- document.getElementById('chk1non').textContent = nonConvergers.length.toLocaleString();
542
- document.getElementById('chk1sum').textContent = (convergerStarts.length + nonConvergers.length).toLocaleString();
543
- setBadge('chk1', convergerStarts.length + nonConvergers.length === TOTAL);
544
-
545
- // Check 2: only rep-digits fail
546
- const repRef = Array.from({ length: 10 }, (_, d) => String(d).repeat(4));
547
- const setA = new Set(nonConvergers);
548
- const onlyRepDigits = repRef.every((x) => setA.has(x)) && nonConvergers.length === 10;
549
- setBadge('chk2', onlyRepDigits);
550
-
551
- // Check 3: max iterations equals 7
552
- setBadge('chk3', maxIter === 7);
553
-
554
- // Check 4: distribution sums to converger count and has k=0 = 1
555
- const sumDist = Array.from(dist.values()).reduce((a, b) => a + b, 0);
556
- const hasZero = (dist.get(0) || 0) === 1;
557
- setBadge('chk4', sumDist === convergerStarts.length && hasZero);
558
-
559
- // Check 5: fixed point & padding invariant
560
- const fp = step('6174');
561
- document.getElementById('fpResult').textContent = fp;
562
- let paddingOk = true;
563
- for (let n = 0; n < TOTAL && paddingOk; n++) {
564
- const { path } = pathTo6174(pad4(n));
565
- for (const t of path) {
566
- if (!/^\d{4}$/.test(t)) {
567
- paddingOk = false;
568
- break;
569
- }
570
- }
571
- }
572
- document.getElementById('padCheck').textContent = paddingOk ? 'OK' : 'Violation found';
573
- setBadge('chk5', fp === '6174' && paddingOk);
574
- </script>
575
- </body>
576
- </html>