PageSourceSearch

https://gdz-raketa.ru/login/

html gdz-raketa.ru collected 2026-09-24 20:28:28 UTC 63,327 bytes, 1,583 lines download raw bytes

1
2<!DOCTYPE html>
3<html lang="ru">
4<head>
5    <meta charset="UTF-8"/>
6    <title>Вход на сайт | GDZ-raketa</title>
7
8    <meta name="theme-color" content="#1F1F1F"/>
9    <meta name="viewport" content="width=device-width, initial-scale=1"/>
10    <meta name="description" content="Войдите на сайт, чтобы воспользоваться всеми возможностями сайта и приложения."/><meta name="og:image" content="/image/imagehome.png"/>    <link rel="stylesheet" href="/css/app.css?v=1.26"><link rel="stylesheet" href="/login/styles.css?v=1.26"><link rel="canonical" href="https://gdz-raketa.ru/login/" />
11<link href="/favicon.svg" rel="shortcut icon" type="image/x-icon">
12
13
14	
14<script async src='https://yandex.ru/ads/system/header-bidding.js'></script>
vendor: 1 bytes, line 14
14
15<script>
16var adfoxBiddersMap = {
17  "adriver": "3337610"
18};
19
20var adUnits = [
21  {
22    "code": "adfox_174789492501676785",
23    "sizes": [
24      [
25        300,
26        300
27      ],
28      [
29        300,
30        250
31      ]
32    ],
33    "bids": [
34      {
35        "bidder": "adriver",
36        "params": {
37          "placementId": "177:gdz-raketa_300x250_banner_category_top",
38          "additional": {
39            "ext": {"query" : "cid="+localStorage.getItem('adrcid')}
40          }
41        }
42      }
43    ]
44  }
45];
46
47var userTimeout = 500;
48
49window.YaHeaderBiddingSettings = {
50   biddersMap: adfoxBiddersMap,
51   adUnits: adUnits,
52   timeout: userTimeout,
53};
54</script>
54
55
56
57<script>window.yaContextCb = window.yaContextCb || []</script>
vendor: 1 bytes, line 57
57
58<script src='https://yandex.ru/ads/system/context.js' async></script>
58
59
60
61
62
63
64
65
66<script src="https://content.adriver.ru/AdRiverFPS.js"></script>
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88<!-- Google Tag Manager -->
89<script>
vendor: 327 bytes, lines 89-93
89(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
90new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
91j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
92'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
93})(window,document,'script','dataLayer','
93GTM-ML2V4X5
vendor: 3 bytes, line 93
93');
93</script>
93
94<!-- End Google Tag Manager -->
95
96
97
98
99<script>
100        if (window.innerWidth < 461) {
101            let script = document.createElement('script');
102            script.src = "https://ru.viadata.store/v2/comm_min.js?sid=104314";
103            script.async = true;
104            document.head.appendChild(script);
105        }
106    </script>
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122</head>
123
124<body class="">
125
126
127
128
129
130
131
132<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 132-133
132
133<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
133GTM-ML2V4X5
vendor: 83 bytes, lines 133-134
133"
134height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
135<!-- End Google Tag Manager (noscript) -->
136
137
138
139<header class="header">
140    <div class="header__container container">
141
142        <a href="/" class="header__logo">
143            <img src="/images/logo.png" srcset="/images/logo.png 1x, /images/logo-2x.png 2x" alt="GDZ-raketa"
144                 class="img-responsive"/>
145        </a>
146
147
148        <a href="/login/" class="header__user-link user-link user-auth">
149
150            <div class="user-link__avatar avatar">
151                <svg role="img" class="avatar__icon">
152                    <use href="/images/icons/sprite.svg#user"/>
153                </svg>
154                            </div>
155                            <div class="user-link__username">Вход</div>
156            
157
158        </a>
159
160
161        <a class="tg-mobile" href="https://t.me/gdzraketa/" target="_blank"><i class="fab fa-telegram-plane"></i></a>
162
163
164
165        <button class="header__hamburger hamburger" type="button">
166            <svg role="img" class="hamburger__open">
167                <use href="/images/icons/sprite.svg#hamburger"/>
168            </svg>
169            <svg role="img" class="hamburger__close">
170                <use href="/images/icons/sprite.svg#hamburger-close"/>
171            </svg>
172        </button>
173
174
175    </div>
176</header>
177
178<nav class="mobile-menu">
179    <div class="container">
180        <div class="mobile-menu__user user">
181            <a href="#" class="user__avatar">
182                <img src="/images/rocket.png" alt="alt" class="user__avatar-img img-responsive"/>
183                            </a>
184            <a href="#" class="user__body">
185                                    <div class="user__title">Имя Фамилия</div>
186                                                    <div class="user__text"></div>
187                            </a>
188            <!-- <div class="user__btns">
189                    <a href="#" class="user__register btn btn--accent">Регистрация</a>
190                    <a href="#" class="user__login btn btn--ghost">Вход</a>
191                </div> -->
192            <a href="/login/logout.php" class="user__logout-btn logout-btn">
193                <svg role="img" class="logout-btn__icon">
194                    <use href="/images/icons/sprite.svg#exit"></use>
195                </svg>
196            </a>
197        </div>
198        <ul class="mobile-menu__list list-unstyled">
199            <li><a href="/lk/">Личный кабинет</a></li>
200            <!-- <li><a href="/blog/">Блог</a></li> -->
201            <!-- <li><a href="/reviews/">Отзывы</a></li> -->
202            <!-- <li><a href="/mobile-app/">Мобильное приложение</a></li> -->
203            <li><a href="/contacts/">Контакты</a></li>
204            <li><a href="/premium/">Премиум подписка</a></li>
205        </ul>
206    </div>
207</nav>
208
209<script src="/dist/jquery/jquery.min.js"></script>
209
210
211<div class="page">
212    <div class="container">
213        <div class="cabinet">
214
215            <div class="page-centered">
216                <div class="container">
217                    <form class="form-auth s-auth">
218                        <h1 class="form-auth__title">Войдите в личный кабинет</h1>
219
220                        <p>Войти через соцсеть:</p>
221
222                        <div class="auth-methods-container" style="position: relative;">
223                            <div class="auth-blocker-overlay" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; cursor: pointer;"></div>
224                            <div id="vk-auth-container" style="margin:32px 0;">
225                            </div>
226                        </div>
227                        <div class="VkSpiner" style="text-align: center;display: none">
228                            <span class="loader"></span>
229                        </div>
230                        
230<script src="https://unpkg.com/@vkid/sdk@<3.0.0/dist-sdk/umd/index.js"></script>
230
231                        
231<script type="text/javascript">
232                            if ('VKIDSDK' in window) {
233                                const VKID = window.VKIDSDK;
234
235                                // Инициализация конфигурации VK ID SDK
236                                VKID.Config.init({
237                                    app: 51942002,
238                                    redirectUrl: 'https://gdz-raketa.ru',
239                                    responseMode: VKID.ConfigResponseMode.Callback,
240                                    source: VKID.ConfigSource.LOWCODE,
241                                    scope: 'email'
242                                });
243
244                                // Создаём и рендерим список вариантов авторизации
245                                const oAuth = new VKID.OAuthList();
246                                oAuth.render({
247                                    container: document.getElementById('vk-auth-container'),
248                                    oauthList: ['vkid']
249                                })
250                                    .on(VKID.WidgetEvents.ERROR, vkidOnError)
251                                    .on(VKID.OAuthListInternalEvents.LOGIN_SUCCESS, function (payload) {
252                                        const checkbox = document.querySelector('.s-auth input[type="checkbox"]');
253                                        if (checkbox && !checkbox.checked) {
254                                            alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
255                                            checkbox.focus();
256                                            return;
257                                        }
258                                        const code = payload.code;
259                                        const deviceId = payload.device_id;
260
261                                        // Обмен авторизационного кода на токены
262                                        VKID.Auth.exchangeCode(code, deviceId)
263                                            .then(function (tokenData) {
264                                                console.log('Токены и данные после обмена:', tokenData);
265
266                                                // Получаем информацию о пользователе с помощью Access token
267                                                VKID.Auth.userInfo(tokenData.access_token)
268                                                    .then(function (userData) {
269                                                        console.log('Данные пользователя через userInfo:', userData);
270
271                                                        // Формируем объект для отправки на сервер
272                                                        const requestData = {
273                                                            silent_token: tokenData.access_token,
274                                                            uuid: tokenData.state || tokenData.uuid,
275                                                            app_token: 'pebMomu3SGKpze06u4Je',
276                                                            user_id: userData.user.user_id || userData.id,
277                                                            first_name: userData.user.first_name || '',
278                                                            last_name: userData.user.last_name || '',
279                                                            email: userData.user.email || ''
280                                                        };
281
282                                                        console.log('Отправляем данные на сервер:', requestData);
283
284                                                        // Отправляем данные на сервер через POST-запрос
285                                                        fetch('https://adm.gdz-raketa.ru/app/auth/vk-auth/', {
286                                                            method: 'POST',
287                                                            headers: {
288                                                                'Content-Type': 'application/json'
289                                                            },
290                                                            body: JSON.stringify(requestData)
291                                                        })
292                                                            .then(response => {
293                                                                if (!response.ok) {
294                                                                    throw new Error(`HTTP error! Статус: ${response.status}`);
295                                                                }
296                                                                return response.json();
297                                                            })
298                                                            .then(result => {
299                                                                if (result.success) {
300                                                                    console.log('Авторизация успешна:', result);
301                                                                    // Перенаправляем пользователя
302                                                                    window.location.href = `${result.redirect_url}?${result.params}`;
303                                                                } else {
304                                                                    console.error('Ошибка авторизации на сервере:', result);
305                                                                }
306                                                            })
307                                                            .catch(error => {
308                                                                console.error('Ошибка fetch-запроса:', error);
309                                                            });
310                                                    })
311                                                    .catch(function (err) {
312                                                        console.error('Ошибка в методе VKID.Auth.userInfo:', err);
313                                                    });
314                                            })
315                                            .catch(vkidOnError);
316                                    });
317
318                                // Функция обработки ошибок авторизации
319                                function vkidOnError(error) {
320                                    console.error('Ошибка авторизации через VK:', error);
321                                }
322                            } else {
323                                console.error('VKIDSDK не найден в объекте window');
324                            }
325                        </script>
325
326                        <style>
327                            .loader {
328                                width: 48px;
329                                height: 48px;
330                                border: 5px solid #EFF2F7;
331                                border-bottom-color: #eb1c4e;
332                                border-radius: 50%;
333                                display: inline-block;
334                                box-sizing: border-box;
335                                animation: rotation 1s linear infinite;
336                            }
337
338                            @keyframes rotation {
339                                0% {
340                                    transform: rotate(0deg);
341                                }
342                                100% {
343                                    transform: rotate(360deg);
344                                }
345                            }
346                            .VkIdSdk_oauth_link_text {
347                                display: none !important;
348                            }
349                        </style>
350
351                        <style>
352                            .yandex-log{
353                                background: #ffcc00;
354                                border-radius: 50px;
355                                padding: 10px;
356                            }
357                            .yandex-log img{
358                                height: 28px;
359                                margin-right: 12px;
360                            }
361                            .yandex-log span{
362                                display: inline-block;
363                                height: 28px;
364                            }
365                        </style>
366                        <div class="auth-methods-container" style="position: relative;">
367                            <div class="auth-blocker-overlay" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; cursor: pointer;"></div>
368                            <!--
369                            <div style="margin-bottom: 20px;">
370                                
370<script async="" src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="GdzRaketaBot" data-size="large" data-auth-url="https://adm.gdz-raketa.ru/app/auth/auth/telegram/callback/" data-request-access="write"></script>
370
371                            </div>
372                            -->
373                            <div style="margin-bottom: 20px; background-color: #f5f5f5; color: #888; font-size: 13px; cursor: default; text-align: center; padding: 12px; line-height: 1.3; border: 1px solid #ddd; border-radius: 50px;">
374                                Авторизация через Telegram отключена, обратитесь к администратору
375                            </div>
376                            <a href="https://adm.gdz-raketa.ru/app/auth/auth/yandex/" class="yandex-auth-link" style="color: #fff; text-decoration: none"><div class="yandex-log">
377                                    <img src="/images/icons/yalogo.svg" alt=""> <span>Войти через Яндекс</span>
378                                </div></a>
379                        </div>
380
381<!--                        <p class="push-btn">При входе вы принимаете <a href="/soglashenie/">согласие на обработку-->
382<!--                                персональных данных</a> в соответствии с Политикой в отношении обработки персональных-->
383<!--                            данных</p>-->
384                        <p class="push-btn"
385                           style="font-size: 16px; color: #888; margin-top: 20px; text-align: center; line-height: 1.4;">
386                            <label>
387                                <input type="checkbox" required>
388                                Я даю согласие на <a href="/soglasie-na-obrabotku/" target="_blank">обработку персональных
389                                    данных</a>
390                            </label>
391                        </p>
392                        
392<script>
393                            document.addEventListener('DOMContentLoaded', function() {
394                                const checkbox = document.querySelector('.s-auth input[type="checkbox"]');
395                                const blockers = document.querySelectorAll('.s-auth .auth-blocker-overlay');
396                                const yandexLink = document.querySelector('.s-auth .yandex-auth-link');
397
398                                if (yandexLink) {
399                                    yandexLink.addEventListener('click', function(e) {
400                                        if (checkbox && !checkbox.checked) {
401                                            e.preventDefault();
402                                            alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
403                                            checkbox.focus();
404                                        }
405                                    });
406                                }
407
408                                const updateBlocker = function() {
409                                    blockers.forEach(blocker => {
410                                        if (checkbox && checkbox.checked) {
411                                            blocker.style.display = 'none';
412                                        } else {
413                                            blocker.style.display = 'block';
414                                        }
415                                    });
416                                };
417                                if (checkbox) {
418                                    checkbox.addEventListener('change', updateBlocker);
419                                    blockers.forEach(blocker => {
420                                        blocker.addEventListener('click', function(e) {
421                                            e.stopPropagation();
422                                            alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
423                                            checkbox.focus();
424                                        });
425                                    });
426                                    updateBlocker();
427                                }
428                            });
429                        </script>
429
430
431
432
433                    </form>
434                    <div>
435
436                    </div>
437                    <form class="form-auth s-edit">
438                        <h1 class="form-auth__title">Регистрация</h1>
439                        <div class="form-auth__controls">
440                            <div class="form-auth__group group-control">
441                                <div class="group-control__header">
442                                    <label for="firstname" class="group-control__label">Ваше имя</label>
443                                </div>
444                                <div class="group-control__wrap">
445                                    <input type="text" class="group-control__control control" id="firstname"
446                                           placeholder="forexample"/>
447                                </div>
448                            </div>
449                            <div class="form-auth__group group-control">
450                                <div class="group-control__header">
451                                    <label for="email" class="group-control__label">Ваш e-mail</label>
452                                </div>
453                                <div class="group-control__wrap">
454                                    <input type="email" class="group-control__control control" id="email"
455                                           placeholder="[email protected]"/>
456                                </div>
457                            </div>
458                        </div>
459                        <div class="form-auth__btns">
460                            <button class="form-auth__submit btn btn--accent" type="submit">Регистрация</button>
461                        </div>
462                    </form>
463                </div>
464            </div>
465
466
467        </div>
468    </div>
469</div>
470
471
472<!-- prettier-ignore -->
473
474
475
476
477
478
479
480
481
482
483
484
485
486<div>
487<script>
488    window.yaContextCb.push(() => {
489  setTimeout(() => {
490    Ya.Context.AdvManager.render({
491        "blockId": "R-A-1836312-2",
492        "type": "fullscreen",
493        "platform": "touch"
494    });
495
496    setInterval(() => {
497      Ya.Context.AdvManager.render({
498        "blockId": "R-A-1836312-2",
499        "type": "fullscreen",
500        "platform": "touch"
501      });
502    }, 5 * 60 * 1000);
503
504  }, 40 * 1000);
505});
506</script>
506
507</div>
508
509
510
511
512
513
514
515
516<div class="stick-desktop">
517<script>
518    window.yaContextCb.push(() => {
519  setTimeout(() => {
520    if (!window.isLentaVisible) {
521        Ya.Context.AdvManager.render({
522            "blockId": "R-A-1836312-129",
523            "type": "floorAd",
524            "platform": "desktop"
525        });
526    }
527
528    setInterval(() => {
529      if (!window.isLentaVisible) {
530          Ya.Context.AdvManager.render({
531            "blockId": "R-A-1836312-129",
532            "type": "floorAd",
533            "platform": "desktop"
534          });
535      }
536    }, 45 * 1000);
537
538  }, 10 * 1000);
539});
540</script>
540
541</div>
542
543
544
545
546
547<div>
548<script>
549    window.yaContextCb.push(() => {
550  setTimeout(() => {
551    Ya.Context.AdvManager.render({
552		"blockId": "R-A-1836312-128",
553		"type": "fullscreen",
554		"platform": "desktop"
555    });
556
557    setInterval(() => {
558      Ya.Context.AdvManager.render({
559		"blockId": "R-A-1836312-128",
560		"type": "fullscreen",
561		"platform": "desktop"
562      });
563    }, 5 * 60 * 1000);
564
565  }, 40 * 1000);
566});
567</script>
567
568</div>
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583<!-- <div>
584<script>
585setTimeout(() => {
586window.yaContextCb.push(() => {
587    Ya.Context.AdvManager.render({
588        "blockId": "R-A-1836312-129",
589        "type": "floorAd",
590        "platform": "desktop"
591    })
592})
593}, 7000);
594</script>
594
595</div>
596
597
598
599
600
601
602<div>
603<script>
604setTimeout(() => {
605window.yaContextCb.push(() => {
606    Ya.Context.AdvManager.render({
607        "blockId": "R-A-1836312-1",
608        "type": "floorAd",
609        "platform": "touch"
610    })
611})
612}, 7000);
613</script>
613
614</div> -->
615
616
617            <!-- Это для слайдера в блоке рекомендация START-->
618
619    
619<script>
620        const sliderContainer = document.getElementById('sliderContainer');
621        let isDragging = false;
622        let startX;
623        let startScrollLeft;
624        let moved = false;
625        let link = null;
626
627        const handleMouseDown = (e) => {
628            moved = false;
629            isDragging = true;
630            startX = e.pageX - sliderContainer.offsetLeft;
631            startScrollLeft = sliderContainer.scrollLeft;
632            sliderContainer.style.cursor = 'grabbing';
633            sliderContainer.style.scrollBehavior = 'auto';
634
635            // Запоминаем ссылку и временно отключаем её
636            link = e.target.closest('a');
637            if(link) {
638                link.style.pointerEvents = 'none';
639            }
640        };
641
642        const handleMouseMove = (e) => {
643            if (!isDragging) return;
644
645            if(!moved && Math.abs(e.pageX - startX) > 3) {
646                moved = true;
647            }
648
649            if(moved) {
650                e.preventDefault();
651                const x = e.pageX - sliderContainer.offsetLeft;
652                const walk = (x - startX) * 1;
653                sliderContainer.scrollLeft = startScrollLeft - walk;
654            }
655        };
656
657        const handleMouseUp = (e) => {
658            isDragging = false;
659            sliderContainer.style.cursor = 'grab';
660            sliderContainer.style.scrollBehavior = 'smooth';
661
662            if(link) {
663                // Восстанавливаем ссылку и проверяем был ли драг
664                link.style.pointerEvents = 'auto';
665                
666                if(!moved) {
667                    window.location.href = link.href;
668                }
669
670                link = null;
671            }
672        };
673
674        sliderContainer.addEventListener('mousedown', handleMouseDown);
675        document.addEventListener('mousemove', handleMouseMove);
676        document.addEventListener('mouseup', handleMouseUp);
677    </script>
677
678
679
680<!-- Это для слайдера в блоке рекомендация -->
681
682
683
684<style>
685/* ===== НОВЫЙ ФУТЕР ===== */
686
687.site-footer {
688  margin-top: 60px;
689  padding: 50px 0 30px;
690  background: linear-gradient(180deg, #f8fafc 0%, #e8f0ff 100%);
691  border-top: 1px solid #dbeafe;
692  position: relative;
693  overflow: hidden;
694  font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
695}
696
697/* мягкое свечение */
698.site-footer::before {
699  content: "";
700  position: absolute;
701  top: -100px;
702  left: 50%;
703  transform: translateX(-50%);
704  width: 600px;
705  height: 260px;
706  background: radial-gradient(circle, rgba(37,99,235,0.12), transparent 70%);
707  filter: blur(60px);
708  pointer-events: none;
709}
710
711/* контейнер */
712.site-footer-container {
713  max-width: 816px;
714  margin: 0 auto;
715  padding: 0 20px;
716  position: relative;
717  box-sizing: border-box;
718}
719
720/* верх */
721.site-footer-top {
722  display: flex;
723  justify-content: space-between;
724  align-items: flex-start;
725  gap: 20px;
726  margin-bottom: 20px;
727}
728
729/* бренд */
730.site-footer-brand {
731  max-width: none;
732  width: 100%;
733}
734
735.site-footer-logo {
736  width: 150px;
737}
738
739.site-footer-slogan {
740  font-size: 14px;
741  color: #64748b;
742  margin-top: 0;
743  max-width: 260px;
744  margin-bottom: 15px;
745}
746
747/* соц */
748.site-footer-socials {
749  display: flex;
750  gap: 6px;
751  margin-top: 10px;
752}
753
754.site-footer-social {
755  width: 40px;
756  height: 40px;
757  background: #f1f5f9;
758  border-radius: 6px;
759  display: flex;
760  align-items: center;
761  justify-content: center;
762  transition: all 0.2s ease;
763  text-decoration: none;
764}
765
766.site-footer-social img {
767  width: 32px;
768  transition: transform 0.2s ease;
769  border-radius: 8px;
770}
771
772.site-footer-social:hover {
773  background: #dbeafe;
774  transform: translateY(-2px);
775}
776
777.site-footer-social:hover img {
778  transform: scale(1.1);
779}
780
781/* кнопка ошибки */
782.site-footer-error {
783  background: linear-gradient(135deg, #EB1C4E 0%, #ff4d6d 100%);
784  color: white;
785  border: none;
786  border-radius: 10px;
787  padding: 10px 25px;
788  font-size: 14px;
789  font-weight: 700;
790  cursor: pointer;
791  transition: all 0.25s ease;
792  margin-top: 7px;
793  margin-left: 40px;
794}
795
796.site-footer-error:hover {
797  transform: translateY(-3px);
798  box-shadow:
799    0 10px 25px rgba(235,28,78,0.35),
800    0 0 12px rgba(235,28,78,0.25);
801}
802
803.site-footer-social-row {
804  display: flex;
805  align-items: center;
806  width: 100%;
807}
808
809/* ссылки */
810.site-footer-links {
811  display: grid;
812  grid-template-columns: repeat(3, 1fr);
813  gap: 10px 40px;
814  margin-bottom: 20px;
815}
816
817.site-footer-links a {
818  font-size: 15px;
819  color: #475569;
820  text-decoration: none;
821}
822
823.site-footer-links a:hover {
824  color: #2563eb;
825}
826
827/* юр */
828.site-footer-legal {
829  font-size: 14px;
830  color: #94a3b8;
831  margin-bottom: 25px;
832}
833
834.site-footer-legal a {
835  margin-right: 14px;
836  color: inherit;
837  text-decoration: none;
838}
839
840.site-footer-legal a:hover {
841  color: #2563eb;
842}
843
844/* низ */
845.site-footer-bottom {
846  border-top: 1px solid #e5e7eb;
847  padding-top: 15px;
848  display: flex;
849  align-items: center;
850  gap: 20px;
851  flex-wrap: wrap;
852}
853
854/* платежки */
855.site-footer-payments {
856  display: flex;
857  gap: 12px;
858  flex-wrap: wrap;
859  align-items: center;
860}
861
862.site-footer-pay img {
863  height: 18px;
864}
865
866.site-footer-pay.tbank img {
867  height: 19px;
868}
869
870.site-footer-copy {
871  font-size: 12px;
872  color: #94a3b8;
873}
874
875/* адаптив */
876@media (max-width: 640px) {
877  .site-footer-top {
878    flex-direction: column;
879    align-items: flex-start;
880  }
881
882  .site-footer-error {
883    margin-left: 0;
884    margin-top: 12px;
885  }
886
887  .site-footer-links {
888    grid-template-columns: 1fr;
889  }
890}
891</style>
892
893<footer class="site-footer">
894  <div class="site-footer-container">
895
896    <!-- верх -->
897    <div class="site-footer-top">
898
899      <div class="site-footer-brand">
900        <img src="/images/logo.png" class="site-footer-logo" alt="GDZ" onerror="this.src='/images/logo-white.png'">
901
902        <p class="site-footer-slogan">
903          Твой лучший помощник в решении домашних заданий
904        </p>
905
906        <div class="site-footer-social-row">
907
908          <div class="site-footer-socials">
909            <a href="https://vk.com/gdzraketa/" class="site-footer-social">
910              <img src="/images/icons/vk.svg" alt="ВКонтакте">
911            </a>
912            <a href="https://t.me/gdzraketa/" class="site-footer-social">
913              <img src="/images/icons/tg.svg" alt="Telegram">
914            </a>
915            <a href="#" class="site-footer-social">
916              <img src="/images/icons/rutube.svg" alt="Rutube">
917            </a>
918            <a href="#" class="site-footer-social">
919              <img src="/images/icons/max.png" alt="MAX">
920            </a>
921          </div>
922
923          <button class="site-footer-error" onclick="window.location.href='#ModalWindow'">
924            Нашли ошибку?
925          </button>
926
927        </div>
928
929      </div>
930
931    </div>
932
933    <!-- ссылки -->
934    <div class="site-footer-links">
935      <a href="/about-us/">О нас</a>
936      <a href="/blog/">Блог</a>
937      <!-- <a href="/ai/">AI-помощник</a> -->
938      <a href="/reviews/">Отзывы</a>
939      <a href="/sitemap/">Карта сайта</a>
940      <a href="/lk/">Личный кабинет</a>
941      <a href="/contacts/">Контакты</a>
942      <a href="/reklama/">Для рекламодателей</a>
943      <a href="/premium/">Премиум подписка</a>
944      <a href="/pravoobladateljam/">Правообладателям</a>
945      <!-- <a href="/predlozhit-uluchshenie/">Предложить улучшение</a> -->
946      <!-- <a href="/mobile-app/">Мобильное приложение</a> -->
947    </div>
948
949    <!-- юридические -->
950    <div class="site-footer-legal">
951      <a href="/oferta/">
951Публичная оферта</a>
952      <a href="/polzovatelskoe-soglashenie/">Пользовательское соглашение</a>
953      <a href="/soglashenie/">Согласие на обработку персональных данных</a>
954    </div>
955
956    <!-- низ -->
957    <div class="site-footer-bottom">
958      <div class="site-footer-payments">
959        <div class="site-footer-pay"><img src="/images/payments/visa.svg" alt="Visa"></div>
960        <div class="site-footer-pay"><img src="/images/payments/mastercard.svg" alt="Mastercard"></div>
961        <div class="site-footer-pay"><img src="/images/payments/mir.svg" alt="МИР"></div>
962        <div class="site-footer-pay tbank"><img src="/images/payments/tbank.png" alt="Т-Банк"></div>
963      </div>
964
965      <div class="site-footer-copy">
966        © 2026 GDZ-raketa.ru — Все права защищены
967      </div>
968    </div>
969
970  </div>
971</footer>
972
973
974
975<div id="ModalWindow" class="Modal">
976    <div class="Modal_Body">
977        <!-- begin -->
978        <form id="form-contact" method="POST" class="contact-form" autocomplete="off" enctype="multipart/form-data">
979
980            <p class="contact-form__title">Заполните форму</p>
981
982            <div class="preloader"></div>
983
984
985                        <!-- Поле с именем -->
986            <div class="contact-form__input-wrapper contact-form__input-wrapper_name hidden">
987                <input name="name" type="hidden" class="contact-form__input contact-form__input_name"
988                       value="https://gdz-raketa.ru/login/">
989            </div>
990
991
992            <fieldset class="updateform">
993                <legend>Выберите тип ошибки:</legend>
994
995                <div class="contact-form__input-wrapper">
996                    <input type="radio" id="huey" name="error" value="Отличается задание"
997                           class="contact-form__input contact-form__input_theme radio" required="">
998                    <label for="huey">Отличается задание</label>
999                </div>
1000
1001                <div class="contact-form__input-wrapper">
1002                    <input type="radio" id="louie" name="error" value="В задании есть ошибка"
1003                           class="contact-form__input contact-form__input_theme radio" required="">
1004                    <label for="louie">В задании есть ошибка</label>
1005                </div>
1006
1007                <div class="contact-form__input-wrapper">
1008                    <input type="radio" id="dewey" name="error" value="Неполный ответ"
1009                           class="contact-form__input contact-form__input_theme radio" required="">
1010                    <label for="dewey">Неполный ответ</label>
1011                </div>
1012            </fieldset>
1013
1014
1015            <!-- Поле с телефоном -->
1016            <!--   <div class="contact-form__input-wrapper contact-form__input-wrapper_email">
1017                <input name="email" type="email" class="contact-form__input contact-form__input_email"
1018                       placeholder="Введите ваш email">
1019              </div> -->
1020
1021            <div class="contact-form__input-wrapper contact-form__input-wrapper_textarea">
1022                <span class="comment">Комментарий:</span>
1023                <textarea name="textarea" class="contact-form__input contact-form__input_textarea"
1024                          placeholder="Сообщите в каком номере проблема.."></textarea>
1025            </div>
1026
1027
1028            <!--Поле с темой в письме-->
1029            <input name="theme" type="hidden" class="contact-form__input contact-form__input_theme"
1030                   value="Сообщение с сайта gdz-raketa.ru">
1031
1032            <!-- <input name="error1" type="hidden" class="contact-form__input contact-form__input_theme"
1033                     value="Отличается задание">
1034
1035                     <input name="error2" type="hidden" class="contact-form__input contact-form__input_theme"
1036                     value="В задании есть ошибка">
1037
1038                     <input name="error3" type="hidden" class="contact-form__input contact-form__input_theme"
1039                     value="Неполный ответ"> -->
1040
1041
1042            <!--Кнопка отправки формы-->
1043            <!-- <p class="push-btn">Нажимая «Отправить», вы предоставляете <a href="/soglashenie/">Согласие на обработку персональных данных</a> в соответствии с Политикой в отношении обработки персональных данных</p> -->
1044            <button type="submit" class="contact-form__button">Отправить</button>
1045
1046        </form>
1047        <div class="contact-form__image" style="display:none;text-align: center;">
1048            <img src="/images/knowledge_x1.png"
1049                 srcset="/images/knowledge_x1.png 1x, /images/knowledge_x2.png 2x" alt=""
1050                 class="img-responsive" style="display: inline;"/>
1051            <img src="/images/stars-lg.png" srcset="/images/stars-lg.png 1x,/images/stars-lg-2x.png 2x"
1052                 alt="" class="gift-img-item__stars" />
1053            <img src="/images/stars-lg.png" srcset="/images/stars-lg.png 1x,/images/stars-lg-2x.png 2x"
1054                 alt="" class="gift-img-item__stars" />
1055            <img src="/images/cloud.png" alt="" class="gift-img-item__cloud" />
1056            <img src="/images/cloud.png" alt="" class="gift-img-item__cloud" />
1057        </div>
1058
1059        <p class="contact-form__message"></p>
1060        <!-- end -->
1061        <a href="#ModalWindowClose" id="clos" class="close-form">+</a>
1062    </div>
1063</div>
1064
1065
1066
1067
1068<div id="ModalWindow2" class="Modal">
1069    <div class="Modal_Body">
1070        <!-- begin -->
1071        <div class="footer__rocket">
1072            <img src="/images/liftoff-footer.png"
1073                 srcset="/images/liftoff-footer.png 1x, /images/liftoff-footer-2x.png 2x" alt="alt"
1074                 class="img-responsive" loading="lazy" data-aos="fade-up" data-aos-delay="350"
1075                 data-aos-duration="1000"/>
1076        </div>
1077        <img src="/images/stars-lg.png" srcset="/images/stars-lg.png 1x,/images/stars-lg-2x.png 2x"
1078             alt="alt" class="gift-img-item__stars" loading="lazy" data-aos="fade" data-aos-delay="50"
1079             data-aos-duration="1000"/>
1080        <img src="/images/stars-lg.png" srcset="/images/stars-lg.png 1x,/images/stars-lg-2x.png 2x"
1081             alt="alt" class="gift-img-item__stars" loading="lazy" data-aos="fade" data-aos-delay="50"
1082             data-aos-duration="1000"/>
1083        <img src="/images/cloud.png" alt="alt" class="gift-img-item__cloud" loading="lazy"
1084             data-aos="fade-left" data-aos-delay="50" data-aos-duration="1500"/>
1085        <img src="/images/cloud.png" alt="alt" class="gift-img-item__cloud" loading="lazy"
1086             data-aos="fade-left" data-aos-delay="50" data-aos-duration="1500"/>
1087        <p>
1088            Для выполнения действия войдите на сайт
1089        </p>
1090        <a href="/login/" class="space-item__btn btn btn--accent">Войти</a>
1091        <!-- end -->
1092        <a href="#ModalWindow2Close" id="clos" class="close-form">+</a>
1093    </div>
1094</div>
1095
1096
1097
1098<div id="ModalWindow3" class="Modal">
1099    <div class="Modal_Body">
1100        <!-- begin -->
1101        <div class="gift-box">
1102            <img src="/images/gift-box.png"
1103                 srcset="/images/gift-box.png 1x, /images/gift-box-x2.png 2x" alt="alt"
1104                 class="img-responsive"/>
1105        </div>
1106        <p class="gift-title">
1107            Премиум подписка в подарок!
1108        </p>
1109        <p class="gift-desc">
1110            Специально для новых пользователей дарим премиум подписку на 7 дней в подарок, чтобы вы смогли оценить все
1111            преимущества приложения.
1112        </p>
1113        <a href="/premium/get-trial.php" class="space-item__btn btn btn--accent">Получить подписку</a>
1114        <p class="gift-subdesc">После нажатия на кнопку "Получить подписку", премиум подписка начнёт действовать ровно 7 дней а
1115            затем автоматически отключится.</p>
1116        <!-- end -->
1117        <a href="#ModalWindow3Close" id="clos" class="close-form">+</a>
1118    </div>
1119</div>
1120
1121
1122
1123
1124
1125
1126<script src="/js/app.js"></script>
1126<script src="/dist/jquery/jquery.mask.min.js"></script>
1126<script src="/login/scripts.js?v=1.01"></script>
1126    
1126<script>
1127        $(document).ready(function () {
1128            // Рассчитываем высоту и количество блоков
1129            var documentHeight = $(document).height();
1130            var viewportHeight = Math.round((documentHeight - 785) / 1500);
1131            if ($('.comments-block').length) {
1132                viewportHeight++;
1133            }
1134            // Убедимся, что viewportHeight не меньше 1
1135            viewportHeight = Math.max(1, viewportHeight);
1136
1137            // Проверка, что высота корректна для расчета
1138            if (viewportHeight <= 0) {
1139                console.error("Ошибка: viewportHeight <= 0, невозможно рассчитать kolRek.");
1140                return; // Прекращаем выполнение
1141            }
1142
1143            var kolRek = 100 / viewportHeight;
1144            kolRek = kolRek + "%"; // Высота каждого блока в процентах
1145
1146            $('body').addClass('with-sidebar');
1147
1148            // 1. Сначала загружаем основной контейнер сайдбара
1149            $.get('/parts/right-sidebar.php')
1150                .done(function (sidebarData) {
1151                    // Добавляем контейнер сайдбара в body
1152                    $('body').append(sidebarData);
1153                    const container = $('.right-sidebar'); // Находим контейнер после добавления
1154
1155                    // Если контейнер не найден, выходим
1156                    if (!container.length) {
1157                        console.error("Критическая ошибка: Элемент .right-sidebar НЕ НАЙДЕН в DOM после добавления!");
1158                        return;
1159                    }
1160
1161                    // 2. Создаем массив для хранения промисов
1162                    var adPromises = [];
1163
1164                    // Динамически получаем количество рекламных блоков из PHP
1165                    const maxAdBlocks = 4;
1166                    const blocksToLoad = Math.min(viewportHeight, maxAdBlocks);
1167
1168                    // Формируем промисы для каждого блока
1169                    for (let i = 1; i <= blocksToLoad; i++) {
1170                        let path = '/parts/right-ad/' + i + '.php';
1171                        // Используем .then() для обработки успеха и ошибки
1172                        let promise = $.get(path)
1173                            .then(
1174                                // Функция УСПЕХА: просто возвращаем данные
1175                                function(data) {
1176                                    return data; // Возвращаем данные для $.when
1177                                },
1178                                // Функция ОШИБКИ: логируем и возвращаем null
1179                                function(jqXHR, textStatus, errorThrown) {
1180                                    console.warn("Не удалось загрузить блок:", path, "Статус:", textStatus, "Ошибка:", errorThrown);
1181                                    // Возвращаем null, чтобы $.when не прервался.
1182                                    return null;
1183                                }
1184                            );
1185                        adPromises.push(promise); // Добавляем промис, возвращенный .then()
1186                    }
1187
1188                    // Если нет промисов, выходим
1189                    if (adPromises.length === 0) {
1190                        return;
1191                    }
1192
1193                    // 3. Используем $.when для ожидания разрешения ВСЕХ промисов
1194                    $.when.apply($, adPromises)
1195                        .done(function () {
1196                            // 'arguments' содержит ПРЯМЫЕ результаты: data или null
1197                            let addedBlocksCount = 0;
1198                            const results = adPromises.length === 1 ? [arguments[0]] : Array.from(arguments);
1199
1200                            // Перебираем результаты и добавляем успешные блоки
1201                            for (let i = 0; i < results.length; i++) {
1202                                let resultData = results[i]; // Результат - это data или null
1203                                if (resultData !== null) {
1204                                    try {
1205                                        container.append(resultData);
1206                                        addedBlocksCount++;
1207                                    } catch (e) {
1208                                        // Логируем ошибку, если не удалось добавить валидные данные
1209                                        console.error("ОШИБКА при добавлении блока #" + i + " в контейнер:", e);
1210                                        console.error("Данные блока, вызвавшие ошибку:", resultData);
1211                                    }
1212                                }
1213                            }
1214
1215                            // 4. Устанавливаем высоту для добавленных блоков
1216                            if (addedBlocksCount > 0) {
1217                                container.children('div').css('height', kolRek);
1218                            }
1219                        })
1220                        .fail(function () {
1221                            // Эта ветка .fail() теперь действительно должна быть неожиданной
1222                            console.error("Критическая ошибка: $.when НЕ ЗАВЕРШИЛСЯ успешно. Это ОЧЕНЬ неожиданно.");
1223                            console.error("Аргументы в .fail():", arguments);
1224                        });
1225                })
1226                .fail(function (jqXHR, textStatus, errorThrown) {
1227                    // Обработка ошибки, если не удалось загрузить основной сайдбар
1228                    console.error("Не удалось загрузить основной сайдбар /parts/right-sidebar.php. Статус:", textStatus, "Ошибка:", errorThrown);
1229                });
1230        });
1231    </script>
1231
1232
1233    <!-- Ограничение рекламного липкого блока справа и блока в футере   -->
1234    <style>
1235        .addSticky > div {
1236            max-height: calc(100vh - 190px);
1237            overflow: hidden;
1238        }
1239        .addSticky > .vidget + div {
1240            max-height: calc(100vh - 365px);
1241        }
1242
1243
1244        .addSticky {
1245            transition: opacity 0.2s ease, clip-path 0.2s ease;
1246        }
1247
1248        .is-hidden-by-footer {
1249            opacity: 0 !important;
1250            /* Обрезаем 100% контента (сверху, справа, снизу, слева) */
1251            clip-path: inset(100% 100% 100% 100%) !important;
1252        }
1253
1254    </style>
1255<!--    
1255<script src="/dist/jquery/jquery.min.js"></script>
1255-->
1256    
1256<script>
1257        $(document).ready(function() {
1258            // Опасная зона: высота окна минус 126px (с запасом для нижнего блока 125px). Изначально брал 140, но не все рекламные блоки вмещались
1259            let bottomThreshold = $(window).height() - 126;
1260
1261            // Обновляем порог при ресайзе окна, чтобы на разных мониторах всё работало четко
1262            $(window).on('resize', function() {
1263                bottomThreshold = $(window).height() - 126;
1264            });
1265
1266            $(window).on('scroll', function() {
1267                $('.addSticky').each(function() {
1268                    let $block = $(this);
1269                    let rect = this.getBoundingClientRect();
1270
1271                    // Если нижний край липкого блока залез в опасную зону
1272                    if (rect.bottom > bottomThreshold) {
1273                        // Прячем и отключаем клики
1274                        $block.addClass('is-hidden-by-footer');
1275                    } else {
1276                        // Возвращаем видимость и кликабельность
1277                        $block.removeClass('is-hidden-by-footer');
1278                    }
1279                });
1280            });
1281
1282            // Запуск при загрузке
1283            $(window).trigger('scroll');
1284        });
1285    </script>
1285
1286
1287    <!-- END Ограничение рекламного липкого блока справа и блока в футере END  -->
1288
1289
1290    <!-- Попап авторизации -->
1291    <style>
1292        .auth-popup-content a:hover{
1293            text-decoration: none;
1294        }
1295        .auth-popup-overlay {
1296            position: fixed;
1297            top: 0;
1298            left: 0;
1299            width: 100%;
1300            height: 100%;
1301            background: rgba(0, 0, 0, 0.5);
1302            z-index: 9999;
1303            display: flex;
1304            justify-content: center;
1305            align-items: center;
1306        }
1307        .auth-popup-content {
1308            background: #fff;
1309            padding: 30px;
1310            border-radius: 16px;
1311            width: 90%;
1312            max-width: 400px;
1313            position: relative;
1314            box-shadow: 0 10px 25px rgba(0,0,0,0.2);
1315        }
1316        .auth-popup-close {
1317            position: absolute;
1318            top: 15px;
1319            right: 15px;
1320            font-size: 28px;
1321            line-height: 1;
1322            cursor: pointer;
1323            color: #999;
1324        }
1325        .auth-popup-close:hover {
1326            color: #333;
1327        }
1328        .auth-popup-title {
1329            text-align: center;
1330            margin-top: 0;
1331            margin-bottom: 10px;
1332            font-size: 20px;
1333            font-weight: 700;
1334            color: #333;
1335        }
1336        .auth-popup-subtitle {
1337            display: flex;
1338            align-items: center;
1339            justify-content: center;
1340            margin-bottom: 24px;
1341            color: #27AE60;
1342            font-weight: 500;
1343            font-size: 14px;
1344        }
1345        .auth-buttons {
1346            display: flex;
1347            flex-direction: column;
1348            gap: 12px;
1349        }
1350        .auth-btn {
1351            display: flex;
1352            align-items: center;
1353            justify-content: center;
1354            padding: 12px 20px;
1355            border-radius: 10px;
1356            text-decoration: none;
1357            font-weight: 500;
1358            font-size: 16px;
1359            transition: opacity 0.2s;
1360            color: #fff !important;
1361            border: none;
1362            cursor: pointer;
1363        }
1364        .auth-btn:hover {
1365            opacity: 0.9;
1366        }
1367        .auth-btn img {
1368            width: 24px;
1369            height: 24px;
1370            margin-right: 10px;
1371        }
1372        .auth-btn--yandex { background-color: #eb1c4e; }
1373        .auth-btn--vk { background-color: #0077FF; }
1374        .auth-btn--tg { background-color: #2481CC; }
1375    </style>
1376    <div id="auth-popup-overlay" class="auth-popup-overlay" style="display: none;">
1377        <div class="auth-popup-content">
1378            <span class="auth-popup-close">&times;</span>
1379
1380            <h2 class="auth-popup-title">Войдите удобным способом</h2>
1381
1382            <div class="auth-popup-subtitle">
1383                <!-- Иконка щита -->
1384                <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 8px;">
1385                    <path d="M12 2L4 5V11C4 16.55 7.4 21.74 12 23C16.6 21.74 20 16.55 20 11V5L12 2Z" fill="#27AE60"/>
1386                    <path d="M9 12L11 14L15 10" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
1387                </svg>
1388                <span>Ваши данные в безопасности</span>
1389            </div>
1390
1391            <div class="tel-auth-block">
1392                <div class="auth-buttons" style="position: relative;">
1393                    <div class="auth-blocker-overlay" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; cursor: pointer;"></div>
1394                    <!-- 1. Яндекс (OAuth) -->
1395                    <a href="https://adm.gdz-raketa.ru/app/auth/auth/yandex/" class="auth-btn auth-btn--yandex auth-link-save-url">
1396                        <img src="/images/icons/yalogo.svg" alt="Yandex">
1397                        <span>Войти через Яндекс</span>
1398                    </a>
1399
1400                    <!-- 2. ВКонтакте (OAuth) -->
1401                    <a href="#" id="vk-login-btn" class="auth-btn auth-btn--vk">
1402                        <img src="/images/icons/vklogo.svg" alt="VK">
1403                        <span>Войти через VK ID</span>
1404                    </a>
1405
1406                    <!-- 3. Telegram (Ссылка на промежуточную страницу) -->
1407                    <!--
1408                    <a href="/login/auth/tg/" class="auth-btn auth-btn--tg auth-link-save-url">
1409                        <img src="/images/icons/tglogo.svg" alt="Telegram">
1410                        <span>Войти через Telegram</span>
1411                    </a>
1412                    -->
1413                    <div class="auth-btn" style="background-color: #f5f5f5; color: #888 !important; font-size: 13px; cursor: default; text-align: center; padding: 10px; line-height: 1.3; border: 1px solid #ddd; border-radius: 10px; font-weight: normal;">
1414                        Авторизация через Telegram отключена, обратитесь к администратору
1415                    </div>
1416                </div>
1417            </div>
1418
1419<!--            <p class="push-btn" style="font-size: 12px; color: #888; margin-top: 20px; text-align: center; line-height: 1.4;">-->
1420<!--                При входе вы принимаете <a href="/soglashenie/" style="color: #888; text-decoration: underline;">согласие на обработку персональных данных</a> в соответствии с Политикой в отношении обработки персональных данных-->
1421<!--            </p>-->
1422            <p class="push-btn"
1423               style="font-size: 16px; color: #888; margin-top: 20px; text-align: center; line-height: 1.4;">
1424                <label>
1425                    <input type="checkbox" required>
1426                    Я даю согласие на <a href="/soglasie-na-obrabotku/" target="_blank">обработку персональных
1427                        данных</a>
1428                </label>
1429            </p>
1430        </div>
1431    </div>
1432
1433
1434
1435
1436    
1436<script src="https://unpkg.com/@vkid/sdk@<3.0.0/dist-sdk/umd/index.js"></script>
1436
1437    
1437<script>
1438        // Логика попапа
1439        $(document).ready(function() {
1440            $('.header__user-link.user-auth').click(function(e) {
1441                e.preventDefault();
1442                $('#auth-popup-overlay').fadeIn(200);
1443            });
1444
1445            $('.auth-popup-close').click(function() {
1446                $('#auth-popup-overlay').fadeOut(200);
1447            });
1448
1449            $('#auth-popup-overlay').click(function(e) {
1450                if (e.target === this) {
1451                    $(this).fadeOut(200);
1452                }
1453            });
1454
1455            const $popupCheckbox = $('#auth-popup-overlay input[type="checkbox"]');
1456            const $popupBlocker = $('#auth-popup-overlay .auth-blocker-overlay');
1457            const updatePopupBlocker = function() {
1458                if ($popupCheckbox.is(':checked')) {
1459                    $popupBlocker.hide();
1460                } else {
1461                    $popupBlocker.show();
1462                }
1463            };
1464            $popupCheckbox.on('change', updatePopupBlocker);
1465            $popupBlocker.click(function(e) {
1466                e.stopPropagation();
1467                alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
1468                $popupCheckbox.focus();
1469            });
1470            updatePopupBlocker();
1471
1472            // Сохранение URL перед переходом (для Яндекс и Telegram)
1473            $('.auth-link-save-url').click(function(e) {
1474                const $checkbox = $(this).closest('.auth-popup-content').find('input[type="checkbox"]');
1475                if ($checkbox.length && !$checkbox.is(':checked')) {
1476                    e.preventDefault();
1477                    alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
1478                    $checkbox.focus();
1479                    return false;
1480                }
1481                e.preventDefault();
1482                const href = $(this).attr('href');
1483                const currentUrl = window.location.href; // Берем текущий URL страницы
1484
1485                $.post('/login/save-url.php', { url: currentUrl }, function() {
1486                    window.location.href = href;
1487                });
1488            });
1489        });
1490
1491        // Логика VK ID
1492        document.getElementById('vk-login-btn').addEventListener('click', function(e) {
1493            const checkbox = this.closest('.auth-popup-content').querySelector('input[type="checkbox"]');
1494            if (checkbox && !checkbox.checked) {
1495                e.preventDefault();
1496                alert('Пожалуйста, дайте согласие на обработку персональных данных, чтобы продолжить.');
1497                checkbox.focus();
1498                return false;
1499            }
1500            e.preventDefault();
1501
1502            // Сохраняем URL перед запуском VK SDK
1503            const currentUrl = window.location.href; // Берем текущий URL страницы
1504            $.post('/login/save-url.php', { url: currentUrl });
1505
1506            if (typeof VKIDSDK === 'undefined') {
1507                const script = document.createElement('script');
1508                script.src = 'https://unpkg.com/@vkid/sdk@latest/dist-sdk/umd/index.js';
1509                script.onload = initVkLogin;
1510                document.body.appendChild(script);
1511            } else {
1512                initVkLogin();
1513            }
1514        });
1515
1516        function initVkLogin() {
1517            const VKID = window.VKIDSDK;
1518
1519            VKID.Config.init({
1520                app: 51942002,
1521                redirectUrl: 'https://gdz-raketa.ru',
1522                responseMode: VKID.ConfigResponseMode.Callback,
1523                source: VKID.ConfigSource.LOWCODE,
1524                scope: 'email'
1525            });
1526
1527            VKID.Auth.login()
1528                .then(function (data) {
1529                    const code = data.code;
1530                    const deviceId = data.device_id;
1531
1532                    if (!code) {
1533                        console.error('Не получен код авторизации', data);
1534                        return;
1535                    }
1536
1537                    VKID.Auth.exchangeCode(code, deviceId)
1538                        .then(function (tokenData) {
1539                            console.log('Токены получены:', tokenData);
1540
1541                            VKID.Auth.userInfo(tokenData.access_token)
1542                                .then(function (userData) {
1543                                    console.log('Данные пользователя:', userData);
1544
1545                                    const requestData = {
1546                                        silent_token: tokenData.access_token,
1547                                        uuid: tokenData.state || tokenData.uuid || 'no-uuid',
1548                                        app_token: 'pebMomu3SGKpze06u4Je',
1549                                        user_id: userData.user.user_id,
1550                                        first_name: userData.user.first_name,
1551                                        last_name: userData.user.last_name,
1552                                        email: userData.user.email || ''
1553                                    };
1554
1555                                    fetch('https://adm.gdz-raketa.ru/app/auth/vk-auth/', {
1556                                        method: 'POST',
1557                                        headers: { 'Content-Type': 'application/json' },
1558                                        body: JSON.stringify(requestData)
1559                                    })
1560                                        .then(response => response.json())
1561                                        .then(result => {
1562                                            if (result.success) {
1563                                                window.location.href = `${result.redirect_url}?${result.params}`;
1564                                            } else {
1565                                                alert('Ошибка авторизации на сервере.');
1566                                                console.error(result);
1567                                            }
1568                                        })
1569                                        .catch(err => console.error('Ошибка fetch:', err));
1570                                });
1571                        })
1572                        .catch(err => console.error('Ошибка exchangeCode:', err));
1573                })
1574                .catch(function(error) {
1575                    console.error('Ошибка VKID.Auth.login:', error);
1576                });
1577        }
1578    </script>
vendor: 1 bytes, line 1578
1578
1579<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
1579
1580
1581</body>
1582
1583</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.