PageSourceSearch

https://erpn.ddugu.ac.in/Home/StudentLogin

html ddugu.ac.in collected 2026-10-02 17:59:27 UTC 28,896 bytes, 824 lines download raw bytes

1
2<!DOCTYPE html>
3<html lang="en">
4<head>
5    <meta charset="utf-8" />
6    <meta name="viewport" content="width=device-width, initial-scale=1.0">
7    <title>Student Login (Ddugu)</title>
8    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&family=Playfair+Display:wght@600;700;800&display=swap" rel="stylesheet">
9    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css" rel="stylesheet">
10    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastify-js/1.12.0/toastify.min.css" />
11
12    <style>
13        :root {
14            --navy: #0f172a;
15            --navy-2: #1e293b;
16            --gold: #c5a059;
17            --indigo: #4B0082;
18            --blue: #2563eb;
19            --muted: #64748b;
20            --glass: rgba(255, 255, 255, 0.98);
21        }
22
23        * { box-sizing: border-box; margin: 0; padding: 0; }
24
25        html, body { height: 100%; }
26
27        body {
28            font-family: 'Montserrat', sans-serif;
29            background: #0b1220;
30            display: flex;
31            align-items: center;
32            justify-content: center;
33            padding: 20px;
34            min-height: 100vh;
35            overflow-x: hidden;
36        }
37
38        /* Ambient animated background */
39        body::before {
40            content: "";
41            position: fixed;
42            inset: -20%;
43            background:
44                radial-gradient(circle at 15% 20%, rgba(75, 0, 130, .55), transparent 55%),
45                radial-gradient(circle at 85% 80%, rgba(37, 99, 235, .45), transparent 55%),
46                radial-gradient(circle at 50% 50%, rgba(197, 160, 89, .18), transparent 60%);
47            filter: blur(30px);
48            animation: ambient 18s ease-in-out infinite alternate;
49            z-index: 0;
50        }
51
52        @keyframes ambient {
53            0%   { transform: translate(0, 0) scale(1); }
54            100% { transform: translate(-4%, 3%) scale(1.08); }
55        }
56
57        /* ===================== MAIN CARD ===================== */
58        .login-shell {
59            position: relative;
60            z-index: 2;
61            display: grid;
62            grid-template-columns: 1fr 1fr;
63            width: 100%;
64            max-width: 880px;
65            min-height: 540px;
66            border-radius: 22px;
67            overflow: hidden;
68            box-shadow:
69                0 30px 80px rgba(0,0,0,.55),
70                0 0 0 1px rgba(255,255,255,.06);
71            background: var(--glass);
72            animation: shellIn .7s cubic-bezier(.2,.8,.2,1) both;
73        }
74
75        @keyframes shellIn {
76            from { opacity: 0; transform: translateY(20px) scale(.98); }
77            to   { opacity: 1; transform: translateY(0) scale(1); }
78        }
79
80        /* ===================== LEFT PANEL ===================== */
81        .brand-panel {
82            position: relative;
83            padding: 40px 36px;
84            color: #fff;
85            background:
86                linear-gradient(150deg, rgba(15,23,42,.96) 0%, rgba(30,27,75,.94) 45%, rgba(75,0,130,.92) 100%),
87                url('/Images/cover.jpg') center / cover no-repeat;
88            display: flex;
89            flex-direction: column;
90            justify-content: space-between;
91            overflow: hidden;
92        }
93
94        .brand-panel::before {
95            content: "";
96            position: absolute;
97            width: 320px;
98            height: 320px;
99            border-radius: 50%;
100            background: radial-gradient(circle, rgba(197,160,89,.28), transparent 70%);
101            top: -110px;
102            right: -120px;
103            pointer-events: none;
104        }
105
106        .brand-panel::after {
107            content: "";
108            position: absolute;
109            width: 260px;
110            height: 260px;
111            border-radius: 50%;
112            background: radial-gradient(circle, rgba(37,99,235,.32), transparent 70%);
113            bottom: -110px;
114            left: -100px;
115            pointer-events: none;
116        }
117
118        .brand-top {
119            position: relative;
120            z-index: 2;
121            display: flex;
122            align-items: center;
123            gap: 12px;
124        }
125
126        .brand-logo {
127            width: 54px;
128            height: 54px;
129            border-radius: 14px;
130            border: 2px solid rgba(255,255,255,.85);
131            box-shadow: 0 10px 24px rgba(0,0,0,.4);
132            object-fit: cover;
133            background: #fff;
134        }
135
136        .brand-name {
137            font-family: 'Playfair Display', serif;
138            font-size: 13px;
139            letter-spacing: 1.8px;
140            text-transform: uppercase;
141            font-weight: 700;
142            color: rgba(255,255,255,.92);
143            line-height: 1.3;
144        }
145
146        .brand-name span {
147            display: block;
148            font-size: 10px;
149            letter-spacing: 2.6px;
150            font-weight: 500;
151            color: var(--gold);
152            margin-top: 3px;
153        }
154
155        .brand-center {
156            position: relative;
157            z-index: 2;
158        }
159
160        .brand-heading {
161            font-family: 'Playfair Display', serif;
162            font-size: 42px;
163            line-height: 1.05;
164            font-weight: 800;
165            letter-spacing: -.5px;
166            margin-bottom: 14px;
167        }
168
169        .brand-heading span {
170            background: linear-gradient(135deg, #facc6b 0%, var(--gold) 45%, #fde68a 100%);
171            -webkit-background-clip: text;
172            background-clip: text;
173            -webkit-text-fill-color: transparent;
174            display: inline-block;
175        }
176
177        .brand-sub {
178            font-size: 13.5px;
179            font-weight: 400;
180            line-height: 1.65;
181            color: rgba(255,255,255,.72);
182            max-width: 320px;
183        }
184
185        .brand-features {
186            position: relative;
187            z-index: 2;
188            list-style: none;
189            margin-top: 22px;
190            display: flex;
191            flex-direction: column;
192            gap: 10px;
193        }
194
195        .brand-features li {
196            display: flex;
197            align-items: center;
198            gap: 10px;
199            font-size: 12px;
200            color: rgba(255,255,255,.78);
201            font-weight: 500;
202        }
203
204        .brand-features li::before {
205            content: "";
206            flex-shrink: 0;
207            width: 20px;
208            height: 20px;
209            border-radius: 50%;
210            background: rgba(197,160,89,.15);
211            border: 1px solid rgba(197,160,89,.5);
212            background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23c5a059' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>");
213            background-size: 11px;
214            background-position: center;
215            background-repeat: no-repeat;
216        }
217
218        .brand-footer {
219            position: relative;
220            z-index: 2;
221            font-size: 10px;
222            letter-spacing: 1.5px;
223            text-transform: uppercase;
224            color: rgba(255,255,255,.4);
225            font-weight: 500;
226        }
227
228        /* ===================== RIGHT PANEL ===================== */
229        .form-panel {
230            position: relative;
231            padding: 40px 40px;
232            display: flex;
233            flex-direction: column;
234            justify-content: center;
235            background: #ffffff;
236        }
237
238        .form-panel-inner {
239            width: 100%;
240            max-width: 340px;
241            margin: 0 auto;
242        }
243
244        .form-eyebrow {
245            font-size: 10.5px;
246            font-weight: 700;
247            letter-spacing: 2.2px;
248            text-transform: uppercase;
249            color: var(--indigo);
250            margin-bottom: 8px;
251            display: flex;
252            align-items: center;
253            gap: 8px;
254        }
255
256        .form-eyebrow::after {
257            content: "";
258            flex: 1;
259            height: 1px;
260            background: linear-gradient(90deg, rgba(75,0,130,.35), transparent);
261        }
262
263        .form-heading {
264            font-family: 'Playfair Display', serif;
265            font-size: 26px;
266            font-weight: 700;
267            color: var(--navy);
268            line-height: 1.15;
269            margin-bottom: 5px;
270        }
271
272        .form-desc {
273            font-size: 12.5px;
274            color: var(--muted);
275            margin-bottom: 22px;
276            line-height: 1.5;
277        }
278
279        .form-group { margin-bottom: 14px; }
280
281        label {
282            display: block;
283            font-size: 10px;
284            font-weight: 700;
285            letter-spacing: 1.1px;
286            text-transform: uppercase;
287            color: var(--navy);
288            margin-bottom: 6px;
289        }
290
291        .input {
292            width: 100%;
293            padding: 11px 14px;
294            border-radius: 11px;
295            border: 1.5px solid #e2e8f0;
296            background: #f8fafc;
297            font-size: 13.5px;
298            color: var(--navy);
299            font-family: 'Montserrat', sans-serif;
300            transition: all .25s ease;
301        }
302
303        .input::placeholder { color: #94a3b8; }
304
305        .input:focus {
306            outline: none;
307            background: #fff;
308            border-color: var(--indigo);
309            box-shadow: 0 0 0 4px rgba(75, 0, 130, .12);
310        }
311
312        /* ================= CAPTCHA ================= */
313        .captcha-row {
314            display: flex;
315            align-items: center;
316            gap: 8px;
317            margin-bottom: 8px;
318        }
319
320        #captchaImg {
321            flex: 1;
322            height: 54px;
323            border-radius: 11px;
324            border: 1.5px solid #e0e7ff;
325            background: #eef2ff;
326            cursor: pointer;
327            transition: transform .15s ease, box-shadow .15s ease;
328            object-fit: cover;
329        }
330
331        #captchaImg:hover {
332            transform: scale(1.01);
333            box-shadow: 0 5px 14px rgba(99,102,241,.22);
334        }
335
336        .btn-refresh {
337            flex-shrink: 0;
338            width: 54px;
339            height: 54px;
340            border-radius: 11px;
341            background: #eef2ff;
342            border: 1.5px solid #c7d2fe;
343            color: #4338ca;
344            display: inline-flex;
345            align-items: center;
346            justify-content: center;
347            cursor: pointer;
348            transition: all .25s ease;
349        }
350
351        .btn-refresh:hover {
352            background: #e0e7ff;
353            transform: rotate(90deg);
354        }
355
356        .btn-refresh:active { transform: rotate(180deg) scale(.95); }
357
358        .btn-refresh svg { width: 18px; height: 18px; }
359
360        #txtCaptcha {
361            letter-spacing: 5px;
362            font-weight: 700;
363            text-transform: uppercase;
364            text-align: center;
365            font-size: 15px;
366        }
367
368        /* ================= LOCKOUT BANNER ================= */
369        .lockout-banner {
370            display: none;
371            align-items: flex-start;
372            gap: 10px;
373            padding: 11px 13px;
374            border-radius: 11px;
375            background: linear-gradient(135deg, #fee2e2, #fecaca);
376            border: 1.5px solid #f87171;
377            color: #7f1d1d;
378            font-size: 12px;
379            font-weight: 600;
380            margin-bottom: 14px;
381            animation: shakeIn .45s ease;
382        }
383
384        .lockout-banner.show { display: flex; }
385
386        .lockout-banner svg {
387            flex-shrink: 0;
388            width: 18px;
389            height: 18px;
390            color: #b91c1c;
391        }
392
393        .lockout-banner .title { font-weight: 700; margin-bottom: 2px; }
394        .lockout-banner .sub   { font-weight: 500; opacity: .85; font-size: 11px; }
395
396        @keyframes shakeIn {
397            0%   { transform: translateX(0); }
398            25%  { transform: translateX(-6px); }
399            50%  { transform: translateX(6px); }
400            75%  { transform: translateX(-4px); }
401            100% { transform: translateX(0); }
402        }
403
404        /* ================= BUTTON ================= */
405        .login-btn {
406            width: 100%;
407            padding: 13px;
408            border-radius: 12px;
409            border: none;
410            background: linear-gradient(135deg, var(--indigo), var(--blue));
411            color: #fff;
412            font-weight: 800;
413            font-size: 12.5px;
414            letter-spacing: 1.5px;
415            text-transform: uppercase;
416            cursor: pointer;
417            margin-top: 6px;
418            font-family: 'Montserrat', sans-serif;
419            transition: all .3s ease;
420            box-shadow: 0 8px 20px rgba(75, 0, 130, .26);
421            position: relative;
422            overflow: hidden;
423        }
424
425        .login-btn::after {
426            content: "";
427            position: absolute;
428            inset: 0;
429            background: linear-gradient(135deg, transparent 30%, rgba(255,255,255,.22), transparent 70%);
430            transform: translateX(-100%);
431            transition: transform .6s ease;
432        }
433
434        .login-btn:hover:not(:disabled) {
435            transform: translateY(-2px);
436            box-shadow: 0 14px 28px rgba(37, 99, 235, .38);
437        }
438
439        .login-btn:hover:not(:disabled)::after {
440            transform: translateX(100%);
441        }
442
443        .login-btn:disabled {
444            opacity: .55;
445            cursor: not-allowed;
446        }
447
448        /* Divider */
449        .divider {
450            display: flex;
451            align-items: center;
452            text-align: center;
453            margin: 16px 0 12px;
454            color: var(--muted);
455            font-size: 10px;
456            font-weight: 700;
457            letter-spacing: 1.6px;
458            text-transform: uppercase;
459        }
460
461        .divider::before,
462        .divider::after {
463            content: "";
464            flex: 1;
465            height: 1px;
466            background: linear-gradient(90deg, transparent, #e2e8f0, transparent);
467        }
468
469        .divider span { padding: 0 10px; }
470
471        /* PhD Login Link */
472        .phd-link {
473            display: flex;
474            align-items: center;
475            justify-content: center;
476            gap: 8px;
477            width: 100%;
478            padding: 11px;
479            border-radius: 11px;
480            background: linear-gradient(135deg, rgba(75, 0, 130, 0.05), rgba(37, 99, 235, 0.05));
481            border: 1.5px solid rgba(75, 0, 130, 0.15);
482            color: var(--indigo);
483            font-size: 11.5px;
484            font-weight: 700;
485            letter-spacing: 0.8px;
486            text-decoration: none;
487            text-transform: uppercase;
488            transition: all .3s ease;
489        }
490
491        .phd-link svg { width: 15px; height: 15px; transition: transform .3s ease; }
492
493        .phd-link:hover {
494            background: linear-gradient(135deg, var(--indigo), var(--blue));
495            border-color: transparent;
496            color: #fff;
497            transform: translateY(-2px);
498            box-shadow: 0 10px 22px rgba(75, 0, 130, 0.28);
499        }
500
501        .phd-link:hover svg { transform: translateX(3px); }
502
503        .help-text {
504            text-align: center;
505            font-size: 11px;
506            color: var(--muted);
507            margin-top: 14px;
508            line-height: 1.5;
509        }
510
511        .help-text a { color: var(--gold); font-weight: 700; text-decoration: none; }
512        .help-text a:hover { text-decoration: underline; }
513
514        /* ===================== RESPONSIVE ===================== */
515        @media (max-width: 900px) {
516            .login-shell {
517                grid-template-columns: 1fr;
518                max-width: 440px;
519                min-height: auto;
520            }
521
522            .brand-panel {
523                padding: 28px 26px 24px;
524            }
525
526            .brand-heading { font-size: 30px; margin-bottom: 10px; }
527            .brand-sub { font-size: 12.5px; max-width: 100%; }
528            .brand-features { display: none; }
529            .brand-footer { display: none; }
530
531            .form-panel { padding: 28px 26px; }
532            .form-heading { font-size: 22px; }
533        }
534
535        @media (max-width: 420px) {
536            body { padding: 10px; }
537            .login-shell { border-radius: 18px; }
538            .brand-panel { padding: 22px 20px 18px; }
539            .form-panel { padding: 22px 20px; }
540            .brand-logo { width: 46px; height: 46px; }
541            .brand-heading { font-size: 26px; }
542        }
543    </style>
544</head>
545
546<body>
547
548    <div class="login-shell">
549
550        <!-- ==================== LEFT PANEL — BRANDING ==================== -->
551        <aside class="brand-panel">
552
553            <div class="brand-top">
554                <img src="/images/DduguLogo.jpg" class="brand-logo" alt="DDUGU Logo" />
555                <div class="brand-name">
556                    Deen Dayal Upadhyaya
557                    <span>Gorakhpur University</span>
558                </div>
559            </div>
560
561            <div class="brand-center">
562                <h1 class="brand-heading">
563                    Student<br />
564                    <span>Portal.</span>
565                </h1>
566                <p class="brand-sub">
567                    Sign in to access your academic dashboard — view and pay fees, manage exam forms, and stay updated with your academic activities.
568                </p>
569
570                <ul class="brand-features">
571                    <li>Secure &amp; verified access</li>
572                    <li>Manage your academic details</li>
573                    <li>Check &amp; pay fees online</li>
574                    <li>Submit and manage exam forms</li>
575                </ul>            
576            </div>
577
578            <div class="brand-footer">
579                © 2026 DDUGU — ERP
580            </div>
581
582        </aside>
583
584        <!-- ==================== RIGHT PANEL — FORM ==================== -->
585        <main class="form-panel">
586
587            <div class="form-panel-inner">
588
589                <div class="form-eyebrow">Secure Sign In</div>
590                <h2 class="form-heading">Welcome back</h2>
591                <p class="form-desc">Enter your credentials below to continue</p>
592
593                <!-- Lockout banner -->
594                <div id="lockoutBanner" class="lockout-banner">
595                    <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
596                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
597                              d="M12 9v2m0 4h.01M5.07 19h13.86a2 2 0 001.74-3L13.74 4a2 2 0 00-3.48 0L3.34 16a2 2 0 001.73 3z" />
598                    </svg>
599                    <div>
600                        <div class="title">Account Temporarily Locked</div>
601                        <div class="sub" id="lockoutMsg">Too many failed attempts. Please try again later.</div>
602                    </div>
603                </div>
604
605                <form id="loginForm" novalidate>
606
607                    <div class="form-group">
608                        <label>Roll Number</label>
609                        <input id="txtRoll" type="text" class="input"
610                               placeholder="Enter your roll number"
611                               autocomplete="off" required />
612                    </div>
613
614                    <div class="form-group">
615                        <label>Date of Birth</label>
616                        <input id="txtDob" type="date" class="input" required />
617                    </div>
618
619                    <div class="form-group">
620                        <label>Security Check</label>
621                        <div class="captcha-row">
622                            <img id="captchaImg" src="/api/LoginApi/GetCaptcha"
623                                 alt="Click to refresh captcha" title="Click to refresh" />
624                            <button type="button" id="refreshCaptcha" class="btn-refresh"
625                                    title="Refresh captcha">
626                                <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
627                                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.2"
628                                          d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
629                                </svg>
630                            </button>
631                        </div>
632                        <input id="txtCaptcha" type="text" class="input"
633                               placeholder="ENTER CAPTCHA"
634                               autocomplete="off" maxlength="6" spellcheck="false" />
635                    </div>
636
637                    <button type="button" id="btnProceed" class="login-btn">
638                        Access Portal
639                    </button>
640                </form>
641
642                <div class="divider"><span>or</span></div>
643
644                <a href="https://erp.ddugu.ac.in/pform2024/login.aspx" class="phd-link">
645                    <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
646                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
647                              d="M12 14l9-5-9-5-9 5 9 5z" />
648                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
649                              d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z" />
650                    </svg>
651                    PhD Candidate Login
652                    <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
653                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
654                              d="M14 5l7 7m0 0l-7 7m7-7H3" />
655                    </svg>
656                </a>
657
658                <p class="help-text">
659                    Facing issues? Contact the <a href="/cdn-cgi/l/email-protection#aec6cbc2decacbddc5eecacadbc9db80cfcd80c7c0">Help Desk</a>
660                </p>
661
662            </div>
663        </main>
664
665    </div>
vendor: 114 bytes, lines 665-667
665
666
667    <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
667<script src="https://cdnjs.cloudflare.com/ajax/libs/toastify-js/1.12.0/toastify.min.js"></script>
667
668    
668<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
668
669
670    
670<script>
671        // ============================================================
672        // UI HELPERS
673        // ============================================================
674        function showLoader() {
675            Swal.fire({
676                html: `<div style="font-size:22px;color:#64748b;font-weight:500">Verifying Credentials...</div>`,
677                allowOutsideClick: false,
678                allowEscapeKey: false,
679                showConfirmButton: false,
680                background: "#ffffff",
681                width: "420px",
682                heightAuto: false,
683                scrollbarPadding: false,
684                didOpen: () => Swal.showLoading()
685            });
686        }
687
688        function hideLoader() { Swal.close(); }
689
690        function showToast(message, type = 'error') {
691            Toastify({
692                text: message,
693                duration: 5000,
694                close: true,
695                gravity: "top",
696                position: "center",
697                backgroundColor: type === 'error'
698                    ? "linear-gradient(135deg, #dc2626, #b91c1c)"
699                    : "linear-gradient(135deg, #16a34a, #15803d)",
700                style: { borderRadius: "10px", fontWeight: "600" }
701            }).showToast();
702        }
703
704        // ============================================================
705        // CAPTCHA
706        // ============================================================
707        function refreshCaptcha() {
708            const img = document.getElementById('captchaImg');
709            img.src = '/api/LoginApi/GetCaptcha?t=' + Date.now();
710            document.getElementById('txtCaptcha').value = '';
711            document.getElementById('txtCaptcha').focus();
712        }
713
714        document.getElementById('captchaImg')
715            .addEventListener('click', refreshCaptcha);
716        document.getElementById('refreshCaptcha')
717            .addEventListener('click', refreshCaptcha);
718
719        // ============================================================
720        // LOCKOUT BANNER
721        // ============================================================
722        function showLockoutBanner(message) {
723            document.getElementById('lockoutMsg').textContent = message;
724            document.getElementById('lockoutBanner').classList.add('show');
725            document.getElementById('btnProceed').disabled = true;
726        }
727
728        function hideLockoutBanner() {
729            document.getElementById('lockoutBanner').classList.remove('show');
730            document.getElementById('btnProceed').disabled = false;
731        }
732
733        // ============================================================
734        // LOGIN SUBMIT
735        // ============================================================
736        const proceedBtn = document.getElementById('btnProceed');
737
738        proceedBtn.addEventListener('click', async () => {
739            const roll    = document.getElementById('txtRoll').value.trim();
740            const dob     = document.getElementById('txtDob').value;
741            const captcha = document.getElementById('txtCaptcha').value.trim();
742
743            if (!roll)              return showToast("Please enter your Roll Number");
744            if (!dob)               return showToast("Please select your Date of Birth");
745            if (!captcha)           return showToast("Please enter the captcha");
746            if (captcha.length < 4) return showToast("Captcha must be at least 4 characters");
747
748            proceedBtn.disabled  = true;
749            proceedBtn.innerText = "Processing...";
750            showLoader();
751
752            let requestCompleted = false;
753
754            try {
755                const res = await fetch('/api/LoginApi/StudentAuth', {
756                    method: 'POST',
757                    headers: { 'Content-Type': 'application/json' },
758                    body: JSON.stringify({
759                        RollNo:    roll,
760                        Dob:       dob,
761                        Captcha:   captcha,
762                        CaptchaId: 'session'
763                    })
764                });
765
766                requestCompleted = true;
767                const data = await res.json();
768
769                if (data.success) {
770                    showToast("Login successful. Redirecting...", "success");
771                    setTimeout(() => { location.href = data.redirectUrl; }, 600);
772                    return;
773                }
774
775                hideLoader();
776                if (data.locked) {
777                    showLockoutBanner(data.message);
778                    showToast(data.message, "error");
779                    refreshCaptcha();
780                    return;
781                }
782
783                showToast(data.message || "Login failed. Please check your credentials.");
784                if (data.refreshCaptcha !== false) refreshCaptcha();
785
786                proceedBtn.disabled  = false;
787                proceedBtn.innerText = "Access Portal";
788
789            } catch (err) {
790                console.error(err);
791                hideLoader();
792                showToast("Network error. Please check your internet connection.");
793                refreshCaptcha();
794                proceedBtn.disabled  = false;
795                proceedBtn.innerText = "Access Portal";
796            } finally {
797                if (!requestCompleted && !proceedBtn.disabled) {
798                    hideLoader();
799                }
800            }
801        });
802
803        ['txtRoll', 'txtDob', 'txtCaptcha'].forEach(id => {
804            document.getElementById(id).addEventListener('keydown', e => {
805                if (e.key === 'Enter') {
806                    e.preventDefault();
807                    proceedBtn.click();
808                }
809            });
810        });
811
812        (function () {
813            const lockedUntil = sessionStorage.getItem('lockoutUntil');
814            if (lockedUntil && new Date(lockedUntil) > new Date()) {
815                const mins = Math.ceil((new Date(lockedUntil) - new Date()) / 60000);
816                showLockoutBanner(`Too many failed attempts. Please try again in ${mins} minute(s).`);
817            } else {
818                sessionStorage.removeItem('lockoutUntil');
819            }
820        })();
821    </script>
vendor: 1 bytes, line 821
821
822<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"22a8b9b1de4046028000d91cfd069108","r":1,"spa":2}' crossorigin="anonymous"></script>
822
823</body>
824</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.