# Скрипты, блоки кода и плагины

# Как отключить работу скриптов в GC

**Временное отключение на определенной странице**: Добавьте в адресную строку страницы параметр `<span class="ql-badge-yellow" style="background-color:rgb(251,238,184);">?offscript=1</span>`. Например, для страницы со списком тренингов ссылка будет выглядеть так: `[https://ваш\_домен.getcourse.ru/teach/control/stream?offscript=1`](https://xn--_-7sbfkf5bif1g.getcourse.ru/teach/control/stream?offscript=1%60). Это отключение действует только для пользователя, который просматривает страницу по этой ссылке.

# Рекламная плашка

# Настройка рекламной плашки

<div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk-"></div>### Добавление ссылок через редирект

<div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk-%D0%A7%D1%82%D0%BE-%D0%B1%D1%8B-%D1%87%D1%83%D1%82%D1%8C-%D1%83%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B8%D1%82"><div class="ql-block" data-block-id="block-b031f56c-7f9a-487f-8403-fb75f1444573">Что бы чуть упростить добавление плашки.   
Просто создал две страницы редиректа и добавил их в скрипт.</div><div class="ql-block" data-block-id="block-7c5a0b93-a7e1-4968-8ac8-9d9e5bef1c86">[https://fitnessmama.school/pl/cms/page?folderId=199884](https://fitnessmama.school/pl/cms/page?folderId=199884)  
  
</div><div class="ql-block" data-block-id="block-171fdb04-0572-4e0c-abd9-067f5d27522d">![](https://t9015420006.p.clickup-attachments.com/t9015420006/36a6cf16-8cde-4a8e-88eb-7f0ce21d635a/image.png)</div></div>### Обновление рекламной плашки

Чтобы заменить плашку, необходимо:

1. Обновить ссылку на файл с изображением.
2. Заменить ссылку на страницу, куда будет вести плашка при нажатии.

Эти изменения нужно внести на следующих страницах редиректа:

**Страница перехода при нажатии на плашку** - [https://fitnessmama.school/pl/cms/page/editor?id=3811815](https://fitnessmama.school/pl/cms/page/editor?id=3811815)

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/scaled-1680-/dXNimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/dXNimage.png)

**Картинка рекламной плашки -** [https://fitnessmama.school/pl/cms/page/editor?id=3811801](https://fitnessmama.school/pl/cms/page/editor?id=3811801)

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/scaled-1680-/6L9image.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/6L9image.png)

При загрузке картинки в хранилище, доступ должен быть настроен для всех, что бы у неавторизованных пользователей, также отображалась плашка:

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/scaled-1680-/UiWimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/UiWimage.png)

### Проверка отображения плашки

Что бы проверить как отображается плашка, можно открыть публично доступную страницу ГК в инкогнито.  
Например: [https://fitnessmama.school/trainings2](https://fitnessmama.school/trainings2)

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/scaled-1680-/8Czimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/8Czimage.png)

<div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk--6"></div>### Видео про тех. настройку плашки:

<div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk-https%3A%2F%2Fdrive.google">[https://drive.google.com/file/d/1rkgeU2CIcbPFqO4nXksQx1WzejlSv0aE/view](https://drive.google.com/file/d/1rkgeU2CIcbPFqO4nXksQx1WzejlSv0aE/view) </div><div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk--7"></div>### Скрыть плашку на определенных страницах

<div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk-%D0%A7%D1%82%D0%BE-%D0%B1%D1%8B-%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C-%D0%B1%D0%B0%D0%BD%D0%B5%D1%80-"><div class="ql-block" data-block-id="block-35ac6d9c-5fbc-47e9-a51d-5482148aeae0">Что бы скрыть банер на определенных страницах сайта, нужно добавь путь в рабочий скрипт:  
[https://fitnessmama.school/pl/cms/layout/update?id=29679#js](https://fitnessmama.school/pl/cms/layout/update?id=29679#js)   
Обновление скрипта может занять около 15 мин.</div></div>[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/scaled-1680-/image.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/image.png)

### Отображение плашки в аккаунте

<div class="ql-block" data-block-id="block-d329b63e-e3b9-40c9-ac53-553129b3af4a" id="bkmrk-%D0%A7%D1%82%D0%BE-%D0%B1%D1%8B-%D0%BF%D0%BB%D0%B0%D1%88%D0%BA%D0%B0-%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0">Что бы плашка отображалась в GC нужно установить его темой для оформления аккаунта, но для этого нужно иметь доступ.</div><div class="ql-block" data-block-id="block-df511c4d-2f21-4482-a2e5-bebbe6f95ba3" id="bkmrk-%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F-%D0%B2-gc%3A-https%3A%2F">Статья в GC: [https://getcourse.ru/blog/816432#akk](https://getcourse.ru/blog/816432#akk)</div>

# Скрипт для плашки

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/scaled-1680-/Bgrimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/Bgrimage.png)

### JS

```javascript
//РЕКЛАМНАЯ ПЛАШКА

// Чтобы исключить отображение для определенной страницы, добавьте путь в массив excludedPages через запятую.
// Например: ["/cms/system/login", "/another/page", "/some/other/page"];

const excludedPages = ["/cms/system/login", "/pl/webinar/show", "/postura_login"]; 
if (!excludedPages.includes(window.location.pathname)) {

//var chek позволяет исключить отображение в определенных блоках
	var chek = $('#ltBlock2132901984, #ltBlock2140587928,); // ID формы виджета
	var cookie_max_age = 24 * 60 * 60; //Время жизни cookie в секундах.
	var delay = 1; //Задержка показа в миллисекундах, 1000 = 1 секунде.

	if (getCookie('popup_per_day') !== 'true') {
    	setTimeout(function() {

//!window.location.href.includes('/widget/') исключает отображаение плашки во всех виджетах
    	    if (chek.length == 0 && !window.location.href.includes('/widget/')) {
        	    if ($('.gc-main-content').hasClass('with-left-menu')) {
            	    $('.gc-main-content').append('<div class="info-banner menu"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	} else {
                	$('.gc-main-content').append('<div class="info-banner"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	}
        	} else {
            	console.log('на странице форма с ГК');

        	}

        	$('.info-banner').append('<div class="close-mybtn"></div>');
      		$('.close-mybtn').click(function() {
      	    $('.info-banner').hide();
       	    setCookie('popup_per_day', 'true', { 'max-age': cookie_max_age });
       	 });
   	 }, delay);
 	};
};

//FUNCTIONS
function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
}

function setCookie(name, value, options = {}) {

    options = {
        path: '/',
            secure: true,
            // при необходимости добавьте другие значения по умолчанию
            ...options
    };

    if (options.expires instanceof Date) {
        options.expires = options.expires.toUTCString();
    }

    var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

    for (var optionKey in options) {
        updatedCookie += "; " + optionKey;
        var optionValue = options[optionKey];
        if (optionValue !== true) {
            updatedCookie += "=" + optionValue;
        }
    }

    document.cookie = updatedCookie;
}

```

### CSS

```css
/* убрать баннер */
.common-banner-wrapper {
  display:none!important;
}

/* Стили для Баннер как у Геткурс */
  .info-banner {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 10px; 
    left: 10px; 
    Z-index: 9;
        overflow: hidden;
        padding: 20px;
  }
  .info-banner.menu {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 20px; 
    left: 90px; 
    Z-index: 999;
        overflow: hidden;
        padding: 20px;
  }
    .info-banner img.banner {
        border-radius: 16px; /*радиус скругления изображения*/ 
        box-shadow: 0 0 6px 2px #00000069; /*настройки тени*/
    }
.close-mybtn {
    cursor: pointer;
    position: absolute;
    width: 25px;
    height: 25px;
    top: 10px;
    right: 10px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 10px 1px #00000038;
}

.close-mybtn:before {
    content: '✕';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    color: #000;
    font-weight: bold;
    line-height: 1;
    font-size: 14px;
    padding: 6px  6.5px;
}

  @media (max-width:  920px) {
    .info-banner {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */ 
      bottom: 10px; 
      left: 0px; 
    }
    .info-banner.menu {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */  
      bottom: 50px; 
      left: 0px; 
  }
  }
/* Стили для Баннер как у Геткурс */

```

# IMC калькулятор

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/scaled-1680-/zyCimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-02/zyCimage.png)

### Экспорт блока

```
eyJ0eXBlIjoiZm9ybS1ub3JtYWwiLCJwcmVzZXQiOiJmb3JtMDIiLCJwYXJhbXMiOiJ7XCJmb3JtXCI6e1wiaXRlbXNcIjp7XCJwYXJ0c1wiOntcImZpZWxkNDkzNzZcIjp7XCJpbm5lclwiOntcInZhbHVlXCI6XCIgICAgPHN0eWxlPlxcclxcbiAgICAgICAgLmNvbmZpcm0tcnVsZXMtY2hlY2tib3gge1xcclxcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuYm1pLWNvbnRhaW5lciB7XFxyXFxuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcclxcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICAgICAgICAgICAgcGFkZGluZzogMjBweDtcXHJcXG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IDBweCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgICAgICAgICAgbWF4LXdpZHRoOiA4MDBweDtcXHJcXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5pbnB1dC1zZWN0aW9uLFxcclxcbiAgICAgICAgLnJlc3VsdC1zZWN0aW9uIHtcXHJcXG4gICAgICAgICAgICBmbGV4OiAxO1xcclxcbiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuaW5wdXQtc2VjdGlvbiB7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIGxhYmVsIHtcXHJcXG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgaW5wdXQsXFxyXFxuICAgICAgICBzZWxlY3Qge1xcclxcbiAgICAgICAgICAgIHdpZHRoOiA5MCU7XFxyXFxuICAgICAgICAgICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcclxcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5ibWktY29udGFpbmVyIGgyIHtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMzBweDtcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5yZXN1bHQtc2VjdGlvbiBwIHtcXHJcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgLmNhbGN1bGF0ZS1idG4ge1xcclxcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgICAgICAgICB3aWR0aDogOTAlO1xcclxcbiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN0JGRjtcXHJcXG4gICAgICAgICAgICBjb2xvcjogI2ZmZjtcXHJcXG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgICAgICB9XFxyXFxuXFxyXFxuICAgICAgICAuY2FsY3VsYXRlLWJ0bjpob3ZlciB7XFxyXFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNTZiMztcXHJcXG4gICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgIC5yZXN1bHQtc2VjdGlvbiBzcGFuIHtcXHJcXG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgPFxcL3N0eWxlPlxcclxcblxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJibWktY29udGFpbmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImlucHV0LXNlY3Rpb25cXFwiPlxcclxcbiAgICAgICAgICAgIDxoMj5JbnRyb2R1IGRhdGVsZTxcXC9oMj5cXHJcXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJhZ2VcXFwiPlZcXHUwMGUycnN0YSAoYW5pKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImFnZVxcXCIgbWluPVxcXCIxXFxcIiBtYXg9XFxcIjEyMFxcXCIgcGxhY2Vob2xkZXI9XFxcIlxcXCI+XFxyXFxuXFxyXFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZ2VuZGVyXFxcIj5TZXg6PFxcL2xhYmVsPlxcclxcbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XFxcImdlbmRlclxcXCI+XFxyXFxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcIm1hbGVcXFwiPkJcXHUwMTAzcmJhdDxcXC9vcHRpb24+XFxyXFxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcImZlbWFsZVxcXCI+RmVtZWllPFxcL29wdGlvbj5cXHJcXG4gICAgICAgICAgICA8XFwvc2VsZWN0PlxcclxcblxcclxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImhlaWdodFxcXCI+XFx1MDBjZW5cXHUwMTAzbFxcdTAyMWJpbWUgKGNtKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImhlaWdodFxcXCIgbWluPVxcXCI1MFxcXCIgbWF4PVxcXCIyNTBcXFwiIHBsYWNlaG9sZGVyPVxcXCJcXFwiPlxcclxcblxcclxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcIndlaWdodFxcXCI+R3JldXRhdGUgKGtnKTo8XFwvbGFiZWw+XFxyXFxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndlaWdodFxcXCIgbWluPVxcXCIyMFxcXCIgbWF4PVxcXCIzMDBcXFwiIHBsYWNlaG9sZGVyPVxcXCJcXFwiPlxcclxcblxcclxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNhbGN1bGF0ZS1idG5cXFwiIG9uY2xpY2s9XFxcImNhbGN1bGF0ZUJNSSgpXFxcIj5DYWxjdWxlYXpcXHUwMTAzIElNQzxcXC9kaXY+XFxyXFxuICAgICAgICA8XFwvZGl2PlxcclxcblxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LXNlY3Rpb25cXFwiPlxcclxcbiAgICAgICAgICAgIDxoMj5SZXp1bHRhdDxcXC9oMj5cXHJcXG4gICAgICAgICAgICA8cD5JTUMtdWwgdFxcdTAxMDN1OjxzcGFuIGlkPVxcXCJibWktcmVzdWx0XFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPk5pdmVsOiA8c3BhbiBpZD1cXFwiYm1pLWxldmVsXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPkRpYXBhem9udWwgc1xcdTAxMDNuXFx1MDEwM3RvczogPHNwYW4gaWQ9XFxcImhlYWx0aHktYm1pXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgICAgIDxwPkdyZXV0YXRlIG9wdGltXFx1MDEwMzo8c3BhbiBpZD1cXFwiaGVhbHRoeS13ZWlnaHRcXFwiPi0tPFxcL3NwYW4+PFxcL3A+XFxyXFxuICAgICAgICAgICAgPHA+UmVjb21hbmRcXHUwMTAzcmk6PHNwYW4gaWQ9XFxcInJlY29tbWVuZGF0aW9uXFxcIj4tLTxcXC9zcGFuPjxcXC9wPlxcclxcbiAgICAgICAgPFxcL2Rpdj5cXHJcXG4gICAgPFxcL2Rpdj5cXHJcXG5cXHJcXG4gICAgPHNjcmlwdD5cXHJcXG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUJNSSgpIHtcXHJcXG4gICAgICAgICAgICBjb25zdCBhZ2UgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlJykudmFsdWUsIDEwKTtcXHJcXG4gICAgICAgICAgICBjb25zdCBnZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZGVyJykudmFsdWU7XFxyXFxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVpZ2h0JykudmFsdWUpO1xcclxcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlaWdodCcpLnZhbHVlKTtcXHJcXG5cXHJcXG4gICAgICAgICAgICBpZiAoaXNOYU4oYWdlKSB8fCBpc05hTihoZWlnaHQpIHx8IGlzTmFOKHdlaWdodCkpIHtcXHJcXG4gICAgICAgICAgICAgICAgYWxlcnQoXFxcIlZcXHUwMTAzIHJ1Z1xcdTAxMDNtIHNcXHUwMTAzIGNvbXBsZXRhXFx1MDIxYmkgdG9hdGUgY1xcdTAwZTJtcHVyaWxlLlxcXCIpO1xcclxcbiAgICAgICAgICAgICAgICByZXR1cm47XFxyXFxuICAgICAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodE1ldGVycyA9IGhlaWdodCBcXC8gMTAwO1xcclxcbiAgICAgICAgICAgIGNvbnN0IGJtaSA9ICh3ZWlnaHQgXFwvIChoZWlnaHRNZXRlcnMgKiBoZWlnaHRNZXRlcnMpKS50b0ZpeGVkKDIpO1xcclxcblxcclxcbiAgICAgICAgICAgIGxldCBsZXZlbDtcXHJcXG4gICAgICAgICAgICBpZiAoYm1pIDwgMTguNSkge1xcclxcbiAgICAgICAgICAgICAgICBsZXZlbCA9ICdTdWJwb25kZXJhbGknO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm1pID49IDE4LjUgJiYgYm1pIDwgMjUpIHtcXHJcXG4gICAgICAgICAgICAgICAgbGV2ZWwgPSAnU3RhbmRhcmQnO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm1pID49IDI1ICYmIGJtaSA8IDMwKSB7XFxyXFxuICAgICAgICAgICAgICAgIGxldmVsID0gJ0V4Y2VzdWwgZGUgZ3JldXRhdGUnO1xcclxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAgICAgICAgIGxldmVsID0gJ0dyXFx1MDEwM3NpbWUnO1xcclxcbiAgICAgICAgICAgIH1cXHJcXG5cXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5Qm1pTWluID0gMTguNTtcXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5Qm1pTWF4ID0gMjQuOTtcXHJcXG4gICAgICAgICAgICBjb25zdCBoZWFsdGh5V2VpZ2h0TWluID0gKGhlYWx0aHlCbWlNaW4gKiBoZWlnaHRNZXRlcnMgKiBoZWlnaHRNZXRlcnMpLnRvRml4ZWQoMSk7XFxyXFxuICAgICAgICAgICAgY29uc3QgaGVhbHRoeVdlaWdodE1heCA9IChoZWFsdGh5Qm1pTWF4ICogaGVpZ2h0TWV0ZXJzICogaGVpZ2h0TWV0ZXJzKS50b0ZpeGVkKDEpO1xcclxcblxcclxcbiAgICAgICAgICAgIGxldCByZWNvbW1lbmRhdGlvbiA9ICcnO1xcclxcbiAgICAgICAgICAgIGlmICh3ZWlnaHQgPCBoZWFsdGh5V2VpZ2h0TWluKSB7XFxyXFxuICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uID0gYFRyZWJ1aWUgc1xcdTAxMDMgY1xcdTAwZTJcXHUwMjE5dGlnaSAkeyhoZWFsdGh5V2VpZ2h0TWluIC0gd2VpZ2h0KS50b0ZpeGVkKDEpfSBrZyBwZW50cnUgYSBhdGluZ2Ugbm9ybWEuYDtcXHJcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdlaWdodCA+IGhlYWx0aHlXZWlnaHRNYXgpIHtcXHJcXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb24gPVxcclxcbiAgICAgICAgICAgICAgICAgICAgYFRyZWJ1aWUgc1xcdTAxMDMgc2xcXHUwMTAzYmVcXHUwMjE5dGkgJHsod2VpZ2h0IC0gaGVhbHRoeVdlaWdodE1heCkudG9GaXhlZCgxKX0ga2cgcGVudHJ1IGEgYXRpbmdlIG5vcm1hLmA7XFxyXFxuICAgICAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb24gPSAnR3JldXRhdGVhIGR2cy4gZXN0ZSBcXHUwMGVlbiBsaW1pdGVsZSBub3JtYWxlLic7XFxyXFxuICAgICAgICAgICAgfVxcclxcblxcclxcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdibWktcmVzdWx0JykudGV4dENvbnRlbnQgPSBibWk7XFxyXFxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JtaS1sZXZlbCcpLnRleHRDb250ZW50ID0gbGV2ZWw7XFxyXFxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aHktYm1pJykudGV4dENvbnRlbnQgPSBgJHtoZWFsdGh5Qm1pTWlufSAtICR7aGVhbHRoeUJtaU1heH1gO1xcclxcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGh5LXdlaWdodCcpLnRleHRDb250ZW50ID0gYCR7aGVhbHRoeVdlaWdodE1pbn0ga2cgLSAke2hlYWx0aHlXZWlnaHRNYXh9IGtnYDtcXHJcXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjb21tZW5kYXRpb24nKS50ZXh0Q29udGVudCA9IHJlY29tbWVuZGF0aW9uO1xcclxcbiAgICAgICAgfVxcclxcbiAgICA8XFwvc2NyaXB0PlwifSxcIm5hbWVcIjpcImZpZWxkNDkzNzZcIixcInBhcnRUeXBlXCI6XCJodG1sXCIsXCJoQWxpZ25cIjpcIlwiLFwibWFyZ2luVG9wXCI6XCJcIixcIm1hcmdpbkJvdHRvbVwiOlwiXCIsXCJ0ZXh0Q29sb3JcIjpcIlwiLFwibGluZUhlaWdodFwiOlwiXCIsXCJlbGVtZW50Q3NzQ2xhc3NcIjpcIlwifX19LFwiaGFuZGxlclwiOlwiXCIsXCJmb3JtQm94XCI6e1wiYmdjb2xvclwiOlwiI0YwRjBGMFwiLFwiY29sb3JcIjpcIlwiLFwiYmdpbWFnZVwiOntcImhhc2hcIjpcIlwifSxcImJvcmRlclwiOntcIndpZHRoXCI6XCIwcHhcIixcInR5cGVcIjpcInNvbGlkXCIsXCJjb2xvclwiOlwiIzk5OTk5OVwiLFwicmFkaXVzXCI6XCJcIn0sXCJwYWRkaW5nc1wiOntcImhvcml6b250YWxcIjpcIjQwcHhcIixcInZlcnRpY2FsXCI6XCIzMHB4XCJ9LFwiZmxleERpcmVjdGlvblwiOlwiY29sdW1uXCIsXCJ0ZXh0QWxpZ25cIjpcIlwifX0sXCJibG9ja0NvZGVcIjpcIjczOWVlXCIsXCJ2aWV3QmxvY2tMZWZ0T2Zmc2V0XCI6XCIyXCIsXCJ2aWV3QmxvY2tXaWR0aFwiOlwiOFwiLFwiYmxvY2tQYWRkaW5nVG9wXCI6XCIyLjVcIixcImJsb2NrUGFkZGluZ0JvdHRvbVwiOlwiMi41XCIsXCJibG9ja0JhY2tncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0ZvcmVncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0xpbmtDb2xvclwiOlwiXCIsXCJibG9ja0ZvbnRcIjpcIlwiLFwiYmxvY2tGb250SGVhZGVyXCI6XCJcIixcImJsb2NrQ3NzQ2xhc3NcIjpcIlwiLFwiYmxvY2tDb3ZlclwiOntcImltYWdlXCI6e1wiaGFzaFwiOlwiXCJ9LFwiYmFja2dyb3VuZFR5cGVcIjpcInNjcm9sbFwiLFwiaGVpZ2h0XCI6XCIxMDB2aFwiLFwidmlkZW9cIjp7XCJzcmNfdmlkZW9fbGlua1wiOlwiXCIsXCJhdXRvcGxheVwiOlwiMFwiLFwidmltZW9faGFzaFwiOlwiXCJ9LFwiYmFja2dyb3VuZE9wYWNpdHlTdGFydFwiOlwiMC4zXCIsXCJiYWNrZ3JvdW5kT3BhY2l0eUZpbmlzaFwiOlwiMC42XCJ9LFwiYm94XCI6e1wiYmdjb2xvclwiOlwiI0YwRjBGMFwiLFwiY29sb3JcIjpcIlwiLFwiYmdpbWFnZVwiOntcImhhc2hcIjpcIlwifSxcImJvcmRlclwiOntcIndpZHRoXCI6XCIwcHhcIixcInR5cGVcIjpcInNvbGlkXCIsXCJjb2xvclwiOlwiIzk5OTk5OVwiLFwicmFkaXVzXCI6XCJcIn0sXCJwYWRkaW5nc1wiOntcImhvcml6b250YWxcIjpcIjQwcHhcIixcInZlcnRpY2FsXCI6XCIzMHB4XCJ9fSxcImlzTW9kYWxcIjp7XCJwb3B1cFR5cGVcIjpcInBvcHVwXCIsXCJtb2RhbFdpZHRoXCI6XCJcIixcIm1vZGFsQ2xhc3NcIjpcIlwifSxcImJsb2NrQ2xpY2tBY3Rpb25cIjp7XCJ0eXBlXCI6XCJcIixcImxpbmtcIjpcIlwiLFwiamF2YXNjcmlwdFwiOlwiXCIsXCJmb3JtVHlwZVwiOlwic3Vic2NyaWJlXCIsXCJwb3NpdGlvblwiOntcIm9mZmVyX2lkXCI6XCJcIn0sXCJmb3JtVGl0bGVcIjpcIlwiLFwiZm9ybUJ1dHRvblRpdGxlXCI6XCJcIixcImZvcm1CbG9ja0NvZGVcIjpcIlwiLFwibW9kYWxCbG9ja0NvZGVcIjpcIlwifSxcImJsb2NrRmxleFwiOntcImJhc2lzXCI6XCJcIixcInNocmlua1wiOlwiXCIsXCJncm93XCI6XCJcIn19IiwiY3NzIjpudWxsfQ==
```

### HTML

```html
    <style>
        .confirm-rules-checkbox {
            display: none;
        }

        .bmi-container {
            display: flex;
            flex-direction: row;
            background-color: #fff;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
            max-width: 800px;
            width: 100%;
        }

        .input-section,
        .result-section {
            flex: 1;
            padding: 20px;
        }

        .input-section {
            border-right: 1px solid #ddd;
        }

        label {
            display: block;
            margin-bottom: 10px;
            font-weight: bold;
        }

        input,
        select {
            width: 90%;
            padding: 10px;
            margin-bottom: 15px;
            border: 1px solid #ddd;
            border-radius: 5px;
            font-size: 16px;
        }

        .bmi-container h2 {
            margin-bottom: 20px;
            font-size: 30px;
        }

        .result-section p {
            margin-bottom: 10px;
        }

        .calculate-btn {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 90%;
            padding: 10px;
            background-color: #007BFF;
            color: #fff;
            border: none;
            border-radius: 5px;
            font-size: 16px;
            cursor: pointer;
        }

        .calculate-btn:hover {
            background-color: #0056b3;
        }

        .result-section span {
            font-weight: bold;
        }
    </style>

    <div class="bmi-container">
        <div class="input-section">
            <h2>Introdu datele</h2>
            <label for="age">Vârsta (ani):</label>
            <input type="number" id="age" min="1" max="120" placeholder="">

            <label for="gender">Sex:</label>
            <select id="gender">
                <option value="male">Bărbat</option>
                <option value="female">Femeie</option>
            </select>

            <label for="height">Înălțime (cm):</label>
            <input type="number" id="height" min="50" max="250" placeholder="">

            <label for="weight">Greutate (kg):</label>
            <input type="number" id="weight" min="20" max="300" placeholder="">

            <div class="calculate-btn" onclick="calculateBMI()">Calculează IMC</div>
        </div>

        <div class="result-section">
            <h2>Rezultat</h2>
            <p>IMC-ul tău:<span id="bmi-result">--</span></p>
            <p>Nivel: <span id="bmi-level">--</span></p>
            <p>Diapazonul sănătos: <span id="healthy-bmi">--</span></p>
            <p>Greutate optimă:<span id="healthy-weight">--</span></p>
            <p>Recomandări:<span id="recommendation">--</span></p>
        </div>
    </div>

    <script>
        function calculateBMI() {
            const age = parseInt(document.getElementById('age').value, 10);
            const gender = document.getElementById('gender').value;
            const height = parseFloat(document.getElementById('height').value);
            const weight = parseFloat(document.getElementById('weight').value);

            if (isNaN(age) || isNaN(height) || isNaN(weight)) {
                alert("Vă rugăm să completați toate câmpurile.");
                return;
            }

            const heightMeters = height / 100;
            const bmi = (weight / (heightMeters * heightMeters)).toFixed(2);

            let level;
            if (bmi < 18.5) {
                level = 'Subponderali';
            } else if (bmi >= 18.5 && bmi < 25) {
                level = 'Standard';
            } else if (bmi >= 25 && bmi < 30) {
                level = 'Excesul de greutate';
            } else {
                level = 'Grăsime';
            }

            const healthyBmiMin = 18.5;
            const healthyBmiMax = 24.9;
            const healthyWeightMin = (healthyBmiMin * heightMeters * heightMeters).toFixed(1);
            const healthyWeightMax = (healthyBmiMax * heightMeters * heightMeters).toFixed(1);

            let recommendation = '';
            if (weight < healthyWeightMin) {
                recommendation = `Trebuie să câștigi ${(healthyWeightMin - weight).toFixed(1)} kg pentru a atinge norma.`;
            } else if (weight > healthyWeightMax) {
                recommendation =
                    `Trebuie să slăbești ${(weight - healthyWeightMax).toFixed(1)} kg pentru a atinge norma.`;
            } else {
                recommendation = 'Greutatea dvs. este în limitele normale.';
            }

            document.getElementById('bmi-result').textContent = bmi;
            document.getElementById('bmi-level').textContent = level;
            document.getElementById('healthy-bmi').textContent = `${healthyBmiMin} - ${healthyBmiMax}`;
            document.getElementById('healthy-weight').textContent = `${healthyWeightMin} kg - ${healthyWeightMax} kg`;
            document.getElementById('recommendation').textContent = recommendation;
        }
    </script>
```

# GetFusion

[https://getfusion.ru/docs](https://getfusion.ru/docs)

# Body Fat Calculator

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/scaled-1680-/mgmimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-03/mgmimage.png)

Экспорт блока

```
eyJ0eXBlIjoicmF3LWh0bWwiLCJwcmVzZXQiOiJyYXctaHRtbCIsInBhcmFtcyI6IntcImJsb2NrQ29kZVwiOlwiYzRhNjRcIixcIm5hbWVcIjpcIlwiLFwicmF3VmFsdWVcIjpcIjxzdHlsZT5cXG4gICAgXFwvKiBib2R5IHtcXG4gICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmNTtcXG4gICAgICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgIH0gKlxcL1xcblxcbiAgICAubW5mc3QtYmZjIHtcXG4gICAgICAgIG1heC13aWR0aDogNTAwcHg7XFxuICAgICAgICBtYXJnaW46IDUwcHggYXV0bztcXG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XFxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgaDEge1xcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICAgICAgY29sb3I6ICMzMzM7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyBsYWJlbCB7XFxuICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgIGNvbG9yOiAjNTU1O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgaW5wdXQsXFxuICAgIC5tbmZzdC1iZmMgc2VsZWN0IHtcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgICAgcGFkZGluZzogMTBweDtcXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XFxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xcbiAgICB9XFxuXFxuICAgIC5tbmZzdC1iZmMgYnV0dG9uIHtcXG4gICAgICAgIHdpZHRoOiAxMDAlO1xcbiAgICAgICAgcGFkZGluZzogMTJweDtcXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyOGE3NDU7XFxuICAgICAgICBjb2xvcjogd2hpdGU7XFxuICAgICAgICBib3JkZXI6IG5vbmU7XFxuICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyBidXR0b246aG92ZXIge1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIxODgzODtcXG4gICAgfVxcblxcbiAgICAubW5mc3QtYmZjIC5yZXN1bHRzIHtcXG4gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7XFxuICAgIH1cXG5cXG4gICAgLm1uZnN0LWJmYyAucmVzdWx0LWl0ZW0ge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgfVxcblxcbiAgICAubW5mc3QtYmZjIC5yZXN1bHQtbGFiZWwge1xcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgICAgICBjb2xvcjogIzMzMztcXG4gICAgfVxcbjxcXC9zdHlsZT5cXG5cXG48ZGl2IGNsYXNzPVxcXCJtbmZzdC1iZmNcXFwiPlxcbiAgICA8aDE+Qm9keSBGYXQgQ2FsY3VsYXRvcjxcXC9oMT5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwiZ2VuZGVyXFxcIj5TZXg6PFxcL2xhYmVsPlxcbiAgICA8c2VsZWN0IGlkPVxcXCJnZW5kZXJcXFwiIG9uY2hhbmdlPVxcXCJ0b2dnbGVIaXBGaWVsZCgpXFxcIj5cXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XFxcIm1hbGVcXFwiPmJcXHUwMTAzcmJhdDxcXC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uIHZhbHVlPVxcXCJmZW1hbGVcXFwiPmZlbWVpZTxcXC9vcHRpb24+XFxuICAgIDxcXC9zZWxlY3Q+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcImFnZVxcXCI+VlxcdTAwZTJyc3RhOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcImFnZVxcXCIgcGxhY2Vob2xkZXI9XFxcImludHJvZHUgdlxcdTAwZTJyc3RhXFxcIiByZXF1aXJlZD5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwid2VpZ2h0XFxcIj5HcmV1dGF0ZSAoa2cpOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndlaWdodFxcXCIgcGxhY2Vob2xkZXI9XFxcImludHJvZHUgZ3JldXRhdGVhXFxcIiByZXF1aXJlZD5cXG5cXG4gICAgPGxhYmVsIGZvcj1cXFwiaGVpZ2h0XFxcIj5cXHUwMGNlblxcdTAxMDNsXFx1MDIxYmltZWEgKGNtKTo8XFwvbGFiZWw+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJudW1iZXJcXFwiIGlkPVxcXCJoZWlnaHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJpbnRyb2R1IFxcdTAwZWVuXFx1MDEwM2xcXHUwMjFiaW1lYVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcIm5lY2tcXFwiPkdcXHUwMGUydCAoY20pOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIm5lY2tcXFwiIHBsYWNlaG9sZGVyPVxcXCJpbnRyb2R1IGNpcmN1bWZlcmluXFx1MDIxYmEgZ1xcdTAwZTJ0dWx1aVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxsYWJlbCBmb3I9XFxcIndhaXN0XFxcIj5UYWxpZSAoY20pOjxcXC9sYWJlbD5cXG4gICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgaWQ9XFxcIndhaXN0XFxcIiBwbGFjZWhvbGRlcj1cXFwiaW50cm9kdSBjaXJjdW1mZXJpblxcdTAyMWJhIHRhbGllaVxcXCIgcmVxdWlyZWQ+XFxuXFxuICAgIDxkaXYgaWQ9XFxcImhpcEZpZWxkXFxcIiBzdHlsZT1cXFwiZGlzcGxheTpub25lO1xcXCI+XFxuICAgICAgICA8bGFiZWwgZm9yPVxcXCJoaXBcXFwiPlxcdTAyMThvbGR1cmkgKGNtKTo8XFwvbGFiZWw+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwibnVtYmVyXFxcIiBpZD1cXFwiaGlwXFxcIiBwbGFjZWhvbGRlcj1cXFwiaW50cm9kdSBjaXJjdW1mZXJpblxcdTAyMWJhIFxcdTAyMTlvbGR1cmlsb3JcXFwiPlxcbiAgICA8XFwvZGl2PlxcblxcbiAgICA8YnV0dG9uIG9uY2xpY2s9XFxcImNhbGN1bGF0ZUJvZHlGYXQoKVxcXCI+Q2FsY3VsZWF6XFx1MDEwMzxcXC9idXR0b24+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdHNcXFwiIGlkPVxcXCJyZXN1bHRzXFxcIj48XFwvZGl2PlxcbjxcXC9kaXY+XFxuXFxuPHNjcmlwdD5cXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGlwRmllbGQoKSB7XFxuICAgICAgICBjb25zdCBnZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZGVyJykudmFsdWU7XFxuICAgICAgICBjb25zdCBoaXBGaWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoaXBGaWVsZCcpO1xcbiAgICAgICAgaWYgKGdlbmRlciA9PT0gJ2ZlbWFsZScpIHtcXG4gICAgICAgICAgICBoaXBGaWVsZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaGlwRmllbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVCb2R5RmF0KCkge1xcbiAgICAgICAgY29uc3QgZ2VuZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlbmRlcicpLnZhbHVlO1xcbiAgICAgICAgY29uc3QgYWdlID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlJykudmFsdWUpO1xcbiAgICAgICAgY29uc3Qgd2VpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VpZ2h0JykudmFsdWUpO1xcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVpZ2h0JykudmFsdWUpO1xcbiAgICAgICAgY29uc3QgbmVjayA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25lY2snKS52YWx1ZSk7XFxuICAgICAgICBjb25zdCB3YWlzdCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dhaXN0JykudmFsdWUpO1xcbiAgICAgICAgbGV0IGhpcCA9IG51bGw7XFxuXFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnZmVtYWxlJykge1xcbiAgICAgICAgICAgIGhpcCA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hpcCcpLnZhbHVlKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIFxcL1xcLyBVLlMuIE5hdnkgTWV0aG9kIENhbGN1bGF0aW9uXFxuICAgICAgICBsZXQgYm9keUZhdFBlcmNlbnRhZ2U7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnbWFsZScpIHtcXG4gICAgICAgICAgICBib2R5RmF0UGVyY2VudGFnZSA9IDQ5NSBcXC8gKDEuMDMyNCAtIDAuMTkwNzcgKiBNYXRoLmxvZzEwKHdhaXN0IC0gbmVjaykgKyAwLjE1NDU2ICogTWF0aC5sb2cxMChoZWlnaHQpKSAtXFxuICAgICAgICAgICAgICAgIDQ1MDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgYm9keUZhdFBlcmNlbnRhZ2UgPSA0OTUgXFwvICgxLjI5NTc5IC0gMC4zNTAwNCAqIE1hdGgubG9nMTAod2Fpc3QgKyBoaXAgLSBuZWNrKSArIDAuMjIxMDAgKiBNYXRoLmxvZzEwKFxcbiAgICAgICAgICAgICAgICBoZWlnaHQpKSAtIDQ1MDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGNvbnN0IGJvZHlGYXRNYXNzID0gKGJvZHlGYXRQZXJjZW50YWdlIFxcLyAxMDApICogd2VpZ2h0O1xcbiAgICAgICAgY29uc3QgbGVhbkJvZHlNYXNzID0gd2VpZ2h0IC0gYm9keUZhdE1hc3M7XFxuXFxuICAgICAgICBcXC9cXC8gSmFja3NvbiAmIFBvbGxvY2sgSWRlYWwgQm9keSBGYXQgQ2FsY3VsYXRpb25cXG4gICAgICAgIGxldCBpZGVhbEJvZHlGYXQgPSBpZGVhbEJvZHlGYXRDYWxjKGFnZSwgZ2VuZGVyKTtcXG5cXG4gICAgICAgIGNvbnN0IGJvZHlGYXRUb0xvc2UgPSBNYXRoLm1heCgwLCBib2R5RmF0TWFzcyAtIChpZGVhbEJvZHlGYXQgXFwvIDEwMCkgKiB3ZWlnaHQpO1xcblxcbiAgICAgICAgXFwvXFwvIEJNSSBNZXRob2QgZm9yIEJvZHkgRmF0IChhcHByb3hpbWF0aW9uKVxcbiAgICAgICAgY29uc3QgYm1pID0gd2VpZ2h0IFxcLyBNYXRoLnBvdyhoZWlnaHQgXFwvIDEwMCwgMik7XFxuICAgICAgICBjb25zdCBib2R5RmF0Qm1pTWV0aG9kID0gKDEuMiAqIGJtaSkgKyAoMC4yMyAqIGFnZSkgLSAoMTAuOCAqIChnZW5kZXIgPT09ICdtYWxlJyA/IDEgOiAwKSkgLSA1LjQ7XFxuXFxuICAgICAgICBcXC9cXC8gQm9keSBGYXQgQ2F0ZWdvcnlcXG4gICAgICAgIGxldCBib2R5RmF0Q2F0ZWdvcnk7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSAnbWFsZScpIHtcXG4gICAgICAgICAgICBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCA2KSB7XFxuICAgICAgICAgICAgICAgIGJvZHlGYXRDYXRlZ29yeSA9ICdFc3NlbnRpYWwgZmF0JztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMTQpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0F0aGxldGVzJztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMTgpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0ZpdG5lc3MnO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCAyNSkge1xcbiAgICAgICAgICAgICAgICBib2R5RmF0Q2F0ZWdvcnkgPSAnQXZlcmFnZSc7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ09iZXNlJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChib2R5RmF0UGVyY2VudGFnZSA8IDE0KSB7XFxuICAgICAgICAgICAgICAgIGJvZHlGYXRDYXRlZ29yeSA9ICdFc3NlbnRpYWwgZmF0JztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMjEpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0F0aGxldGVzJztcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlGYXRQZXJjZW50YWdlIDwgMjUpIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ0ZpdG5lc3MnO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keUZhdFBlcmNlbnRhZ2UgPCAzMikge1xcbiAgICAgICAgICAgICAgICBib2R5RmF0Q2F0ZWdvcnkgPSAnQXZlcmFnZSc7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgYm9keUZhdENhdGVnb3J5ID0gJ09iZXNlJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICBcXC9cXC8gRGlzcGxheSByZXN1bHRzXFxuICAgICAgICBjb25zdCByZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTtcXG4gICAgICAgIHJlc3VsdHMuaW5uZXJIVE1MID0gYFxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3VsdC1pdGVtXFxcIj48c3BhbiBjbGFzcz1cXFwicmVzdWx0LWxhYmVsXFxcIj5Cb2R5IEZhdCAoJSk6PFxcL3NwYW4+ICR7Ym9keUZhdFBlcmNlbnRhZ2UudG9GaXhlZCgyKX0lPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+Qm9keSBGYXQgQ2F0ZWdvcnk6PFxcL3NwYW4+ICR7Ym9keUZhdENhdGVnb3J5fTxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkJvZHkgRmF0IE1hc3MgKGtnKTo8XFwvc3Bhbj4gJHtib2R5RmF0TWFzcy50b0ZpeGVkKDIpfSBrZzxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkxlYW4gQm9keSBNYXNzIChrZyk6PFxcL3NwYW4+ICR7bGVhbkJvZHlNYXNzLnRvRml4ZWQoMil9IGtnPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+SWRlYWwgQm9keSBGYXQgZm9yIEdpdmVuIEFnZSAoJSk6PFxcL3NwYW4+ICR7aWRlYWxCb2R5RmF0LnRvRml4ZWQoMil9JTxcXC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicmVzdWx0LWl0ZW1cXFwiPjxzcGFuIGNsYXNzPVxcXCJyZXN1bHQtbGFiZWxcXFwiPkJvZHkgRmF0IHRvIExvc2UgdG8gUmVhY2ggSWRlYWwgKGtnKTo8XFwvc3Bhbj4gJHtib2R5RmF0VG9Mb3NlLnRvRml4ZWQoMil9IGtnPFxcL2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXN1bHQtaXRlbVxcXCI+PHNwYW4gY2xhc3M9XFxcInJlc3VsdC1sYWJlbFxcXCI+Qm9keSBGYXQgKCUpOjxcXC9zcGFuPiAoQk1JIG1ldGhvZCk6ICR7Ym9keUZhdEJtaU1ldGhvZC50b0ZpeGVkKDIpfSU8XFwvZGl2PlxcbiAgICAgICAgYDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBpZGVhbEJvZHlGYXRDYWxjKGFnZSwgZ2VuZGVyKSB7XFxuICAgICAgICBpZiAoZ2VuZGVyID09PSBcXFwibWFsZVxcXCIpIHtcXG4gICAgICAgICAgICBpZiAoYWdlIDw9IDIwKSByZXR1cm4gOC41O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSAyNSkgcmV0dXJuIDEwLjU7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDMwKSByZXR1cm4gMTIuNztcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gMzUpIHJldHVybiAxMy43O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA0MCkgcmV0dXJuIDE1LjM7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDQ1KSByZXR1cm4gMTYuNDtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNTApIHJldHVybiAxOC45O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA1NSkgcmV0dXJuIDIwLjk7XFxuICAgICAgICAgICAgZWxzZSByZXR1cm4gMjI7IFxcL1xcLyBcXHUwNDFjXFx1MDQzZVxcdTA0MzZcXHUwNDNkXFx1MDQzZSBcXHUwNDQzXFx1MDQzYVxcdTA0MzBcXHUwNDM3XFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMyXFx1MDQzZVxcdTA0MzdcXHUwNDQwXFx1MDQzMFxcdTA0NDFcXHUwNDQyXFx1MDQzMCBcXHUwNDMyXFx1MDQ0YlxcdTA0NDhcXHUwNDM1IDU1XFxuICAgICAgICB9IGVsc2UgaWYgKGdlbmRlciA9PT0gXFxcImZlbWFsZVxcXCIpIHtcXG4gICAgICAgICAgICBpZiAoYWdlIDw9IDIwKSByZXR1cm4gMTcuNztcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gMjUpIHJldHVybiAxOC40O1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSAzMCkgcmV0dXJuIDE5LjM7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDM1KSByZXR1cm4gMjEuNTtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNDApIHJldHVybiAyMi4yO1xcbiAgICAgICAgICAgIGVsc2UgaWYgKGFnZSA8PSA0NSkgcmV0dXJuIDIyLjk7XFxuICAgICAgICAgICAgZWxzZSBpZiAoYWdlIDw9IDUwKSByZXR1cm4gMjUuMjtcXG4gICAgICAgICAgICBlbHNlIGlmIChhZ2UgPD0gNTUpIHJldHVybiAyNi4zO1xcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIDI4OyBcXC9cXC8gXFx1MDQxY1xcdTA0M2VcXHUwNDM2XFx1MDQzZFxcdTA0M2UgXFx1MDQ0M1xcdTA0M2FcXHUwNDMwXFx1MDQzN1xcdTA0MzBcXHUwNDQyXFx1MDQ0YyBcXHUwNDM3XFx1MDQzZFxcdTA0MzBcXHUwNDQ3XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzNSBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQzMlxcdTA0M2VcXHUwNDM3XFx1MDQ0MFxcdTA0MzBcXHUwNDQxXFx1MDQ0MlxcdTA0MzAgXFx1MDQzMlxcdTA0NGJcXHUwNDQ4XFx1MDQzNSA1NVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIG51bGw7IFxcL1xcLyBcXHUwNDE1XFx1MDQ0MVxcdTA0M2JcXHUwNDM4IFxcdTA0M2ZcXHUwNDNlXFx1MDQzYiBcXHUwNDNkXFx1MDQzNSBcXHUwNDQzXFx1MDQzYVxcdTA0MzBcXHUwNDM3XFx1MDQzMFxcdTA0M2QsIFxcdTA0MzJcXHUwNDNlXFx1MDQzN1xcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgbnVsbFxcbiAgICB9XFxuPFxcL3NjcmlwdD5cIixcInJlcGxhY2VWYXJpYWJsZXNcIjpcIlwiLFwiYmxvY2tQYWRkaW5nVG9wXCI6MCxcImJsb2NrUGFkZGluZ0JvdHRvbVwiOjAsXCJibG9ja0JhY2tncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0ZvcmVncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0xpbmtDb2xvclwiOlwiXCIsXCJibG9ja0ZvbnRcIjpudWxsLFwiYmxvY2tGb250SGVhZGVyXCI6bnVsbCxcImJsb2NrQ3NzQ2xhc3NcIjpcIlwiLFwiYmxvY2tDb3ZlclwiOm51bGwsXCJpc01vZGFsXCI6bnVsbCxcImJsb2NrQ2xpY2tBY3Rpb25cIjpcIlwiLFwiYmxvY2tGbGV4XCI6MH0iLCJjc3MiOm51bGwsImlzUmVkZXNpZ24iOmZhbHNlfQ==
```

```html
<style>
    /* body {
            font-family: Arial, sans-serif;
            background-color: #f0f0f5;
            margin: 0;
            padding: 0;
        } */

    .mnfst-bfc {
        max-width: 500px;
        margin: 50px auto;
        padding: 20px;
        background-color: white;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        border-radius: 10px;
    }

    .mnfst-bfc h1 {
        text-align: center;
        color: #333;
    }

    .mnfst-bfc label {
        display: block;
        margin-bottom: 8px;
        color: #555;
    }

    .mnfst-bfc input,
    .mnfst-bfc select {
        width: 100%;
        padding: 10px;
        margin-bottom: 15px;
        border: 1px solid #ccc;
        border-radius: 5px;
    }

    .mnfst-bfc button {
        width: 100%;
        padding: 12px;
        background-color: #28a745;
        color: white;
        border: none;
        border-radius: 5px;
        cursor: pointer;
    }

    .mnfst-bfc button:hover {
        background-color: #218838;
    }

    .mnfst-bfc .results {
        margin-top: 20px;
    }

    .mnfst-bfc .result-item {
        margin-bottom: 10px;
    }

    .mnfst-bfc .result-label {
        font-weight: bold;
        color: #333;
    }
</style>

<div class="mnfst-bfc">
    <h1>Body Fat Calculator</h1>

    <label for="gender">Sex:</label>
    <select id="gender" onchange="toggleHipField()">
        <option value="male">bărbat</option>
        <option value="female">femeie</option>
    </select>

    <label for="age">Vârsta:</label>
    <input type="number" id="age" placeholder="introdu vârsta" required>

    <label for="weight">Greutate (kg):</label>
    <input type="number" id="weight" placeholder="introdu greutatea" required>

    <label for="height">Înălțimea (cm):</label>
    <input type="number" id="height" placeholder="introdu înălțimea" required>

    <label for="neck">Gât (cm):</label>
    <input type="number" id="neck" placeholder="introdu circumferința gâtului" required>

    <label for="waist">Talie (cm):</label>
    <input type="number" id="waist" placeholder="introdu circumferința taliei" required>

    <div id="hipField" style="display:none;">
        <label for="hip">Șolduri (cm):</label>
        <input type="number" id="hip" placeholder="introdu circumferința șoldurilor">
    </div>

    <button onclick="calculateBodyFat()">Calculează</button>

    <div class="results" id="results"></div>
</div>

<script>
    function toggleHipField() {
        const gender = document.getElementById('gender').value;
        const hipField = document.getElementById('hipField');
        if (gender === 'female') {
            hipField.style.display = 'block';
        } else {
            hipField.style.display = 'none';
        }
    }

    function calculateBodyFat() {
        const gender = document.getElementById('gender').value;
        const age = parseFloat(document.getElementById('age').value);
        const weight = parseFloat(document.getElementById('weight').value);
        const height = parseFloat(document.getElementById('height').value);
        const neck = parseFloat(document.getElementById('neck').value);
        const waist = parseFloat(document.getElementById('waist').value);
        let hip = null;

        if (gender === 'female') {
            hip = parseFloat(document.getElementById('hip').value);
        }

        // U.S. Navy Method Calculation
        let bodyFatPercentage;
        if (gender === 'male') {
            bodyFatPercentage = 495 / (1.0324 - 0.19077 * Math.log10(waist - neck) + 0.15456 * Math.log10(height)) -
                450;
        } else {
            bodyFatPercentage = 495 / (1.29579 - 0.35004 * Math.log10(waist + hip - neck) + 0.22100 * Math.log10(
                height)) - 450;
        }

        const bodyFatMass = (bodyFatPercentage / 100) * weight;
        const leanBodyMass = weight - bodyFatMass;

        // Jackson & Pollock Ideal Body Fat Calculation
        let idealBodyFat = idealBodyFatCalc(age, gender);

        const bodyFatToLose = Math.max(0, bodyFatMass - (idealBodyFat / 100) * weight);

        // BMI Method for Body Fat (approximation)
        const bmi = weight / Math.pow(height / 100, 2);
        const bodyFatBmiMethod = (1.2 * bmi) + (0.23 * age) - (10.8 * (gender === 'male' ? 1 : 0)) - 5.4;

        // Body Fat Category
        let bodyFatCategory;
        if (gender === 'male') {
            if (bodyFatPercentage < 6) {
                bodyFatCategory = 'Essential fat';
            } else if (bodyFatPercentage < 14) {
                bodyFatCategory = 'Athletes';
            } else if (bodyFatPercentage < 18) {
                bodyFatCategory = 'Fitness';
            } else if (bodyFatPercentage < 25) {
                bodyFatCategory = 'Average';
            } else {
                bodyFatCategory = 'Obese';
            }
        } else {
            if (bodyFatPercentage < 14) {
                bodyFatCategory = 'Essential fat';
            } else if (bodyFatPercentage < 21) {
                bodyFatCategory = 'Athletes';
            } else if (bodyFatPercentage < 25) {
                bodyFatCategory = 'Fitness';
            } else if (bodyFatPercentage < 32) {
                bodyFatCategory = 'Average';
            } else {
                bodyFatCategory = 'Obese';
            }
        }

        // Display results
        const results = document.getElementById('results');
        results.innerHTML = `
            <div class="result-item"><span class="result-label">Body Fat (%):</span> ${bodyFatPercentage.toFixed(2)}%</div>
            <div class="result-item"><span class="result-label">Body Fat Category:</span> ${bodyFatCategory}</div>
            <div class="result-item"><span class="result-label">Body Fat Mass (kg):</span> ${bodyFatMass.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Lean Body Mass (kg):</span> ${leanBodyMass.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Ideal Body Fat for Given Age (%):</span> ${idealBodyFat.toFixed(2)}%</div>
            <div class="result-item"><span class="result-label">Body Fat to Lose to Reach Ideal (kg):</span> ${bodyFatToLose.toFixed(2)} kg</div>
            <div class="result-item"><span class="result-label">Body Fat (%):</span> (BMI method): ${bodyFatBmiMethod.toFixed(2)}%</div>
        `;
    }

    function idealBodyFatCalc(age, gender) {
        if (gender === "male") {
            if (age <= 20) return 8.5;
            else if (age <= 25) return 10.5;
            else if (age <= 30) return 12.7;
            else if (age <= 35) return 13.7;
            else if (age <= 40) return 15.3;
            else if (age <= 45) return 16.4;
            else if (age <= 50) return 18.9;
            else if (age <= 55) return 20.9;
            else return 22; // Можно указать значение для возраста выше 55
        } else if (gender === "female") {
            if (age <= 20) return 17.7;
            else if (age <= 25) return 18.4;
            else if (age <= 30) return 19.3;
            else if (age <= 35) return 21.5;
            else if (age <= 40) return 22.2;
            else if (age <= 45) return 22.9;
            else if (age <= 50) return 25.2;
            else if (age <= 55) return 26.3;
            else return 28; // Можно указать значение для возраста выше 55
        }
        return null; // Если пол не указан, возвращаем null
    }
</script>
```

# Служебные скрипты FM

[https://fitnessmama.school/pl/cms/layout/update?id=29679#js](https://fitnessmama.school/pl/cms/layout/update?id=29679#js)

#### HTML

```javascript
<!-- WhatsApp-Tlgt Web -->
$(function(){
    window.isMobile = /Mobile|webOS|BlackBerry|IEMobile|MeeGo|mini|Fennec|Windows Phone|Android|iP(ad|od|hone)/i.test(navigator.userAgent);
    var nint = setInterval(function() {
        if($('#whatsapp_button').length == 0) {
            if($(".user-phone-widget").length) {
                var phone = $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"]').text().replace(/\D+/g,'');
                if(phone[0] == 3 && phone.length == 10) phone = "39"+phone;
                if(phone[0] == 9 && phone.length == 10) phone = "7"+phone;
                if(phone[0] == 8 && phone.length == 11) phone = "7"+phone.slice(1);
                phone = "+"+phone;
                $(".user-phone-widget").after(`
                <span>
                <button id="whatsapp_button" class="btn btn-sm btn-default" onclick="window.open((window.isMobile ? 'https://wa.me/' : 'https://web.whatsapp.com/send?phone=') + '${phone}')" style="
                margin: 3px 0;
                background-color: #25D366;
                color: white;
                padding: 4px 5px;
                border: none;
                border-radius: 30px;
                height: 22px;
                "><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="whatsapp" class="svg-inline--fa fa-whatsapp fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" style="width: 12px;"><path fill="currentColor" d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"></path></svg>
                </button>
                <button id="whatsapp_button" class="btn btn-sm btn-default" onclick="window.open(('https://t.me/') + '${phone}')" style="
                padding: 4px 5px;    
                border: none;    
                height: 22px;
                width: 22px;
                background: url(https://upload.wikimedia.org/wikipedia/commons/8/82/Telegram_logo.svg);
                background-size: cover;
                background-repeat: no-repeat;
                ">

                </span>`);
            }
        }
    },50);
});
<!-- WhatsApp-Tlgt Web -->

<!-- Превью в хранилище -->

<!-- Превью в хранилище -->
if(window.location.href.indexOf('/fileservice/control/account/') > -1) {
    $(function(){
        $('#w5-container table tr').each(function(i, row){
            let filetype = $(row).find("td:nth-child(4)").text().trim();
            let filelink = $(row).find("td:nth-child(3) a").attr("href");
            if(["изображение", "image"].indexOf(filetype) > -1) {
                let thumb_img = "";
                if([".gif", ".svg"].indexOf(filelink.substring(filelink.length - 4)) == -1) {
                    let regex = /(.*)\/fileservice\/file\/download(?:\/.*\/)(\d*)\/.*\/(\d*)\/.*\/((?:.*)\w{32}[^\/]*)/gm;
                    let thumb_subst = `$1/fileservice/file/thumbnail/h/$4/s/200x/a/$2/sc/$3`;
                    thumb_img = filelink.replace(regex, thumb_subst);
                } else {
                    thumb_img = filelink;
                }
                $(row).find("td:nth-child(3)").append('<img src="'+thumb_img+'" style="display:block;max-width:200px;" />');
            } else if(["видео", "video"].indexOf(filetype) > -1 || !isNaN(parseInt(filetype))) {
                $(row).find("td:nth-child(3)").append('<video controls src="'+filelink+'" style="display:block;width:200px;height:112px;" />');
            }
        });
    });
}
<!-- Превью в хранилище -->

<!--  Показ ссылки для скачивания, при загрузке файла в ФХ -->
$(()=>{ if(window.location.href.indexOf('/fileservice/control/account/storage') > -1) {
    $('.uploadify-container').data('uploadifive').settings.onUploadComplete = function (e, res) {
        let $item = e.queueItem;
        let link = '/fileservice/control/account/file-by-hash?hash='+res+'&from=storage'
        $item.find('.fileinfo').html(` <a target="_blank" href="${link}">${res}</a> `,);
        $.get(link,(data)=>{
            var pageDom = $('<x/>').append($.parseHTML(data));
            newlink = pageDom.find('input.form-control[type="text"]').val();
            let linke = document.createElement('div');
            let linkc = document.createElement('a');
            $item.find('.filename').before(linke, linkc);
            $(linke).html(newlink)
            .css({"position":"absolute","left":"-99999px"});
            $(linkc).html('<i class="fa fa-clipboard" aria-hidden="true"></i> ')
            .css({"cursor":"pointer"})
            .on('click', function(){
                selectElement(linke);  
                $(linke).select();
                document.execCommand('copy');  
                let that = this;
                $(that).css('color','#ff00db');
                setTimeout(()=>{
                    $(that).css('color','');
                },1000);  
            });
        });
        function selectElement(element) {
            if (window.getSelection) {
                var sel = window.getSelection();
                sel.removeAllRanges();
                var range = document.createRange();
                range.selectNodeContents(element);
                sel.addRange(range);
            } else if (document.selection) {
                var textRange = document.body.createTextRange();
                textRange.moveToElementText(element);
                textRange.select();
            }
        }
    }
    }});
<!--  Показ ссылки для скачивания, при загрузке файла в ФХ -->

<!--  Добавляет возможность перетаскивать блоки настроек в редакторе страниц и уроков -->

if(
window.location.pathname.indexOf("/pl/cms/page/editor") > -1 || 
(
window.location.pathname == "/pl/teach/control/lesson/view" && 
window.location.search.indexOf("editMode=1") > -1
)
) {
    $( document ).ajaxSuccess(function( event, xhr, settings ) {
        if ( settings.url.indexOf("/pl/lite/block/get-setting") > -1 || settings.url.indexOf("/pl/lite/block/settings") > -1) {
            setTimeout(()=>{
                $('.setting-editor-popover, .block-style-popover')
                .draggable({ handle: '.popover-title', cancel: '.btn, input' })
                .find('.popover-title').css({'cursor':'move'});
            });
        }
    });
}

//РЕКЛАМНАЯ ПЛАШКА

// Чтобы исключить отображение для определенной страницы, добавьте путь в массив excludedPages через запятую.
// Например: ["/cms/system/login", "/another/page", "/some/other/page"];

const excludedPages = ["/voting_concurs_baza", "/waitlist_campaign_ticket", "/cms/system/login", "/pl/webinar/show", "/postura_login", "/giftshop", "/live12", "/cadou_personalizat"]; 
if (!excludedPages.includes(window.location.pathname)) {

	var chek = $('#ltBlock2055000206, #ltBlock2055000208, #ltBlock2055000229, #ltBlock2055000232'); // ID формы виджета
	var cookie_max_age = 24 * 60 * 60; //Время жизни cookie в секундах.
	var delay = 1; //Задержка показа в миллисекундах, 1000 = 1 секунде.

	if (getCookie('popup_per_day') !== 'true') {
    	setTimeout(function() {


    	    if (chek.length == 0 && !window.location.href.includes('/widget/')) {
        	    if ($('.gc-main-content').hasClass('with-left-menu')) {
            	    $('.gc-main-content').append('<div class="info-banner menu"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	} else {
                	$('.gc-main-content').append('<div class="info-banner"><a href="https://fitnessmama.school/plaska_link" target="_blank"><img class="img-responsive banner" src="https://fitnessmama.school/plaska"></a></div>');
            	}
        	} else {
            	console.log('на странице форма с ГК');

        	}

        	$('.info-banner').append('<div class="close-mybtn"></div>');
      		$('.close-mybtn').click(function() {
      	    $('.info-banner').hide();
       	    setCookie('popup_per_day', 'true', { 'max-age': cookie_max_age });
       	 });
   	 }, delay);
 	};
};

//FUNCTIONS
function getCookie(name) {
    var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
}

function setCookie(name, value, options = {}) {

    options = {
        path: '/',
            secure: true,
            // при необходимости добавьте другие значения по умолчанию
            ...options
    };

    if (options.expires instanceof Date) {
        options.expires = options.expires.toUTCString();
    }

    var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

    for (var optionKey in options) {
        updatedCookie += "; " + optionKey;
        var optionValue = options[optionKey];
        if (optionValue !== true) {
            updatedCookie += "=" + optionValue;
        }
    }

    document.cookie = updatedCookie;
}

```

#### CSS   


```css
/* убрать баннер */
.common-banner-wrapper {
  display:none!important;
}

/* Стили для Баннер как у Геткурс */
  .info-banner {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 10px; 
    left: 10px; 
    Z-index: 9;
        overflow: hidden;
        padding: 20px;
  }
  .info-banner.menu {
    width: 400px; /*ширина изображения */ 
    height:120px; /*высота изображения */ 
    display: block; 
    position: fixed; 
    bottom: 20px; 
    left: 90px; 
    Z-index: 999;
        overflow: hidden;
        padding: 20px;
  }
    .info-banner img.banner {
        border-radius: 16px; /*радиус скругления изображения*/ 
        box-shadow: 0 0 6px 2px #00000069; /*настройки тени*/
    }
.close-mybtn {
    cursor: pointer;
    position: absolute;
    width: 25px;
    height: 25px;
    top: 10px;
    right: 10px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 10px 1px #00000038;
}

.close-mybtn:before {
    content: '✕';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    color: #000;
    font-weight: bold;
    line-height: 1;
    font-size: 14px;
    padding: 6px  6.5px;
}

  @media (max-width:  920px) {
    .info-banner {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */ 
      bottom: 10px; 
      left: 0px; 
    }
    .info-banner.menu {
      width: 100%; /*ширина изображения */ 
      height:auto; /*высота изображения */  
      bottom: 50px; 
      left: 0px; 
  }
  }
/* Стили для Баннер как у Геткурс */


```

# Бот в WhatsApp

# Как сделать автоматические сообщения  WhatsApp через Геткурс

На странице, где расположена кнопка WhatsApp вставить ссылку :

[https://api.whatsapp.com/send?phone=37360239852&amp;text=Salut!%20Vreau%20s%C4%83-mi%20transmite%C8%9Bi%20antrenamentul%20pentru%20abdomen%20plat%20%C8%99i%20Webinarul%20despre%20nutri%C8%9Bie](https://api.whatsapp.com/send?phone=37360239852&text=Salut!%20Vreau%20s%C4%83-mi%20transmite%C8%9Bi%20antrenamentul%20pentru%20abdomen%20plat%20%C8%99i%20Webinarul%20despre%20nutri%C8%9Bie)

где [phone](https://api.whatsapp.com/send?phone=37360239852&text=Salut!%20Vreau%20s%C4%83-mi%20transmite%C8%9Bi%20antrenamentul%20pentru%20abdomen%20plat%20%C8%99i%20Webinarul%20despre%20nutri%C8%9Bie) - это номер WhatsApp, привязанный к Геткурсу; [text](https://api.whatsapp.com/send?phone=37360239852&text=Salut!%20Vreau%20s%C4%83-mi%20transmite%C8%9Bi%20antrenamentul%20pentru%20abdomen%20plat%20%C8%99i%20Webinarul%20despre%20nutri%C8%9Bie)- любой желаемый текст (призыв к действию)

[![Снимок экрана 2025-04-01 в 12.53.29.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-04/scaled-1680-/snimok-ekrana-2025-04-01-v-12-53-29.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-04/snimok-ekrana-2025-04-01-v-12-53-29.png)

У пользователя отображается уже готовое сообщение с текстом, которое он может отправить в один клик.

Далее создаем процесс ( или ветку в действующем процессе) по инструкции: [https://textback.ru/knowledgebase/getcourse/](https://textback.ru/knowledgebase/getcourse/)

**<span style="color: rgb(0, 0, 0);">Важно!</span>** протестировать можно только через номер УЧЕНИКА. Сообщения в WhatsApp после входящего не придут, если номер в базе Геткурс значиться как СОТРУДНИКА.

# Оформеление GC (до Remake)

# Оформление бокового меню ГК

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-04/scaled-1680-/stuimage.png)](https://drive.google.com/file/d/103-7ZhGmtWc30PV3GXmUa9VeskELc1At/view?usp=sharing)  
[https://drive.google.com/file/d/103-7ZhGmtWc30PV3GXmUa9VeskELc1At/view?usp=sharing](https://drive.google.com/file/d/103-7ZhGmtWc30PV3GXmUa9VeskELc1At/view?usp=sharing)

#### Скрипт в настройках аккаунта  
[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-04/scaled-1680-/image.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-04/image.png)

```javascript
<!-- Боковое меню -->
<link rel="stylesheet" href="https://fitnessmama.school/pl/cms/layout/css?id=29680&hash=9cc3105d9df0b69b9fa7b4db22f48c30&bundle=1" />
<script src="https://fitnessmama.school/pl/cms/layout/js?id=29680&hash=9cc3105d9df0b69b9fa7b4db22f48c30&bundle=1"></script>
```

#### CSS

```css


/*Убираем бэкграунд иконки-пропадает ховер выделение */
.gc-account-leftbar .gc-account-user-menu li a {
   background-color: transparent!important;
}

/* Убираем разрыв */
.gc-account-leftbar .gc-account-user-menu li {
  border-bottom: none;
}

/* Прячем старую иконку чатиума полностью*/
li.menu-item-chatium {
  display:none;
}
/* Отступы между иконкой и выделением*/
.gc-account-leftbar .gc-account-user-menu li a.with-label {
    padding: 3px 0px 0px 0px!important;
    margin-top:10px;
}

/* Делает прозрачными места иконок + шрифт */
.gc-account-leftbar .gc-account-user-menu li a {
  background:none!important;
  font-family: 'Urbanist', sans-serif;
  font-style: normal;
  font-weight: 700;
  font-size: 11px; 

}

/* Подпись для новой*/
.gc-account-user-menu li.menu-item.new-chatium-icon a:after{
  content: "Chatium";
  color: #000;
  bottom: 2px!important;
  font-weight: 600;
}


/*Задаем выделение ярлыка*/
.custom-menu .gc-account-leftbar .gc-account-user-menu li.active a, .custom-menu .gc-account-leftbar .gc-account-user-menu li.selected a {
    background-color: #FFF!important;
}

li.menu-item.menu-item-profile a, li.menu-item.menu-item-notifications_button_small a, li.menu-item.menu-item-cms a, li.menu-item.menu-item-teach a, li.menu-item.menu-item-user a, li.menu-item.menu-item-tasks a, li.menu-item.menu-item-notifications a, li.menu-item.menu-item-sales a, li.menu-item.menu-item-chatium a {
    display: block;
    background: transparent;
    margin: 3px auto 0px;
    width: 62px !important;
  	height: 62px !important;
    border-radius: 8px;
    transition: all 1.0s;
}
/* пододвигаем колокольчик */
li.menu-item.menu-item-notifications_button_small a {
    height: 35px !important;
    border-radius: 5px;
}
/*Скругление профиля*/
.menu-item-profile .menu-item-icon {
    border-radius: 26px;
    width: 52px;
    border: 2px solid #EB1a41;
    margin-top:5px;
}

/*Позицианируем номерки*/
.gc-account-leftbar li:not(.menu-item-profile):not(.menu-item-notifications_button_small) .notify-count { 
  bottom: unset;

  top: 0%;
}

/* Шайк меню */
.gc-account-user-menu .menu-item a:hover img

{


  
	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
}

 .gc-account-user-menu .menu-item a:hover:after, 
.menu-item-prolongation a:hover img,
.menu-item.new-chatium-icon a:hover img
{

	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
} 
  
.notify-count {
  z-index:1;
}

@-webkit-keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
@keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
 

/*_____________Настройка суб меню___________________*/
/*Настройка суб меню______________*/
<!--  Настройка суб меню -->
.gc-account-leftbar .gc-account-user-submenu-bar {
    width: 320px;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li a {
   padding-top: 9px;
   padding-bottom: 9px;
   text-transform: lowercase;
   font-family: 'Urbanist', sans-serif;
   font-weight: 500!important;
   font-style: normal;
   font-size: 22px;
   line-height: 108.5%;
   padding-left: 20px;
}

/*Суб меню с заглавной*/
.gc-account-user-submenu-bar .gc-account-user-submenu li a::first-letter {
  text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:first-letter {
   text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:hover {
   color: #555555;
}

/*Заголовок субменю_*/
.gc-account-user-submenu-bar h3 {
   font-family: 'Urbanist', sans-serif;
   font-weight: 700!important;
  color: #004456;
   font-size: 30px;
   line-height: 40px;

}
.gc-account-leftbar .gc-account-user-submenu-bar {
   display: flex;
   flex-direction: column;
  background: #FFF;
}
.gc-account-leftbar .gc-account-user-submenu-bar:after {
   content: "";
   display: block;
   height: 60px;
   background: url("https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/323/h/2a01bc7dda6cdfa74cb5e627822c51f2.png") center / contain no-repeat;
   margin-top: auto;
   margin-bottom: 20px;
}

/* Анимация выбора меню */
.gc-account-user-submenu-bar .gc-account-user-submenu li {
    position: realtive;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a {
    position: relative !important;
    z-index: 9999;
    transition: all 1.3s;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li::after {
    content: "";
    width: 0%;
    height: 100%;
    position: absolute;
    background:  silver;
    top:0;
    left:0;
    transition: all .5s;
    z-index: 0;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a:hover {
    background: transparent;
    color:#005B63;
    z-index: 1;
    text-decoration: none;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li:hover::after {
    width: 100%;
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu {
		margin-bottom: 45px;
		background: #5E2E92;
		width: 70px;
		height: 100%;
	}
	.gc-main-content.with-left-menu {
		margin-left: 0;
	}
}

@media (max-width: 576px) {
	.gc-account-leftbar
		.gc-account-user-submenu-bar-notifications_button_small {
		width: calc(100vw - 70px);
		overflow: auto;
	}
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu li {
		border-bottom: none;
	}
}


.gc-account-user-menu  {

 font-family: 'Urbanist', sans-serif!important;

}

.popover {
	z-index: 8888;
}
```

#### JS

```javascript
<!--  Подмена пункта меню Chatium -->
$(function() {
  setTimeout(function(){
    $(".menu-item-sales").after(
       '<li class="menu-item new-chatium-icon">'+
        '<a href="/chatium" title="Chatium">'+
          '<img class="menu-item-icon" src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/31/h/80723613363bcb010a2e0e6a98a90c65.png">'+
        '</a>'+
      '</li>'
    ); 
  },0);
});
<!--  END Подмена ссылки на chatium -->

<!--  Установка активности пунктов на подмененных ссылках-->
$(document).ready(function(){
	setTimeout(function(){
		if (window.location.pathname.startsWith("/chatium")) {
			$('.gc-account-user-menu li').removeClass('active');
			$('.gc-account-user-menu li.new-chatium-icon').addClass('active');
		}
		
        if (window.location.pathname.startsWith("/profile")) {
			$('.gc-account-user-menu li').removeClass('active');
		}
	}, 10);
});

<!--  Подмена ссылок на профиль и смену пароля -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/cms/counters/menu" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-profile a").attr("href", "/profile");
      $(".gc-account-user-submenu-bar li.menu-item-change_password a").attr("href", "/changePassword");
    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена ссылок на профиль и смену пароля -->

<!--  Подмена страницы личного кабинета -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/teach/control/stream" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-teach a").attr("href", "/l_kabinet");

    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена страницы личного кабинета -->

<!-- Боковое меню фикс сохранение подменный профиль-->
$(()=>{setTimeout(()=>{
  $(".edit-profile-popup-btn").off().click((e)=>{
    e.stopPropagation();
    window.open('/profile', '_parent');
  });
})});
<!-- Боковое меню фикс сохранение подменный профиль-->
```

# Карточка тренинга в GC

```css
.stream-table { 
  margin-left:0!important;
}

.stream-table tbody {
  display:flex;
  flex-wrap: wrap;
}

.stream-table tbody tr {
  position:relative;
  flex:0 0 calc(33.3333% - 20px);
  height:350px;
  border-radius:9px;
  box-shadow:0 0 3px 1px rgba(0,0,0,0.1);
  overflow:hidden;
  margin:10px;
  transition:all 0.5s;
}

@media (max-width:850px) {
  .stream-table tbody tr {
    flex:0 0 calc(50% - 20px);
  }
      .stream-table tbody tr {
    height:310px;
  }
}

@media (max-width:510px) {
  .stream-table tbody tr {
      flex:0 0 100%;
  }
}

.stream-table tr a {
	height: 100%;
    width:100%;
	z-index: 2;
	position: relative;
}

.stream-table tbody tr:hover {
  transform:scale(1.05);
}

.stream-table tbody tr td {
  position:relative;
  display:flex;
  height:100%;
  width:100%;
  padding:0!important;
}

/* РќР°СЃС‚СЂР°РёРІР°РµРј Р·Р°РіРѕР»РѕРІРѕРє */
.stream-table tbody tr td .stream-title {
  position:absolute;
  top:185px; 
  color:black!important;
  z-index:1;
  margin:auto 20px;
}

/* РќР°СЃС‚СЂР°РёРІР°РµРј РѕРїРёСЃР°РЅРёРµ */
.stream-table tbody tr td div {
  display: none;
  position:absolute;
  top:285px;
  margin:auto 20px;
    line-height:1.4em;
}


.stream-table tbody tr td:before {
  content:"Deschide ";
  position:absolute;
  top:310px;
  left:20px;
  padding:5px 7px;
  border:1px solid black;
  border-radius:5px;
  transition:all 0.3s;
}

.stream-table tbody tr td:hover:before {
  background:rgb(228, 22, 122);
  color:white;
}

.stream-table tbody tr.no-public td:before {
  display:none;
}


.stream-table tbody tr td:after {
  content:"";
  position:absolute;
  top:0;
  left:0;
  width:100%;
  height:180px;
background: #8E2DE2;
background: -webkit-linear-gradient(to right, #4A00E0, #8E2DE2);
background: linear-gradient(to right, #4A00E0, #8E2DE2);
}

.stream-table tbody tr[data-training-id="934063181"] td:after {         
    background:url(https://fs.getcourse.ru/fileservice/file/download/a/87136/sc/239/h/71f4ed3e615b77040c1fd4aaf9648be0.jpg) no-repeat;
  background-size:cover;
  background-position: 0 40%;
}
```

# Стилизация страниц со списком уроков FM

```css
.lesson-list li.user-state-not_reached .info {
  border-left: 1px solid #ecf0f1;
  background: #d3d3d3;
}

.lesson-list-01 .state-icon-block {
Color: white;
}

.lesson-list-01 .lesson-list li {
    margin:20px!important;
      box-shadow:0 0 10px rgba(0,0,0,.5);
    }

.lesson-list {
    margin: 0px;
    padding: 0px;
    list-style: none;
    background: white;
    padding: 10px 0px;
    margin-bottom: 20px;
  border-radius:0px;
}

.lesson-list li .item-a {
    border-top-left-radius: 0px;
    border-bottom-left-radius: 0px;
 background: #f7f7f7;
  
}

.user-state-bg {
    background: #f7f7f7;
}
.lesson-list li .state-icon-block {
    background: #f80070;
}

.lesson-list li .info {
 border-radius:15!important;
    margin-left: 60px;
    padding-top: 0px;
    height: 100%;
    background: #f7f7f7;
}

.lesson-list li .title {
    font-size: 25px;
    font-weight: normal;
    line-height: 24px;
    margin-right: 20px;
    display: block;
    max-width: 500px; 
}



.lesson-list li .info {
    margin-left: 0;
    width: auto;
}

.lesson-list li table td {
    vertical-align: middle;
    min-height: 180px;
}

.lesson-list li .item-image {
    display: flex;
}


```

# Изображения из кода оформления

Убрали во всех тренингах и подтренингах код оформления.  
Код оформления сохранили в вики.  
Собрали из кода все ссылки на тренинги и соответствующие изображения в отдельной таблице.  
Старался не пропускать какие-то дочерние подтренинги, но думаю есть не большой шанс что то упустить.  
  
[https://docs.google.com/spreadsheets/d/1nTtFkirQSJiWBujLhNuHQ8\_kPhBZe-EQWCoOxhCXEFw/edit?gid=0#gid=0](https://docs.google.com/spreadsheets/d/1nTtFkirQSJiWBujLhNuHQ8_kPhBZe-EQWCoOxhCXEFw/edit?gid=0#gid=0)

# Гибкие права доступа

#### Видео поясненение

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/scaled-1680-/c7vimage.png)](https://www.loom.com/share/08e0df245660404b8a3f3f596fb5cafa)

#### Таблица с правами

[https://docs.google.com/spreadsheets/d/1Cp0ymngh0kfGEgZ9UMkN5gxa4bSTxdw2I3bvBtJbZ3w/edit?gid=0#gid=0](https://docs.google.com/spreadsheets/d/1Cp0ymngh0kfGEgZ9UMkN5gxa4bSTxdw2I3bvBtJbZ3w/edit?gid=0#gid=0)

#### Скрипт

```html
<script>
  const sheetBaseUrl = 'https://docs.google.com/spreadsheets/d/1Cp0ymngh0kfGEgZ9UMkN5gxa4bSTxdw2I3bvBtJbZ3w/gviz/tq?tqx=out:csv';
  const accessSheetUrl = sheetBaseUrl + '&sheet=Доступ';
  const superUserSheetUrl = sheetBaseUrl + '&sheet=SUPERUSERS';

  const currentPath = window.location.pathname.toLowerCase();
  const userId = String(window.accountUserId).trim();

  const waitForUserInfo = setInterval(() => {
    const user = window.userInfo;
    if (!user) return;
    clearInterval(waitForUserInfo);

    const hasAccessRole = user.isAdmin || user.isManager || user.isTeacher;
    if (!hasAccessRole) return;

    Promise.all([
      fetch(accessSheetUrl).then(r => r.text()),
      fetch(superUserSheetUrl).then(r => r.text())
    ])
    .then(([accessCsv, superCsv]) => {
      const superUsers = superCsv
        .trim()
        .split('\n')
        .flatMap(row => row.split(','))
        .map(id => id.replace(/["\r\n]/g, '').trim())
        .filter(Boolean);

      if (superUsers.includes(userId)) return;

      const rows = accessCsv.trim().split('\n'); // 👈 теперь БЕЗ slice(1)
      const cleanRows = [];

      for (const row of rows) {
        const parts = row.split(',').map(p => p.replace(/["\r\n]/g, '').trim());
        const basePath = parts[1]?.toLowerCase() || "";
        const ids = parts.slice(2).filter(Boolean);

        if (basePath.length >= 3) {
          cleanRows.push({ basePath, ids });
        }
      }

      const matchedRow = cleanRows.find(r => currentPath.includes(r.basePath));

      if (matchedRow) {
        if (matchedRow.ids.includes(userId)) {
          console.log(`✅ Доступ разрешён к "${matchedRow.basePath}"`);
        } else {
          console.warn(`❌ Доступ запрещён — ID не найден в строке "${matchedRow.basePath}"`);
          window.location.replace('/redirect-acces');
        }
      } else {
        console.log("🟢 Путь не ограничен — доступ открыт");
      }
    })
    .catch(err => console.error('❌ Ошибка загрузки:', err));
  }, 100);
</script>

```

# Боковая панель FM

### JS

```javascript
<!--  Подмена пункта меню Chatium -->
$(function() {
  setTimeout(function(){
    $(".menu-item-sales").after(
       '<li class="menu-item new-chatium-icon">'+
        '<a href="/chatium" title="Chatium">'+
          '<img class="menu-item-icon" src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/31/h/80723613363bcb010a2e0e6a98a90c65.png">'+
        '</a>'+
      '</li>'
    ); 
  },0);
});
<!--  END Подмена ссылки на chatium -->

<!--  Установка активности пунктов на подмененных ссылках-->
$(document).ready(function(){
	setTimeout(function(){
		if (window.location.pathname.startsWith("/chatium")) {
			$('.gc-account-user-menu li').removeClass('active');
			$('.gc-account-user-menu li.new-chatium-icon').addClass('active');
		}
		
        if (window.location.pathname.startsWith("/profile")) {
			$('.gc-account-user-menu li').removeClass('active');
		}
	}, 10);
});

<!--  Подмена ссылок на профиль и смену пароля -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/cms/counters/menu" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-profile a").attr("href", "/profile");
      $(".gc-account-user-submenu-bar li.menu-item-change_password a").attr("href", "/changePassword");
    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена ссылок на профиль и смену пароля -->

<!--  Подмена страницы личного кабинета -->
$(document).ajaxSuccess(function(event, xhr, settings) {
  if ( settings.url == "/teach/control/stream" ) {
    var target = $('.gc-account-user-submenu-bar')[0];
    var observer = new MutationObserver(function(mutations) {
      $(".gc-account-user-submenu-bar li.menu-item-teach a").attr("href", "/l_kabinet");

    }).observe(target, { attributes: false, childList: true, characterData: false, subtree: true });
  }
});
<!--  End Подмена страницы личного кабинета -->

<!-- Боковое меню фикс сохранение подменный профиль-->
$(()=>{setTimeout(()=>{
  $(".edit-profile-popup-btn").off().click((e)=>{
    e.stopPropagation();
    window.open('/profile', '_parent');
  });
})});
<!-- Боковое меню фикс сохранение подменный профиль-->

```

### CSS

```css
/*Убираем бэкграунд иконки-пропадает ховер выделение */
.gc-account-leftbar .gc-account-user-menu li a {
   background-color: transparent!important;
}

/* Убираем разрыв */
.gc-account-leftbar .gc-account-user-menu li {
  border-bottom: none;
}

/* Прячем старую иконку чатиума полностью*/
li.menu-item-chatium {
  display:none;
}
/* Отступы между иконкой и выделением*/
.gc-account-leftbar .gc-account-user-menu li a.with-label {
    padding: 3px 0px 0px 0px!important;
    margin-top:10px;
}

/* Делает прозрачными места иконок + шрифт */
.gc-account-leftbar .gc-account-user-menu li a {
  background:none!important;
  font-family: 'Urbanist', sans-serif;
  font-style: normal;
  font-weight: 700;
  font-size: 11px; 

}

/* Подпись для новой*/
.gc-account-user-menu li.menu-item.new-chatium-icon a:after{
  content: "Chatium";
  color: #000;
  bottom: 2px!important;
  font-weight: 600;
}


/*Задаем выделение ярлыка*/
.custom-menu .gc-account-leftbar .gc-account-user-menu li.active a, .custom-menu .gc-account-leftbar .gc-account-user-menu li.selected a {
    background-color: #FFF!important;
}

li.menu-item.menu-item-profile a, li.menu-item.menu-item-notifications_button_small a, li.menu-item.menu-item-cms a, li.menu-item.menu-item-teach a, li.menu-item.menu-item-user a, li.menu-item.menu-item-tasks a, li.menu-item.menu-item-notifications a, li.menu-item.menu-item-sales a, li.menu-item.menu-item-chatium a {
    display: block;
    background: transparent;
    margin: 3px auto 0px;
    width: 62px !important;
  	height: 62px !important;
    border-radius: 8px;
    transition: all 1.0s;
}
/* пододвигаем колокольчик */
li.menu-item.menu-item-notifications_button_small a {
    height: 35px !important;
    border-radius: 5px;
}
/*Скругление профиля*/
.menu-item-profile .menu-item-icon {
    border-radius: 26px;
    width: 52px;
    border: 2px solid #EB1a41;
    margin-top:5px;
}

/*Позицианируем номерки*/
.gc-account-leftbar li:not(.menu-item-profile):not(.menu-item-notifications_button_small) .notify-count { 
  bottom: unset;

  top: 0%;
}

/* Шайк меню */
.gc-account-user-menu .menu-item a:hover img

{


  
	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
}

 .gc-account-user-menu .menu-item a:hover:after, 
.menu-item-prolongation a:hover img,
.menu-item.new-chatium-icon a:hover img
{

	-webkit-animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
	        animation: shake-top 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) both;
} 
  
.notify-count {
  z-index:1;
}

@-webkit-keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
@keyframes shake-top {
  0%,
  100% {
    -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
    -webkit-transform-origin: 50% 0;
            transform-origin: 50% 0;
  }
  10% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
  20%,
  40%,
  60% {
    -webkit-transform: rotate(-4deg);
            transform: rotate(-4deg);
  }
  30%,
  50%,
  70% {
    -webkit-transform: rotate(4deg);
            transform: rotate(4deg);
  }
  80% {
    -webkit-transform: rotate(-2deg);
            transform: rotate(-2deg);
  }
  90% {
    -webkit-transform: rotate(2deg);
            transform: rotate(2deg);
  }
}
 

/*_____________Настройка суб меню___________________*/
/*Настройка суб меню______________*/
<!--  Настройка суб меню -->
.gc-account-leftbar .gc-account-user-submenu-bar {
    width: 320px;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li a {
   padding-top: 9px;
   padding-bottom: 9px;
   text-transform: lowercase;
   font-family: 'Urbanist', sans-serif;
   font-weight: 500!important;
   font-style: normal;
   font-size: 22px;
   line-height: 108.5%;
   padding-left: 20px;
}

/*Суб меню с заглавной*/
.gc-account-user-submenu-bar .gc-account-user-submenu li a::first-letter {
  text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:first-letter {
   text-transform: uppercase;
}

.custom-menu .gc-account-user-submenu-bar .gc-account-user-submenu a:hover {
   color: #555555;
}

/*Заголовок субменю_*/
.gc-account-user-submenu-bar h3 {
   font-family: 'Urbanist', sans-serif;
   font-weight: 700!important;
  color: #004456;
   font-size: 30px;
   line-height: 40px;

}
.gc-account-leftbar .gc-account-user-submenu-bar {
   display: flex;
   flex-direction: column;
  background: #FFF;
}
.gc-account-leftbar .gc-account-user-submenu-bar:after {
   content: "";
   display: block;
   height: 60px;
   background: url("https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/323/h/2a01bc7dda6cdfa74cb5e627822c51f2.png") center / contain no-repeat;
   margin-top: auto;
   margin-bottom: 20px;
}

/* Анимация выбора меню */
.gc-account-user-submenu-bar .gc-account-user-submenu li {
    position: realtive;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a {
    position: relative !important;
    z-index: 9999;
    transition: all 1.3s;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li::after {
    content: "";
    width: 0%;
    height: 100%;
    position: absolute;
    background:  silver;
    top:0;
    left:0;
    transition: all .5s;
    z-index: 0;
}
.gc-account-user-submenu-bar .gc-account-user-submenu li a:hover {
    background: transparent;
    color:#005B63;
    z-index: 1;
    text-decoration: none;
}

.gc-account-user-submenu-bar .gc-account-user-submenu li:hover::after {
    width: 100%;
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu {
		margin-bottom: 45px;
		background: #5E2E92;
		width: 70px;
		height: 100%;
	}
	.gc-main-content.with-left-menu {
		margin-left: 0;
	}
}

@media (max-width: 576px) {
	.gc-account-leftbar
		.gc-account-user-submenu-bar-notifications_button_small {
		width: calc(100vw - 70px);
		overflow: auto;
	}
}

@media (max-width: 768px) {
	.gc-account-leftbar .gc-account-user-menu li {
		border-bottom: none;
	}
}


.gc-account-user-menu  {

 font-family: 'Urbanist', sans-serif!important;

}

.popover {
	z-index: 8888;
}
```

# Оформление Remake

# Тема Remake

```javascript
//Версия от 09.02.25 17:00

var layoutID = '00054';

//// Настройка видимости оформления Remake (customStyleVisibilityRule):
//// true - все
//// false - никто
//// window.userInfo.isAdmin - админы (не работает в чатиуме) 
//// window.accountUserId == 216415659 - только пользователь с таким ID
//// window.userInfo.isAdmin && window.accountUserId != 348017492;  — админы за исключением конкретного пользователя
//// window.userInfo.isAdmin || [216415659, 123456789, 987654321].indexOf(window.accountUserId) > -1; — админы и конкретные пользователи
/* 
var customStyleVisibilityRule = 
    window.userInfo.isAdmin 
    || [216415659, 123456789, 987654321].indexOf(window.accountUserId) > -1; 
// админы и конкретные пользователи */

var customStyleVisibilityRule = true; 

let remakeTopMenu = {
  init: true,
  links: [
	{
		name: "Scrieți suportului tehnic",
		link: "javascript: m_custom_btn_click()",
		icon: "https://remake-proxy.ru/themes/images/icons/chat-icon.svg",
	},
  ]
}

// Компактное меню на всех страницах (раскомментируйте код ниже, чтобы включить)
// $(()=>{$('body').addClass('compact-menu compact-menu-by-default')});

function extraScriptsX() {
/****************************/
/*       Extra Scripts      */       
/****************************/

     /* ВСТАВЛЯЙТЕ ДОПОЛНИТЕЛЬНЫЙ КОД ЗДЕСЬ */    
    if(window.PageChecker.isPaymentsPage) {
    	$('.xdget-partialpay span[style="color: #186905"]').text('Disponibilă achitarea parțială a comenzii')
    }
    
    if(window.PageChecker.isWebinarPage) {
        let webinalInter = setInterval(function(){
            if ($('.broadcast-started').length) {
            	clearInterval(webinalInter)
                $('.broadcast-started').text('Webinarul a început, fă click pe ecran')
            }
        },100)
    }

/****************************/
/*     END Extra Scripts    */       
/****************************/

////////////////////////////////////////////
//     Дальше ничего трогать не нужно!    //
////////////////////////////////////////////

// START Remake Support Block
if(window.userInfo.isAdmin && !$('meta[property="og:title"]').length) {

$(document).on('remake-left-menu-ready',function(){
  let $styles = $(`
<style>
body #gcAccountUserMenu .custom-btns-wrapper {
    margin-top: 0;
}
body #gcAccountUserMenu .remake-support-wrapper {
    margin-top: 0;
}
body #gcAccountUserMenu .custom-btns-wrapper .menutoggle-btn {
    margin-bottom: 0;
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support {
    color: var(--color-3);
    background: none!important;
    padding-top: 5px;
    padding-bottom: 5px;
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support:before {
   transition: background 0.2s;
   background: var(--color-3);
   mask-image: url(https://remake-proxy.ru/themes/images/icons/headphones-support.svg);
   -webkit-mask-image: url(https://remake-proxy.ru/themes/images/icons/headphones-support.svg); 
}
body #gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support:hover:before {
   background: var(--color-3-1);
}
#gcAccountUserMenu .custom-btns-wrapper .custom-btn.remake-support span:before {
    content:"Тех.поддержка Remake";
}
#chatra:not(.chatra--expanded) {  visibility: hidden !important;  opacity: 0 !important;  pointer-events: none;  transition: none; }
</style>
  `);
  let $remake_support_wrapper = $(`
    <div class="custom-btns-wrapper remake-support-wrapper">
      <a class="custom-btn remake-support" href="https://t.me/RemakeGetCourse_bot" target="_blank"><span></span></a>
    </div>
  `);
  $('.custom-btns-wrapper').after($styles, $remake_support_wrapper);
  $remake_support_wrapper.prepend($('#gcAccountUserMenu .custom-btns-wrapper .menutoggle-btn'));
});
}
// END Remake Support Block

}; // END extraScriptsX, эти скобки не трогать


$(()=>{
  if(window.userInfo.isAdmin) {
    $('body').css('opacity','1'); $('html').addClass('loaded');
  }
});

$(document).on('remake-ready',()=>{
  extraScriptsX();
})

let customStyleSheetLayoutID;
if ((customStyleSheetLayoutID = /\/layout\/js\?id=(\d+)/.exec(document.currentScript.src)) !== null ||
    (customStyleSheetLayoutID = /\/layout\/js?.*&id=(\d+)/.exec(document.currentScript.src)) !== null ||
    (customStyleSheetLayoutID = /\/pl\/layout\/(\d+)/.exec(document.currentScript.src)) !== null) customStyleSheetLayoutID = customStyleSheetLayoutID[1];
var customStyleSheetX = "/pl/cms/layout/css?hash&bundle=1&id="+customStyleSheetLayoutID;

var remakeProxyX = "https://remake-proxy.ru";

(function(){

let remakeToggler = (() => {
  let matches = document.cookie.match(
    new RegExp(
      "(?:^|; )" +
      "remake-toggler".replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') +
      "=([^;]*)"
    )
  );
  return matches ? parseInt(decodeURIComponent(matches[1])) : 1;
})();

if (window.userInfo.isAdmin && !$('#remake-toggler').length) {
  if ($('#gcAccountUserMenu').length) remakeTogglerInit();
  else
    $(document).ajaxSend(function (event, xhr, settings) {
      if (settings.url == "/cms/counters/menu") remakeTogglerInit();
    });

  function remakeTogglerInit() {
    setTimeout(() => {
      let $remakeToggler = $(`
        <label for="remake-toggler">
          <span>Switch Remake</span>
          <style>
            #gcAccountUserMenu .custom-btns-wrapper label[for="remake-toggler"] {
              display: flex;
              justify-content: center;
              align-items: center;
              background: var(--m-custom-btn-color);
              padding: 14px;
              text-align: center;
              border-radius: 6px;
              font-family: var(--font-family-2a);
              font-style: normal;
              font-weight: normal;
              font-size: 16px;
              line-height: 120%;
              color: var(--m-item-active);
              margin-bottom: 10px;
              text-decoration: none;
              outline: none;
              transition: background-color .2s, border-radius .3s;
              color: var(--color-3,#222);
              background: none !important;
              padding-top: 5px;
              padding-bottom: 5px;
              cursor:pointer;
            }

            #gcAccountUserMenu label[for="remake-toggler"]:before {
              content: "";
              display: inline-block;
              width: 24px;
              height: 24px;
              margin-right: 5px;
              background: var(--m-item-active);
              mask-image: var(--paperplane-icon);
              -webkit-mask-image: var(--paperplane-icon);
              mask-size: contain;
              -webkit-mask-size: contain;
              mask-repeat: no-repeat;
              -webkit-mask-repeat: no-repeat;
              mask-position: center;
              -webkit-mask-position: center;
              mask-origin: content-box;
              -webkit-mask-origin: content-box;
              transition: background 0.2s;
              background: var(--color-3);
              mask-image: url(https://remake-proxy.ru/themes/images/icons/switch-remake-icon.svg);
              -webkit-mask-image: url(https://remake-proxy.ru/themes/images/icons/switch-remake-icon.svg);
            }

            label[for="remake-toggler"] input {
              display: none;
            }

            #gcAccountUserMenu label[for="remake-toggler"] span {
              display: inline-block;
              overflow: hidden;
              max-width: 300px;
              white-space: nowrap;
              transition: max-width 0.3s;
            }

            @media(min-width:769px) {
              body.compact-menu #gcAccountUserMenu label[for="remake-toggler"] span {
                max-width:0
              }
            }

	    #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"] {
              height: fit-content;
              margin-top: auto;
              border-radius: 6px;
              background: #3d556d;
              padding: 10px 7px;
              margin-left: auto;
              margin-right: auto;
              display: flex;
              justify-content: center;
              text-align: center;
              align-items: center;
              cursor:pointer;

            }

            #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"]:before {
              display:none
            }
                        #gcAccountUserMenu:not(.menu-ready) .gc-account-leftbar {
              display: flex;
              flex-direction: column;
            }

            #gcAccountUserMenu:not(.menu-ready) label[for="remake-toggler"] span {
              color:#fff;
              white-space: pre-wrap;
            }
          </style>
        </label>
      `);
      let $remakeTogglerRadio = $('<input id="remake-toggler" type="radio">');
      $remakeTogglerRadio
        .attr('checked', !!remakeToggler)
        .on('change', (e) => {
          e.preventDefault();
        });
      $remakeToggler
        .prepend($remakeTogglerRadio)
        .on('click', function (e) {
          if (
            window.confirm(
              "Для переключения оформления Remake страница будет перезагружена. Продолжить?"
            )
          ) {
            let $r = $(this).find('input');
            $r.prop('checked', !$r.is(':checked'));
            window.gcSetCookie("remake-toggler", $r.is(':checked') ? 1 : 0, {
              path: '/'
            });
            window.location.reload();
          }
          return false;
        });
      if (remakeToggler) {
        $('#gcAccountUserMenu').on('menu-ready', () => {
          $('#gcAccountUserMenu .custom-btns-wrapper').last().append($remakeToggler);
        });
      } else {
        $('#gcAccountUserMenu .gc-account-leftbar').append($remakeToggler);
      }
    });
  }
}

if (
  !customStyleVisibilityRule ||
  window.location.search.indexOf("originalview") > -1 ||
  !remakeToggler
) {
  $('#preloader-styles').remove();
  return false;
}
  
  if(typeof styleX_init != "undefined") return false;
  var styleX_init = 1; 
 
  CSSinjection(customStyleSheetX);

  setTimeout(()=>{ 

    if($('#gcAccountUserMenu').length) launchLeftMenuScripts(); 
    else $(document).ajaxSend(function(event, xhr, settings) {
      if ( settings.url == "/cms/counters/menu" ) launchLeftMenuScripts();
    });
    function launchLeftMenuScripts() {
      //js-cookie
      !function(e){var n;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=t,o}}}(function(){function f(){for(var e=0,n={};e<arguments.length;e++){var t=arguments[e];for(var o in t)n[o]=t[o]}return n}function a(e){return e.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}return function e(u){function c(){}function t(e,n,t){if("undefined"!=typeof document){"number"==typeof(t=f({path:"/"},c.defaults,t)).expires&&(t.expires=new Date(1*new Date+864e5*t.expires)),t.expires=t.expires?t.expires.toUTCString():"";try{var o=JSON.stringify(n);/^[\{\[]/.test(o)&&(n=o)}catch(e){}n=u.write?u.write(n,e):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=encodeURIComponent(String(e)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var r="";for(var i in t)t[i]&&(r+="; "+i,!0!==t[i]&&(r+="="+t[i].split(";")[0]));return document.cookie=e+"="+n+r}}function n(e,n){if("undefined"!=typeof document){for(var t={},o=document.cookie?document.cookie.split("; "):[],r=0;r<o.length;r++){var i=o[r].split("="),c=i.slice(1).join("=");n||'"'!==c.charAt(0)||(c=c.slice(1,-1));try{var f=a(i[0]);if(c=(u.read||u)(c,f)||a(c),n)try{c=JSON.parse(c)}catch(e){}if(t[f]=c,e===f)break}catch(e){}}return e?t[e]:t}}return c.set=t,c.get=function(e){return n(e,!1)},c.getJSON=function(e){return n(e,!0)},c.remove=function(e,n){t(e,"",f(n,{expires:-1}))},c.defaults={},c.withConverter=e,c}(function(){})});
      if (Cookies.get('compact-menu') === "true") $('body').addClass('compact-menu');
      let $menuStyleLink = $("<link>", {rel: "stylesheet", type: "text/css", href: remakeProxyX+"/pl/layout/"+layoutID+"/15/left-menu-styles.css", crossOrigin: "anonymous"});
      
      $menuStyleLink.on('load', ()=>{
          let wait_styles = setInterval(()=>{
            if($('html').css('order') == 1) {
              clearInterval(wait_styles);
              JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-scripts.js", ()=>{
                $(()=>{setTimeout(()=>{ 
                  $('html').addClass('page-ready');
                  $('#gcAccountUserMenu .gc-account-leftbar').stickySidebar({minWidth: 768});
                  $('#gcAccountUserMenu').trigger('menu-ready');
                })});
              });
            }
          });
      });
      $('link[href*="/nassets/"]:last').after($menuStyleLink);
   }

   $(()=>{
      if(
         !$('.gc-account-leftbar .m-account-logo').length && 
         (
           $('body.chatium_body').length ||
           window.navigator.userAgent.includes('ChatiumWebView') ||
           $('script[src*="getcourse_webview"]').length || 
           (window.location.pathname.indexOf('/pl/teach/control/lesson/webview') > -1)
         )
      ) { 
         CSSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-styles.css", ()=>{
           JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/14/left-menu-scripts.js", ()=>{
             $(()=>{setTimeout(()=>{ 
               $('html').addClass('page-ready');
             })});
           });
         });
         $('body').prepend(`
<div id="gcAccountUserMenu" class="menu-ready">
  <div class="gc-account-leftbar">
    <a href="javascript:void(0)" class="toggle-link without-icon"></a>
  </div>
</div>
        `);
         $(window).on('load', makeRemakeMenu);
      }
   });

   $(document).ajaxSuccess(function(event, xhr, settings) {
     if (settings.url == "/cms/counters/menu") {
       makeRemakeMenu(xhr.responseJSON || (typeof xhr.responseText === 'string' ? xhr.responseText : null))
     }
   });
        
  });

  function makeRemakeMenu(data = false) {
    let checkMenuReady = setInterval(()=>{
       if($('#gcAccountUserMenu').hasClass('menu-ready')) {
        clearInterval(checkMenuReady);
        let accountLogo = getComputedStyle($('html body').get(0)).getPropertyValue('--m-account-logo-mob') 
                          || getComputedStyle($('html').get(0)).getPropertyValue('--m-account-logo-mob');
        accountLogo = accountLogo.replace(/\s*url\(([^)]*)\)/, "$1").replace(/["']/g, '');
        $('#gcAccountUserMenu .gc-account-leftbar .toggle-link').off().html(`
          <a class="m-account-logo" href="javascript:void(0)" onclick="location.href=getComputedStyle($('#gcAccountUserMenu')[0]).getPropertyValue('--m-account-logo-url').replace(/['&quot;]/g,'')">
             <img height="100%" src="${accountLogo}" alt="">
          </a>
          <a class="m-search" href="javascript:void(0)" onclick="showMobSearch(event)"></a>
          <a class="m-notify" href="javascript:void(0)" onclick="showNotifications(event)">
			<span class="m-notify-icon"></span>
			<span class="notify-count"></span>
			</a>
          ${!(
           $('body.chatium_body').length ||
           window.navigator.userAgent.includes('ChatiumWebView') ||
           $('script[src*="getcourse_webview"]').length || 
           (window.location.pathname.indexOf('/pl/teach/control/lesson/webview') > -1)
          ) ? '<a class="m-burger-btn" href="javascript:void(0)" onclick="showMobMenu(event)"></a>':''}
        `);
        let counters = {
          "chatium-chatium_app": ".submenu-item-chatium_app",
          "chatium_updates": ".submenu-item-chatium_updates",
          "sales-my_deals": ".submenu-item-my_deals",
          "teach-answers": ".submenu-item-answers",
          "notifications-inbox": ".submenu-item-inbox",
        }
        if(data){
          let json_counters;
          if (typeof data === 'string') {
            json_counters = JSON.parse(data).counters || [];
          } else if (typeof data === 'object') {
            json_counters = data.counters || [];
          }
          $.each(json_counters, (name,val)=>{
            if(typeof counters[name] !== "undefined" && val!=0) {
              $(counters[name]).find('.submenu-notify-count').html(val);
            }
          });
          if(typeof json_counters.notifications_button_small !== "undefined" && json_counters.notifications_button_small!=0) {
            $('#gcAccountUserMenu .gc-account-leftbar .toggle-link > .m-notify > .notify-count').html(json_counters.notifications_button_small);
          }
        }
      }
    },10);
  }

  JSinjection(remakeProxyX+"/pl/layout/"+layoutID+"/0/distributor.js", function(){    
    setTimeout(()=>{
      if($.active) {
        let q = 0;
        $(document).ajaxStop(function() { 
          if(!q++) {
            setTimeout(()=>{
              $(document).trigger('remake-ready'); 
            });
          }
        });
      } else {
        setTimeout(()=>{
          $(document).trigger('remake-ready'); 
        });
      }
    });
  });

})();

function JSinjection(fileName, callback) {
  var script = document.createElement( "script" )
  script.type = "text/javascript";
  if(typeof callback != "undefined") {
    if(script.readyState) {  // only required for IE <9
      script.onreadystatechange = function() {
        if ( script.readyState === "loaded" || script.readyState === "complete" ) {
          script.onreadystatechange = null;
          callback();
        }
      };
    } else {  //Others
      script.onload = function() {
        callback();
      };
    }
  }
  script.src = fileName;
  script.crossOrigin = "anonymous";
  document.getElementsByTagName( "head" )[0].appendChild( script );
}

function CSSinjection(fileName, callback) {
  var link = document.createElement("link");
  link.type = "text/css";
  link.rel = "stylesheet";
  link.crossOrigin = "anonymous";
  if(typeof callback != "undefined") {
    link.onload = callback();
  }
  link.href = fileName;
  document.head.appendChild(link);
}
```

# Блок кода оформления Remake в Header

#### Шрифты и стили уведомления

```css
<!-- Подключение шрифта и стилей для уведомления -->
<style>
@import url('https://fonts.googleapis.com/css2?family=Golos+Text:wght@400;500;600;700;800;900&display=swap');

.message-wrapper {
    width: 100%;
    position: fixed;
    left: 50%;
    bottom: 50px;
    background: #333;
    border-radius: 50px;
    display: flex;
    flex-direction: row;
    align-items: center;
    padding: 20px 40px;
    z-index: 10000;
    max-width: 1000px;
    animation: fadeIn 0.3s linear 1 forwards 5s;
    transform: translate(-50%, 10px);
    opacity: 0;
}

.message-wrapper.fadeOut {
    animation: fadeOut 0.3s linear 1 forwards;
}

.message-text,
.message-btn {
    font-family: 'Golos', 'Manrope', Helvetica, Arial, sans-serif;
    font-style: normal;
    font-weight: 400;
    font-size: 16px;
    line-height: 140%;
    color: #fff;
}

.message-text {
    padding-right: 20px;
}

.message-btn {
    border: none;
    cursor: pointer;
    background: #fff;
    border-radius: 30px;
    padding: 20px 89px;
    transition: 0.3s all;
    color: #333;
}

.message-btn:hover {
    opacity: 0.8;
}

.message-text a {
    border-bottom: 1px solid #fff;
    text-decoration: none;
    color: #fff !important;
}

@media (max-width: 991px) {
    .message-wrapper {
        flex-direction: column;
        justify-content: center;
        align-items: center;
        padding: 20px;
        border-radius: 20px;
    }
    .message-text {
        margin-bottom: 30px;
        margin-right: 0;
        padding-right: 0;
    }
}

@keyframes fadeIn {
    from {
        transform: translate(-50%, 10px);
        opacity: 0;
    }
    to {
        transform: translate(-50%, 0);
        opacity: 1;
    }
}

@keyframes fadeOut {
    from {
        transform: translate(-50%, 0);
        opacity: 1;
    }
    to {
        transform: translate(-50%, 10px);
        opacity: 0;
    }
}
</style>
```

#### Прелоадер для админа

```css
<script>
if (window.userInfo.isAdmin) {
    document.write(`
        <style id="preloader-styles">
            body { opacity: 0; transition: opacity 0.3s; }
            html.loaded body { opacity: 1; }
            #gcAccountUserMenu { opacity: 0; }
            html.page-ready #gcAccountUserMenu { opacity: 1; }

            html:before {
                content: "";
                position: fixed;
                top: 50%;
                left: 50%;
                width: 40px;
                height: 40px;
                font-size: 10px;
                text-indent: -9999em;
                border: 5px solid transparent;
                border-bottom: 5px solid #333;
                border-left: 5px solid #333;
                transform: translate(-50%, -50%);
                border-radius: 100%;
                z-index: 10000;
                animation: remake-preloader 1s infinite linear;
            }

            html.loaded:before {
                opacity: 0;
            }

            @keyframes remake-preloader {
                0% { transform: translate(-50%, -50%) rotate(0deg); }
                100% { transform: translate(-50%, -50%) rotate(360deg); }
            }
        </style>
    `);
}
</script>

```

#### Уведомление о редизайне

```javascript
<script>
(function() {
    $(() => {
        if ($('#gcAccountUserMenu').length && !localStorage.getItem("redesignPopupView")) {
            const $message = $(`
                <div class="message-wrapper">
                    <div class="message-text">
                        În curând, designul școlii va fi actualizat. Dacă ceva nu se afișează corect, reveniți peste 15 minute sau încercați să ștergeți memoria cache. 
                        <a href="https://support.google.com/accounts/answer/32050?hl=ro&co=GENIE.Platform%3DDesktop">Instrucțiuni pentru ștergerea memoriei cache</a>
                    </div>
                    <button class="message-btn">Închide</button>
                </div>
            `);

            $('body').append($message);

            $message.find(".message-btn").on("click", function () {
                localStorage.setItem("redesignPopupView", true);
                $message.addClass("fadeOut");
                setTimeout(() => $message.remove(), 1000);
            });
        }
    });
})();
</script>
```

#### Настройки прелоадера

```javascript
<script>
const PRELOADER_REMAKE_READY_TIMEOUT = 1500;
const PRELOADER_FALLBACK_TIMEOUT = 7000;

const removePreloader = () => {
    $('body').css('opacity', '1');
    $('html').addClass('loaded page-ready');
};

$(document).on('remake-ready', () => {
    setTimeout(removePreloader, PRELOADER_REMAKE_READY_TIMEOUT);
});

setTimeout(removePreloader, PRELOADER_FALLBACK_TIMEOUT);
</script>
```

#### Подключение Remake и принудительная отрисовка

```javascript
<!-- Подключение скрипта Remake -->
<script type="text/javascript" src="/pl/cms/layout/js?hash&bundle=0&id=52740"></script>

<!-- Резервное включение видимости после загрузки -->
<style>
    body {
        opacity: 0;
        transition: opacity 1ms linear;
    }
    #gcAccountUserMenu {
        opacity: 0;
    }
</style>

<script>
$(() => {
    setTimeout(() => {
        console.log("body loaded");
        $("body").css("opacity", "1");
        $("#gcAccountUserMenu").css("opacity", "1");
    }, 500);
});
</script>

```

# Боковая панель в списке тренингов

```json
{"type":"container","xdgetId":"176656_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1","params":{"elClass":"","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","children":[{"type":"lessonSchedule","xdgetId":"149482_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1_1","params":{"elClass":"","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":""}},{"type":"div","xdgetId":"r3919_1_1","params":{"elClass":"","elId":"remake-right-panel","visibleTo":"admins","fixedClass":"","elementTitle":"Полезная информация [Remake]","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"div","xdgetId":"r3116_1_1","params":{"elClass":"remake-right-panel-content design-v2","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"html","xdgetId":"r6540_1_1","params":{"elClass":"remake-right-panel-toggler","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Полезная информация","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"div","xdgetId":"r3478_1_1","params":{"elClass":"right-panel-big-buttons","elId":"","visibleTo":"admins","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"button","xdgetId":"r224_1_1","params":{"elClass":"remake-icon-play","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Live-uri","tag":""},"style":{"color":"ffffff"}},{"type":"button","xdgetId":"r924_1_1","params":{"elClass":"remake-icon-tg-3","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Chatul clubului","tag":""},"style":{"color":"ffffff"}}],"content":"","link":""}},{"type":"html","xdgetId":"r3380_1_1","params":{"elClass":"","elId":"last_viewed_lessons","visibleTo":"","fixedClass":"","elementTitle":"Последние просмотренные уроки","invisibleTo":"","attributesStr":"","clickLink":"","content":"","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"div","xdgetId":"r1246_1_1","params":{"elClass":"remake-right-box","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"html","xdgetId":"r1959_1_1","params":{"elClass":"remake-right-box-header","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Link-uri utile","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"button","xdgetId":"r9417_1_1","params":{"elClass":"remake-icon-tg","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Telegram","tag":""}},{"type":"button","xdgetId":"r6068_1_1","params":{"elClass":"remake-icon-link-2","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Baza de cunoștințe","tag":""}},{"type":"button","xdgetId":"r9166_1_1","params":{"elClass":"remake-icon-chain","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Site","tag":""}},{"type":"button","xdgetId":"r4443_1_1","params":{"elClass":"remake-icon-ruble-2","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Programe în parteneriat","tag":""}},{"type":"html","xdgetId":"r3512_1_1","params":{"elClass":"remake-right-box-header","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Abonează-te","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"button","xdgetId":"r2234_1_1","params":{"elClass":"remake-icon-inst","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Instagram","tag":""}},{"type":"button","xdgetId":"r2459_1_1","params":{"elClass":"remake-icon-tg","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Suport tehnic","tag":""}},{"type":"button","xdgetId":"r9075_1_1","params":{"elClass":"remake-icon-tg-2","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Chatul clubului","tag":""}},{"type":"button","xdgetId":"r3438_1_1","params":{"elClass":"remake-icon-yt","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Canalul de Youtube","tag":""}},{"type":"html","xdgetId":"r1313_1_1","params":{"elClass":"remake-right-box-header","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Ai&nbsp;o&nbsp;întrebare?","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"button","xdgetId":"r1204_1_1","params":{"elClass":"remake-icon-chat-2","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Scrie echipei de suport","tag":""}},{"type":"button","xdgetId":"r6014_1_1","params":{"elClass":"remake-icon-call","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Solicită o consultație","tag":""}}],"content":"","link":""}},{"type":"div","xdgetId":"r8271_1_1","params":{"elClass":"remake-right-box","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"html","xdgetId":"r5388_1_1","params":{"elClass":"sp-header","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Graficul de&nbsp;lucru al&nbsp;echipei de&nbsp;suport","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"html","xdgetId":"r8324_1_1","params":{"elClass":"sp-time","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Luni-Vineri - 10:00 - 18:00 ora București","wysiwyg_disabled":false,"typograf":false,"replace_variables":false,"fileList":{"files":[]}}},{"type":"html","xdgetId":"r844_1_1","params":{"elClass":"sp-text","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Albinuțele mele te&nbsp;vor contacta în&nbsp;următoarele 24&nbsp;de ore din momentul apelului. Dar nu-ți face griji, revenim mult mai rapid.","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}},{"type":"html","xdgetId":"r130_1_1","params":{"elClass":"sp-link","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"<a href=\"javascript: m_custom_btn_click()\">Scrie echipei de&nbsp;suport →</a>","wysiwyg_disabled":false,"typograf":"true","replace_variables":false,"fileList":{"files":[]}}}],"content":"","link":""}},{"type":"div","xdgetId":"r7557_1_1","params":{"elClass":"remake-right-box","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"header","xdgetId":"r4393_1_1","params":{"elClass":"remake-right-box-header","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","content":"Abonează-te la pagina noastră pe rețelele de socializare și fii pe fază!","tag":"","size":"","typograf":"true"}},{"type":"div","xdgetId":"r4826_1_1","params":{"elClass":"remake-right-box-social-btns","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","hide_with_children":false,"children":[{"type":"button","xdgetId":"r5442_1_1","params":{"elClass":"remake-social-icon-fb","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"https://www.facebook.com/fitnessmama.md","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r3964_1_1","params":{"elClass":"remake-social-icon-vk","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r2266_1_1","params":{"elClass":"remake-social-icon-tg","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"https://t.me/+IPFde6C1oChiNDhi","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r5700_1_1","params":{"elClass":"remake-social-icon-vb","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r8777_1_1","params":{"elClass":"remake-social-icon-wa","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r4382_1_1","params":{"elClass":"remake-social-icon-inst","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"https://www.instagram.com/ina.fitnessmama/","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r6397","params":{"elClass":"remake-social-icon-yt","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"https://www.youtube.com/channel/UC8tp3qurK3nrrklxOGqKQuA","onClick":"","content":"","tag":""}},{"type":"button","xdgetId":"r6412","params":{"elClass":"remake-social-icon-link","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"https://fitnessmama.ro/","onClick":"","content":"","tag":""}}],"content":"","link":""}}],"content":"","link":""}},{"type":"button","xdgetId":"r1540_1_1","params":{"elClass":"remake-right-panel-close-btn","elId":"","visibleTo":"","fixedClass":"","elementTitle":"","invisibleTo":"","attributesStr":"","clickLink":"","onClick":"","content":"Свернуть панель","tag":""}}],"content":"","link":""}}],"content":"","link":""}}],"content":"","link":""}}
```

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/scaled-1680-/knkimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/knkimage.png)

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/scaled-1680-/PCJimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/PCJimage.png)

# Плашка с информацией об новом дизайне

```javascript

<script>(function(){$(() => {$('#gcAccountUserMenu').length&&(null==localStorage.getItem("redesignPopupView")&&($("body").append($('<div class="message-wrapper"><div class="message-text">În curând, designul școlii va fi actualizat. Dacă ceva nu se afișează corect, reveniți peste 15 minute sau încercați să ștergeți memoria cache. <a href="https://support.google.com/accounts/answer/32050?hl=ro&co=GENIE.Platform%3DDesktop">Instrucțiuni pentru ștergerea memoriei cache</a></div>')).find(".message-wrapper").append($('<button class="message-btn">Închide</button>')).find(".message-btn").click(function(){localStorage.setItem("redesignPopupView",!0),$(".message-wrapper").addClass("fadeOut"),setTimeout(function(){$(".message-wrapper").remove()},1e3)})))})})();</script>
```

# Прямой переход ученика к открытому потоку (подтренингу)

Для прямого перехода в подтренинг ниже по иерархии наследования, если этот подтренинг единственный доступный пользователю. Позволяет ученику миновать ручной выбор среди недоступных ему подтренингов.

# Настройка конкретного подтренинга

[![Direct-choice.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/scaled-1680-/direct-choice.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/direct-choice.png)

#### 1. Перейдите в настройки вида подтренинга-марафона, в котором находятся подтренинги-потоки.  
2. Добавьте блок “Javascript” и разместите его последним блоком на странице.  
3. В блок вставьте код из документа ниже:

```
$(document).ready(function () {
  if (!$('.gc-main-content').hasClass('gc-user-user')) return;

  const $streamTable = $('.stream-table');
  if (!$streamTable.length) return;

  const $subTrainingRows = $streamTable.find('tbody tr');

  if ($subTrainingRows.length === 1) {
    const link = $subTrainingRows.find('a').attr('href');
    if (link) window.location.href = link;
  }
});

```

#### **Пример действий:**

<div id="bkmrk--3" style="padding: 48.85% 0 0 0; position: relative;"><iframe allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" frameborder="0" height="" src="https://player.vimeo.com/video/1090426677?h=2e5b9bf6b5&title=0&byline=0&portrait=0&badge=0&autopause=0&player_id=0&app_id=58479" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" title="insert_js_gc" width=""></iframe>

</div>
#### В результате, если ученику в тренинге виден только один подтренинг, он будет автоматически переходить в него: 

<div id="bkmrk--7" style="padding: 53.33% 0 0 0; position: relative;"><iframe allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" frameborder="0" height="" src="https://player.vimeo.com/video/1090426696?h=526342ada4&title=0&byline=0&portrait=0&badge=0&autopause=0&player_id=0&app_id=58479" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" title="result1_after_insert_js" width=""></iframe>

</div>#### Если же более одного, то пользователь остается на странице тренинга: 

<div id="bkmrk--9" style="padding: 51.25% 0 0 0; position: relative;"><iframe allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" frameborder="0" height="" src="https://player.vimeo.com/video/1090426714?h=5918aa34e3&title=0&byline=0&portrait=0&badge=0&autopause=0&player_id=0&app_id=58479" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" title="result2_after_insert_js" width=""></iframe>

</div>

# Глобальная настрока

#### Вставьте представленный ниже код в «Настройки аккаунта» - «Счетчики и прочие скрипты для BODY» 

```
<script>
$(document).ready(function () {
  if (window.location.href.indexOf('/teach/control/stream/view') > -1) {
    if (!$('.gc-main-content').hasClass('gc-user-user')) return;

    const $streamTable = $('.stream-table');
    if (!$streamTable.length) return;

    const $subTrainingRows = $streamTable.find('tbody tr');


    const $lessonsList = $('.lesson-list');
    const $lessons = $lessonsList.find('li');

    if ($subTrainingRows.length === 1 && $lessons.length < 1) {
      const link = $subTrainingRows.find('a').attr('href');
      if (link) window.location.href = link;
    }
  }
});
</script>
```

#### Пример:

[![ins_code_for_dir_access_to_child_training.jpg](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/scaled-1680-/ins-code-for-dir-access-to-child-training.jpg)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-06/ins-code-for-dir-access-to-child-training.jpg)

####  Сохраните изменения.

#### Если ранее [вставляли этот код непосредственно в тренинг](https://wiki.kishlaru.ru/books/skripty-bloki-koda-i-plaginy/page/nastroika-konkretnogo-podtreninga), удалите из тренинга.

# Как настроить колесо фортуны на GetCourse

# Подробнее о колесе

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field30831" data-param="items/parts/field30831" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/e97f32e2763195979e49b9d67ada4198.png/s/s1200x/a/143493/sc/89" data-img-title="" id="bkmrk--1">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/e97f32e2763195979e49b9d67ada4198.png/s/s1200x/a/143493/sc/89)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field30831/inner/image/caption">  
</div></div></div>**Артём Седов**

Привет! Эксперт по выстраиванию работы с подписной базой в онлайн-школах  
и эксперт по взрывным невыжигающим акционным механикам.

Ниже представлена демонстрация интерактивного технического решения для онлайн-школ на Геткурсе, которое мы используем в акциях и курсах. Вы можете использовать «Колесо фортуны» как есть или доработать его самостоятельно. Под видео представлены варианты его использования.

<span class="redactor-inline-converted">300 экспертных записей про продажи:</span> [https://t.me/sedovlink](https://t.me/sedovlink)

#### Пояснение на 20 минут что есть что:

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/hIFLrfbyERA" width="560"></iframe>

#### В результате применения инструкции:

・вращение доступно 1 раз в день  
・колесо перезагружается в 7:00  
・создается нулевой заказ  
・приз приходит ссылкой на почту  
・призы могут выпасть повторно   
・вероятность выпадения сектора настраивается

・количество выпадание каждого приза не регулируется

#### Варианты использования:

1. Как удерживающий прием с подарками во время самой акции. Пользователю нужно заходить каждый день, чтобы крутить колесо. Чем больше раз заходит пользователей, тем больше шансов, что он купит.
2. Как удерживающий прием с подарками или бонусными рублями до старта акции. Пользователю нужно заходить каждый день, чтобы крутить. У нас больше шансов, что он придет на мероприятие. Увеличивается вероятность покупки, если он делает это ради бонусных рублей.
3. Как подарок после покупки. Увеличивает конверсию. Можно выдавать бонусные рубли на следующую покупу и повысить шанс повторной продажи.
4. Приз за прохождение модуля курса. Таким образом можно стимулировать пользователей выполнять задания и повышать доходимость.

# Условия доступа

Инструкция стоит 9000 руб

<mark>Мгновенный доступ после оплаты</mark>

**Почему инструкция платная?**

1\) это интеллектуальный труд

2\) это потраченное время команды

3\) это тех.решение согласованное с задачами

4\) это часть платного курса [«Распродажа как стандарт»](https://sedov.link/rks)

**Впереди "Черная пятница" и "Новогодняя распродажа"**

А это значит, что "Колесо фортуны" будет актуально. Покупаете один раз — используете на всех акциях.

**Обратите внимание! Скрипт по настройке вероятностей в колесе фортуны — это дополнение и оплачивается отдельно. Можете выбрать галку в форме, чтобы оформить инструкцию с дополнением.**

<div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1508366124" data-updated="1662791686" id="bkmrk-"></div>Демонстрационная версия колеса: [https://sedov.link/fortune](https://sedov.link/fortune)

# Вводный урок

### Краткий чек-лист по разделам

#### Базовая настройка колеса

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1" data-param="items/parts/text1" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D1%81"><div class="text-normal f-text" data-editable="true" data-param="items/parts/text1/inner/text">1. Создание структуры страницы и добавление всех блоков и элементов
2. Подготовка продукта, предложений и добавление их в форму
3. Подготовка формы, подключение классов
4. Подключение всех кодов для формирования колеса

</div></div>#### Настройка визуализации

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_52" data-param="items/parts/text1_52" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D1%81%D1%82%D0%B8%D0%BB%D1%8F-%D0%B8-%D0%BE%D1%82"><div class="text-normal f-text" data-editable="true" data-param="items/parts/text1_52/inner/text">1. Настройка стиля и отображения

</div></div>#### Реализация сценария

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_92" data-param="items/parts/text1_92" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D1%8F-%D0%9F%D0%BE"><div class="text-normal f-text" data-editable="true" data-param="items/parts/text1_92/inner/text">1. Описание сценария
2. Подготовка элементов (группы, сегменты, таймер, блоки)
3. Настройка процесса
4. Подготовка писем с призами
5. Финальные настройки

</div></div>

# Создание структуры страницы и добавление всех блоков и элементов

### Создание страницы

В аккаунте переходим в раздел «Страницы → Добавить страницу».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field60070" data-param="items/parts/field60070" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/2cb3986c3685e27b5a0bcae3feddba9b.png/s/s1200x/a/143493/sc/431" data-img-title="" id="bkmrk--1">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/2cb3986c3685e27b5a0bcae3feddba9b.png/s/s1200x/a/143493/sc/431)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field60070/inner/image/caption">  
</div></div></div>Из предложенных вариантов, выбираем «Пустая страница», вносим название, нажимаем добавить страницу и переходим в **редактор страницы**.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field916" data-param="items/parts/field916" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/2f130e1f7269c897c147cce26c1c00e3.png/s/s1200x/a/143493/sc/140" data-img-title="" id="bkmrk--3">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/2f130e1f7269c897c147cce26c1c00e3.png/s/s1200x/a/143493/sc/140)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field916/inner/image/caption">  
</div></div></div>Добавление всех блоков и элементов

<div class="builder-item part-header " data-animation-mode="no" data-item-name="field11385" data-param="items/parts/field11385" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D0%BF%D0%BE-%D0%BF%D0%B5%D1%80%D0%B5%D1%87%D0%BD%D1%8E%C2%A0%D0%B2"><div class="f-header f-header-26" data-editable="true" data-param="items/parts/field11385/inner/text"><u>Справка по перечню всех элементов по порядку:</u></div></div>**1. Блок «Якорная ссылка» (#before)**

*<span class="redactor-inline-converted">— Данный блок необходим, чтобы добавить якорную ссылку, которая переместит экран пользователя к блоку «Заглушке», который появится после использованной попытки.</span>*

<div class="builder-item part-separator " data-animation-mode="no" data-item-name="field44057" data-param="items/parts/field44057" data-setting-editable="true" data-title="Элемент" id="bkmrk--4">---

</div>**2. Блок «Форма»**

*<span class="redactor-inline-converted">— Основной блок в котором будет установленно колесо фортуны, а так же сам обработчик формы для запуска процесса, добавления групп и т.д. Это все будет описано в следующих уроках.</span>*

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field26242_58_72" data-param="items/parts/field26242_58_72" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA-%D0%A2%D0%B5%D0%BA%D1%81%D1%82-%D0%94%D0%BE%D0%BF%D0%BE"><div class="text-large f-text" data-editable="true" data-param="items/parts/field26242_58_72/inner/text">1. Заголовок
2. Текст
3. Дополнительно → HTML
4. Дополнительно → Предложение по условию
5. Поле пользователя → Email
6. Поле пользователя → Телефон
7. Поле пользователя → Свое поле (в примере текстовое доп. поле «Введите свой телеграм»)
8. Кнопка (вращать колесо)

</div></div><div class="builder-item part-separator " data-animation-mode="no" data-item-name="field52063" data-param="items/parts/field52063" data-setting-editable="true" data-title="Элемент" id="bkmrk--5">---

</div>**3. Блок «Якорная ссылка» (#after)**

*<span class="redactor-inline-converted">— Аналогично блоку под №1, только теперь мы будем перемещать пользователя к блоку-форме с колесом фортуны. Можно использовать в ссылках, чтобы пользователь попадал сразу в нужное место. Например в демонстрации мы использовали данную ссылку, когда пользователь нажимал кнопку для еще одной попытки. </span>*

<div class="builder-item part-separator " data-animation-mode="no" data-item-name="field21171" data-param="items/parts/field21171" data-setting-editable="true" data-title="Элемент" id="bkmrk--6">---

</div>**4. Блок «Текст и заголовок»**

<span class="redactor-inline-converted">*—* </span>*Блок «Заглушка», он будет показан после перезагрузки страницы, после того как пользователь сделает попытку вращения колеса. В нем будет указан таймер до следующей попытки, а так же изображение самого колеса и текст.*

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field26242_58_72_23" data-param="items/parts/field26242_58_72_23" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3"><div class="text-large f-text" data-editable="true" data-param="items/parts/field26242_58_72_23/inner/text">1. Изображение исходного колеса
2. Заголовок
3. Текст
4. Таймер

</div></div><div class="builder-item part-separator " data-animation-mode="no" data-item-name="field52914" data-param="items/parts/field52914" data-setting-editable="true" data-title="Элемент" id="bkmrk--7">---

</div>**5. Блок «CSS код» — Системные стили колеса  
6\. Блок «CSS код» — общее оформление вида страницы, стили и дизайн  
7\. Блок «JavaScript код» — Системный код колеса  
8\. Блок «JavaScript код» — Позиционирование сообщения о необходимости заполнения полей формы.**

*— Системные блоки, которые формируют колесо фортуны, его отображение.*

<div class="builder-item part-separator " data-animation-mode="no" data-item-name="field18916" data-param="items/parts/field18916" data-setting-editable="true" data-title="Элемент" id="bkmrk--8">---

</div>**Далее пошагово нужно будет добавить все эти блоки на странице**

**согласно порядка указанному в списке.**

<div class="builder-item part-separator " data-animation-mode="no" data-item-name="field13028" data-param="items/parts/field13028" data-setting-editable="true" data-title="Элемент" id="bkmrk--9">---

</div>#### 1. Добавление якорной ссылки

В редакторе страницы нажимаем «Все блоки → навигация → якорь».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field98028" data-param="items/parts/field98028" data-setting-editable="true" data-title="Элемент" id="bkmrk--10"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/de8001ec0a06ef24658e0f219de476d9.png/s/s1200x/a/143493/sc/195" data-img-title="" id="bkmrk--11">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/de8001ec0a06ef24658e0f219de476d9.png/s/s1200x/a/143493/sc/195)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field98028/inner/image/caption">  
</div></div></div>В настройках указываем название якоря «#before» и нажимаем сохранить.

#### 2. Добавление формы

В редакторе страницы нажимаем «Все блоки → форма → обычная форма».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field47026" data-param="items/parts/field47026" data-setting-editable="true" data-title="Элемент" id="bkmrk--12"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/e0f4da8da5c208658614f0d961129a37.png/s/s1200x/a/143493/sc/98" data-img-title="" id="bkmrk--13">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/e0f4da8da5c208658614f0d961129a37.png/s/s1200x/a/143493/sc/98)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field47026/inner/image/caption">  
</div></div></div>После появления формы на странице указываем свой заголовок, добавляем необходимые поля пользователя (Email, телефон), даем название кнопке и оформляем ее.

**Точный перечень и порядок расстановки элементов можно взять из списка выше.**

Между заголовком и полем пользователя, добавляем блок «Дополнительно → HTML» в нем позже будет расположен код колеса.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field12246" data-param="items/parts/field12246" data-setting-editable="true" data-title="Элемент" id="bkmrk--15"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/fac713a1111ff7f505c7afab221fc622.png/s/s1200x/a/143493/sc/265" data-img-title="" id="bkmrk--16">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/fac713a1111ff7f505c7afab221fc622.png/s/s1200x/a/143493/sc/265)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field12246/inner/image/caption">  
</div></div></div>Под блоком HTML добавляем блок «Дополнительно → Предложение по условию» в нем позже будут добавленны предложения которые будут формировать сектора колеса фортуны.

#### 3. Добавление якорной ссылки

Аналогично первому пункту, в редакторе страницы нажимаем «Все блоки → навигация → якорь».

В настройках указываем название якоря «#after» и нажимаем сохранить.

#### 4. Добавление блока «Текст и заголовок» (Заглушка)

В редакторе страницы нажимаем «Все блоки → текст → текст и заголовок».

После появления блока "Текст" на странице добавляем стандартное изображение, указываем свой заголовок, добавляем текстовое описание.

Последним элементом добавляем блок «Дополнительно → HTML» в нем позже будет расположен код таймера.

**Точный перечень и порядок расстановки элементов можно взять из списка выше.**

#### 5. Добавление блоков с кодами

Блоки (5,6,7,8) CSS и JS кода мы добавим в следующем уроке с помощью импорта кода на странице.

# Подготовка продукта, предложений и добавление их в форму

### Создание продукта и предложений

**Предложения необходимы для того, чтобы формировать сегменты колеса фортуны, создавать заказ для пользователя и по нему определять какой приз он выиграл.**

<div class="builder-item part-separator " data-animation-mode="no" data-item-name="field47950" data-param="items/parts/field47950" data-setting-editable="true" data-title="Элемент" id="bkmrk-">---

</div>Заходим в продукты внутри аккаунта, называем колесо фортуны и нажимаем создать.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field2014" data-param="items/parts/field2014" data-setting-editable="true" data-title="Элемент" id="bkmrk--1"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/7db7df665c5db625913980b69150dd3e.png/s/s1200x/a/143493/sc/159" data-img-title="" id="bkmrk--2">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/7db7df665c5db625913980b69150dd3e.png/s/s1200x/a/143493/sc/159)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field2014/inner/image/caption">  
</div></div></div>Внутри продукта на вкладке предложения, нажимаем добавить предложения.

Предложению даем название приза, ставим цену 0.

**На вкладке настройки ставим галочку «Не отправлять автоматическое письмо пользователю».**

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field83093" data-param="items/parts/field83093" data-setting-editable="true" data-title="Элемент" id="bkmrk--3"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/1209ac192e26c61650051e01764bd99d.png/s/s1200x/a/143493/sc/503" data-img-title="" id="bkmrk--4">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/1209ac192e26c61650051e01764bd99d.png/s/s1200x/a/143493/sc/503)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field83093/inner/image/caption">  
</div></div></div>**Нужно понимать, что кол-во предложений будет определять кол-во секторов колеса фортуны и названия каждого сектора. Поэтому название желательно указывать краткой не более 3-4 слов и максимально понятное.**

Для удобства можно отметить все предложений одним тегом, чтобы было проще ими управлять в будущем,

в зависимости от той механики и сценария который вы будете использовать.

Добавление предложений в форму

У блока «Предложения по условию» ([п. 2.4](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)) внутри формы, нажимаем на шестеренку (настройки), далее кликаем на панель «выбрать предложения» и выбираем те предложения что создали под данную активность.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field28902" data-param="items/parts/field28902" data-setting-editable="true" data-title="Элемент" id="bkmrk--5"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/63ef51c25dd0f18e382add5046dbe632.png/s/s1200x/a/143493/sc/235" data-img-title="" id="bkmrk--6">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/63ef51c25dd0f18e382add5046dbe632.png/s/s1200x/a/143493/sc/235)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field28902/inner/image/caption">  
</div></div></div>Так же в настройках данного блока, в поле CSS класс элемента,

добавляем свой класс <span class="redactor-inline-converted">`<strong class="redactor-inline-converted">sedov_block-hidden</strong>`</span> и нажимаем **сохранить и закрыть**.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field28902_94" data-param="items/parts/field28902_94" data-setting-editable="true" data-title="Элемент" id="bkmrk--7"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/6da1da591f22b89e4d49b750ca7fd166.png/s/s1200x/a/143493/sc/247" data-img-title="" id="bkmrk--8">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/6da1da591f22b89e4d49b750ca7fd166.png/s/s1200x/a/143493/sc/247)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field28902_94/inner/image/caption">  
</div></div></div>Вот так будет выглядеть собранная форма.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field28902_94_49" data-param="items/parts/field28902_94_49" data-setting-editable="true" data-title="Элемент" id="bkmrk--9"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/0c89609723fb0bc1488264be91514d9e.png/s/s1200x/a/143493/sc/58" data-img-title="" id="bkmrk--10">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/0c89609723fb0bc1488264be91514d9e.png/s/s1200x/a/143493/sc/58)</div></div>

# Подготовка формы, подключение классов

### Подлючение классов CSS к форме

Родительскому блоку (контейнеру) внутри которого расположена фома ([п. 2](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)), нужно нажать кнопку «Стиль» и в самом низу в поле CSS класс элемента добавить классы `<strong class="redactor-inline-converted">forma-sedov</strong>` и `<strong>sedov-link-1</strong>` и нажмите «Сохранить и закрыть».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field92184" data-param="items/parts/field92184" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/a1b80e6f859a5dc6b20e26795b113095.png/s/s1200x/a/143493/sc/97" data-img-title="" id="bkmrk--1">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/a1b80e6f859a5dc6b20e26795b113095.png/s/s1200x/a/143493/sc/97)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field92184/inner/image/caption">  
</div></div></div>Так же можно отрегулировать стандартные настройки блока. Задать верхний и нижние отступы, добавить контейнер и указать внутренние оступы и скругление углов, по желанию дизайна.

***В демонстрационной версии в настройках стилей добавлен контейнер и добавлен белый шрифт к названиям секторов, а так же указаны внутренние отступы в размере 40px и скругление углов в 10px. Но вы можете указать свои настройки в соответствии с пожеланиями к дизайну.***

<span class="redactor-inline-converted"> ***Изображение со страницы демонстрации -** [**https://sedov.link/fortune**](https://sedov.link/fortune)*</span>

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field68518" data-param="items/parts/field68518" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/9f4b415eae65d559c7894b9a0a213343.png/s/s1200x/a/143493/sc/104" data-img-title="" id="bkmrk--3">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/9f4b415eae65d559c7894b9a0a213343.png/s/s1200x/a/143493/sc/104)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field68518/inner/image/caption">  
</div></div></div>Подлючение классов CSS к форме

У элемента формы (п. 2.3) «Дополнительно → HTML» необходимо указать классы **`<strong>spinner-block</strong>`** и `<strong class="redactor-inline-converted">sedov-link-1</strong>` и нажать «Сохранить и закрыть».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field64985" data-param="items/parts/field64985" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/f7f775c5cc21424dce5d158fbd973d7b.png/s/s1200x/a/143493/sc/304" data-img-title="" id="bkmrk--5">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/f7f775c5cc21424dce5d158fbd973d7b.png/s/s1200x/a/143493/sc/304)</div></div>

# Подключение всех кодов для формирования колеса

### Подключение разметки колеса

У элемента формы ([п. 2.3](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)) «Дополнительно → HTML», нажимаем шестеренку (настройки) и в общее поле для кода (Введите HTML код) вводим следующий код и нажмите «Сохранить и закрыть»:

**&lt;div class="container text-center"&gt;  
&lt;div class="deal-wheel"&gt;  
 &lt;ul class="spinner2"&gt;&lt;/ul&gt;  
 &lt;div class="ticker"&gt;&lt;/div&gt;  
&lt;/div&gt;  
&lt;/div&gt;**

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field34355" data-param="items/parts/field34355" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/086bc74645218940d31ad83efe54821f.png/s/s1200x/a/143493/sc/55" data-img-title="" id="bkmrk--1">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/086bc74645218940d31ad83efe54821f.png/s/s1200x/a/143493/sc/55)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field34355/inner/image/caption">  
</div></div></div>### Подключение CSS-кода колеса

У текстового блока (контейнера) под формой, в выпадающем списке, необходимо выбрать «импортировать блок ниже» и вставить скопированный код по нажатию на кнопку ниже.

```
eyJ0eXBlIjoicmF3LWNzcyIsInByZXNldCI6InJhdy1jc3MiLCJwYXJhbXMiOiJ7XCJibG9ja0NvZGVcIjpcIjc2NTY1XCIsXCJuYW1lXCI6XCJcXHUwNDIxXFx1MDQ0MlxcdTA0MzhcXHUwNDNiXFx1MDQzOCBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0MzBcIixcInJhd1ZhbHVlXCI6XCJcXC8qIFxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQzNVxcdTA0MzdcXHUwNDM0XFx1MDQzNSBcXHUwNDQyXFx1MDQzMFxcdTA0M2EsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZVxcdTA0MzFcXHUwNDRiIFxcdTA0NDFcXHUwNDMyXFx1MDQzZVxcdTA0MzlcXHUwNDQxXFx1MDQ0MlxcdTA0MzJcXHUwNDMwIHdpZHRoIFxcdTA0MzggaGVpZ2h0IFxcdTA0MzdcXHUwNDMwXFx1MDQzNFxcdTA0MzBcXHUwNDMyXFx1MDQzMFxcdTA0M2JcXHUwNDM4IFxcdTA0M2RcXHUwNDM1IFxcdTA0NDBcXHUwNDMwXFx1MDQzN1xcdTA0M2NcXHUwNDM1XFx1MDQ0MFxcdTA0NGIgXFx1MDQzYVxcdTA0M2VcXHUwNDNkXFx1MDQ0MlxcdTA0MzVcXHUwNDNkXFx1MDQ0MlxcdTA0MzAsIFxcdTA0MzAgXFx1MDQ0MFxcdTA0MzBcXHUwNDM3XFx1MDQzY1xcdTA0MzVcXHUwNDQwXFx1MDQ0YiBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQzMCAqXFwvXFxuKiB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG5cXC8qIFxcdTA0M2VcXHUwNDMxXFx1MDQ0OVxcdTA0MzhcXHUwNDM1IFxcdTA0M2RcXHUwNDMwXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzZVxcdTA0MzlcXHUwNDNhXFx1MDQzOCBcXHUwNDQxXFx1MDQ0MlxcdTA0NDBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDQ2XFx1MDQ0YiAqXFwvXFxuLnNwaW5uZXItYmxvY2sge1xcbiAgXFwvKiBcXHUwNDNmXFx1MDQzZVxcdTA0MzRcXHUwNDNhXFx1MDQzYlxcdTA0NGVcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDFcXHUwNDM1XFx1MDQ0MlxcdTA0M2FcXHUwNDQzICpcXC9cXG4gIGRpc3BsYXk6IGdyaWQ7XFxuICBcXC8qIFxcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0MzJcXHUwNDM4XFx1MDQzYyBcXHUwNDMyXFx1MDQ0MVxcdTA0NTEgXFx1MDQzZlxcdTA0M2UgXFx1MDQ0NlxcdTA0MzVcXHUwNDNkXFx1MDQ0MlxcdTA0NDBcXHUwNDQzICpcXC9cXG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XFxuICBcXC8qIFxcdTA0MzVcXHUwNDQxXFx1MDQzYlxcdTA0MzggXFx1MDQ0N1xcdTA0NDJcXHUwNDNlLVxcdTA0NDJcXHUwNDNlIFxcdTA0M2RcXHUwNDM1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzY1xcdTA0MzVcXHUwNDQ5XFx1MDQzMFxcdTA0MzVcXHUwNDQyXFx1MDQ0MVxcdTA0NGYgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0MzJcXHUwNDNlXFx1MDQ1MSBcXHUwNDNjXFx1MDQzNVxcdTA0NDFcXHUwNDQyXFx1MDQzZSBcXHUyMDE0IFxcdTA0NDFcXHUwNDNhXFx1MDQ0MFxcdTA0NGJcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDNlLCBcXHUwNDQ3XFx1MDQ0MlxcdTA0M2UgXFx1MDQzZFxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDNjXFx1MDQzNVxcdTA0NDFcXHUwNDQyXFx1MDQzOFxcdTA0M2JcXHUwNDNlXFx1MDQ0MVxcdTA0NGMgKlxcL1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuXFwvKiBcXHUwNDNlXFx1MDQzMVxcdTA0NDlcXHUwNDM4XFx1MDQzOSBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMyXFx1MDQ0MVxcdTA0MzVcXHUwNDQ1IFxcdTA0NGRcXHUwNDNiXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0NDJcXHUwNDNlXFx1MDQzMiAqXFwvXFxuLmRlYWwtd2hlZWwge1xcbiAgXFwvKiBcXHUwNDM3XFx1MDQzMFxcdTA0MzRcXHUwNDMwXFx1MDQ1MVxcdTA0M2MgXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDRiXFx1MDQzNSBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQzMCAqXFwvXFxuICBcXC8qIFxcdTA0NDBcXHUwNDMwXFx1MDQzN1xcdTA0M2NcXHUwNDM1XFx1MDQ0MFxcdTA0NGIgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwICpcXC9cXG4gIC0tc2l6ZTogY2xhbXAoMjUwcHgsIDcwdm1pbiwgNTAwcHgpO1xcbiAgXFwvKiBcXHUwNDNkXFx1MDQzMFxcdTA0NDFcXHUwNDQyXFx1MDQ0MFxcdTA0M2VcXHUwNDM5XFx1MDQzYVxcdTA0MzggXFx1MDQ0ZlxcdTA0NDBcXHUwNDNhXFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQzOCBcXHUwNDM4IFxcdTA0MzdcXHUwNDMwXFx1MDQzYlxcdTA0MzhcXHUwNDMyXFx1MDQzYVxcdTA0MzggXFx1MDQ0NFxcdTA0M2VcXHUwNDNkXFx1MDQzMCBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzMiAqXFwvXFxuICAtLWxnLWhzOiAwIDMlO1xcbiAgLS1sZy1zdG9wOiA1MCU7XFxuICAtLWxnOiBsaW5lYXItZ3JhZGllbnQoXFxuICAgICAgaHNsKHZhcigtLWxnLWhzKSAwJSkgMCB2YXIoLS1sZy1zdG9wKSxcXG4gICAgICBoc2wodmFyKC0tbGctaHMpIDIwJSkgdmFyKC0tbGctc3RvcCkgMTAwJVxcbiAgICApO1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0M2VcXHUwNDM3XFx1MDQzOFxcdTA0NDZcXHUwNDM4XFx1MDQzZVxcdTA0M2RcXHUwNDM4XFx1MDQ0MFxcdTA0M2VcXHUwNDMyXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzNSBcXHUwNDNlXFx1MDQ0MlxcdTA0M2RcXHUwNDNlXFx1MDQ0MVxcdTA0MzhcXHUwNDQyXFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0M2UgXFx1MDQzNFxcdTA0NDBcXHUwNDQzXFx1MDQzM1xcdTA0MzhcXHUwNDQ1IFxcdTA0NGRcXHUwNDNiXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0NDJcXHUwNDNlXFx1MDQzMiAqXFwvXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBcXC8qIFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2FcXHUwNDNiXFx1MDQ0ZVxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDQyXFx1MDQzYVxcdTA0NDMgKlxcL1xcbiAgZGlzcGxheTogZ3JpZDtcXG4gIGdyaWQtZ2FwOiBjYWxjKHZhcigtLXNpemUpIFxcLyAyMCk7XFxuICBcXC8qIFxcdTA0MzJcXHUwNDRiXFx1MDQ0MFxcdTA0MzBcXHUwNDMyXFx1MDQzZFxcdTA0MzhcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDFcXHUwNDNlXFx1MDQzNFxcdTA0MzVcXHUwNDQwXFx1MDQzNlxcdTA0MzhcXHUwNDNjXFx1MDQzZVxcdTA0MzUgXFx1MDQzMVxcdTA0M2JcXHUwNDNlXFx1MDQzYVxcdTA0MzAgXFx1MDQzZlxcdTA0M2UgXFx1MDQ0NlxcdTA0MzVcXHUwNDNkXFx1MDQ0MlxcdTA0NDBcXHUwNDQzICpcXC9cXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBcXC8qIFxcdTA0MzdcXHUwNDMwXFx1MDQzNFxcdTA0MzBcXHUwNDUxXFx1MDQzYyBcXHUwNDM4XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzMCBcXHUwNDNlXFx1MDQzMVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDJcXHUwNDM1XFx1MDQzOSBcXHUwNDMyXFx1MDQzZFxcdTA0NDNcXHUwNDQyXFx1MDQ0MFxcdTA0MzggXFx1MDQ0MVxcdTA0MzVcXHUwNDQyXFx1MDQzYVxcdTA0MzggKlxcL1xcbiAgZ3JpZC10ZW1wbGF0ZS1hcmVhczpcXG4gICAgXFxcInNwaW5uZXIyXFxcIlxcbiAgICBcXFwidHJpZ2dlclxcXCI7XFxuICBcXC8qIFxcdTA0NDNcXHUwNDQxXFx1MDQ0MlxcdTA0MzBcXHUwNDNkXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MFxcdTA0MzBcXHUwNDM3XFx1MDQzY1xcdTA0MzVcXHUwNDQwIFxcdTA0NDhcXHUwNDQwXFx1MDQzOFxcdTA0NDRcXHUwNDQyXFx1MDQzMCAqXFwvXFxuICBmb250LXNpemU6IGNhbGModmFyKC0tc2l6ZSkgXFwvIDIxKTtcXG59XFxuXFxuXFwvKiBcXHUwNDMyXFx1MDQ0MVxcdTA0NTEsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZSBcXHUwNDNlXFx1MDQ0MlxcdTA0M2RcXHUwNDNlXFx1MDQ0MVxcdTA0MzhcXHUwNDQyXFx1MDQ0MVxcdTA0NGYgXFx1MDQzYVxcdTA0M2UgXFx1MDQzMlxcdTA0M2RcXHUwNDQzXFx1MDQ0MlxcdTA0NDBcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDM4XFx1MDQzYyBcXHUwNDRkXFx1MDQzYlxcdTA0MzVcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQzMFxcdTA0M2MgXFx1MDQzM1xcdTA0M2JcXHUwNDMwXFx1MDQzMlxcdTA0M2RcXHUwNDNlXFx1MDQzM1xcdTA0M2UgXFx1MDQzMVxcdTA0M2JcXHUwNDNlXFx1MDQzYVxcdTA0MzAsIFxcdTA0MzFcXHUwNDQzXFx1MDQzNFxcdTA0MzVcXHUwNDQyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0NVxcdTA0M2VcXHUwNDM0XFx1MDQzOFxcdTA0NDJcXHUwNDRjXFx1MDQ0MVxcdTA0NGYgXFx1MDQzMiBcXHUwNDNlXFx1MDQzMVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDJcXHUwNDM4IFxcdTA0NDFcXHUwNDM1XFx1MDQ0MlxcdTA0M2FcXHUwNDM4IFxcdTA0NDEgXFx1MDQzZFxcdTA0MzBcXHUwNDM3XFx1MDQzMlxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0MzVcXHUwNDNjIHNwaW5uZXIgKlxcL1xcbi5kZWFsLXdoZWVsID4gKiB7XFxuICBncmlkLWFyZWE6IHNwaW5uZXIyO1xcbn1cXG5cXG5cXC8qIFxcdTA0NDFcXHUwNDMwXFx1MDQzYyBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhIFxcdTA0MzggXFx1MDQzYVxcdTA0M2RcXHUwNDNlXFx1MDQzZlxcdTA0M2FcXHUwNDMwIFxcdTA0MzFcXHUwNDQzXFx1MDQzNFxcdTA0NDNcXHUwNDQyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0NVxcdTA0M2VcXHUwNDM0XFx1MDQzOFxcdTA0NDJcXHUwNDRjXFx1MDQ0MVxcdTA0NGYgXFx1MDQzMiBcXHUwNDNlXFx1MDQzMVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDJcXHUwNDM4IFxcdTA0NDFcXHUwNDM1XFx1MDQ0MlxcdTA0M2FcXHUwNDM4IFxcdTA0NDEgXFx1MDQzZFxcdTA0MzBcXHUwNDM3XFx1MDQzMlxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0MzVcXHUwNDNjIHRyaWdnZXIgXFx1MDQzOCBcXHUwNDMxXFx1MDQ0M1xcdTA0MzRcXHUwNDQzXFx1MDQ0MiBcXHUwNDMyXFx1MDQ0YlxcdTA0NDBcXHUwNDNlXFx1MDQzMlxcdTA0M2RcXHUwNDM1XFx1MDQzZFxcdTA0NGIgXFx1MDQzZlxcdTA0M2UgXFx1MDQ0NlxcdTA0MzVcXHUwNDNkXFx1MDQ0MlxcdTA0NDBcXHUwNDQzICpcXC9cXG4uZGVhbC13aGVlbCAuYnRuLXNwaW4ge1xcbiAgZ3JpZC1hcmVhOiB0cmlnZ2VyO1xcbiAganVzdGlmeS1zZWxmOiBjZW50ZXI7XFxufVxcblxcblxcLyogXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMCAqXFwvXFxuLnNwaW5uZXIyIHtcXG4gIFxcLyogXFx1MDQzNFxcdTA0M2VcXHUwNDMxXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQ0ZlxcdTA0MzVcXHUwNDNjIFxcdTA0M2VcXHUwNDQyXFx1MDQzZFxcdTA0M2VcXHUwNDQxXFx1MDQzOFxcdTA0NDJcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZVxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDM3XFx1MDQzOFxcdTA0NDZcXHUwNDM4XFx1MDQzZVxcdTA0M2RcXHUwNDM4XFx1MDQ0MFxcdTA0M2VcXHUwNDMyXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzNSAqXFwvXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBcXC8qIFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2FcXHUwNDNiXFx1MDQ0ZVxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDQyXFx1MDQzYVxcdTA0NDMgKlxcL1xcbiAgZGlzcGxheTogZ3JpZDtcXG4gIFxcLyogXFx1MDQzMlxcdTA0NGJcXHUwNDQwXFx1MDQzMFxcdTA0MzJcXHUwNDNkXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMlxcdTA0NDFcXHUwNDUxIFxcdTA0M2ZcXHUwNDNlIFxcdTA0NDZcXHUwNDM1XFx1MDQzZFxcdTA0NDJcXHUwNDQwXFx1MDQ0MyAqXFwvXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0ZFxcdTA0M2JcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQ0MiBcXHUwNDMyIFxcdTA0NDFcXHUwNDM1XFx1MDQ0MlxcdTA0M2FcXHUwNDQzICpcXC9cXG4gIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFxcXCJzcGlubmVyMlxcXCI7XFxuICBcXC8qIFxcdTA0NDNcXHUwNDQxXFx1MDQ0MlxcdTA0MzBcXHUwNDNkXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MFxcdTA0MzBcXHUwNDM3XFx1MDQzY1xcdTA0MzVcXHUwNDQwXFx1MDQ0YiAqXFwvXFxuICB3aWR0aDogdmFyKC0tc2l6ZSk7XFxuICBoZWlnaHQ6IHZhcigtLXNpemUpO1xcbiAgXFwvKiBcXHUwNDNmXFx1MDQzZVxcdTA0MzJcXHUwNDNlXFx1MDQ0MFxcdTA0MzBcXHUwNDQ3XFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0ZFxcdTA0M2JcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQ0MiAgKlxcL1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1yb3RhdGUsIDI1KSAqIDFkZWcpKTtcXG4gIFxcLyogXFx1MDQ0MFxcdTA0MzhcXHUwNDQxXFx1MDQ0M1xcdTA0MzVcXHUwNDNjIFxcdTA0M2FcXHUwNDQwXFx1MDQ0M1xcdTA0MzNcXHUwNDNiXFx1MDQ0M1xcdTA0NGUgXFx1MDQzZVxcdTA0MzFcXHUwNDMyXFx1MDQzZVxcdTA0MzRcXHUwNDNhXFx1MDQ0MywgXFx1MDQzMCBcXHUwNDMyXFx1MDQ0MVxcdTA0NTEsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZSBcXHUwNDNkXFx1MDQzNSBcXHUwNDNmXFx1MDQzZVxcdTA0M2NcXHUwNDM1XFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQ0MlxcdTA0NDFcXHUwNDRmLCBcXHUyMDE0IFxcdTA0MzFcXHUwNDQzXFx1MDQzNFxcdTA0MzVcXHUwNDQyIFxcdTA0NDFcXHUwNDNhXFx1MDQ0MFxcdTA0NGJcXHUwNDQyXFx1MDQzZSBcXHUwNDM3XFx1MDQzMCBcXHUwNDNhXFx1MDQ0MFxcdTA0NDNcXHUwNDMzXFx1MDQzZVxcdTA0M2MgKlxcL1xcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcbn1cXG5cXG5cXC8qIFxcdTA0MzJcXHUwNDQxXFx1MDQ1MSwgXFx1MDQ0N1xcdTA0NDJcXHUwNDNlIFxcdTA0MzJcXHUwNDNkXFx1MDQ0M1xcdTA0NDJcXHUwNDQwXFx1MDQzOCBcXHUwNDRkXFx1MDQ0MlxcdTA0M2VcXHUwNDMzXFx1MDQzZSBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQzMCwgXFx1MDQzMVxcdTA0NDNcXHUwNDM0XFx1MDQzNVxcdTA0NDIgXFx1MDQzZFxcdTA0MzBcXHUwNDQ1XFx1MDQzZVxcdTA0MzRcXHUwNDM4XFx1MDQ0MlxcdTA0NGNcXHUwNDQxXFx1MDQ0ZiBcXHUwNDMyIFxcdTA0M2VcXHUwNDMxXFx1MDQzYlxcdTA0MzBcXHUwNDQxXFx1MDQ0MlxcdTA0MzggXFx1MDQ0MVxcdTA0MzVcXHUwNDQyXFx1MDQzYVxcdTA0MzggXFx1MDQ0MSBcXHUwNDNkXFx1MDQzMFxcdTA0MzdcXHUwNDMyXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzNVxcdTA0M2Mgc3Bpbm5lciAqXFwvXFxuLnNwaW5uZXIyICoge1xcbiAgZ3JpZC1hcmVhOiBzcGlubmVyMjtcXG59XFxuXFxuXFwvKiBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MiBcXHUwNDNkXFx1MDQzMCBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwXFx1MDQ0NSAqXFwvXFxuLnByaXplIHtcXG4gIFxcLyogXFx1MDQzMlxcdTA0M2FcXHUwNDNiXFx1MDQ0ZVxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDBhYlxcdTA0MzNcXHUwNDM4XFx1MDQzMVxcdTA0M2FcXHUwNDQzXFx1MDQ0ZVxcdTAwYmIgXFx1MDQzMlxcdTA0NTFcXHUwNDQwXFx1MDQ0MVxcdTA0NDJcXHUwNDNhXFx1MDQ0MyAqXFwvXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIFxcLyogXFx1MDQzN1xcdTA0MzBcXHUwNDM0XFx1MDQzMFxcdTA0NTFcXHUwNDNjIFxcdTA0M2VcXHUwNDQyXFx1MDQ0MVxcdTA0NDJcXHUwNDQzXFx1MDQzZlxcdTA0NGIgXFx1MDQzZVxcdTA0NDIgXFx1MDQzYVxcdTA0NDBcXHUwNDMwXFx1MDQ1MVxcdTA0MzIgXFx1MDQzMVxcdTA0M2JcXHUwNDNlXFx1MDQzYVxcdTA0MzAgKlxcL1xcbiAgcGFkZGluZzogMCBjYWxjKHZhcigtLXNpemUpIFxcLyA2KSAwIGNhbGModmFyKC0tc2l6ZSkgXFwvIDIwKTtcXG4gIFxcLyogXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNjXFx1MDQzNVxcdTA0NDBcXHUwNDRiICpcXC9cXG4gIHdpZHRoOiA1MCU7XFxuICBoZWlnaHQ6IDUwJTtcXG4gIFxcLyogXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZVxcdTA0M2VcXHUwNDQwXFx1MDQzNFxcdTA0MzhcXHUwNDNkXFx1MDQzMFxcdTA0NDJcXHUwNDRiLCBcXHUwNDNlXFx1MDQ0MlxcdTA0M2RcXHUwNDNlXFx1MDQ0MVxcdTA0MzhcXHUwNDQyXFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0M2UgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDRiXFx1MDQ0NSBcXHUwNDMxXFx1MDQ0M1xcdTA0MzRcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyICpcXC9cXG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciByaWdodDtcXG4gIFxcLyogXFx1MDQzZlxcdTA0M2VcXHUwNDMyXFx1MDQzZVxcdTA0NDBcXHUwNDMwXFx1MDQ0N1xcdTA0MzhcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyICpcXC9cXG4gIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLXJvdGF0ZSkpO1xcbiAgXFwvKiBcXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQwXFx1MDQzNVxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0Y1xcdTA0MzdcXHUwNDNlXFx1MDQzMlxcdTA0MzBcXHUwNDQyXFx1MDQzNVxcdTA0M2JcXHUwNDRlIFxcdTA0MzJcXHUwNDRiXFx1MDQzNFxcdTA0MzVcXHUwNDNiXFx1MDQ0ZlxcdTA0NDJcXHUwNDRjIFxcdTA0M2NcXHUwNDRiXFx1MDQ0OFxcdTA0M2FcXHUwNDNlXFx1MDQzOSBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MiBcXHUwNDNkXFx1MDQzMCBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwXFx1MDQ0NSAqXFwvXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuXFwvKiBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgKlxcL1xcbi50aWNrZXIge1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzZVxcdTA0NDJcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDM4XFx1MDQ0MlxcdTA0MzVcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDNlXFx1MDQzNSBcXHUwNDNmXFx1MDQzZVxcdTA0MzdcXHUwNDM4XFx1MDQ0NlxcdTA0MzhcXHUwNDNlXFx1MDQzZFxcdTA0MzhcXHUwNDQwXFx1MDQzZVxcdTA0MzJcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDM1ICpcXC9cXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIFxcLyogXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNjXFx1MDQzNVxcdTA0NDBcXHUwNDRiICpcXC9cXG4gIGxlZnQ6IGNhbGModmFyKC0tc2l6ZSkgXFwvIC0xNSk7XFxuICB3aWR0aDogY2FsYyh2YXIoLS1zaXplKSBcXC8gMTApO1xcbiAgaGVpZ2h0OiBjYWxjKHZhcigtLXNpemUpIFxcLyAyMCk7XFxuICBcXC8qIFxcdTA0NDRcXHUwNDNlXFx1MDQzZCBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzYVxcdTA0MzAgKlxcL1xcbiAgYmFja2dyb3VuZDogdmFyKC0tbGcpO1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MlxcdTA0MzBcXHUwNDNhLCBcXHUwNDQ3XFx1MDQ0MlxcdTA0M2VcXHUwNDMxXFx1MDQ0YiBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgXFx1MDQzMVxcdTA0NGJcXHUwNDNiIFxcdTA0MzJcXHUwNDRiXFx1MDQ0OFxcdTA0MzUgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwICpcXC9cXG4gIHotaW5kZXg6IDE7XFxuICBcXC8qIFxcdTA0NDRcXHUwNDNlXFx1MDQ0MFxcdTA0M2NcXHUwNDMwIFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNhXFx1MDQzMCAqXFwvXFxuICBjbGlwLXBhdGg6IHBvbHlnb24oMjAlIDAsIDEwMCUgNTAlLCAyMCUgMTAwJSwgMCUgNTAlKTtcXG4gIFxcLyogXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQyXFx1MDQzZVxcdTA0NDdcXHUwNDNhXFx1MDQ0MywgXFx1MDQzZVxcdTA0NDJcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDM4XFx1MDQ0MlxcdTA0MzVcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDNlIFxcdTA0M2FcXHUwNDNlXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0MzkgXFx1MDQzMVxcdTA0NDNcXHUwNDM0XFx1MDQzNVxcdTA0NDIgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzBcXHUwNDQyXFx1MDQ0Y1xcdTA0NDFcXHUwNDRmIFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNlXFx1MDQzYSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzggXFx1MDQzNFxcdTA0MzJcXHUwNDM4XFx1MDQzNlxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzggXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwICpcXC9cXG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBsZWZ0O1xcbn1cXG5cXG5cXC8qIFxcdTA0M2FcXHUwNDNkXFx1MDQzZVxcdTA0M2ZcXHUwNDNhXFx1MDQzMCBcXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQzXFx1MDQ0MVxcdTA0M2FcXHUwNDMwIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMCAqXFwvXFxuLmJ0bi1zcGluIHtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGJhY2tncm91bmQ6IGJsYWNrO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgXFwvKiBcXHUwNDMxXFx1MDQzNVxcdTA0NDBcXHUwNDUxXFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNjXFx1MDQzNVxcdTA0NDAgXFx1MDQ0OFxcdTA0NDBcXHUwNDM4XFx1MDQ0NFxcdTA0NDJcXHUwNDMwIFxcdTA0NDJcXHUwNDMwXFx1MDQzYVxcdTA0M2VcXHUwNDM5IFxcdTA0MzZcXHUwNDM1LCBcXHUwNDNhXFx1MDQzMFxcdTA0M2EgXFx1MDQzMiBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0MzUgKlxcL1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzZVxcdTA0NDJcXHUwNDQxXFx1MDQ0MlxcdTA0NDNcXHUwNDNmXFx1MDQ0YiBcXHUwNDNlXFx1MDQ0MiBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MlxcdTA0MzAgXFx1MDQzMlxcdTA0M2RcXHUwNDQzXFx1MDQ0MlxcdTA0NDBcXHUwNDM4IFxcdTA0M2FcXHUwNDNkXFx1MDQzZVxcdTA0M2ZcXHUwNDNhXFx1MDQzOCAqXFwvXFxuICBwYWRkaW5nOiAwLjlyZW0gMnJlbSAxcmVtO1xcbiAgXFwvKiBcXHUwNDQxXFx1MDQzYVxcdTA0NDBcXHUwNDQzXFx1MDQzM1xcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0M1xcdTA0MzNcXHUwNDNiXFx1MDQ0YiAqXFwvXFxuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XFxuICBcXC8qIFxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQzZFxcdTA0MzVcXHUwNDQ4XFx1MDQzZFxcdTA0MzhcXHUwNDM5IFxcdTA0MzJcXHUwNDM4XFx1MDQzNCBcXHUwNDNhXFx1MDQ0M1xcdTA0NDBcXHUwNDQxXFx1MDQzZVxcdTA0NDBcXHUwNDMwIFxcdTA0M2RcXHUwNDMwXFx1MDQzNCBcXHUwNDNhXFx1MDQzZFxcdTA0M2VcXHUwNDNmXFx1MDQzYVxcdTA0M2VcXHUwNDM5IFxcdTA0M2RcXHUwNDMwIFxcdTA0NDBcXHUwNDQzXFx1MDQzYVxcdTA0NDMqXFwvXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcLyogXFx1MDQzNVxcdTA0NDFcXHUwNDNiXFx1MDQzOCBcXHUwNDNhXFx1MDQzZFxcdTA0M2VcXHUwNDNmXFx1MDQzYVxcdTA0MzAgXFx1MDQzZFxcdTA0MzBcXHUwNDM2XFx1MDQzMFxcdTA0NDJcXHUwNDMwIFxcdTA0MzggXFx1MDQzZFxcdTA0MzVcXHUwNDMwXFx1MDQzYVxcdTA0NDJcXHUwNDM4XFx1MDQzMlxcdTA0M2RcXHUwNDMwICpcXC9cXG4uYnRuLXNwaW46ZGlzYWJsZWQge1xcbiAgXFwvKiBcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzMlxcdTA0M2RcXHUwNDM1XFx1MDQ0OFxcdTA0M2RcXHUwNDM4XFx1MDQzOSBcXHUwNDMyXFx1MDQzOFxcdTA0MzQgXFx1MDQzYVxcdTA0NDNcXHUwNDQwXFx1MDQ0MVxcdTA0M2VcXHUwNDQwXFx1MDQzMCAqXFwvXFxuICBjdXJzb3I6IHByb2dyZXNzO1xcbiAgXFwvKiBcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2RcXHUwNDNlXFx1MDQzZlxcdTA0M2FcXHUwNDQzIFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0NDNcXHUwNDNmXFx1MDQ0MFxcdTA0M2VcXHUwNDM3XFx1MDQ0MFxcdTA0MzBcXHUwNDQ3XFx1MDQzZFxcdTA0M2VcXHUwNDM5ICpcXC9cXG4gIG9wYWNpdHk6IDAuMjU7XFxufVxcblxcblxcLyogXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGYgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0NGYgKlxcL1xcbi5pcy1zcGlubmluZyAuc3Bpbm5lcjIge1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDhzIGN1YmljLWJlemllcigwLjEsIC0wLjAxLCAwLCAxKTtcXG59XFxuXFxuXFwvKiBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQ0ZiBcXHUwNDM0XFx1MDQzMlxcdTA0MzhcXHUwNDM2XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZiBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzYVxcdTA0MzAgKlxcL1xcbi5pcy1zcGlubmluZyAudGlja2VyIHtcXG4gICAgICAgICAgYW5pbWF0aW9uOiB0aWNrIDcwMG1zIGN1YmljLWJlemllcigwLjM0LCAxLjU2LCAwLjY0LCAxKTtcXG59XFxuXFxuXFxuXFwvKiBcXHUwNDRkXFx1MDQ0NFxcdTA0NDRcXHUwNDM1XFx1MDQzYVxcdTA0NDIsIFxcdTA0M2FcXHUwNDNlXFx1MDQzM1xcdTA0MzRcXHUwNDMwIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzZSBcXHUwNDM3XFx1MDQzMFxcdTA0MzRcXHUwNDM1XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQ0MiBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgXFx1MDQzZlxcdTA0NDBcXHUwNDM4IFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM4ICpcXC9cXG5Aa2V5ZnJhbWVzIHRpY2sge1xcbiAgNDAlIHtcXG4gICAgXFwvKiBcXHUwNDQ3XFx1MDQ0M1xcdTA0NDJcXHUwNDRjIFxcdTA0M2ZcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcdTA0NDdcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgXFx1MDQzZFxcdTA0MzBcXHUwNDMyXFx1MDQzNVxcdTA0NDBcXHUwNDQ1IFxcdTA0MzIgXFx1MDQ0MVxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0MzRcXHUwNDM4XFx1MDQzZFxcdTA0MzUgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0MzggKlxcL1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTJkZWcpO1xcbiAgfVxcbn1cXG5cXG5cXC8qIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDM4XFx1MDQ0MFxcdTA0NDNcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQ0YlxcdTA0M2ZcXHUwNDMwXFx1MDQzMlxcdTA0NDhcXHUwNDM4XFx1MDQzOSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDAgKlxcL1xcbi5wcml6ZS5zZWxlY3RlZCAudGV4dCB7XFxuICBcXC8qIFxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MiBcXHUwNDMxXFx1MDQzNVxcdTA0M2JcXHUwNDRiXFx1MDQzYyAqXFwvXFxuICBjb2xvcjogd2hpdGU7XFxuICBcXC8qIFxcdTA0M2RcXHUwNDMwXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0MzhcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0MzRcXHUwNDNiXFx1MDQzOFxcdTA0NDJcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQ0YyBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOCAqXFwvXFxuICBhbmltYXRpb246IHNlbGVjdGVkIDgwMG1zIGVhc2U7XFxufVxcblxcblxcLyogXFx1MDQzZFxcdTA0MzBcXHUwNDQxXFx1MDQ0MlxcdTA0NDBcXHUwNDMwXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGUgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXHUwNDMwIFxcdTA0M2RcXHUwNDMwIFxcdTA0MzJcXHUwNDRiXFx1MDQzZlxcdTA0MzBcXHUwNDMyXFx1MDQ0OFxcdTA0MzVcXHUwNDNjIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzUgXFx1MDQzZlxcdTA0M2UgXFx1MDQzYVxcdTA0MzBcXHUwNDM0XFx1MDQ0MFxcdTA0MzBcXHUwNDNjICpcXC9cXG5Aa2V5ZnJhbWVzIHNlbGVjdGVkIHtcXG4gIFxcLyogXFx1MDQ0N1xcdTA0NDJcXHUwNDNlIFxcdTA0M2ZcXHUwNDQwXFx1MDQzZVxcdTA0MzhcXHUwNDQxXFx1MDQ0NVxcdTA0M2VcXHUwNDM0XFx1MDQzOFxcdTA0NDIgXFx1MDQzZFxcdTA0MzAgMjUlIFxcdTA0M2VcXHUwNDQyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzBcXHUwNDNiXFx1MDQzMCBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOCAqXFwvXFxuICAyNSUge1xcbiAgICBcXC8qIFxcdTA0NDNcXHUwNDMyXFx1MDQzNVxcdTA0M2JcXHUwNDM4XFx1MDQ0N1xcdTA0MzhcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyIFxcdTA0MzIgMSwyNSBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDMwICpcXC9cXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjI1KTtcXG4gICAgXFwvKiBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXHUwNDQzIFxcdTA0NDJcXHUwNDM1XFx1MDQzZFxcdTA0NGMgKlxcL1xcbiAgICB0ZXh0LXNoYWRvdzogMXZtaW4gMXZtaW4gMCBoc2xhKDAgMCUgMCUgXFwvIDAuMSk7XFxuICB9XFxuICA0MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpO1xcbiAgICB0ZXh0LXNoYWRvdzogMCAwIDAgaHNsYSgwIDAlIDAlIFxcLyAwLjIpO1xcbiAgfVxcbiAgNjAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcXG4gICAgdGV4dC1zaGFkb3c6IDAuNXZtaW4gMC41dm1pbiAwIGhzbGEoMCAwJSAwJSBcXC8gMC4xKTtcXG4gIH1cXG4gIDc1JSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7XFxuICB9XFxuICA4NSUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgfVxcbn1cXG5cXG5cXC8qXFx1MDQyMVxcdTA0M2FcXHUwNDQwXFx1MDQ0YlxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0ZiBcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQ0YipcXC9cXG4uc2Vkb3ZfYmxvY2staGlkZGVuIHtcXG4gIGRpc3BsYXk6bm9uZTtcXG59XFxuXFxuXFwvKlxcdTA0MjFcXHUwNDMyXFx1MDQzZVxcdTA0MzggXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0MzgqXFwvXFxuLmZvcm1hLXNlZG92IC5mb3JtLXJlc3VsdC1ibG9jay5lcnJvciB7IFxcLypcXHUwNDI2XFx1MDQzMlxcdTA0MzVcXHUwNDQyIFxcdTA0MzJcXHUwNDMwXFx1MDQzYlxcdTA0MzhcXHUwNDM0XFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOCBcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQ0YipcXC9cXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIGJvcmRlci1yYWRpdXM6IDUwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDI1cHg7XFxuICAgIGJhY2tncm91bmQ6ICNmZjEzMDA7XFxuICAgIGNvbG9yOiAjMDAwO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDJweCAxMHB4IDBweCAjYTIwYzAwO1xcbn1cXG4uc3Bpbm5lcjIgeyBcXG4gICAgcGFkZGluZzogMDtcXG59XFxuLnByaXplIHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuMjsgXFwvKlxcdTA0MzJcXHUwNDRiXFx1MDQ0MVxcdTA0M2VcXHUwNDQyXFx1MDQzMCBcXHUwNDQxXFx1MDQ0MlxcdTA0NDBcXHUwNDNlXFx1MDQzYVxcdTA0MzgqXFwvXFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7IFxcLypcXHUwNDM2XFx1MDQzOFxcdTA0NDBcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQ0YypcXC9cXG4gICAgZm9udC1zaXplOiAwLjdlbTsgXFwvKlxcdTA0NDhcXHUwNDQwXFx1MDQzOFxcdTA0NDRcXHUwNDQyIFxcdTA0M2ZcXHUwNDQwXFx1MDQzOFxcdTA0MzdcXHUwNDMwKlxcL1xcbn1cIixcImJsb2NrUGFkZGluZ1RvcFwiOjAsXCJibG9ja1BhZGRpbmdCb3R0b21cIjowLFwiYmxvY2tCYWNrZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tGb3JlZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tDc3NDbGFzc1wiOlwiXCIsXCJyZXBsYWNlVmFyaWFibGVzXCI6XCJcIixcImJsb2NrTGlua0NvbG9yXCI6XCJcIixcImJsb2NrRm9udFwiOm51bGwsXCJibG9ja0ZvbnRIZWFkZXJcIjpudWxsfSIsImNzcyI6bnVsbH0=
```

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field1781" data-param="items/parts/field1781" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/b65eb8f5bf03f40096547699b8dbac6e.png/s/s1200x/a/143493/sc/258" data-img-title="" id="bkmrk--3">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/b65eb8f5bf03f40096547699b8dbac6e.png/s/s1200x/a/143493/sc/258)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field1781/inner/image/caption">  
</div></div></div>### Подключение CSS-кода фона блоков

У CSS блока который вы добавили ранее, так же выбираем "Импортировать блок ниже" и вставляем скопированный код по нажатию на кнопку ниже.

```
eyJ0eXBlIjoicmF3LWNzcyIsInByZXNldCI6InJhdy1jc3MiLCJwYXJhbXMiOiJ7XCJibG9ja0NvZGVcIjpcIjZkY2I0XCIsXCJuYW1lXCI6XCJcXHUwNDFlXFx1MDQ0NFxcdTA0M2VcXHUwNDQwXFx1MDQzY1xcdTA0M2JcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0M2ZcXHUwNDMwXFx1MDQzZFxcdTA0MzVcXHUwNDNiXFx1MDQzOCBcXHUwNDQxIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzZVxcdTA0M2NcIixcInJhd1ZhbHVlXCI6XCIuZm9ybWEtc2Vkb3YgLmJsb2NrLWJveCB7XFxuYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2IoNzMsIDEzNSwgMjIzKSAxMCUsIHJnYigxMDcsNjcsMTY5KSk7ICAgICBcXC8qXFx1MDQ0NFxcdTA0M2VcXHUwNDNkIFxcdTA0M2FcXHUwNDNlXFx1MDQzZFxcdTA0NDJcXHUwNDM1XFx1MDQzOVxcdTA0M2RcXHUwNDM1XFx1MDQ0MFxcdTA0MzAqXFwvXFxuICAgIFxcLypib3gtc2hhZG93OiAwIDAgMjBweCA1cHggIzAwMDAwMDVlOyAgXFx1MDQ0MlxcdTA0MzVcXHUwNDNkXFx1MDQ0YyBcXHUwNDNhXFx1MDQzZVxcdTA0M2RcXHUwNDQyXFx1MDQzNVxcdTA0MzlcXHUwNDNkXFx1MDQzNVxcdTA0NDBcXHUwNDMwKlxcL1xcbn1cIixcImJsb2NrUGFkZGluZ1RvcFwiOjAsXCJibG9ja1BhZGRpbmdCb3R0b21cIjowLFwiYmxvY2tCYWNrZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tGb3JlZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tDc3NDbGFzc1wiOlwiXCIsXCJyZXBsYWNlVmFyaWFibGVzXCI6XCJcIixcImJsb2NrTGlua0NvbG9yXCI6XCJcIixcImJsb2NrRm9udFwiOm51bGwsXCJibG9ja0ZvbnRIZWFkZXJcIjpudWxsfSIsImNzcyI6bnVsbH0=
```

### Подключение JS-кода колеса

У CSS блока который вы добавили предыдущим, так же выбираем "Импортировать блок ниже" и вставляем скопированный код по нажатию на кнопку ниже.

```
eyJ0eXBlIjoicmF3LWpzIiwicHJlc2V0IjoicmF3LWpzIiwicGFyYW1zIjoie1wiYmxvY2tDb2RlXCI6XCJmNWIyYVwiLFwibmFtZVwiOlwiXFx1MDQxYVxcdTA0M2VcXHUwNDM0IFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMFwiLFwicmF3VmFsdWVcIjpcIlxcL1xcL1xcdTA0MTNcXHUwNDM1XFx1MDQzZFxcdTA0MzVcXHUwNDQwXFx1MDQzMFxcdTA0NDJcXHUwNDNlXFx1MDQ0MCBcXHUwNDQ2XFx1MDQzMlxcdTA0MzVcXHUwNDQyXFx1MDQzZVxcdTA0MzIgc2Vkb3YubGlua1xcbmZ1bmN0aW9uIGdlbmVyYXRlQ29sb3IoKSB7XFxuICAgIGxldCB4MTZjb2xvciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2Nzc3MjE1KS50b1N0cmluZygxNik7XFxuICAgIGlmICh4MTZjb2xvci5sZW5ndGggPCA2KSB7XFxuICAgICAgICBsZXQgeDE2Y29sb3JMZW5ndGggPSB4MTZjb2xvci5sZW5ndGg7XFxuICAgICAgICBmb3IgKGxldCBpID0geDE2Y29sb3JMZW5ndGg7IGkgPCA2OyBpKyspIHtcXG4gICAgICAgICAgICB4MTZjb2xvciA9IHgxNmNvbG9yICsgJ2EnO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiAnIycgKyB4MTZjb2xvcjtcXG59XFxuXFxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7XFxuICAgIGNvbnN0IGZvcm1DbGFzc2VzID0gW1xcbiAgICAgICAgJ3NlZG92LWxpbmstMScsXFxuICAgICAgICBcXC9cXC8gJ3NlZG92LWxpbmstMicgXFwvKiBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQ0MFxcdTA0MzVcXHUwNDMwXFx1MDQzYlxcdTA0MzhcXHUwNDM3XFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOCBcXHUwNDNkXFx1MDQzNVxcdTA0NDFcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDRjXFx1MDQzYVxcdTA0MzhcXHUwNDQ1IFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxLCBcXHUwNDNkXFx1MDQzNVxcdTA0M2VcXHUwNDMxXFx1MDQ0NVxcdTA0M2VcXHUwNDM0XFx1MDQzOFxcdTA0M2NcXHUwNDNlIFxcdTA0MzRcXHUwNDQzXFx1MDQzMVxcdTA0M2JcXHUwNDM4XFx1MDQ0MFxcdTA0M2VcXHUwNDMyXFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0M2FcXHUwNDNiXFx1MDQzMFxcdTA0NDFcXHUwNDQxXFx1MDQ0YipcXC9cXG4gICAgXTtcXG4gICAgY29uc3Qgd2hlZWxDb2xvcnMgPSBbIFxcL1xcL1xcdTA0M2FcXHUwNDMwXFx1MDQzNlxcdTA0MzRcXHUwNDMwXFx1MDQ0ZiBcXHUwNDQxXFx1MDQ0MlxcdTA0NDBcXHUwNDNlXFx1MDQzYVxcdTA0MzAgXFx1MDQzZVxcdTA0NDJcXHUwNDMyXFx1MDQzNVxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0NDIgXFx1MDQzN1xcdTA0MzAgXFx1MDQ0NlxcdTA0MzJcXHUwNDM1XFx1MDQ0MiBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwLiBcXHUwNDE1XFx1MDQ0MVxcdTA0M2JcXHUwNDM4IFxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDJcXHUwNDNlXFx1MDQzMiBcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDRjXFx1MDQ0OFxcdTA0MzUsIFxcdTA0NDdcXHUwNDM1XFx1MDQzYyBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzMiwgXFx1MDQ0MlxcdTA0M2UgXFx1MDQ0MVxcdTA0M2JcXHUwNDM1XFx1MDQzNFxcdTA0NDNcXHUwNDRlXFx1MDQ0OVxcdTA0MzhcXHUwNDM5IFxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDIgXFx1MDQzZlxcdTA0M2VcXHUwNDM0XFx1MDQzMVxcdTA0MzhcXHUwNDQwXFx1MDQzMFxcdTA0MzVcXHUwNDQyXFx1MDQ0MVxcdTA0NGYgXFx1MDQzMFxcdTA0MzJcXHUwNDQyXFx1MDQzZVxcdTA0M2NcXHUwNDMwXFx1MDQ0MlxcdTA0MzhcXHUwNDQ3XFx1MDQzNVxcdTA0NDFcXHUwNDNhXFx1MDQzOFxcbiAgICAgICcjZmNhYjE0JyxcXG4gICAgICAnI2ZhNjY0MScsXFxuICAgICAgJyNiZTQwYzAnLFxcbiAgICAgICcjNDhjY2UwJyxcXG4gICAgICAnIzQyOGJlYicsXFxuICAgICAgJyM1MDVhZGQnLFxcbiAgICAgICcjMmQ4MGNlJ1xcbiAgICBdO1xcblxcbiAgICB2YXIgcHJpemVzID0gW107XFxuICAgIHZhciBmb3JtID0gW107XFxuICAgIHZhciB3aGVlbEJsb2NrID0gW107XFxuICAgIHZhciB0aXRsZVByaXplcyA9IFtdO1xcbiAgICB2YXIgdGl0bGVQcml6ZXNTZWxlY3RvciA9ICcucHVsbC1sZWZ0LmZvcm0tcG9zaXRpb24tdGl0bGUnO1xcbiAgICB2YXIgd2hlZWwgPSBbXTtcXG4gICAgdmFyIHNwaW5uZXIgPSBbXTtcXG4gICAgdmFyIHRpY2tlciA9IFtdO1xcbiAgICBcXC9cXC8gXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0NGNcXHUwNDNhXFx1MDQzZSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzMiBcXHUwNDNkXFx1MDQzMFxcdTA0NDBcXHUwNDM1XFx1MDQzN1xcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQ0MFxcdTA0NDNcXHUwNDMzXFxuICAgIHZhciBwcml6ZVNsaWNlID0gW107XFxuICAgIFxcL1xcLyBcXHUwNDNkXFx1MDQzMCBcXHUwNDNhXFx1MDQzMFxcdTA0M2FcXHUwNDNlXFx1MDQzNSBcXHUwNDQwXFx1MDQzMFxcdTA0NDFcXHUwNDQxXFx1MDQ0MlxcdTA0M2VcXHUwNDRmXFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0NDFcXHUwNDNjXFx1MDQzNVxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMCBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzIFxcdTA0M2VcXHUwNDQyXFx1MDQzZFxcdTA0M2VcXHUwNDQxXFx1MDQzOFxcdTA0NDJcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZSBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzXFx1MDQzMFxcbiAgICB2YXIgcHJpemVPZmZzZXQgPSBbXTtcXG4gICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDQwXFx1MDQzZVxcdTA0M2ZcXHUwNDM4XFx1MDQ0MVxcdTA0NGJcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIENTUy1cXHUwNDNhXFx1MDQzYlxcdTA0MzBcXHUwNDQxXFx1MDQ0MVxcdTA0NGIsIFxcdTA0M2FcXHUwNDNlXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcdTA0MzUgXFx1MDQzMVxcdTA0NDNcXHUwNDM0XFx1MDQzNVxcdTA0M2MgXFx1MDQzNFxcdTA0M2VcXHUwNDMxXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQ0ZlxcdTA0NDJcXHUwNDRjIFxcdTA0MzggXFx1MDQ0M1xcdTA0MzFcXHUwNDM4XFx1MDQ0MFxcdTA0MzBcXHUwNDQyXFx1MDQ0YyBcXHUwNDM4XFx1MDQzNyBcXHUwNDQxXFx1MDQ0MlxcdTA0MzhcXHUwNDNiXFx1MDQzNVxcdTA0MzlcXG4gICAgY29uc3Qgc3BpbkNsYXNzID0gXFxcImlzLXNwaW5uaW5nXFxcIjtcXG4gICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IFxcXCJzZWxlY3RlZFxcXCI7XFxuICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzZVxcdTA0M2JcXHUwNDQzXFx1MDQ0N1xcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQ0MVxcdTA0MzUgXFx1MDQzN1xcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0NGYgXFx1MDQzZlxcdTA0MzBcXHUwNDQwXFx1MDQzMFxcdTA0M2NcXHUwNDM1XFx1MDQ0MlxcdTA0NDBcXHUwNDNlXFx1MDQzMiBcXHUwNDQxXFx1MDQ0MlxcdTA0MzhcXHUwNDNiXFx1MDQzNVxcdTA0MzkgXFx1MDQ0MyBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzMlxcbiAgICB2YXIgc3Bpbm5lclN0eWxlcyA9IFtdO1xcblxcbiAgICBcXC9cXC8gXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDMwXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0MzhcXG4gICAgdmFyIHRpY2tlckFuaW0gPSBbXTtcXG4gICAgXFwvXFwvIFxcdTA0NDNcXHUwNDMzXFx1MDQzZVxcdTA0M2IgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0NGZcXG4gICAgdmFyIHJvdGF0aW9uID0gW107XFxuICAgIFxcL1xcLyBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQzXFx1MDQ0OVxcdTA0MzhcXHUwNDM5IFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcbiAgICB2YXIgY3VycmVudFNsaWNlID0gW107XFxuICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0MzBcXHUwNDRmIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MlxcdTA0M2VcXHUwNDMyXFx1MDQ0YlxcdTA0NDUgXFx1MDQzZlxcdTA0M2VcXHUwNDM0XFx1MDQzZlxcdTA0MzhcXHUwNDQxXFx1MDQzNVxcdTA0MzlcXG4gICAgdmFyIHByaXplTm9kZXMgPSBbXTtcXG5cXG4gICAgXFwvXFwvXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDMwXFx1MDQ0ZiBzdWJtaXQgZm9ybVxcbiAgICB2YXIgZm9ybUJ1dHRvbiA9IFtdO1xcblxcbiAgICBmb3IgKGxldCBmb3JtS2V5IGluIGZvcm1DbGFzc2VzKSB7XFxuICAgICAgICBpZiAoJCgnLicgKyBmb3JtQ2xhc3Nlc1tmb3JtS2V5XSkuZXEoMSkuZmluZCgnZm9ybScpLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGZvcm1bZm9ybUtleV0gPSAkKCcuJyArIGZvcm1DbGFzc2VzW2Zvcm1LZXldKS5lcSgxKS5maW5kKCdmb3JtJyk7XFxuICAgICAgICAgICAgd2hlZWxCbG9ja1tmb3JtS2V5XSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZm9ybUNsYXNzZXNbZm9ybUtleV0pWzBdO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBmb3JtW2Zvcm1LZXldID0gJCgnLicgKyBmb3JtQ2xhc3Nlc1tmb3JtS2V5XSkuZXEoMCkuZmluZCgnZm9ybScpO1xcbiAgICAgICAgICAgIHdoZWVsQmxvY2tbZm9ybUtleV0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZvcm1DbGFzc2VzW2Zvcm1LZXldKVsxXTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIFxcL1xcL1xcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0NDNcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0M2FcXHUwNDNkXFx1MDQzZVxcdTA0M2ZcXHUwNDNhXFx1MDQ0MyBmb3JtIHN1Ym1pdFxcbiAgICAgICAgZm9ybUJ1dHRvbltmb3JtS2V5XSA9IGZvcm1bZm9ybUtleV0uZmluZCgnYnV0dG9uJyk7XFxuXFxuICAgICAgICBcXC9cXC9cXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0M2RcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0NDBcXHUwNDM4XFx1MDQzN1xcdTA0NGIgXFx1MDQzOCBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MFxcdTA0MzBcXHUwNDNkXFx1MDQzNFxcdTA0M2VcXHUwNDNjXFx1MDQzZFxcdTA0NGJcXHUwNDM1IFxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDJcXHUwNDMwXFxuICAgICAgICB0aXRsZVByaXplc1tmb3JtS2V5XSA9IGZvcm1bZm9ybUtleV0uZmluZCh0aXRsZVByaXplc1NlbGVjdG9yKTtcXG4gICAgICAgIGlmICh0aXRsZVByaXplc1tmb3JtS2V5XS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgdGl0bGVQcml6ZXNbZm9ybUtleV0uZWFjaChmdW5jdGlvbihpLCBlKSB7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9ICQoZSkudGV4dCgpLnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByaXplc1tmb3JtS2V5XSkgcHJpemVzW2Zvcm1LZXldID0gW107XFxuICAgICAgICAgICAgICAgICAgICBsZXQgYyA9IHR5cGVvZih3aGVlbENvbG9ycykgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYgd2hlZWxDb2xvcnMgIT09IG51bGwgJiYgd2hlZWxDb2xvcnNbaV0gPyB3aGVlbENvbG9yc1tpXSA6IGdlbmVyYXRlQ29sb3IoKTtcXG4gICAgICAgICAgICAgICAgICAgIHByaXplc1tmb3JtS2V5XS5wdXNoKHsgdGV4dDogdGl0bGUsIGNvbG9yOiBjIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBcXC9cXC8gXFx1MDQ0MVxcdTA0M2VcXHUwNDM3XFx1MDQzNFxcdTA0MzBcXHUwNDUxXFx1MDQzYyBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0NGJcXHUwNDM1IFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMxXFx1MDQ0YlxcdTA0NDFcXHUwNDQyXFx1MDQ0MFxcdTA0M2VcXHUwNDMzXFx1MDQzZSBcXHUwNDM0XFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQ0M1xcdTA0M2ZcXHUwNDMwIFxcdTA0M2FcXHUwNDNlIFxcdTA0MzJcXHUwNDQxXFx1MDQzNVxcdTA0M2MgXFx1MDQzZVxcdTA0MzFcXHUwNDRhXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzMFxcdTA0M2MgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0MzUgXFx1MjAxNCBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQ0MyBcXHUwNDMyIFxcdTA0NDZcXHUwNDM1XFx1MDQzYlxcdTA0M2VcXHUwNDNjLCBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0NDMsIFxcdTA0M2FcXHUwNDNkXFx1MDQzZVxcdTA0M2ZcXHUwNDNhXFx1MDQzNSBcXHUwNDM4IFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNhXFx1MDQ0M1xcbiAgICAgICAgaWYgKCF3aGVlbEJsb2NrW2Zvcm1LZXldKSBicmVhaztcXG4gICAgICAgIHdoZWVsW2Zvcm1LZXldID0gd2hlZWxCbG9ja1tmb3JtS2V5XS5xdWVyeVNlbGVjdG9yKFxcXCIuZGVhbC13aGVlbFxcXCIpO1xcbiAgICAgICAgc3Bpbm5lcltmb3JtS2V5XSA9IHdoZWVsW2Zvcm1LZXldLnF1ZXJ5U2VsZWN0b3IoXFxcIi5zcGlubmVyMlxcXCIpO1xcbiAgICAgICAgdGlja2VyW2Zvcm1LZXldID0gd2hlZWxbZm9ybUtleV0ucXVlcnlTZWxlY3RvcihcXFwiLnRpY2tlclxcXCIpO1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0M2RcXHUwNDMwIFxcdTA0NDFcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDRjXFx1MDQzYVxcdTA0M2UgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0MzIgXFx1MDQzZFxcdTA0MzBcXHUwNDQwXFx1MDQzNVxcdTA0MzdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0NDBcXHUwNDQzXFx1MDQzM1xcbiAgICAgICAgcHJpemVTbGljZVtmb3JtS2V5XSA9IDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aDtcXG4gICAgICAgIFxcL1xcLyBcXHUwNDNkXFx1MDQzMCBcXHUwNDNhXFx1MDQzMFxcdTA0M2FcXHUwNDNlXFx1MDQzNSBcXHUwNDQwXFx1MDQzMFxcdTA0NDFcXHUwNDQxXFx1MDQ0MlxcdTA0M2VcXHUwNDRmXFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0NDFcXHUwNDNjXFx1MDQzNVxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMCBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzIFxcdTA0M2VcXHUwNDQyXFx1MDQzZFxcdTA0M2VcXHUwNDQxXFx1MDQzOFxcdTA0NDJcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZSBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzXFx1MDQzMFxcbiAgICAgICAgcHJpemVPZmZzZXRbZm9ybUtleV0gPSBNYXRoLmZsb29yKDE4MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCk7XFxuICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMlxcdTA0NDFcXHUwNDM1IFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmIFxcdTA0M2ZcXHUwNDMwXFx1MDQ0MFxcdTA0MzBcXHUwNDNjXFx1MDQzNVxcdTA0NDJcXHUwNDQwXFx1MDQzZVxcdTA0MzIgXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0MzVcXHUwNDM5IFxcdTA0NDMgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0MzJcXG4gICAgICAgIHNwaW5uZXJTdHlsZXNbZm9ybUtleV0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGlubmVyW2Zvcm1LZXldKTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0MzBcXHUwNDRmIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOFxcbiAgICAgICAgdGlja2VyQW5pbVtmb3JtS2V5XTtcXG4gICAgICAgIFxcL1xcLyBcXHUwNDQzXFx1MDQzM1xcdTA0M2VcXHUwNDNiIFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmXFxuICAgICAgICByb3RhdGlvbltmb3JtS2V5XSA9IDA7XFxuICAgICAgICBcXC9cXC8gXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0M1xcdTA0NDlcXHUwNDM4XFx1MDQzOSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXG4gICAgICAgIGN1cnJlbnRTbGljZVtmb3JtS2V5XSA9IDA7XFxuICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDMwXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXHUwNDNlXFx1MDQzMlxcdTA0NGJcXHUwNDQ1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2ZcXHUwNDM4XFx1MDQ0MVxcdTA0MzVcXHUwNDM5XFxuICAgICAgICBwcml6ZU5vZGVzW2Zvcm1LZXldO1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDBcXHUwNDMwXFx1MDQ0MVxcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQ0ZlxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyIFxcdTA0M2ZcXHUwNDNlIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzBcXHUwNDNjXFxuICAgICAgICBjb25zdCBjcmVhdGVQcml6ZU5vZGVzID0gKCkgPT4ge1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDNlXFx1MDQzMVxcdTA0NDBcXHUwNDMwXFx1MDQzMVxcdTA0MzBcXHUwNDQyXFx1MDQ0YlxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0MzBcXHUwNDM2XFx1MDQzNFxcdTA0NDNcXHUwNDRlIFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2ZcXHUwNDM4XFx1MDQ0MVxcdTA0NGNcXG4gICAgICAgICAgICBwcml6ZXNbZm9ybUtleV0uZm9yRWFjaCgoeyB0ZXh0LCBjb2xvciwgcmVhY3Rpb24gfSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQzYVxcdTA0MzBcXHUwNDM2XFx1MDQzNFxcdTA0M2VcXHUwNDM5IFxcdTA0MzhcXHUwNDM3IFxcdTA0M2RcXHUwNDM4XFx1MDQ0NSBcXHUwNDNkXFx1MDQzMFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzJcXHUwNDNlXFx1MDQzOSBcXHUwNDQzXFx1MDQzM1xcdTA0M2VcXHUwNDNiIFxcdTA0M2ZcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDMwXFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uW2Zvcm1LZXldID0gKChwcml6ZVNsaWNlW2Zvcm1LZXldICogaSkgKiAtMSkgLSBwcml6ZU9mZnNldFtmb3JtS2V5XTtcXG4gICAgICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzRcXHUwNDNlXFx1MDQzMVxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZVxcdTA0MzQgXFx1MDQ0MSBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNjXFx1MDQzNVxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1XFx1MDQzYyBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MlxcdTA0MzAgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0NDMgXFx1MDQzMiBcXHUwNDNhXFx1MDQzZVxcdTA0M2RcXHUwNDM1XFx1MDQ0NiBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQzMCBzcGlubmVyXFxuICAgICAgICAgICAgICAgIHNwaW5uZXJbZm9ybUtleV0uaW5zZXJ0QWRqYWNlbnRIVE1MKFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImJlZm9yZWVuZFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDIgXFx1MDQzZlxcdTA0NDBcXHUwNDM4IFxcdTA0NGRcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQ0M1xcdTA0MzZcXHUwNDM1IFxcdTA0M2VcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQzYlxcdTA0MzVcXHUwNDNkIFxcdTA0M2RcXHUwNDQzXFx1MDQzNlxcdTA0M2RcXHUwNDRiXFx1MDQzY1xcdTA0MzggXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0NGZcXHUwNDNjXFx1MDQzOFxcbiAgICAgICAgICAgICAgICAgICAgYDxsaSBjbGFzcz1cXFwicHJpemVcXFwiIGRhdGEtcmVhY3Rpb249JHtyZWFjdGlvbn0gc3R5bGU9XFxcIi0tcm90YXRlOiAke3JvdGF0aW9uW2Zvcm1LZXldfWRlZ1xcXCI+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGV4dFxcXCI+JHt0ZXh0fTxcXC9zcGFuPlxcbiAgICAgIDxcXC9saT5gXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDBcXHUwNDM4XFx1MDQ0MVxcdTA0NDNcXHUwNDM1XFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNkXFx1MDQzZVxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDJcXHUwNDNkXFx1MDQ0YlxcdTA0MzUgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcbiAgICAgICAgY29uc3QgY3JlYXRlQ29uaWNHcmFkaWVudCA9ICgpID0+IHtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNkXFx1MDQ0M1xcdTA0MzZcXHUwNDNkXFx1MDQzZVxcdTA0MzUgXFx1MDQzN1xcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0NGYgXFx1MDQ0MyBcXHUwNDRkXFx1MDQzYlxcdTA0MzVcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQzMCBzcGlubmVyXFxuICAgICAgICAgICAgc3Bpbm5lcltmb3JtS2V5XS5zZXRBdHRyaWJ1dGUoXFxuICAgICAgICAgICAgICAgIFxcXCJzdHlsZVxcXCIsXFxuICAgICAgICAgICAgICAgIGBiYWNrZ3JvdW5kOiBjb25pYy1ncmFkaWVudChcXG4gICAgICBmcm9tIC05MGRlZyxcXG4gICAgICAke3ByaXplc1tmb3JtS2V5XVxcbiAgICAgICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0NDNcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDIgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0M1xcdTA0NDlcXHUwNDM1XFx1MDQzM1xcdTA0M2UgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcbiAgICAgICAgLm1hcCgoY29sb3IsIGkpID0+IGNvbG9yLmNvbG9yICsgYCBgICsgKDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCkgKiAocHJpemVzW2Zvcm1LZXldLmxlbmd0aCAtIGkgLSAxKSArIGBkZWdgICsgYCBgICsgKDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCkgKiAocHJpemVzW2Zvcm1LZXldLmxlbmd0aCAtIGkpICsgYGRlZ2ApXFxuICAgICAgICAucmV2ZXJzZSgpXFxuICAgICAgfVxcbiAgICApO2BcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgfTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDQxXFx1MDQzZVxcdTA0MzdcXHUwNDM0XFx1MDQzMFxcdTA0NTFcXHUwNDNjIFxcdTA0NDRcXHUwNDQzXFx1MDQzZFxcdTA0M2FcXHUwNDQ2XFx1MDQzOFxcdTA0NGUsIFxcdTA0M2FcXHUwNDNlXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcdTA0NGYgXFx1MDQzZFxcdTA0MzBcXHUwNDQwXFx1MDQzOFxcdTA0NDFcXHUwNDQzXFx1MDQzNVxcdTA0NDIgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlIFxcdTA0MzIgXFx1MDQ0MVxcdTA0MzFcXHUwNDNlXFx1MDQ0MFxcdTA0MzVcXG4gICAgICAgIGNvbnN0IHNldHVwV2hlZWwgPSAoKSA9PiB7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0NDFcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzYlxcdTA0MzAgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcbiAgICAgICAgICAgIGNyZWF0ZUNvbmljR3JhZGllbnQoKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXG4gICAgICAgICAgICBjcmVhdGVQcml6ZU5vZGVzKCk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzAgXFx1MDQzZlxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQzY1xcdTA0NGIgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDM4XFx1MDQzYyBcXHUwNDQxXFx1MDQzZlxcdTA0MzhcXHUwNDQxXFx1MDQzZVxcdTA0M2EgXFx1MDQzMlxcdTA0NDFcXHUwNDM1XFx1MDQ0NSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFx1MDQzZVxcdTA0MzIgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0MzUsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZVxcdTA0MzFcXHUwNDRiIFxcdTA0NDBcXHUwNDMwXFx1MDQzMVxcdTA0M2VcXHUwNDQyXFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0NDEgXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzOCBcXHUwNDNhXFx1MDQzMFxcdTA0M2EgXFx1MDQ0MSBcXHUwNDNlXFx1MDQzMVxcdTA0NGFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDMwXFx1MDQzY1xcdTA0MzhcXG4gICAgICAgICAgICBwcml6ZU5vZGVzW2Zvcm1LZXldID0gd2hlZWxbZm9ybUtleV0ucXVlcnlTZWxlY3RvckFsbChcXFwiLnByaXplXFxcIik7XFxuICAgICAgICB9O1xcblxcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0M2VcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzOFxcdTA0NDdcXHUwNDM1XFx1MDQ0MVxcdTA0NDJcXHUwNDMyXFx1MDQzZSBcXHUwNDNlXFx1MDQzMVxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDNlXFx1MDQzMiwgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzNSBcXHUwNDQxXFx1MDQzNFxcdTA0MzVcXHUwNDNiXFx1MDQzMFxcdTA0MzVcXHUwNDQyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0OFxcdTA0MzUgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlXFxuICAgICAgICBjb25zdCBzcGluZXJ0aWEgPSAobWluLCBtYXgpID0+IHtcXG4gICAgICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcXG4gICAgICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDRcXHUwNDQzXFx1MDQzZFxcdTA0M2FcXHUwNDQ2XFx1MDQzOFxcdTA0NGYgXFx1MDQzN1xcdTA0MzBcXHUwNDNmXFx1MDQ0M1xcdTA0NDFcXHUwNDNhXFx1MDQzMCBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZiBcXHUwNDQxIFxcdTA0M2ZcXHUwNDNiXFx1MDQzMFxcdTA0MzJcXHUwNDNkXFx1MDQzZVxcdTA0MzkgXFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDNlXFx1MDQzMlxcdTA0M2FcXHUwNDNlXFx1MDQzOVxcbiAgICAgICAgY29uc3QgcnVuVGlja2VyQW5pbWF0aW9uID0gKCkgPT4ge1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDMyXFx1MDQzN1xcdTA0NGZcXHUwNDNiXFx1MDQzOCBcXHUwNDNhXFx1MDQzZVxcdTA0MzQgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0MzggXFx1MDQzZVxcdTA0NDJcXHUwNDQxXFx1MDQ0ZVxcdTA0MzRcXHUwNDMwOiBodHRwczpcXC9cXC9jc3MtdHJpY2tzLmNvbVxcL2dldC12YWx1ZS1vZi1jc3Mtcm90YXRpb24tdGhyb3VnaC1qYXZhc2NyaXB0XFwvXFxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gc3Bpbm5lclN0eWxlc1tmb3JtS2V5XS50cmFuc2Zvcm0uc3BsaXQoXFxcIihcXFwiKVsxXS5zcGxpdChcXFwiKVxcXCIpWzBdLnNwbGl0KFxcXCIsXFxcIik7XFxuICAgICAgICAgICAgY29uc3QgYSA9IHZhbHVlc1swXTtcXG4gICAgICAgICAgICBjb25zdCBiID0gdmFsdWVzWzFdO1xcbiAgICAgICAgICAgIGxldCByYWQgPSBNYXRoLmF0YW4yKGIsIGEpO1xcblxcbiAgICAgICAgICAgIGlmIChyYWQgPCAwKSByYWQgKz0gKDIgKiBNYXRoLlBJKTtcXG5cXG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGgucm91bmQocmFkICogKDE4MCBcXC8gTWF0aC5QSSkpO1xcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gTWF0aC5mbG9vcihhbmdsZSBcXC8gcHJpemVTbGljZVtmb3JtS2V5XSk7XFxuXFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDRmIFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNhXFx1MDQzMCwgXFx1MDQzYVxcdTA0M2VcXHUwNDMzXFx1MDQzNFxcdTA0MzAgXFx1MDQzNVxcdTA0MzNcXHUwNDNlIFxcdTA0MzdcXHUwNDMwXFx1MDQzNFxcdTA0MzVcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDQyIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzZSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzggXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzhcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzNVxcdTA0NDFcXHUwNDNiXFx1MDQzOCBcXHUwNDNmXFx1MDQzZVxcdTA0NGZcXHUwNDMyXFx1MDQzOFxcdTA0M2JcXHUwNDQxXFx1MDQ0ZiBcXHUwNDNkXFx1MDQzZVxcdTA0MzJcXHUwNDRiXFx1MDQzOSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXG4gICAgICAgICAgICBpZiAoY3VycmVudFNsaWNlW2Zvcm1LZXldICE9PSBzbGljZSkge1xcbiAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQ0M1xcdTA0MzFcXHUwNDM4XFx1MDQ0MFxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQ0ZSBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzYVxcdTA0MzBcXG4gICAgICAgICAgICAgICAgdGlja2VyW2Zvcm1LZXldLnN0eWxlLmFuaW1hdGlvbiA9IFxcXCJub25lXFxcIjtcXG4gICAgICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzggXFx1MDQ0N1xcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0MzcgMTAgXFx1MDQzY1xcdTA0MzhcXHUwNDNiXFx1MDQzYlxcdTA0MzhcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQzXFx1MDQzZFxcdTA0MzQgXFx1MDQzZVxcdTA0NDJcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0ZFxcdTA0NDJcXHUwNDNlLCBcXHUwNDQ3XFx1MDQ0MlxcdTA0M2VcXHUwNDMxXFx1MDQ0YiBcXHUwNDNlXFx1MDQzZCBcXHUwNDMyXFx1MDQzNVxcdTA0NDBcXHUwNDNkXFx1MDQ0M1xcdTA0M2JcXHUwNDQxXFx1MDQ0ZiBcXHUwNDMyIFxcdTA0M2ZcXHUwNDM1XFx1MDQ0MFxcdTA0MzJcXHUwNDNlXFx1MDQzZFxcdTA0MzBcXHUwNDQ3XFx1MDQzMFxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0M2VcXHUwNDM1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0M2VcXHUwNDM2XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzNVxcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRpY2tlcltmb3JtS2V5XS5zdHlsZS5hbmltYXRpb24gPSBudWxsLCAxMCk7XFxuICAgICAgICAgICAgICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzZVxcdTA0NDFcXHUwNDNiXFx1MDQzNSBcXHUwNDQyXFx1MDQzZVxcdTA0MzNcXHUwNDNlLCBcXHUwNDNhXFx1MDQzMFxcdTA0M2EgXFx1MDQ0ZlxcdTA0MzdcXHUwNDRiXFx1MDQ0N1xcdTA0M2VcXHUwNDNhIFxcdTA0M2ZcXHUwNDQwXFx1MDQzZVxcdTA0NDhcXHUwNDUxXFx1MDQzYiBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDAgLSBcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzNVxcdTA0MzNcXHUwNDNlIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDNcXHUwNDQ5XFx1MDQzOFxcdTA0M2MgXFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTbGljZVtmb3JtS2V5XSA9IHNsaWNlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzN1xcdTA0MzBcXHUwNDNmXFx1MDQ0M1xcdTA0NDFcXHUwNDNhXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDRlXFxuICAgICAgICAgICAgdGlja2VyQW5pbVtmb3JtS2V5XSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShydW5UaWNrZXJBbmltYXRpb24pO1xcbiAgICAgICAgfTtcXG5cXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDQ0XFx1MDQ0M1xcdTA0M2RcXHUwNDNhXFx1MDQ0NlxcdTA0MzhcXHUwNDRmIFxcdTA0MzJcXHUwNDRiXFx1MDQzMVxcdTA0M2VcXHUwNDQwXFx1MDQzMCBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFx1MDQzZVxcdTA0MzJcXHUwNDNlXFx1MDQzM1xcdTA0M2UgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcbiAgICAgICAgY29uc3Qgc2VsZWN0UHJpemUgPSAoKSA9PiB7XFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBNYXRoLmZsb29yKHJvdGF0aW9uW2Zvcm1LZXldIFxcLyBwcml6ZVNsaWNlW2Zvcm1LZXldKTtcXG4gICAgICAgICAgICBwcml6ZU5vZGVzW2Zvcm1LZXldW3NlbGVjdGVkXS5jbGFzc0xpc3QuYWRkKHNlbGVjdGVkQ2xhc3MpO1xcbiAgICAgICAgICAgIHNldFByaXplKHNlbGVjdGVkKTtcXG4gICAgICAgIH07XFxuXFxuICAgICAgICBcXC9cXC9cXHUwNDEyXFx1MDQ0YlxcdTA0MzFcXHUwNDM4XFx1MDQ0MFxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNkXFx1MDQ0M1xcdTA0MzZcXHUwNDNkXFx1MDQ0YlxcdTA0MzkgXFx1MDQzZlxcdTA0NDBcXHUwNDM4XFx1MDQzNyBcXHUwNDMyIFxcdTA0NDRcXHUwNDNlXFx1MDQ0MFxcdTA0M2NcXHUwNDM1XFxuICAgICAgICBjb25zdCBzZXRQcml6ZSA9IChzZWxlY3RlZCkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0aXRsZVByaXplc1tmb3JtS2V5XS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFRpdGxlID0gJChwcml6ZU5vZGVzW2Zvcm1LZXldW3NlbGVjdGVkXSkudGV4dCgpLnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgdGl0bGVQcml6ZXNbZm9ybUtleV0uZWFjaChmdW5jdGlvbihpLCBlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSAkKGUpLnRleHQoKS50cmltKCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgPT09IHNlbGVjdGVkVGl0bGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGUpLnRyaWdnZXIoJ2NsaWNrJyk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH07XFxuXFxuICAgICAgICBcXC9cXC9cXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQzXFx1MDQ0MVxcdTA0M2FcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlXFxuICAgICAgICBmdW5jdGlvbiBzdGFydFdoZWVsTmlrYW5kcm92KCkge1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzNVxcdTA0NTEgXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzZVxcdTA0NDFcXHUwNDQyXFx1MDQ0M1xcdTA0M2ZcXHUwNDNkXFx1MDQzZVxcdTA0MzkgXFx1MDQzNFxcdTA0M2JcXHUwNDRmIFxcdTA0M2RcXHUwNDMwXFx1MDQzNlxcdTA0MzBcXHUwNDQyXFx1MDQzOFxcdTA0NGZcXG4gICAgICAgICAgICBmb3JtQnV0dG9uW2Zvcm1LZXldLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzdcXHUwNDMwXFx1MDQzNFxcdTA0MzBcXHUwNDUxXFx1MDQzYyBcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZVxcdTA0MzUgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwXFxuICAgICAgICAgICAgcm90YXRpb25bZm9ybUtleV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzNjAgKyBzcGluZXJ0aWEoMjAwMCwgNTAwMCkpO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDQzXFx1MDQzMVxcdTA0MzhcXHUwNDQwXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0M2ZcXHUwNDQwXFx1MDQzZVxcdTA0NDhcXHUwNDNiXFx1MDQ0YlxcdTA0MzkgXFx1MDQzZlxcdTA0NDBcXHUwNDM4XFx1MDQzN1xcbiAgICAgICAgICAgIHByaXplTm9kZXNbZm9ybUtleV0uZm9yRWFjaCgocHJpemUpID0+IHByaXplLmNsYXNzTGlzdC5yZW1vdmUoc2VsZWN0ZWRDbGFzcykpO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDQzIFxcdTA0M2FcXHUwNDNiXFx1MDQzMFxcdTA0NDFcXHUwNDQxIGlzLXNwaW5uaW5nLCBcXHUwNDQxIFxcdTA0M2ZcXHUwNDNlXFx1MDQzY1xcdTA0M2VcXHUwNDQ5XFx1MDQ0Y1xcdTA0NGUgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzM1xcdTA0M2UgXFx1MDQ0MFxcdTA0MzVcXHUwNDMwXFx1MDQzYlxcdTA0MzhcXHUwNDM3XFx1MDQ0M1xcdTA0MzVcXHUwNDNjIFxcdTA0M2RcXHUwNDQzXFx1MDQzNlxcdTA0M2RcXHUwNDQzXFx1MDQ0ZSBcXHUwNDNlXFx1MDQ0MlxcdTA0NDBcXHUwNDM4XFx1MDQ0MVxcdTA0M2VcXHUwNDMyXFx1MDQzYVxcdTA0NDNcXG4gICAgICAgICAgICB3aGVlbFtmb3JtS2V5XS5jbGFzc0xpc3QuYWRkKHNwaW5DbGFzcyk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0NDdcXHUwNDM1XFx1MDQ0MFxcdTA0MzVcXHUwNDM3IENTUyBcXHUwNDMzXFx1MDQzZVxcdTA0MzJcXHUwNDNlXFx1MDQ0MFxcdTA0MzhcXHUwNDNjIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzBcXHUwNDNjLCBcXHUwNDNhXFx1MDQzMFxcdTA0M2EgXFx1MDQzOFxcdTA0M2MgXFx1MDQzZlxcdTA0M2VcXHUwNDMyXFx1MDQzNVxcdTA0NDBcXHUwNDNkXFx1MDQ0M1xcdTA0NDJcXHUwNDRjXFx1MDQ0MVxcdTA0NGZcXG4gICAgICAgICAgICBzcGlubmVyW2Zvcm1LZXldLnN0eWxlLnNldFByb3BlcnR5KFxcXCItLXJvdGF0ZVxcXCIsIHJvdGF0aW9uW2Zvcm1LZXldKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzMlxcdTA0M2VcXHUwNDM3XFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgXFx1MDQzMiBcXHUwNDMzXFx1MDQzZVxcdTA0NDBcXHUwNDM4XFx1MDQzN1xcdTA0M2VcXHUwNDNkXFx1MDQ0MlxcdTA0MzBcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDQzXFx1MDQ0ZSBcXHUwNDNmXFx1MDQzZVxcdTA0MzdcXHUwNDM4XFx1MDQ0NlxcdTA0MzhcXHUwNDRlXFxuICAgICAgICAgICAgdGlja2VyW2Zvcm1LZXldLnN0eWxlLmFuaW1hdGlvbiA9IFxcXCJub25lXFxcIjtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzN1xcdTA0MzBcXHUwNDNmXFx1MDQ0M1xcdTA0NDFcXHUwNDNhXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDRlIFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1XFxuICAgICAgICAgICAgcnVuVGlja2VyQW5pbWF0aW9uKCk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBcXC9cXC8gXFx1MDQzZVxcdTA0NDJcXHUwNDQxXFx1MDQzYlxcdTA0MzVcXHUwNDM2XFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MsIFxcdTA0M2FcXHUwNDNlXFx1MDQzM1xcdTA0MzRcXHUwNDMwIFxcdTA0MzdcXHUwNDMwXFx1MDQzYVxcdTA0M2VcXHUwNDNkXFx1MDQ0N1xcdTA0MzhcXHUwNDNiXFx1MDQzMFxcdTA0NDFcXHUwNDRjIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDRmIFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMFxcbiAgICAgICAgc3Bpbm5lcltmb3JtS2V5XS5hZGRFdmVudExpc3RlbmVyKFxcXCJ0cmFuc2l0aW9uZW5kXFxcIiwgKCkgPT4ge1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDNlXFx1MDQ0MVxcdTA0NDJcXHUwNDMwXFx1MDQzZFxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0MzhcXHUwNDMyXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0M2VcXHUwNDQyXFx1MDQ0MFxcdTA0MzhcXHUwNDQxXFx1MDQzZVxcdTA0MzJcXHUwNDNhXFx1MDQ0MyBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZlxcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpY2tlckFuaW1bZm9ybUtleV0pO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzZVxcdTA0M2JcXHUwNDQzXFx1MDQ0N1xcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQzXFx1MDQ0OVxcdTA0MzVcXHUwNDM1IFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDMwIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMFxcbiAgICAgICAgICAgIHJvdGF0aW9uW2Zvcm1LZXldICU9IDM2MDtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzMlxcdTA0NGJcXHUwNDMxXFx1MDQzOFxcdTA0NDBcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0NDBcXHUwNDM4XFx1MDQzN1xcbiAgICAgICAgICAgIHNlbGVjdFByaXplKCk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0NDNcXHUwNDMxXFx1MDQzOFxcdTA0NDBcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDEsIFxcdTA0M2FcXHUwNDNlXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcdTA0MzkgXFx1MDQzZVxcdTA0NDJcXHUwNDMyXFx1MDQzNVxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0NDIgXFx1MDQzN1xcdTA0MzAgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzVcXG4gICAgICAgICAgICB3aGVlbFtmb3JtS2V5XS5jbGFzc0xpc3QucmVtb3ZlKHNwaW5DbGFzcyk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0M2VcXHUwNDQyXFx1MDQzZlxcdTA0NDBcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzMiBDU1MgXFx1MDQzZFxcdTA0M2VcXHUwNDMyXFx1MDQzZVxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQzZVxcdTA0MzZcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDMwIFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMFxcbiAgICAgICAgICAgIHNwaW5uZXJbZm9ybUtleV0uc3R5bGUuc2V0UHJvcGVydHkoXFxcIi0tcm90YXRlXFxcIiwgcm90YXRpb25bZm9ybUtleV0pO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2RcXHUwNDNlXFx1MDQzZlxcdTA0M2FcXHUwNDQzIFxcdTA0NDFcXHUwNDNkXFx1MDQzZVxcdTA0MzJcXHUwNDMwIFxcdTA0MzBcXHUwNDNhXFx1MDQ0MlxcdTA0MzhcXHUwNDMyXFx1MDQzZFxcdTA0M2VcXHUwNDM5XFxuICAgICAgICAgICAgZm9ybUJ1dHRvbltmb3JtS2V5XS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcXG4gICAgICAgICAgICBmb3JtW2Zvcm1LZXldLnRyaWdnZXIoJ3N1Ym1pdCcpO1xcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDM0XFx1MDQzM1xcdTA0M2VcXHUwNDQyXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMlxcdTA0NDFcXHUwNDUxIFxcdTA0M2EgXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzMlxcdTA0M2VcXHUwNDNjXFx1MDQ0MyBcXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQzXFx1MDQ0MVxcdTA0M2FcXHUwNDQzXFxuICAgICAgICBzZXR1cFdoZWVsKCk7XFxuXFxuICAgICAgICBcXC9cXC9zdWJtaXQgXFx1MDQ0NFxcdTA0M2VcXHUwNDQwXFx1MDQzY1xcdTA0NGIgXFx1MDQzZlxcdTA0M2UgXFx1MDQzYVxcdTA0M2JcXHUwNDM4XFx1MDQzYVxcdTA0NDMgXFx1MDQzYVxcdTA0M2RcXHUwNDNlXFx1MDQzZlxcdTA0M2FcXHUwNDM1XFxuICAgICAgICBmb3JtQnV0dG9uW2Zvcm1LZXldLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XFxuICAgICAgICAgICAgc3RhcnRXaGVlbE5pa2FuZHJvdigpO1xcbiAgICAgICAgfSk7XFxuXFxuICAgIH1cXG59KTtcIixcImJsb2NrUGFkZGluZ1RvcFwiOjAsXCJibG9ja1BhZGRpbmdCb3R0b21cIjowLFwiYmxvY2tCYWNrZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tGb3JlZ3JvdW5kQ29sb3JcIjpcIlwiLFwiYmxvY2tDc3NDbGFzc1wiOlwiXCIsXCJyZXBsYWNlVmFyaWFibGVzXCI6XCJcIixcImJsb2NrTGlua0NvbG9yXCI6XCJcIixcImJsb2NrRm9udFwiOm51bGwsXCJibG9ja0ZvbnRIZWFkZXJcIjpudWxsLFwiX192aXNpYmlsaXR5XCI6XCJ7XFxcImVuYWJsZWRcXFwiOlxcXCJcXFwiLFxcXCJkaXNhYmxlZFxcXCI6XFxcIlxcXCIsXFxcImVuYWJsZWRfZ3JvdXBfaWRcXFwiOlxcXCJcXFwiLFxcXCJlbmFibGVkX3NlZ21lbnRfaWRcXFwiOlxcXCJcXFwiLFxcXCJkaXNhYmxlZF9ncm91cF9pZFxcXCI6XFxcIlxcXCIsXFxcImRpc2FibGVkX3NlZ21lbnRfaWRcXFwiOlxcXCJcXFwiLFxcXCJ2aXNpYmxlX2Zyb21cXFwiOlxcXCJcXFwiLFxcXCJ2aXNpYmxlX3RvXFxcIjpcXFwiXFxcIixcXFwidmlzaWJsZV9zY2hlZHVsZVxcXCI6W10sXFxcImhpZGVfdXJsX3BhcmFtXFxcIjpcXFwiXFxcIixcXFwiaGlkZV91cmxfcGFyYW1fdmFsdWVcXFwiOlxcXCJcXFwiLFxcXCJzaG93X3VybF9wYXJhbVxcXCI6XFxcIlxcXCIsXFxcInNob3dfdXJsX3BhcmFtX3ZhbHVlXFxcIjpcXFwiXFxcIixcXFwic2hvd19kb21haW5cXFwiOlxcXCJcXFwiLFxcXCJoaWRlX2RvbWFpblxcXCI6XFxcIlxcXCIsXFxcInNob3dfdGFnc1xcXCI6XFxcIlxcXCIsXFxcImhpZGVfdGFnc1xcXCI6XFxcIlxcXCIsXFxcIm1pbl92aXNpYmxlX3dpZHRoXFxcIjpcXFwiMFxcXCIsXFxcIm1heF92aXNpYmxlX3dpZHRoXFxcIjpcXFwiN1xcXCJ9XCJ9IiwiY3NzIjpudWxsfQ==
```

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field5353" data-param="items/parts/field5353" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/ba4115f326ec096f49803745599863d4.png/s/s1200x/a/143493/sc/484" data-img-title="" id="bkmrk--5">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/ba4115f326ec096f49803745599863d4.png/s/s1200x/a/143493/sc/484)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field5353/inner/image/caption">  
</div></div></div>### Подключение JS-кода валидации формы

У JavaScript блока который вы добавили предыдущим, так же выбираем "Импортировать блок ниже" и вставляем скопированный код по нажатию на кнопку ниже.

```
eyJ0eXBlIjoicmF3LWpzIiwicHJlc2V0IjoicmF3LWpzIiwicGFyYW1zIjoie1wiYmxvY2tDb2RlXCI6XCIwNDE5ZVwiLFwibmFtZVwiOlwiXFx1MDQxYVxcdTA0M2VcXHUwNDM0IFxcdTA0M2ZcXHUwNDM1XFx1MDQ0MFxcdTA0MzVcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDMwIFxcdTA0MzJcXHUwNDM1XFx1MDQ0MFxcdTA0MzhcXHUwNDQ0XFx1MDQzOFxcdTA0M2FcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDM4IFxcdTA0NDRcXHUwNDNlXFx1MDQ0MFxcdTA0M2NcXHUwNDRiXCIsXCJyYXdWYWx1ZVwiOlwidmFyIGVyciA9ICQoJy5mb3JtLXJlc3VsdC1ibG9jaycpO1xcbmNvbnNvbGUubG9nKGVycik7XFxuJChlcnIpLnByZXBlbmRUbygnLmZvcm1hLXNlZG92IC5wYXJ0LWJ1dHRvbicpOyBcXC8qXFx1MDQzZlxcdTA0M2VcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDRmXFx1MDQzOSBcXHUwNDNhXFx1MDQzYlxcdTA0MzBcXHUwNDQxXFx1MDQ0MSBcXHUwNDQxXFx1MDQzMlxcdTA0M2VcXHUwNDM1XFx1MDQzOSBcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQ0YiBmb3JtYS1zZGwqXFwvXCIsXCJibG9ja1BhZGRpbmdUb3BcIjowLFwiYmxvY2tQYWRkaW5nQm90dG9tXCI6MCxcImJsb2NrQmFja2dyb3VuZENvbG9yXCI6XCJcIixcImJsb2NrRm9yZWdyb3VuZENvbG9yXCI6XCJcIixcImJsb2NrQ3NzQ2xhc3NcIjpcIlwiLFwicmVwbGFjZVZhcmlhYmxlc1wiOlwiXCIsXCJibG9ja0xpbmtDb2xvclwiOlwiXCIsXCJibG9ja0ZvbnRcIjpudWxsLFwiYmxvY2tGb250SGVhZGVyXCI6bnVsbH0iLCJjc3MiOm51bGx9
```

---

**После добавления всех скриптов, страницу можно будет опубликовать и посмотеть на результат.**

<div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397235092" data-updated="1653039478" id="bkmrk-https%3A%2F%2Fsedov.link%2Fp"><div class="lt-block lt-view raw-js lt-raw lt-raw-js lt-system-block lt-invisible-block" data-block-id="1397233727" data-code="b-b9295" id="bkmrk-https%3A%2F%2Fsedov.link%2Fp-1"><div class="lt-block-wrapper">[https://sedov.link/page735](https://sedov.link/page735) </div></div><div class="lt-block lt-view raw-css lt-raw lt-raw-css lt-system-block lt-invisible-block" data-block-id="1397233738" data-code="b-92952" id="bkmrk--7"><div class="lt-block-wrapper">  
</div></div></div><div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397697822" data-updated="1653039478" id="bkmrk--8"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="2057903523" data-code="b-001b8" id="bkmrk--9"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items" id="bkmrk--10"><div class="builder-item part-image " data-animation-mode="no" data-item-name="field40749" data-param="items/parts/field40749" data-setting-editable="true" data-title="Элемент" id="bkmrk--11"></div></div></div></div></div></div></div></div>

# Настройка стиля и отображения

### Управление цветами секторов

По умолчанию колесо генерирует цвета секторов автоматически после каждой перезагрузки страницы.

Если вы хотите задать собственные цвета, вам необходимо в блоке “JavaScript: Код колеса”,

задать в них собственные цвета в формате **[HEX](https://yandex.ru/search/?text=%D1%8F%D0%BD%D0%B4%D0%B5%D0%BA%D1%81+%D1%86%D0%B2%D0%B5%D1%82%D0%B0&lr=10830)**.

**Каждая строка отвечает за цвет сектора, идущего по порядку. Если строк с собственными цветами меньше, чем секторов, то следующий цвет подбирается автоматически.**

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field82231" data-param="items/parts/field82231" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/74504eb02580040cea6c10f64239dd90.png/s/s1200x/a/143493/sc/32" data-img-title="" id="bkmrk--1">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/74504eb02580040cea6c10f64239dd90.png/s/s1200x/a/143493/sc/32)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field82231/inner/image/caption">  
</div></div></div>### Изменение информера валидации формы

По умолчанию, всплывающий информер о необходимости ввода почты или другого обязательного поля, имеет собственные стили системы геткурс.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field24012" data-param="items/parts/field24012" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/6e45b1bb05791a54874d9e49812ca73b.png/s/s1200x/a/143493/sc/104" data-img-title="" id="bkmrk--3">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/6e45b1bb05791a54874d9e49812ca73b.png/s/s1200x/a/143493/sc/104)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field24012/inner/image/caption">  
</div></div></div>Вы можете настроить собственный стиль в дизайн вашей страницы, изменив значения кода в блоке CSS: Стили колеса.

**Для этого необходимо иметь базовые знания CSS.**

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field76841" data-param="items/parts/field76841" data-setting-editable="true" data-title="Элемент" id="bkmrk--5"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/e8617ce7c5ffd15ecf2c797d0c959619.png/s/s1200x/a/143493/sc/272" data-img-title="" id="bkmrk--6">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/e8617ce7c5ffd15ecf2c797d0c959619.png/s/s1200x/a/143493/sc/272)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field76841/inner/image/caption">  
</div></div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field46598" data-param="items/parts/field46598" data-setting-editable="true" data-title="Элемент" id="bkmrk--7"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/7bca5fbe765d4cbd11d2e9de30b24bbd.png/s/s1200x/a/143493/sc/468" data-img-title="" id="bkmrk--8">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/7bca5fbe765d4cbd11d2e9de30b24bbd.png/s/s1200x/a/143493/sc/468)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field46598/inner/image/caption">  
</div></div></div>### Управление названий секторов

Может потребоваться изменить базовые стили текстов секторов. Например уменьшить или увеличить шрифт, поменять цвет текста, добавить высоты строки и т.д. Все настройки можно внести в блоке CSS: Стили колеса в самом низу.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field80369" data-param="items/parts/field80369" data-setting-editable="true" data-title="Элемент" id="bkmrk--9"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/f6dbe0afcfe536a313872467aa8a93e8.png/s/s1200x/a/143493/sc/296" data-img-title="" id="bkmrk--10">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/f6dbe0afcfe536a313872467aa8a93e8.png/s/s1200x/a/143493/sc/296)</div></div>

# Описание сценария

## Краткий план сценария

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1" data-param="items/parts/text1" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE-1%C2%A0"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1/inner/text">1. вращение доступно 1 раз в день
2. колесо перезагружается в 7:00
3. приз приходит ссылкой на почту
4. призы могут выпасть повторно

</div></div>## Логика работы механики

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_12" data-param="items/parts/text1_12" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C-%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_12/inner/text">1. Пользователь вращает колесо нажатием на кнопку
2. Выпадает приз и в этот момент пользоваетель авторизуется, добавляется в группу, по нему запускается процесс, создается заказ и страница перезагружается.
3. После перезагрузки, мы скрываем блок-форму с колесом по группе и показываем блок «Заглушку» так же по группе, где расположено изображение калеса как муляж, таймер до следующей попытки и текстовое содержание.
4. По истечению времени (устанавливается процессом), пользователь удаляется из группы и на странице вновь можно вращать колесо.

</div></div>## Список инструментов для реализации сценария

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_89" data-param="items/parts/text1_89" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%93%D1%80%D1%83%D0%BF%D0%BF%D1%8B-%D0%A0%D0%B0%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%9F%D1%80%D0%BE%D1%86"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_89/inner/text">1. Группы
2. Рассылки
3. Процессы
4. Таймер
5. Логика

</div></div>

# Подготовка элементов (группы, таймер)

### Создание групп

Для реализации механики, необходимо подготовить группы с любым названием. Для примера были созданны группы **КО\_крутил колесо.**

Для этого переходим «Пользователи → Вкладка „Группы“ → Создать группу».

Вносим название и нажимаем Создать.

<div class="lite-block-live-wrapper o-lt-onecolumn o-lt-onecolumn-common" data-block-id="1397318672" data-updated="1653039398" id="bkmrk-"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="1397318672" data-code="b-72695"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items"><div class="builder-item part-image " data-animation-mode="no" data-item-name="field92503" data-param="items/parts/field92503" data-setting-editable="true" data-title="Элемент" id="bkmrk--1"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/cdacfd12f2e9b41241f94621583f77c6.png/s/s1200x/a/143493/sc/197" data-img-title="" id="bkmrk--2">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/cdacfd12f2e9b41241f94621583f77c6.png/s/s1200x/a/143493/sc/197)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field92503/inner/image/caption">  
</div></div></div><div class="builder-item part-header  text-left" data-animation-mode="no" data-item-name="header1_64" data-param="items/parts/header1_64" data-setting-editable="true" data-title="Элемент"><div class="f-header f-header-36" data-editable="true" data-param="items/parts/header1_64/inner/text">  
</div></div></div></div></div></div></div></div></div>### Создание таймера

Переходим на сайт [https://megatimer.ru/](https://megatimer.ru/)

Далее нажимаем на вкладку "Импорт настроек" и добавляем код скопировав его по нажатию на кнопку.

```
<script src="//megatimer.ru/get/5993b9abf6dab29905656fb5a6a42e98.js"></script>
```

<div class="lite-block-live-wrapper o-lt-onecolumn o-lt-onecolumn-common" data-block-id="1397318672" data-updated="1653039398" id="bkmrk--3"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="1397318672" data-code="b-72695"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"></div></div></div></div></div></div>Далее указываем код в поле "Код вашего таймера обратного отсчета" и нажимаем загрузить.

<div class="lite-block-live-wrapper o-lt-onecolumn o-lt-onecolumn-common" data-block-id="1397318672" data-updated="1653039398" id="bkmrk--4"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="1397318672" data-code="b-72695"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items"><div class="builder-item part-image " data-animation-mode="no" data-item-name="field78161" data-param="items/parts/field78161" data-setting-editable="true" data-title="Элемент" id="bkmrk--5"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/a75651fb5442636d7e8ba0b2b45a1b62.png/s/s1200x/a/143493/sc/133" data-img-title="" id="bkmrk--6">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/a75651fb5442636d7e8ba0b2b45a1b62.png/s/s1200x/a/143493/sc/133)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field78161/inner/image/caption">  
</div></div></div><div class="builder-item part-text " data-animation-mode="no" data-item-name="field29984_28" data-param="items/parts/field29984_28" data-setting-editable="true" data-title="Элемент"><div class="text-large f-text" data-editable="true" data-param="items/parts/field29984_28/inner/text">  
</div></div></div></div></div></div></div></div></div>Готово! Теперь можно настроить код по визуальным параметрам под свой дизайн используя вкладки 1,2,3 и после настройки нажав на вкладку «Получить код» скопировать его, чтобы установить на нашу страницу с колесом фортуны позже в следующем уроке.

***Просто оставьте вкладку браузера открытой!***

<div class="lite-block-live-wrapper o-lt-onecolumn o-lt-onecolumn-common" data-block-id="1397318672" data-updated="1653039398" id="bkmrk--8"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="1397318672" data-code="b-72695"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items"><div class="builder-item part-text " data-animation-mode="no" data-item-name="field29984_28" data-param="items/parts/field29984_28" data-setting-editable="true" data-title="Элемент" id="bkmrk--9"><div class="text-large f-text" data-editable="true" data-param="items/parts/field29984_28/inner/text">  
</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field44479" data-param="items/parts/field44479" data-setting-editable="true" data-title="Элемент" id="bkmrk--10"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/3a730e749c667d7c07944aaff636fc82.png/s/s1200x/a/143493/sc/163" data-img-title="" id="bkmrk--11">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/3a730e749c667d7c07944aaff636fc82.png/s/s1200x/a/143493/sc/163)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field44479/inner/image/caption">  
</div></div></div><div class="builder-item part-text " data-animation-mode="no" data-item-name="field29984_28_39" data-param="items/parts/field29984_28_39" data-setting-editable="true" data-title="Элемент"><div class="text-large f-text" data-editable="true" data-param="items/parts/field29984_28_39/inner/text">  
</div></div></div></div></div></div></div></div></div>**Обратите внимание, что после импорта кода из урока, во вкладке «Тип таймера» автоматически принялись настройки цикличного перезапуска таймера каждый день в 7 утра, согласно сценарию. Если у вас другой сценарий, то вы можете настроить по своему.**

<div class="lite-block-live-wrapper o-lt-raw o-lt-raw-js o-lt-system-block o-lt-invisible-block" data-block-id="1397323341" data-updated="1653039398" id="bkmrk--12"><div class="lt-block lt-view raw-js lt-raw lt-raw-js lt-system-block lt-invisible-block" data-block-id="1397323341" data-code="b-e96e4" id="bkmrk--13"><div class="lt-block-wrapper">  
</div></div></div><div class="lite-block-live-wrapper o-lt-lesson o-lt-lesson-mission-block" data-block-id="1397092563" data-updated="1653039398" id="bkmrk--14"><div class="lt-block lt-view lmb1 lt-lesson lt-lesson-mission-block" data-block-id="1397092563" data-code="ltBlock1397092563" id="bkmrk--15"><div class="lt-block-wrapper">  
</div></div></div><div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397235205" data-updated="1653039398" id="bkmrk--16"><div class="lt-block lt-view raw-js lt-raw lt-raw-js lt-system-block lt-invisible-block" data-block-id="1397233727" data-code="b-b9295" id="bkmrk--17"><div class="lt-block-wrapper">  
</div></div><div class="lt-block lt-view raw-css lt-raw lt-raw-css lt-system-block lt-invisible-block" data-block-id="1397233738" data-code="b-92952" id="bkmrk--18"><div class="lt-block-wrapper">  
</div></div></div><div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397697862" data-updated="1653039398" id="bkmrk--19"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="2057903523" data-code="b-001b8" id="bkmrk--20"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items" id="bkmrk--21"><div class="builder-item part-image " data-animation-mode="no" data-item-name="field40749" data-param="items/parts/field40749" data-setting-editable="true" data-title="Элемент" id="bkmrk--22"></div></div></div></div></div></div></div></div>

# Настройка процесса

## Процесс обновления колеса фортуны

**Для того, чтобы настроить сценарий когда пользователь может крутить колесо каждый день с 7 утра, мы воспользуемся процессом геткурса.**

**Процесс будет запускаться в обработчике формы в которой размещено колесо фортуны.**

Переходим на страницу «Процессы», нажимаем «Создать процесс», вводим название, в выпадающем списке выбираем «Пользователи», шаблон процесса «Без шаблона» и нажимаем Создать.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field85849" data-param="items/parts/field85849" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/8e81a7428ef4af057a1fe99683b27298.png/s/s1200x/a/143493/sc/124" data-img-title="" id="bkmrk--1">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/8e81a7428ef4af057a1fe99683b27298.png/s/s1200x/a/143493/sc/124)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field85849/inner/image/caption">  
</div></div></div>## Настройка процесса:

Переходим на вкладку «Процесс», т.к. в ней будем производить все настройки.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field7275" data-param="items/parts/field7275" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/01d60154683b21ba1aa37d53e389f440.png/s/s1200x/a/143493/sc/30" data-img-title="" id="bkmrk--3">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/01d60154683b21ba1aa37d53e389f440.png/s/s1200x/a/143493/sc/30)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field7275/inner/image/caption">  
</div></div></div>## 1. Настройка блока «задержка»

**Делаем все по шагам:**

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_9_66_14" data-param="items/parts/text1_9_66_14" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%92%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%22%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B1"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_9_66_14/inner/text">1. Выбираем "Добавить блок → Задержка", даем блоку название и нажимаем Сохранить.
2. Переходим внутрь блока который создался, в поле таймера "часы" – указываем 8 часов.
3. Ставим галочку "После задержки дождаться наступления определенного времени" и указываем – "любой день в 7-00 утра"
4. Нажимаем Сохранить
5. Блок готов!

</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field33623" data-param="items/parts/field33623" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/b30e363e3dfdad93ca9eebd765ed51c8.png/s/s1200x/a/143493/sc/438" data-img-title="" id="bkmrk--5">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/b30e363e3dfdad93ca9eebd765ed51c8.png/s/s1200x/a/143493/sc/438)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field33623/inner/image/caption">  
</div></div></div>## 2. Настройка блока «удалить из группы»

**Делаем все по шагам:**

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_9_66_14_60" data-param="items/parts/text1_9_66_14_60" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%92%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%C2%AB%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B1"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_9_66_14_60/inner/text">1. Выбираем «Добавить блок → Операция → Удалить из группы» и нажимаем Сохранить.
2. Переходим внутрь блока который создался, даем название и поле «выберете группы» выбираем ранее созданную группу в прошлом уроке – «КО\_крутил колесо».
3. Нажимаем Сохранить
4. Блок готов!

</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field46437" data-param="items/parts/field46437" data-setting-editable="true" data-title="Элемент" id="bkmrk--6"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/e99f493607d1835789d2aa353214cfda.png/s/s1200x/a/143493/sc/111" data-img-title="" id="bkmrk--7">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/e99f493607d1835789d2aa353214cfda.png/s/s1200x/a/143493/sc/111)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field46437/inner/image/caption">  
</div></div></div>## 3. Добавление блока "завершение процесса"

**Делаем все по шагам:**

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field42404" data-param="items/parts/field42404" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9D%D0%B0%D0%B6%D0%B8%D0%BC%D0%B0%D0%B5%D0%BC-%22%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B1"><div class="text-large f-text" data-editable="true" data-param="items/parts/field42404/inner/text">1. Нажимаем "Добавить блок → Завершение процесса" и нажимаем Сохранить.
2. Блок готов!

</div></div>## 4. Построение логики процесса

Теперь в рабочем поле у нас четыре блока:

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_9_66_14_60_30_63" data-param="items/parts/text1_9_66_14_60_30_63" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D0%91%D0%BB%D0%BE%D0%BA-%22"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_9_66_14_60_30_63/inner/text">1. <span class="redactor-inline-converted">Начало работы</span>
2. <span class="redactor-inline-converted">Блок "Задержки"</span>
3. <span class="redactor-inline-converted">Блок "Удаления из группы"</span>
4. <span class="redactor-inline-converted">Завершение процесса</span>

</div></div>Теперь каждый блок, необходимо соединить стрелкой в той последовательности, что указана в списке выше. Для примера предоставленно изображение:

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field52298" data-param="items/parts/field52298" data-setting-editable="true" data-title="Элемент" id="bkmrk--8"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/bd7c8bc0554ca4bbe30b3ff035306bcd.png/s/s1200x/a/143493/sc/362" data-img-title="" id="bkmrk--9">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/bd7c8bc0554ca4bbe30b3ff035306bcd.png/s/s1200x/a/143493/sc/362)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field52298/inner/image/caption">  
</div></div></div>Процесс готов!

# Подготовка писем с призами

## Готовим рассылку

Переходим на страницу «Рассылки → Создать рассылку».

**На появившейся странице указываем:**

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_70" data-param="items/parts/text1_70" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%80%D0%B0%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%28%D0%B4"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_70/inner/text">1. Название рассылки (для отдельного приза)
2. Категорию рассылок — Общие рассылки
3. По чему делается рассылка — Пользователи
4. Транспорт — Email
5. Нажимаем «Содать рассылку»

</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field30912" data-param="items/parts/field30912" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/4b90062f5c7101473f23a1fb2bd63ab3.png/s/s1200x/a/143493/sc/120" data-img-title="" id="bkmrk--1">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/4b90062f5c7101473f23a1fb2bd63ab3.png/s/s1200x/a/143493/sc/120)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field30912/inner/image/caption">  
</div></div></div>В созданной рассылке, в редакторе наполняем текстом и указываем название приза и кнопку ведущую куда-либо.

В примере мы ведем на конкретные страницы.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field40555" data-param="items/parts/field40555" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/c879a10bf2a37ed0abcb72c135dc70f2.png/s/s1200x/a/143493/sc/318" data-img-title="" id="bkmrk--3">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/c879a10bf2a37ed0abcb72c135dc70f2.png/s/s1200x/a/143493/sc/318)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field40555/inner/image/caption">  
</div></div></div>В правой стороне страницы созданной рассылки, настраиваем сегмент отправки.

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field98586" data-param="items/parts/field98586" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%92%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%C2%AB%D0%A1%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%C2%BB-%D0%92"><div class="text-large f-text" data-editable="true" data-param="items/parts/field98586/inner/text">1. Выбираем «Сегмент»
2. В выпадающем списке «Добавить условие» выбираем «Имеет заказ → Предложение → Выбираем предложение».
3. Предложение нужно выбирать то, которое соответствует данному призу.
4. Далее при наведении на предложение, выбираем «И»
5. В выпадающем списке «Дата создания → Сегодня»
6. Сегмент готов!

</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field87170" data-param="items/parts/field87170" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/8a760fc5b5d36f2e5e190ed9a46f4ae0.png/s/s1200x/a/143493/sc/294" data-img-title="" id="bkmrk--5">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/8a760fc5b5d36f2e5e190ed9a46f4ae0.png/s/s1200x/a/143493/sc/294)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field87170/inner/image/caption">  
</div></div></div>Опускаемся чуть ниже и в настройках «Когда отправлять» выбираем «После попадания пользователя под правило».

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field73615" data-param="items/parts/field73615" data-setting-editable="true" data-title="Элемент" id="bkmrk--6"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/be6cf0ff65a5c2fed0c56edde4526ebf.png/s/s1200x/a/143493/sc/21" data-img-title="" id="bkmrk--7">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/be6cf0ff65a5c2fed0c56edde4526ebf.png/s/s1200x/a/143493/sc/21)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field73615/inner/image/caption">  
</div></div></div>**Рассылка готова!**

**Проверяем еще раз содержание текста на предмет ошибок и нажимаем «Готово к отправке» в самом низу.**

## Копирование рассылки

Так как у нас несколько призов в колесе фортуны, необходимо заготовить под каждый приз отдельное письмо рассылки.

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field42727_82_26" data-param="items/parts/field42727_82_26" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%94%D0%BB%D1%8F-%D1%8D%D1%82%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE-%D0%BA%D0%BE%D0%BF"><div class="text-large f-text" data-editable="true" data-param="items/parts/field42727_82_26/inner/text">1. Для этого просто копируем предыдущую рассылку по кнопке снизу справа.
2. В редакторе меняем текст соответствующий призу (сектору)
3. Меняем в сегменте предложение на соответствующее призу (сектору)
4. Сохраняем и рассылка готова!

</div></div>**Создаем нужное количество рассылок (у нас это 7 шт.) и запускаем в отправку кнопкой «Готово к отправке».**

# Финальные настройки

## Подготавливаем инструменты для финальной сборки

Итак что у нас готово для итоговой сборки:

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field4705" data-param="items/parts/field4705" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0-%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81-%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5"><div class="text-large f-text" data-editable="true" data-param="items/parts/field4705/inner/text">1. Группа
2. Процесс
3. Таймер обратного отсчета

</div></div>1\. Настройка скрытия блоков по группе

Для блока в котором находится форма с колесом ([п. 2](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)), необходимо выбрать «Видимость блока → (скрывать если пользователь) В группе», выбираем нашу группу «КО\_крутил колесо» и нажимаем Сохранить.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field54888" data-param="items/parts/field54888" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/d678a0991834e35deffc35c61225ef30.png/s/s1200x/a/143493/sc/154" data-img-title="" id="bkmrk--1">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/d678a0991834e35deffc35c61225ef30.png/s/s1200x/a/143493/sc/154)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field54888/inner/image/caption">  
</div></div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field54888_8" data-param="items/parts/field54888_8" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/c46e575cca4dd41dcb927c06a2d38219.png/s/s1200x/a/143493/sc/237" data-img-title="" id="bkmrk--3">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/c46e575cca4dd41dcb927c06a2d38219.png/s/s1200x/a/143493/sc/237)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field54888_8/inner/image/caption">  
</div></div></div>Аналогично для текстового блока (заглушки) где указано изображение и таймер ([п. 4](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)), в настройках видимости указываем «Видимость блока → (Показывать, только если пользователь) В группе», выбираем нашу группу «КО\_крутил колесо» и нажимаем Сохранить.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field33496" data-param="items/parts/field33496" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/e89ce8816355e657039d3b647235a36e.png/s/s1200x/a/143493/sc/24" data-img-title="" id="bkmrk--5">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/e89ce8816355e657039d3b647235a36e.png/s/s1200x/a/143493/sc/24)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field33496/inner/image/caption">  
</div></div></div>После всех настроек, нажимаем «Опубликовать страницу».

2\. Настройка обработчика формы

В блоке с формой ([п. 2](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)), слева нажимаем «Настройка» и в обработчике формы указываем события в следующем порядке:

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field74850_6" data-param="items/parts/field74850_6" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0"><div class="text-large f-text" data-editable="true" data-param="items/parts/field74850_6/inner/text">1. Авторизация пользователя
2. Запустить процесс – "Обновление колеса фортуны"
3. Добавить пользователя в группу – КО\_крутил колесо
4. Переадресация – ваш домен#after (в примере это [https://sedov.link/page735#after](https://sedov.link/page735#after))
5. Сохранить и закрыть блок.

</div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field50435" data-param="items/parts/field50435" data-setting-editable="true" data-title="Элемент" id="bkmrk--6"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/4b07358584b2c95832ba712790150330.png/s/s1200x/a/143493/sc/361" data-img-title="" id="bkmrk--7">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/4b07358584b2c95832ba712790150330.png/s/s1200x/a/143493/sc/361)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field50435/inner/image/caption">  
</div></div></div>После внесений настроек, публикуем страницу!

3\. Настройка таймера

<div class="builder-item part-text " data-animation-mode="no" data-item-name="field74850_6_1" data-param="items/parts/field74850_6_1" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-%D0%B2%D0%BA%D0%BB%D0%B0%D0%B4%D0%BA%D1%83-%D1%81-"><div class="text-large f-text" data-editable="true" data-param="items/parts/field74850_6_1/inner/text">1. Открываем вкладку с настроенным в прошлом уроке таймером [https://megatimer.ru/](https://megatimer.ru/)
2. Копируем код таймера во вкладке получить код.
3. Переходим на страницу колеса и в текстовом блоке (заглушке) под блоком с формой ([п. 4](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)) вносим код внутри элемента HTML с помощью нажатия на шестеренку (настройки) и нажимаем сохранить и закрыть.

</div></div>После публикуем страницу. Теперь на странице появился вечно тикающий таймер.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field41111" data-param="items/parts/field41111" data-setting-editable="true" data-title="Элемент" id="bkmrk--8"><div class="image-box" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/8ccd4bcd192eb161070bb08ba8bf0773.png/s/s1200x/a/143493/sc/273" data-img-title="" id="bkmrk--9">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/8ccd4bcd192eb161070bb08ba8bf0773.png/s/s1200x/a/143493/sc/273)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field41111/inner/image/caption">  
</div></div></div><div class="builder-item part-image " data-animation-mode="no" data-item-name="field14490" data-param="items/parts/field14490" data-setting-editable="true" data-title="Элемент" id="bkmrk--10"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/42494fe51490e323697a51891c0d7dcf.png/s/s1200x/a/143493/sc/60" data-img-title="" id="bkmrk--11">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/42494fe51490e323697a51891c0d7dcf.png/s/s1200x/a/143493/sc/60)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field14490/inner/image/caption">  
</div></div></div>4\. Финальный штрих

В блоке заглушке под формой ([п. 4](https://sedov.link/pl/teach/control/lesson/view?id=243964064&editMode=0)), в место штатного изображения которое мы добавляли ранее, необходимо поместить нужное по смыслу. В примере мы сделали скриншот сформированного колеса фортуны и загрузили в блок.

**Вы можете указать собственное изображение, подходящее по контексту активности школы.**

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field17814" data-param="items/parts/field17814" data-setting-editable="true" data-title="Элемент" id="bkmrk--12"><div class="image-box" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/2f6e21bd28488e04198a21e901d8283b.png/s/s1200x/a/143493/sc/51" data-img-title="" id="bkmrk--13">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/2f6e21bd28488e04198a21e901d8283b.png/s/s1200x/a/143493/sc/51)</div></div>

# Настройка вероятностей

## Замена кода и настройка кода

Для настройки вероятностей нужно заменить текущий ваш «JavaScript: Код колеса» на новый.

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field34355" data-param="items/parts/field34355" data-setting-editable="true" data-title="Элемент" id="bkmrk-"><div class="image-box" data-img-src="//fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/73ba07fabb04bbfe1db3ebe022a950f4.png/s/s1200x/a/143493/sc/405" data-img-title="" id="bkmrk--1">![](https://fs-thb02.getcourse.ru/fileservice/file/thumbnail/h/73ba07fabb04bbfe1db3ebe022a950f4.png/s/s1200x/a/143493/sc/405)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field34355/inner/image/caption">  
</div></div></div>Для замены выполните последовательность действий:

1\. Удалите старый «JavaScript: Код колеса» со страницы;

2\. Скопируйте новый по кнопке ниже:

```
eyJ0eXBlIjoicmF3LWpzIiwicHJlc2V0IjoicmF3LWpzIiwicGFyYW1zIjoie1wiYmxvY2tDb2RlXCI6XCJmNWIyYVwiLFwibmFtZVwiOlwiXFx1MDQxYVxcdTA0M2VcXHUwNDM0IFxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0MzVcXHUwNDQxXFx1MDQzMFwiLFwicmF3VmFsdWVcIjpcIlxcL1xcL1xcdTA0MTNcXHUwNDM1XFx1MDQzZFxcdTA0MzVcXHUwNDQwXFx1MDQzMFxcdTA0NDJcXHUwNDNlXFx1MDQ0MCBcXHUwNDQ2XFx1MDQzMlxcdTA0MzVcXHUwNDQyXFx1MDQzZVxcdTA0MzIgc2Vkb3YubGlua1xcbmZ1bmN0aW9uIGdlbmVyYXRlQ29sb3IoKSB7XFxuICAgIGxldCB4MTZjb2xvciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2Nzc3MjE1KS50b1N0cmluZygxNik7XFxuICAgIGlmICh4MTZjb2xvci5sZW5ndGggPCA2KSB7XFxuICAgICAgICBsZXQgeDE2Y29sb3JMZW5ndGggPSB4MTZjb2xvci5sZW5ndGg7XFxuICAgICAgICBmb3IgKGxldCBpID0geDE2Y29sb3JMZW5ndGg7IGkgPCA2OyBpKyspIHtcXG4gICAgICAgICAgICB4MTZjb2xvciArPSAnYSc7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuICcjJyArIHgxNmNvbG9yO1xcbn1cXG5cXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHtcXG4gICAgY29uc3QgZm9ybUNsYXNzZXMgPSBbXFxuICAgICAgICAnc2Vkb3YtbGluay0xJyxcXG4gICAgICAgIFxcL1xcLyAnc2Vkb3YtbGluay0yJyBcXC8qIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDQwXFx1MDQzNVxcdTA0MzBcXHUwNDNiXFx1MDQzOFxcdTA0MzdcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDM4IFxcdTA0M2RcXHUwNDM1XFx1MDQ0MVxcdTA0M2FcXHUwNDNlXFx1MDQzYlxcdTA0NGNcXHUwNDNhXFx1MDQzOFxcdTA0NDUgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDEsIFxcdTA0M2RcXHUwNDM1XFx1MDQzZVxcdTA0MzFcXHUwNDQ1XFx1MDQzZVxcdTA0MzRcXHUwNDM4XFx1MDQzY1xcdTA0M2UgXFx1MDQzNFxcdTA0NDNcXHUwNDMxXFx1MDQzYlxcdTA0MzhcXHUwNDQwXFx1MDQzZVxcdTA0MzJcXHUwNDMwXFx1MDQ0MlxcdTA0NGMgXFx1MDQzYVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDFcXHUwNDRiKlxcL1xcbiAgICBdO1xcbiAgICBjb25zdCB3aGVlbENvbG9ycyA9IFsgXFwvXFwvXFx1MDQzYVxcdTA0MzBcXHUwNDM2XFx1MDQzNFxcdTA0MzBcXHUwNDRmIFxcdTA0NDFcXHUwNDQyXFx1MDQ0MFxcdTA0M2VcXHUwNDNhXFx1MDQzMCBcXHUwNDNlXFx1MDQ0MlxcdTA0MzJcXHUwNDM1XFx1MDQ0N1xcdTA0MzBcXHUwNDM1XFx1MDQ0MiBcXHUwNDM3XFx1MDQzMCBcXHUwNDQ2XFx1MDQzMlxcdTA0MzVcXHUwNDQyIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzAuIFxcdTA0MTVcXHUwNDQxXFx1MDQzYlxcdTA0MzggXFx1MDQ0NlxcdTA0MzJcXHUwNDM1XFx1MDQ0MlxcdTA0M2VcXHUwNDMyIFxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDQ4XFx1MDQzNSwgXFx1MDQ0N1xcdTA0MzVcXHUwNDNjIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2VcXHUwNDMyLCBcXHUwNDQyXFx1MDQzZSBcXHUwNDQxXFx1MDQzYlxcdTA0MzVcXHUwNDM0XFx1MDQ0M1xcdTA0NGVcXHUwNDQ5XFx1MDQzOFxcdTA0MzkgXFx1MDQ0NlxcdTA0MzJcXHUwNDM1XFx1MDQ0MiBcXHUwNDNmXFx1MDQzZVxcdTA0MzRcXHUwNDMxXFx1MDQzOFxcdTA0NDBcXHUwNDMwXFx1MDQzNVxcdTA0NDJcXHUwNDQxXFx1MDQ0ZiBcXHUwNDMwXFx1MDQzMlxcdTA0NDJcXHUwNDNlXFx1MDQzY1xcdTA0MzBcXHUwNDQyXFx1MDQzOFxcdTA0NDdcXHUwNDM1XFx1MDQ0MVxcdTA0M2FcXHUwNDM4XFxuICAgICAgJyNmY2FiMTQnLFxcbiAgICAgICcjZmE2NjQxJyxcXG4gICAgICAnI2JlNDBjMCcsXFxuICAgICAgJyM0OGNjZTAnLFxcbiAgICAgICcjNDI4YmViJyxcXG4gICAgICAnIzUwNWFkZCcsXFxuICAgICAgJyMyZDgwY2UnXFxuICAgIF07XFxuXFxuICAgIFxcL1xcLyBcXHUwNDNlXFx1MDQzZlxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzVcXHUwNDNiXFx1MDQ0ZlxcdTA0MzVcXHUwNDNjIFxcdTA0MzJcXHUwNDM1XFx1MDQ0MFxcdTA0M2VcXHUwNDRmXFx1MDQ0MlxcdTA0M2RcXHUwNDNlXFx1MDQ0MVxcdTA0NDJcXHUwNDRjIFxcdTA0MzJcXHUwNDRiXFx1MDQzZlxcdTA0MzBcXHUwNDM0XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZlxcbiAgICBcXC9cXC9cXHUwNDNhXFx1MDQzMFxcdTA0MzZcXHUwNDM0XFx1MDQzMFxcdTA0NGYgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzZVxcdTA0M2FcXHUwNDMwIFxcdTA0M2VcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDQyIFxcdTA0MzdcXHUwNDMwIFxcdTA0NDhcXHUwNDMwXFx1MDQzZFxcdTA0NDEgXFx1MDQzMlxcdTA0NGJcXHUwNDNmXFx1MDQzMFxcdTA0MzRcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzAuXFxuICAgIFxcL1xcLyBcXHUwNDE1XFx1MDQ0MVxcdTA0M2JcXHUwNDM4IFxcdTA0NDhcXHUwNDMwXFx1MDQzZFxcdTA0NDFcXHUwNDNlXFx1MDQzMiBcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDRjXFx1MDQ0OFxcdTA0MzUsIFxcdTA0NDdcXHUwNDM1XFx1MDQzYyBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzMiwgXFx1MDQ0MlxcdTA0M2UgXFx1MDQ0OFxcdTA0MzBcXHUwNDNkXFx1MDQ0MVxcdTA0NGIgXFx1MDQ0MyBcXHUwNDNhXFx1MDQ0MFxcdTA0MzBcXHUwNDM5XFx1MDQzZFxcdTA0MzhcXHUwNDQ1IFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2VcXHUwNDMyIFxcdTA0NDBcXHUwNDMwXFx1MDQzMlxcdTA0M2RcXHUwNDRiIDBcXG4gICAgbGV0IHdoZWVsQ2hhbmNlcyA9IHtcXG4gICAgICAgICczMzM4MjMwJzogMCxcXG4gICAgICAgICczMzM4MjMyJzogMzMsXFxuICAgICAgICAnMzMzODIzOCc6IDAsXFxuICAgICAgICAnMzMzODIzOSc6IDAsXFxuICAgICAgICAnMzMzODI0Myc6IDAsXFxuICAgICAgICAnMzMzODI0NCc6IDAsXFxuICAgICAgICAnMzMzODI0NSc6IDBcXG4gICAgfTtcXG5cXG4gICAgbGV0IHByaXplcyA9IFtdO1xcbiAgICBsZXQgZm9ybSA9IFtdO1xcbiAgICBsZXQgd2hlZWxCbG9jayA9IFtdO1xcbiAgICBsZXQgdGl0bGVQcml6ZXMgPSBbXTtcXG4gICAgbGV0IHRpdGxlUHJpemVzU2VsZWN0b3IgPSAnLnB1bGwtbGVmdC5mb3JtLXBvc2l0aW9uLXRpdGxlJztcXG4gICAgbGV0IG9mZmVyUHJpemVzID0gW107XFxuICAgIGxldCBvZmZlcnMgPSBbXTtcXG4gICAgbGV0IG9mZmVySWRQcml6ZXNTZWxlY3RvciA9ICcuY2xlYXJmaXguZm9ybS1wb3NpdGlvbic7XFxuICAgIGxldCB3aGVlbCA9IFtdO1xcbiAgICBsZXQgc3Bpbm5lciA9IFtdO1xcbiAgICBsZXQgdGlja2VyID0gW107XFxuICAgIFxcL1xcLyBcXHUwNDNkXFx1MDQzMCBcXHUwNDQxXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQ0Y1xcdTA0M2FcXHUwNDNlIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2VcXHUwNDMyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0MFxcdTA0MzVcXHUwNDM3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0M2FcXHUwNDQwXFx1MDQ0M1xcdTA0MzNcXG4gICAgbGV0IHByaXplU2xpY2UgPSBbXTtcXG4gICAgXFwvXFwvIFxcdTA0M2RcXHUwNDMwIFxcdTA0M2FcXHUwNDMwXFx1MDQzYVxcdTA0M2VcXHUwNDM1IFxcdTA0NDBcXHUwNDMwXFx1MDQ0MVxcdTA0NDFcXHUwNDQyXFx1MDQzZVxcdTA0NGZcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQ0MVxcdTA0M2NcXHUwNDM1XFx1MDQ0OVxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwIFxcdTA0MzRcXHUwNDQwXFx1MDQ0M1xcdTA0MzMgXFx1MDQzZVxcdTA0NDJcXHUwNDNkXFx1MDQzZVxcdTA0NDFcXHUwNDM4XFx1MDQ0MlxcdTA0MzVcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDNlIFxcdTA0MzRcXHUwNDQwXFx1MDQ0M1xcdTA0MzNcXHUwNDMwXFxuICAgIGxldCBwcml6ZU9mZnNldCA9IFtdO1xcbiAgICBcXC9cXC8gXFx1MDQzZlxcdTA0NDBcXHUwNDNlXFx1MDQzZlxcdTA0MzhcXHUwNDQxXFx1MDQ0YlxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgQ1NTLVxcdTA0M2FcXHUwNDNiXFx1MDQzMFxcdTA0NDFcXHUwNDQxXFx1MDQ0YiwgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDRiXFx1MDQzNSBcXHUwNDMxXFx1MDQ0M1xcdTA0MzRcXHUwNDM1XFx1MDQzYyBcXHUwNDM0XFx1MDQzZVxcdTA0MzFcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDRmXFx1MDQ0MlxcdTA0NGMgXFx1MDQzOCBcXHUwNDQzXFx1MDQzMVxcdTA0MzhcXHUwNDQwXFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0MzhcXHUwNDM3IFxcdTA0NDFcXHUwNDQyXFx1MDQzOFxcdTA0M2JcXHUwNDM1XFx1MDQzOVxcbiAgICBjb25zdCBzcGluQ2xhc3MgPSBcXFwiaXMtc3Bpbm5pbmdcXFwiO1xcbiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gXFxcInNlbGVjdGVkXFxcIjtcXG4gICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0NDNcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0MzJcXHUwNDQxXFx1MDQzNSBcXHUwNDM3XFx1MDQzZFxcdTA0MzBcXHUwNDQ3XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZiBcXHUwNDNmXFx1MDQzMFxcdTA0NDBcXHUwNDMwXFx1MDQzY1xcdTA0MzVcXHUwNDQyXFx1MDQ0MFxcdTA0M2VcXHUwNDMyIFxcdTA0NDFcXHUwNDQyXFx1MDQzOFxcdTA0M2JcXHUwNDM1XFx1MDQzOSBcXHUwNDQzIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2VcXHUwNDMyXFxuICAgIGxldCBzcGlubmVyU3R5bGVzID0gW107XFxuXFxuICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0MzBcXHUwNDRmIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOFxcbiAgICBsZXQgdGlja2VyQW5pbSA9IFtdO1xcbiAgICBcXC9cXC8gXFx1MDQ0M1xcdTA0MzNcXHUwNDNlXFx1MDQzYiBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQ0ZlxcbiAgICBsZXQgcm90YXRpb24gPSBbXTtcXG4gICAgXFwvXFwvIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDNcXHUwNDQ5XFx1MDQzOFxcdTA0MzkgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFxuICAgIGxldCBjdXJyZW50U2xpY2UgPSBbXTtcXG4gICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDM1XFx1MDQ0MFxcdTA0MzVcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDNkXFx1MDQzMFxcdTA0NGYgXFx1MDQzNFxcdTA0M2JcXHUwNDRmIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyXFx1MDQzZVxcdTA0MzJcXHUwNDRiXFx1MDQ0NSBcXHUwNDNmXFx1MDQzZVxcdTA0MzRcXHUwNDNmXFx1MDQzOFxcdTA0NDFcXHUwNDM1XFx1MDQzOVxcbiAgICBsZXQgcHJpemVOb2RlcyA9IFtdO1xcblxcbiAgICBcXC9cXC9cXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0MzBcXHUwNDRmIHN1Ym1pdCBmb3JtXFxuICAgIGxldCBmb3JtQnV0dG9uID0gW107XFxuXFxuICAgIGZvciAobGV0IGZvcm1LZXkgaW4gZm9ybUNsYXNzZXMpIHtcXG4gICAgICAgIGlmICgkKCcuJyArIGZvcm1DbGFzc2VzW2Zvcm1LZXldKS5lcSgxKS5maW5kKCdmb3JtJykubGVuZ3RoKSB7XFxuICAgICAgICAgICAgZm9ybVtmb3JtS2V5XSA9ICQoJy4nICsgZm9ybUNsYXNzZXNbZm9ybUtleV0pLmVxKDEpLmZpbmQoJ2Zvcm0nKTtcXG4gICAgICAgICAgICB3aGVlbEJsb2NrW2Zvcm1LZXldID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmb3JtQ2xhc3Nlc1tmb3JtS2V5XSlbMF07XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGZvcm1bZm9ybUtleV0gPSAkKCcuJyArIGZvcm1DbGFzc2VzW2Zvcm1LZXldKS5lcSgwKS5maW5kKCdmb3JtJyk7XFxuICAgICAgICAgICAgd2hlZWxCbG9ja1tmb3JtS2V5XSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZm9ybUNsYXNzZXNbZm9ybUtleV0pWzFdO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgXFwvXFwvXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2RcXHUwNDNlXFx1MDQzZlxcdTA0M2FcXHUwNDQzIGZvcm0gc3VibWl0XFxuICAgICAgICBmb3JtQnV0dG9uW2Zvcm1LZXldID0gZm9ybVtmb3JtS2V5XS5maW5kKCdidXR0b24nKTtcXG5cXG4gICAgICAgIFxcL1xcL1xcdTA0MzdcXHUwNDMwXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQzZFxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFx1MDQ0YiBcXHUwNDM4IFxcdTA0MzRcXHUwNDNlXFx1MDQzMVxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM0XFx1MDQzZVxcdTA0M2NcXHUwNDNkXFx1MDQ0YlxcdTA0MzUgXFx1MDQ0NlxcdTA0MzJcXHUwNDM1XFx1MDQ0MlxcdTA0MzBcXG4gICAgICAgIHRpdGxlUHJpemVzW2Zvcm1LZXldID0gZm9ybVtmb3JtS2V5XS5maW5kKHRpdGxlUHJpemVzU2VsZWN0b3IpO1xcbiAgICAgICAgaWYgKHRpdGxlUHJpemVzW2Zvcm1LZXldLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICB0aXRsZVByaXplc1tmb3JtS2V5XS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gJChlKS50ZXh0KCkudHJpbSgpO1xcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJpemVzW2Zvcm1LZXldKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIHByaXplc1tmb3JtS2V5XSA9IFtdO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGMgPSB0eXBlb2Yod2hlZWxDb2xvcnMpICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIHdoZWVsQ29sb3JzICE9PSBudWxsICYmIHdoZWVsQ29sb3JzW2ldID8gd2hlZWxDb2xvcnNbaV0gOiBnZW5lcmF0ZUNvbG9yKCk7XFxuICAgICAgICAgICAgICAgICAgICBwcml6ZXNbZm9ybUtleV0ucHVzaCh7IHRleHQ6IHRpdGxlLCBjb2xvcjogYyB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0MWVcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQ0OFxcdTA0MzBcXHUwNDNkXFx1MDQ0MVxcdTA0NGJcXG4gICAgICAgIG9mZmVyUHJpemVzW2Zvcm1LZXldID0gZm9ybVtmb3JtS2V5XS5maW5kKG9mZmVySWRQcml6ZXNTZWxlY3Rvcik7XFxuICAgICAgICBpZiAob2ZmZXJQcml6ZXNbZm9ybUtleV0ubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIG9mZmVyUHJpemVzW2Zvcm1LZXldLmVhY2goZnVuY3Rpb24oaSwgZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgb2ZmZXJJZCA9ICQoZSkuYXR0cihcXFwiZGF0YS1vZmZlci1pZFxcXCIpO1xcbiAgICAgICAgICAgICAgICBpZiAob2ZmZXJJZCkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZlcnNbZm9ybUtleV0pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgb2ZmZXJzW2Zvcm1LZXldID0gW107XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgY2ggPSB0eXBlb2Yod2hlZWxDaGFuY2VzKSAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiB3aGVlbENoYW5jZXMgIT09IG51bGwgJiYgd2hlZWxDaGFuY2VzW29mZmVySWRdID8gd2hlZWxDaGFuY2VzW29mZmVySWRdIDogMDtcXG4gICAgICAgICAgICAgICAgICAgIG9mZmVyc1tmb3JtS2V5XS5wdXNoKHsgb2ZmZXJJZDogb2ZmZXJJZCwgY2hhbmNlOiBjaCB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uc29sZS5sb2cob2ZmZXJzW2Zvcm1LZXldKVxcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDFcXHUwNDNlXFx1MDQzN1xcdTA0MzRcXHUwNDMwXFx1MDQ1MVxcdTA0M2MgXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDRiXFx1MDQzNSBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQzMVxcdTA0NGJcXHUwNDQxXFx1MDQ0MlxcdTA0NDBcXHUwNDNlXFx1MDQzM1xcdTA0M2UgXFx1MDQzNFxcdTA0M2VcXHUwNDQxXFx1MDQ0MlxcdTA0NDNcXHUwNDNmXFx1MDQzMCBcXHUwNDNhXFx1MDQzZSBcXHUwNDMyXFx1MDQ0MVxcdTA0MzVcXHUwNDNjIFxcdTA0M2VcXHUwNDMxXFx1MDQ0YVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0MzBcXHUwNDNjIFxcdTA0M2RcXHUwNDMwIFxcdTA0NDFcXHUwNDQyXFx1MDQ0MFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDM1IFxcdTIwMTQgXFx1MDQzMVxcdTA0M2JcXHUwNDNlXFx1MDQzYVxcdTA0NDMgXFx1MDQzMiBcXHUwNDQ2XFx1MDQzNVxcdTA0M2JcXHUwNDNlXFx1MDQzYywgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDQzLCBcXHUwNDNhXFx1MDQzZFxcdTA0M2VcXHUwNDNmXFx1MDQzYVxcdTA0MzUgXFx1MDQzOCBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzYVxcdTA0NDNcXG4gICAgICAgIGlmICghd2hlZWxCbG9ja1tmb3JtS2V5XSkge1xcbiAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICAgIHdoZWVsW2Zvcm1LZXldID0gd2hlZWxCbG9ja1tmb3JtS2V5XS5xdWVyeVNlbGVjdG9yKFxcXCIuZGVhbC13aGVlbFxcXCIpO1xcbiAgICAgICAgc3Bpbm5lcltmb3JtS2V5XSA9IHdoZWVsW2Zvcm1LZXldLnF1ZXJ5U2VsZWN0b3IoXFxcIi5zcGlubmVyMlxcXCIpO1xcbiAgICAgICAgdGlja2VyW2Zvcm1LZXldID0gd2hlZWxbZm9ybUtleV0ucXVlcnlTZWxlY3RvcihcXFwiLnRpY2tlclxcXCIpO1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0M2RcXHUwNDMwIFxcdTA0NDFcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDRjXFx1MDQzYVxcdTA0M2UgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0MzIgXFx1MDQzZFxcdTA0MzBcXHUwNDQwXFx1MDQzNVxcdTA0MzdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0NDBcXHUwNDQzXFx1MDQzM1xcbiAgICAgICAgcHJpemVTbGljZVtmb3JtS2V5XSA9IDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aDtcXG4gICAgICAgIFxcL1xcLyBcXHUwNDNkXFx1MDQzMCBcXHUwNDNhXFx1MDQzMFxcdTA0M2FcXHUwNDNlXFx1MDQzNSBcXHUwNDQwXFx1MDQzMFxcdTA0NDFcXHUwNDQxXFx1MDQ0MlxcdTA0M2VcXHUwNDRmXFx1MDQzZFxcdTA0MzhcXHUwNDM1IFxcdTA0NDFcXHUwNDNjXFx1MDQzNVxcdTA0NDlcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMCBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzIFxcdTA0M2VcXHUwNDQyXFx1MDQzZFxcdTA0M2VcXHUwNDQxXFx1MDQzOFxcdTA0NDJcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZSBcXHUwNDM0XFx1MDQ0MFxcdTA0NDNcXHUwNDMzXFx1MDQzMFxcbiAgICAgICAgcHJpemVPZmZzZXRbZm9ybUtleV0gPSBNYXRoLmZsb29yKDE4MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCk7XFxuICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMlxcdTA0NDFcXHUwNDM1IFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmIFxcdTA0M2ZcXHUwNDMwXFx1MDQ0MFxcdTA0MzBcXHUwNDNjXFx1MDQzNVxcdTA0NDJcXHUwNDQwXFx1MDQzZVxcdTA0MzIgXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0MzVcXHUwNDM5IFxcdTA0NDMgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0MzJcXG4gICAgICAgIHNwaW5uZXJTdHlsZXNbZm9ybUtleV0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGlubmVyW2Zvcm1LZXldKTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzY1xcdTA0MzVcXHUwNDNkXFx1MDQzZFxcdTA0MzBcXHUwNDRmIFxcdTA0MzRcXHUwNDNiXFx1MDQ0ZiBcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzMFxcdTA0NDZcXHUwNDM4XFx1MDQzOFxcbiAgICAgICAgdGlja2VyQW5pbVtmb3JtS2V5XTtcXG4gICAgICAgIFxcL1xcLyBcXHUwNDQzXFx1MDQzM1xcdTA0M2VcXHUwNDNiIFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmXFxuICAgICAgICByb3RhdGlvbltmb3JtS2V5XSA9IDA7XFxuICAgICAgICBcXC9cXC8gXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0M1xcdTA0NDlcXHUwNDM4XFx1MDQzOSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXG4gICAgICAgIGN1cnJlbnRTbGljZVtmb3JtS2V5XSA9IDA7XFxuICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0M2RcXHUwNDMwXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXHUwNDNlXFx1MDQzMlxcdTA0NGJcXHUwNDQ1IFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2ZcXHUwNDM4XFx1MDQ0MVxcdTA0MzVcXHUwNDM5XFxuICAgICAgICBwcml6ZU5vZGVzW2Zvcm1LZXldO1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDBcXHUwNDMwXFx1MDQ0MVxcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQ0ZlxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDFcXHUwNDQyIFxcdTA0M2ZcXHUwNDNlIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0MzBcXHUwNDNjXFxuICAgICAgICBjb25zdCBjcmVhdGVQcml6ZU5vZGVzID0gKCkgPT4ge1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDNlXFx1MDQzMVxcdTA0NDBcXHUwNDMwXFx1MDQzMVxcdTA0MzBcXHUwNDQyXFx1MDQ0YlxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0MzBcXHUwNDM2XFx1MDQzNFxcdTA0NDNcXHUwNDRlIFxcdTA0M2ZcXHUwNDNlXFx1MDQzNFxcdTA0M2ZcXHUwNDM4XFx1MDQ0MVxcdTA0NGNcXG4gICAgICAgICAgICBwcml6ZXNbZm9ybUtleV0uZm9yRWFjaCgoeyB0ZXh0LCBjb2xvciwgcmVhY3Rpb24gfSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQzYVxcdTA0MzBcXHUwNDM2XFx1MDQzNFxcdTA0M2VcXHUwNDM5IFxcdTA0MzhcXHUwNDM3IFxcdTA0M2RcXHUwNDM4XFx1MDQ0NSBcXHUwNDNkXFx1MDQzMFxcdTA0MzdcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0MVxcdTA0MzJcXHUwNDNlXFx1MDQzOSBcXHUwNDQzXFx1MDQzM1xcdTA0M2VcXHUwNDNiIFxcdTA0M2ZcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDMwXFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uW2Zvcm1LZXldID0gKChwcml6ZVNsaWNlW2Zvcm1LZXldICogaSkgKiAtMSkgLSBwcml6ZU9mZnNldFtmb3JtS2V5XTtcXG4gICAgICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzRcXHUwNDNlXFx1MDQzMVxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZVxcdTA0MzQgXFx1MDQ0MSBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNjXFx1MDQzNVxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1XFx1MDQzYyBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQxXFx1MDQ0MlxcdTA0MzAgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0NDMgXFx1MDQzMiBcXHUwNDNhXFx1MDQzZVxcdTA0M2RcXHUwNDM1XFx1MDQ0NiBcXHUwNDMxXFx1MDQzYlxcdTA0M2VcXHUwNDNhXFx1MDQzMCBzcGlubmVyXFxuICAgICAgICAgICAgICAgIHNwaW5uZXJbZm9ybUtleV0uaW5zZXJ0QWRqYWNlbnRIVE1MKFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImJlZm9yZWVuZFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDIgXFx1MDQzZlxcdTA0NDBcXHUwNDM4IFxcdTA0NGRcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQ0M1xcdTA0MzZcXHUwNDM1IFxcdTA0M2VcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQzYlxcdTA0MzVcXHUwNDNkIFxcdTA0M2RcXHUwNDQzXFx1MDQzNlxcdTA0M2RcXHUwNDRiXFx1MDQzY1xcdTA0MzggXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0NGZcXHUwNDNjXFx1MDQzOFxcbiAgICAgICAgICAgICAgICAgICAgYDxsaSBjbGFzcz1cXFwicHJpemVcXFwiIGRhdGEtcmVhY3Rpb249JHtyZWFjdGlvbn0gc3R5bGU9XFxcIi0tcm90YXRlOiAke3JvdGF0aW9uW2Zvcm1LZXldfWRlZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInRleHRcXFwiPiR7dGV4dH08XFwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgIDxcXC9saT5gXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9O1xcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDBcXHUwNDM4XFx1MDQ0MVxcdTA0NDNcXHUwNDM1XFx1MDQzYyBcXHUwNDQwXFx1MDQzMFxcdTA0MzdcXHUwNDNkXFx1MDQzZVxcdTA0NDZcXHUwNDMyXFx1MDQzNVxcdTA0NDJcXHUwNDNkXFx1MDQ0YlxcdTA0MzUgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcbiAgICAgICAgY29uc3QgY3JlYXRlQ29uaWNHcmFkaWVudCA9ICgpID0+IHtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQ0M1xcdTA0NDFcXHUwNDQyXFx1MDQzMFxcdTA0M2RcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNkXFx1MDQ0M1xcdTA0MzZcXHUwNDNkXFx1MDQzZVxcdTA0MzUgXFx1MDQzN1xcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQ0MVxcdTA0NDJcXHUwNDM4XFx1MDQzYlxcdTA0NGYgXFx1MDQ0MyBcXHUwNDRkXFx1MDQzYlxcdTA0MzVcXHUwNDNjXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQzMCBzcGlubmVyXFxuICAgICAgICAgICAgc3Bpbm5lcltmb3JtS2V5XS5zZXRBdHRyaWJ1dGUoXFxuICAgICAgICAgICAgICAgIFxcXCJzdHlsZVxcXCIsXFxuICAgICAgICAgICAgICAgIGBiYWNrZ3JvdW5kOiBjb25pYy1ncmFkaWVudChcXG4gICAgICAgICAgICAgICAgICAgIGZyb20gLTkwZGVnLFxcbiAgICAgICAgICAgICAgICAgICAgJHtwcml6ZXNbZm9ybUtleV1cXG4gICAgICAgICAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQ0NlxcdTA0MzJcXHUwNDM1XFx1MDQ0MiBcXHUwNDQyXFx1MDQzNVxcdTA0M2FcXHUwNDQzXFx1MDQ0OVxcdTA0MzVcXHUwNDMzXFx1MDQzZSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwXFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sb3IsIGkpID0+IGNvbG9yLmNvbG9yICsgYCBgICsgKDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCkgKiAocHJpemVzW2Zvcm1LZXldLmxlbmd0aCAtIGkgLSAxKSArIGBkZWdgICsgYCBgICsgKDM2MCBcXC8gcHJpemVzW2Zvcm1LZXldLmxlbmd0aCkgKiAocHJpemVzW2Zvcm1LZXldLmxlbmd0aCAtIGkpICsgYGRlZ2ApXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICApO2BcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgfTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDQxXFx1MDQzZVxcdTA0MzdcXHUwNDM0XFx1MDQzMFxcdTA0NTFcXHUwNDNjIFxcdTA0NDRcXHUwNDQzXFx1MDQzZFxcdTA0M2FcXHUwNDQ2XFx1MDQzOFxcdTA0NGUsIFxcdTA0M2FcXHUwNDNlXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcdTA0NGYgXFx1MDQzZFxcdTA0MzBcXHUwNDQwXFx1MDQzOFxcdTA0NDFcXHUwNDQzXFx1MDQzNVxcdTA0NDIgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlIFxcdTA0MzIgXFx1MDQ0MVxcdTA0MzFcXHUwNDNlXFx1MDQ0MFxcdTA0MzVcXG4gICAgICAgIGNvbnN0IHNldHVwV2hlZWwgPSAoKSA9PiB7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0NDFcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzYlxcdTA0MzAgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQ0YlxcbiAgICAgICAgICAgIGNyZWF0ZUNvbmljR3JhZGllbnQoKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzZlxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0MVxcdTA0NDJcXG4gICAgICAgICAgICBjcmVhdGVQcml6ZU5vZGVzKCk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzAgXFx1MDQzZlxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0M2MgXFx1MDQzY1xcdTA0NGIgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQ0M1xcdTA0NDdcXHUwNDM4XFx1MDQzYyBcXHUwNDQxXFx1MDQzZlxcdTA0MzhcXHUwNDQxXFx1MDQzZVxcdTA0M2EgXFx1MDQzMlxcdTA0NDFcXHUwNDM1XFx1MDQ0NSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFx1MDQzZVxcdTA0MzIgXFx1MDQzZFxcdTA0MzAgXFx1MDQ0MVxcdTA0NDJcXHUwNDQwXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0MzUsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZVxcdTA0MzFcXHUwNDRiIFxcdTA0NDBcXHUwNDMwXFx1MDQzMVxcdTA0M2VcXHUwNDQyXFx1MDQzMFxcdTA0NDJcXHUwNDRjIFxcdTA0NDEgXFx1MDQzZFxcdTA0MzhcXHUwNDNjXFx1MDQzOCBcXHUwNDNhXFx1MDQzMFxcdTA0M2EgXFx1MDQ0MSBcXHUwNDNlXFx1MDQzMVxcdTA0NGFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDMwXFx1MDQzY1xcdTA0MzhcXG4gICAgICAgICAgICBwcml6ZU5vZGVzW2Zvcm1LZXldID0gd2hlZWxbZm9ybUtleV0ucXVlcnlTZWxlY3RvckFsbChcXFwiLnByaXplXFxcIik7XFxuICAgICAgICB9O1xcblxcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0M2VcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRmXFx1MDQzNVxcdTA0M2MgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzOFxcdTA0NDdcXHUwNDM1XFx1MDQ0MVxcdTA0NDJcXHUwNDMyXFx1MDQzZSBcXHUwNDNlXFx1MDQzMVxcdTA0M2VcXHUwNDQwXFx1MDQzZVxcdTA0NDJcXHUwNDNlXFx1MDQzMiwgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQzNSBcXHUwNDQxXFx1MDQzNFxcdTA0MzVcXHUwNDNiXFx1MDQzMFxcdTA0MzVcXHUwNDQyIFxcdTA0M2RcXHUwNDMwXFx1MDQ0OFxcdTA0MzUgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlXFxuICAgICAgICBjb25zdCBzcGluZXJ0aWEgPSAobWluLCBtYXgpID0+IHtcXG4gICAgICAgICAgICBtaW5WYWx1ZSA9IE1hdGguY2VpbChtaW4pO1xcbiAgICAgICAgICAgIG1heFZhbHVlID0gTWF0aC5mbG9vcihtYXgpO1xcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4VmFsdWUgLSBtaW5WYWx1ZSArIDEpKSArIG1pblZhbHVlO1xcbiAgICAgICAgfTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDQ0XFx1MDQ0M1xcdTA0M2RcXHUwNDNhXFx1MDQ0NlxcdTA0MzhcXHUwNDRmIFxcdTA0MzdcXHUwNDMwXFx1MDQzZlxcdTA0NDNcXHUwNDQxXFx1MDQzYVxcdTA0MzAgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0NGYgXFx1MDQ0MSBcXHUwNDNmXFx1MDQzYlxcdTA0MzBcXHUwNDMyXFx1MDQzZFxcdTA0M2VcXHUwNDM5IFxcdTA0M2VcXHUwNDQxXFx1MDQ0MlxcdTA0MzBcXHUwNDNkXFx1MDQzZVxcdTA0MzJcXHUwNDNhXFx1MDQzZVxcdTA0MzlcXG4gICAgICAgIGNvbnN0IHJ1blRpY2tlckFuaW1hdGlvbiA9ICgpID0+IHtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzMlxcdTA0MzdcXHUwNDRmXFx1MDQzYlxcdTA0MzggXFx1MDQzYVxcdTA0M2VcXHUwNDM0IFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDM4IFxcdTA0M2VcXHUwNDQyXFx1MDQ0MVxcdTA0NGVcXHUwNDM0XFx1MDQzMDogaHR0cHM6XFwvXFwvY3NzLXRyaWNrcy5jb21cXC9nZXQtdmFsdWUtb2YtY3NzLXJvdGF0aW9uLXRocm91Z2gtamF2YXNjcmlwdFxcL1xcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNwaW5uZXJTdHlsZXNbZm9ybUtleV0udHJhbnNmb3JtLnNwbGl0KFxcXCIoXFxcIilbMV0uc3BsaXQoXFxcIilcXFwiKVswXS5zcGxpdChcXFwiLFxcXCIpO1xcbiAgICAgICAgICAgIGNvbnN0IGEgPSB2YWx1ZXNbMF07XFxuICAgICAgICAgICAgY29uc3QgYiA9IHZhbHVlc1sxXTtcXG4gICAgICAgICAgICBsZXQgcmFkID0gTWF0aC5hdGFuMihiLCBhKTtcXG5cXG4gICAgICAgICAgICBpZiAocmFkIDwgMCkge1xcbiAgICAgICAgICAgICAgcmFkICs9ICgyICogTWF0aC5QSSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5yb3VuZChyYWQgKiAoMTgwIFxcLyBNYXRoLlBJKSk7XFxuICAgICAgICAgICAgY29uc3Qgc2xpY2UgPSBNYXRoLmZsb29yKGFuZ2xlIFxcLyBwcml6ZVNsaWNlW2Zvcm1LZXldKTtcXG5cXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGYgXFx1MDQ0ZlxcdTA0MzdcXHUwNDRiXFx1MDQ0N1xcdTA0M2FcXHUwNDMwLCBcXHUwNDNhXFx1MDQzZVxcdTA0MzNcXHUwNDM0XFx1MDQzMCBcXHUwNDM1XFx1MDQzM1xcdTA0M2UgXFx1MDQzN1xcdTA0MzBcXHUwNDM0XFx1MDQzNVxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0NDIgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDNlIFxcdTA0M2ZcXHUwNDQwXFx1MDQzOCBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzOFxcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM1XFx1MDQ0MVxcdTA0M2JcXHUwNDM4IFxcdTA0M2ZcXHUwNDNlXFx1MDQ0ZlxcdTA0MzJcXHUwNDM4XFx1MDQzYlxcdTA0NDFcXHUwNDRmIFxcdTA0M2RcXHUwNDNlXFx1MDQzMlxcdTA0NGJcXHUwNDM5IFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcbiAgICAgICAgICAgIGlmIChjdXJyZW50U2xpY2VbZm9ybUtleV0gIT09IHNsaWNlKSB7XFxuICAgICAgICAgICAgICAgIFxcL1xcLyBcXHUwNDQzXFx1MDQzMVxcdTA0MzhcXHUwNDQwXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0M2NcXHUwNDMwXFx1MDQ0NlxcdTA0MzhcXHUwNDRlIFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNhXFx1MDQzMFxcbiAgICAgICAgICAgICAgICB0aWNrZXJbZm9ybUtleV0uc3R5bGUuYW5pbWF0aW9uID0gXFxcIm5vbmVcXFwiO1xcbiAgICAgICAgICAgICAgICBcXC9cXC8gXFx1MDQzOCBcXHUwNDQ3XFx1MDQzNVxcdTA0NDBcXHUwNDM1XFx1MDQzNyAxMCBcXHUwNDNjXFx1MDQzOFxcdTA0M2JcXHUwNDNiXFx1MDQzOFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDNcXHUwNDNkXFx1MDQzNCBcXHUwNDNlXFx1MDQ0MlxcdTA0M2NcXHUwNDM1XFx1MDQzZFxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDRkXFx1MDQ0MlxcdTA0M2UsIFxcdTA0NDdcXHUwNDQyXFx1MDQzZVxcdTA0MzFcXHUwNDRiIFxcdTA0M2VcXHUwNDNkIFxcdTA0MzJcXHUwNDM1XFx1MDQ0MFxcdTA0M2RcXHUwNDQzXFx1MDQzYlxcdTA0NDFcXHUwNDRmIFxcdTA0MzIgXFx1MDQzZlxcdTA0MzVcXHUwNDQwXFx1MDQzMlxcdTA0M2VcXHUwNDNkXFx1MDQzMFxcdTA0NDdcXHUwNDMwXFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzZVxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDNiXFx1MDQzZVxcdTA0MzZcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDM1XFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGlja2VyW2Zvcm1LZXldLnN0eWxlLmFuaW1hdGlvbiA9IG51bGwsIDEwKTtcXG4gICAgICAgICAgICAgICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDNlXFx1MDQ0MVxcdTA0M2JcXHUwNDM1IFxcdTA0NDJcXHUwNDNlXFx1MDQzM1xcdTA0M2UsIFxcdTA0M2FcXHUwNDMwXFx1MDQzYSBcXHUwNDRmXFx1MDQzN1xcdTA0NGJcXHUwNDQ3XFx1MDQzZVxcdTA0M2EgXFx1MDQzZlxcdTA0NDBcXHUwNDNlXFx1MDQ0OFxcdTA0NTFcXHUwNDNiIFxcdTA0NDFcXHUwNDM1XFx1MDQzYVxcdTA0NDJcXHUwNDNlXFx1MDQ0MCAtIFxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDM1XFx1MDQzM1xcdTA0M2UgXFx1MDQ0MlxcdTA0MzVcXHUwNDNhXFx1MDQ0M1xcdTA0NDlcXHUwNDM4XFx1MDQzYyBcXG4gICAgICAgICAgICAgICAgY3VycmVudFNsaWNlW2Zvcm1LZXldID0gc2xpY2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQzXFx1MDQ0MVxcdTA0M2FcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGVcXG4gICAgICAgICAgICB0aWNrZXJBbmltW2Zvcm1LZXldID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJ1blRpY2tlckFuaW1hdGlvbik7XFxuICAgICAgICB9O1xcblxcblxcbiAgICAgICAgXFwvXFwvIFxcdTA0NDRcXHUwNDQzXFx1MDQzZFxcdTA0M2FcXHUwNDQ2XFx1MDQzOFxcdTA0NGYgXFx1MDQzMlxcdTA0NGJcXHUwNDMxXFx1MDQzZVxcdTA0NDBcXHUwNDMwIFxcdTA0M2ZcXHUwNDQwXFx1MDQzOFxcdTA0MzdcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDMzXFx1MDQzZSBcXHUwNDQxXFx1MDQzNVxcdTA0M2FcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDMwXFxuICAgICAgICBjb25zdCBzZWxlY3RQcml6ZSA9ICgpID0+IHtcXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IE1hdGguZmxvb3Iocm90YXRpb25bZm9ybUtleV0gXFwvIHByaXplU2xpY2VbZm9ybUtleV0pO1xcbiAgICAgICAgICAgIHByaXplTm9kZXNbZm9ybUtleV1bc2VsZWN0ZWRdLmNsYXNzTGlzdC5hZGQoc2VsZWN0ZWRDbGFzcyk7XFxuICAgICAgICAgICAgc2V0UHJpemUoc2VsZWN0ZWQpO1xcbiAgICAgICAgfTtcXG5cXG4gICAgICAgIFxcL1xcL1xcdTA0MTJcXHUwNDRiXFx1MDQzMVxcdTA0MzhcXHUwNDQwXFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0M2RcXHUwNDQzXFx1MDQzNlxcdTA0M2RcXHUwNDRiXFx1MDQzOSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3IFxcdTA0MzIgXFx1MDQ0NFxcdTA0M2VcXHUwNDQwXFx1MDQzY1xcdTA0MzVcXG4gICAgICAgIGNvbnN0IHNldFByaXplID0gKHNlbGVjdGVkKSA9PiB7XFxuICAgICAgICAgICAgaWYgKHRpdGxlUHJpemVzW2Zvcm1LZXldLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkVGl0bGUgPSAkKHByaXplTm9kZXNbZm9ybUtleV1bc2VsZWN0ZWRdKS50ZXh0KCkudHJpbSgpO1xcbiAgICAgICAgICAgICAgICB0aXRsZVByaXplc1tmb3JtS2V5XS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9ICQoZSkudGV4dCgpLnRyaW0oKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSA9PT0gc2VsZWN0ZWRUaXRsZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZSkudHJpZ2dlcignY2xpY2snKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfTtcXG5cXG4gICAgICAgIGNvbnN0IGNoYW5jZVByaXplID0gKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBzdW0gPSAwO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2ZmZXJzW2Zvcm1LZXldLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIHN1bSArPSBvZmZlcnNbZm9ybUtleV1baV1bJ2NoYW5jZSddO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmFuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHN1bSk7XFxuICAgICAgICAgICAgbGV0IHdpbiA9IDA7XFxuICAgICAgICAgICAgZm9yIChsZXQgcyA9IG9mZmVyc1tmb3JtS2V5XVswXVsnY2hhbmNlJ107IHMgPD0gcmFuZDsgcyArPSBvZmZlcnNbZm9ybUtleV1bd2luXVsnY2hhbmNlJ10pIHtcXG4gICAgICAgICAgICAgICAgd2luKys7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBzcGlucyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2MCArIHNwaW5lcnRpYSgyMDAwLCA1MDAwKSk7XFxuICAgICAgICAgICAgcm90ID0gTWF0aC5mbG9vcihzcGlucyAlIDM2MCBcXC8gcHJpemVTbGljZVtmb3JtS2V5XSk7XFxuICAgICAgICAgICAgcmV0dXJuIHNwaW5zICsgcHJpemVTbGljZVtmb3JtS2V5XSAqICh3aW4gLSByb3QpO1xcblxcbiAgICAgICAgfTtcXG5cXG5cXG4gICAgICAgIFxcL1xcL1xcdTA0MzdcXHUwNDMwXFx1MDQzZlxcdTA0NDNcXHUwNDQxXFx1MDQzYVxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0M2VcXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0V2hlZWxOaWthbmRyb3YoKSB7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDM1XFx1MDQ1MSBcXHUwNDNkXFx1MDQzNVxcdTA0MzRcXHUwNDNlXFx1MDQ0MVxcdTA0NDJcXHUwNDQzXFx1MDQzZlxcdTA0M2RcXHUwNDNlXFx1MDQzOSBcXHUwNDM0XFx1MDQzYlxcdTA0NGYgXFx1MDQzZFxcdTA0MzBcXHUwNDM2XFx1MDQzMFxcdTA0NDJcXHUwNDM4XFx1MDQ0ZlxcbiAgICAgICAgICAgIGZvcm1CdXR0b25bZm9ybUtleV0ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzN1xcdTA0MzBcXHUwNDM0XFx1MDQzMFxcdTA0NTFcXHUwNDNjIFxcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzBcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDNlXFx1MDQzNSBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzNSBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0MzBcXG4gICAgICAgICAgICByb3RhdGlvbltmb3JtS2V5XSA9IGNoYW5jZVByaXplKCk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0NDNcXHUwNDMxXFx1MDQzOFxcdTA0NDBcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzZlxcdTA0NDBcXHUwNDNlXFx1MDQ0OFxcdTA0M2JcXHUwNDRiXFx1MDQzOSBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFxuICAgICAgICAgICAgcHJpemVOb2Rlc1tmb3JtS2V5XS5mb3JFYWNoKChwcml6ZSkgPT4gcHJpemUuY2xhc3NMaXN0LnJlbW92ZShzZWxlY3RlZENsYXNzKSk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzRcXHUwNDNlXFx1MDQzMVxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZVxcdTA0M2JcXHUwNDM1XFx1MDQ0MVxcdTA0NDMgXFx1MDQzYVxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NDEgaXMtc3Bpbm5pbmcsIFxcdTA0NDEgXFx1MDQzZlxcdTA0M2VcXHUwNDNjXFx1MDQzZVxcdTA0NDlcXHUwNDRjXFx1MDQ0ZSBcXHUwNDNhXFx1MDQzZVxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2VcXHUwNDMzXFx1MDQzZSBcXHUwNDQwXFx1MDQzNVxcdTA0MzBcXHUwNDNiXFx1MDQzOFxcdTA0MzdcXHUwNDQzXFx1MDQzNVxcdTA0M2MgXFx1MDQzZFxcdTA0NDNcXHUwNDM2XFx1MDQzZFxcdTA0NDNcXHUwNDRlIFxcdTA0M2VcXHUwNDQyXFx1MDQ0MFxcdTA0MzhcXHUwNDQxXFx1MDQzZVxcdTA0MzJcXHUwNDNhXFx1MDQ0M1xcbiAgICAgICAgICAgIHdoZWVsW2Zvcm1LZXldLmNsYXNzTGlzdC5hZGQoc3BpbkNsYXNzKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQ0N1xcdTA0MzVcXHUwNDQwXFx1MDQzNVxcdTA0MzcgQ1NTIFxcdTA0MzNcXHUwNDNlXFx1MDQzMlxcdTA0M2VcXHUwNDQwXFx1MDQzOFxcdTA0M2MgXFx1MDQ0MVxcdTA0MzVcXHUwNDNhXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzMFxcdTA0M2MsIFxcdTA0M2FcXHUwNDMwXFx1MDQzYSBcXHUwNDM4XFx1MDQzYyBcXHUwNDNmXFx1MDQzZVxcdTA0MzJcXHUwNDM1XFx1MDQ0MFxcdTA0M2RcXHUwNDQzXFx1MDQ0MlxcdTA0NGNcXHUwNDQxXFx1MDQ0ZlxcbiAgICAgICAgICAgIHNwaW5uZXJbZm9ybUtleV0uc3R5bGUuc2V0UHJvcGVydHkoXFxcIi0tcm90YXRlXFxcIiwgcm90YXRpb25bZm9ybUtleV0pO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDMyXFx1MDQzZVxcdTA0MzdcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NGZcXHUwNDM3XFx1MDQ0YlxcdTA0NDdcXHUwNDNlXFx1MDQzYSBcXHUwNDMyIFxcdTA0MzNcXHUwNDNlXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFx1MDQzZVxcdTA0M2RcXHUwNDQyXFx1MDQzMFxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0NDNcXHUwNDRlIFxcdTA0M2ZcXHUwNDNlXFx1MDQzN1xcdTA0MzhcXHUwNDQ2XFx1MDQzOFxcdTA0NGVcXG4gICAgICAgICAgICB0aWNrZXJbZm9ybUtleV0uc3R5bGUuYW5pbWF0aW9uID0gXFxcIm5vbmVcXFwiO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDM3XFx1MDQzMFxcdTA0M2ZcXHUwNDQzXFx1MDQ0MVxcdTA0M2FcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGUgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzVcXG4gICAgICAgICAgICBydW5UaWNrZXJBbmltYXRpb24oKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDNlXFx1MDQ0MlxcdTA0NDFcXHUwNDNiXFx1MDQzNVxcdTA0MzZcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYywgXFx1MDQzYVxcdTA0M2VcXHUwNDMzXFx1MDQzNFxcdTA0MzAgXFx1MDQzN1xcdTA0MzBcXHUwNDNhXFx1MDQzZVxcdTA0M2RcXHUwNDQ3XFx1MDQzOFxcdTA0M2JcXHUwNDMwXFx1MDQ0MVxcdTA0NGMgXFx1MDQzMFxcdTA0M2RcXHUwNDM4XFx1MDQzY1xcdTA0MzBcXHUwNDQ2XFx1MDQzOFxcdTA0NGYgXFx1MDQzMlxcdTA0NDBcXHUwNDMwXFx1MDQ0OVxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0NGYgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwXFxuICAgICAgICBzcGlubmVyW2Zvcm1LZXldLmFkZEV2ZW50TGlzdGVuZXIoXFxcInRyYW5zaXRpb25lbmRcXFwiLCAoKSA9PiB7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0M2VcXHUwNDQxXFx1MDQ0MlxcdTA0MzBcXHUwNDNkXFx1MDQzMFxcdTA0MzJcXHUwNDNiXFx1MDQzOFxcdTA0MzJcXHUwNDMwXFx1MDQzNVxcdTA0M2MgXFx1MDQzZVxcdTA0NDJcXHUwNDQwXFx1MDQzOFxcdTA0NDFcXHUwNDNlXFx1MDQzMlxcdTA0M2FcXHUwNDQzIFxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0NDlcXHUwNDM1XFx1MDQzZFxcdTA0MzhcXHUwNDRmXFxuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGlja2VyQW5pbVtmb3JtS2V5XSk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0M2ZcXHUwNDNlXFx1MDQzYlxcdTA0NDNcXHUwNDQ3XFx1MDQzMFxcdTA0MzVcXHUwNDNjIFxcdTA0NDJcXHUwNDM1XFx1MDQzYVxcdTA0NDNcXHUwNDQ5XFx1MDQzNVxcdTA0MzUgXFx1MDQzN1xcdTA0M2RcXHUwNDMwXFx1MDQ0N1xcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDMyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQ0MlxcdTA0MzAgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwXFxuICAgICAgICAgICAgcm90YXRpb25bZm9ybUtleV0gJT0gMzYwO1xcbiAgICAgICAgICAgIFxcL1xcLyBcXHUwNDMyXFx1MDQ0YlxcdTA0MzFcXHUwNDM4XFx1MDQ0MFxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNmXFx1MDQ0MFxcdTA0MzhcXHUwNDM3XFxuICAgICAgICAgICAgc2VsZWN0UHJpemUoKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQ0M1xcdTA0MzFcXHUwNDM4XFx1MDQ0MFxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzYlxcdTA0MzBcXHUwNDQxXFx1MDQ0MSwgXFx1MDQzYVxcdTA0M2VcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDRiXFx1MDQzOSBcXHUwNDNlXFx1MDQ0MlxcdTA0MzJcXHUwNDM1XFx1MDQ0N1xcdTA0MzBcXHUwNDM1XFx1MDQ0MiBcXHUwNDM3XFx1MDQzMCBcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDQ5XFx1MDQzNVxcdTA0M2RcXHUwNDM4XFx1MDQzNVxcbiAgICAgICAgICAgIHdoZWVsW2Zvcm1LZXldLmNsYXNzTGlzdC5yZW1vdmUoc3BpbkNsYXNzKTtcXG4gICAgICAgICAgICBcXC9cXC8gXFx1MDQzZVxcdTA0NDJcXHUwNDNmXFx1MDQ0MFxcdTA0MzBcXHUwNDMyXFx1MDQzYlxcdTA0NGZcXHUwNDM1XFx1MDQzYyBcXHUwNDMyIENTUyBcXHUwNDNkXFx1MDQzZVxcdTA0MzJcXHUwNDNlXFx1MDQzNSBcXHUwNDNmXFx1MDQzZVxcdTA0M2JcXHUwNDNlXFx1MDQzNlxcdTA0MzVcXHUwNDNkXFx1MDQzOFxcdTA0MzUgXFx1MDQzZlxcdTA0M2VcXHUwNDMyXFx1MDQzZVxcdTA0NDBcXHUwNDNlXFx1MDQ0MlxcdTA0MzAgXFx1MDQzYVxcdTA0M2VcXHUwNDNiXFx1MDQzNVxcdTA0NDFcXHUwNDMwXFxuICAgICAgICAgICAgc3Bpbm5lcltmb3JtS2V5XS5zdHlsZS5zZXRQcm9wZXJ0eShcXFwiLS1yb3RhdGVcXFwiLCByb3RhdGlvbltmb3JtS2V5XSk7XFxuICAgICAgICAgICAgXFwvXFwvIFxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDNhXFx1MDQzZFxcdTA0M2VcXHUwNDNmXFx1MDQzYVxcdTA0NDMgXFx1MDQ0MVxcdTA0M2RcXHUwNDNlXFx1MDQzMlxcdTA0MzAgXFx1MDQzMFxcdTA0M2FcXHUwNDQyXFx1MDQzOFxcdTA0MzJcXHUwNDNkXFx1MDQzZVxcdTA0MzlcXG4gICAgICAgICAgICBmb3JtQnV0dG9uW2Zvcm1LZXldLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xcbiAgICAgICAgICAgIGZvcm1bZm9ybUtleV0udHJpZ2dlcignc3VibWl0Jyk7XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIFxcL1xcLyBcXHUwNDNmXFx1MDQzZVxcdTA0MzRcXHUwNDMzXFx1MDQzZVxcdTA0NDJcXHUwNDMwXFx1MDQzMlxcdTA0M2JcXHUwNDM4XFx1MDQzMlxcdTA0MzBcXHUwNDM1XFx1MDQzYyBcXHUwNDMyXFx1MDQ0MVxcdTA0NTEgXFx1MDQzYSBcXHUwNDNmXFx1MDQzNVxcdTA0NDBcXHUwNDMyXFx1MDQzZVxcdTA0M2NcXHUwNDQzIFxcdTA0MzdcXHUwNDMwXFx1MDQzZlxcdTA0NDNcXHUwNDQxXFx1MDQzYVxcdTA0NDNcXG4gICAgICAgIHNldHVwV2hlZWwoKTtcXG5cXG4gICAgICAgIFxcL1xcL3N1Ym1pdCBcXHUwNDQ0XFx1MDQzZVxcdTA0NDBcXHUwNDNjXFx1MDQ0YiBcXHUwNDNmXFx1MDQzZSBcXHUwNDNhXFx1MDQzYlxcdTA0MzhcXHUwNDNhXFx1MDQ0MyBcXHUwNDNhXFx1MDQzZFxcdTA0M2VcXHUwNDNmXFx1MDQzYVxcdTA0MzVcXG4gICAgICAgIGZvcm1CdXR0b25bZm9ybUtleV0ub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcXG4gICAgICAgICAgICBzdGFydFdoZWVsTmlrYW5kcm92KCk7XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0pO1wiLFwiYmxvY2tQYWRkaW5nVG9wXCI6MCxcImJsb2NrUGFkZGluZ0JvdHRvbVwiOjAsXCJibG9ja0JhY2tncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0ZvcmVncm91bmRDb2xvclwiOlwiXCIsXCJibG9ja0Nzc0NsYXNzXCI6XCJcIixcInJlcGxhY2VWYXJpYWJsZXNcIjpcIlwiLFwiYmxvY2tMaW5rQ29sb3JcIjpcIlwiLFwiYmxvY2tGb250XCI6bnVsbCxcImJsb2NrRm9udEhlYWRlclwiOm51bGwsXCJfX3Zpc2liaWxpdHlcIjpcIntcXFwiZW5hYmxlZFxcXCI6XFxcIlxcXCIsXFxcImRpc2FibGVkXFxcIjpcXFwiXFxcIixcXFwiZW5hYmxlZF9ncm91cF9pZFxcXCI6XFxcIlxcXCIsXFxcImVuYWJsZWRfc2VnbWVudF9pZFxcXCI6XFxcIlxcXCIsXFxcImRpc2FibGVkX2dyb3VwX2lkXFxcIjpcXFwiXFxcIixcXFwiZGlzYWJsZWRfc2VnbWVudF9pZFxcXCI6XFxcIlxcXCIsXFxcInZpc2libGVfZnJvbVxcXCI6XFxcIlxcXCIsXFxcInZpc2libGVfdG9cXFwiOlxcXCJcXFwiLFxcXCJ2aXNpYmxlX3NjaGVkdWxlXFxcIjpbXSxcXFwiaGlkZV91cmxfcGFyYW1cXFwiOlxcXCJcXFwiLFxcXCJoaWRlX3VybF9wYXJhbV92YWx1ZVxcXCI6XFxcIlxcXCIsXFxcInNob3dfdXJsX3BhcmFtXFxcIjpcXFwiXFxcIixcXFwic2hvd191cmxfcGFyYW1fdmFsdWVcXFwiOlxcXCJcXFwiLFxcXCJzaG93X2RvbWFpblxcXCI6XFxcIlxcXCIsXFxcImhpZGVfZG9tYWluXFxcIjpcXFwiXFxcIixcXFwic2hvd190YWdzXFxcIjpcXFwiXFxcIixcXFwiaGlkZV90YWdzXFxcIjpcXFwiXFxcIixcXFwibWluX3Zpc2libGVfd2lkdGhcXFwiOlxcXCIwXFxcIixcXFwibWF4X3Zpc2libGVfd2lkdGhcXFwiOlxcXCI3XFxcIn1cIn0iLCJjc3MiOm51bGx9
```

3\. Сохраните страницу.

Для натройки правильной работы:

1\. Зайдите в настройки формы с колесом и нажмите на список предложений:

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field68269" data-param="items/parts/field68269" data-setting-editable="true" data-title="Элемент" id="bkmrk--2"><div class="image-box image-box-with-border" data-img-src="//fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/0c9114b7b48943d166889ae0e287b784.png/s/s1200x/a/143493/sc/20" data-img-title="" id="bkmrk--3">![](https://fs-thb01.getcourse.ru/fileservice/file/thumbnail/h/0c9114b7b48943d166889ae0e287b784.png/s/s1200x/a/143493/sc/20)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field68269/inner/image/caption">  
</div></div></div>2\. Вам понадобятся id предложений. Их можно скопировать в блокнот, переписать, запомнить, или пока оставить страницу открытой в отдельной вкладке:

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field81174" data-param="items/parts/field81174" data-setting-editable="true" data-title="Элемент" id="bkmrk--4"><div class="image-box image-box-with-border" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/f93d2364c663237d63dfca877c97c070.png/s/s1200x/a/143493/sc/113" data-img-title="" id="bkmrk--5">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/f93d2364c663237d63dfca877c97c070.png/s/s1200x/a/143493/sc/113)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field81174/inner/image/caption">  
</div></div></div>3\. Зайдите в редактор «JavaScript: Код колеса» и отредактируйте часть кода, в котором определяются вероятности выпадения секторов:

<div class="builder-item part-image " data-animation-mode="no" data-item-name="field45936" data-param="items/parts/field45936" data-setting-editable="true" data-title="Элемент" id="bkmrk--6"><div class="image-box image-box-with-border" data-img-src="//fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/5a0bea5dd42b497926309abc6f183464.png/s/s1200x/a/143493/sc/144" data-img-title="" id="bkmrk--7">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/5a0bea5dd42b497926309abc6f183464.png/s/s1200x/a/143493/sc/144)<div class="lt-image-caption" data-editable="true" data-param="items/parts/field45936/inner/image/caption">  
</div></div></div>4\. В этой части кода в столбик перечислены номера предложений. Замените эти номера на свои.

5\. Напротив каждого номера стоят значения, которые определяют вероятность. «0» — нулевая вероятность.

Вот некоторые правила выставления вероятностей:

<div class="builder-item part-text " data-animation-mode="no" data-item-name="text1_14_63_86_88_12_8" data-param="items/parts/text1_14_63_86_88_12_8" data-setting-editable="true" data-title="Элемент" id="bkmrk-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B9%D1%82%D0%B5-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D1%86"><div class="text-large f-text" data-editable="true" data-param="items/parts/text1_14_63_86_88_12_8/inner/text">- используйте только целый положительные числа
- если хотите равные вероятности у всех секторов, просто выставьте «1» везде
- число в поле — это не вероятность напрямую, а вес. Можно указывать числа больше 1000, а их сумма может быть любое. Вероятность сектора с числом 1000 всегда больше, чем вероятность сектора с числом 33.

</div></div>6\. Сохраните. Пользуйтесь.

<div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397356823" data-updated="1653039247" id="bkmrk--9"><div class="lt-block lt-view raw-css lt-raw lt-raw-css lt-system-block lt-invisible-block" data-block-id="1397233738" data-code="b-92952" id="bkmrk--10"><div class="lt-block-wrapper">  
</div></div></div><div class="lite-block-live-wrapper o-lt-embed o-lt-embed-page o-lt-system-block o-lt-invisible-block" data-block-id="1397697900" data-updated="1653039247" id="bkmrk--11"><div class="lt-block lt-view bld01 lt-onecolumn lt-onecolumn-common" data-block-id="2057903523" data-code="b-001b8" id="bkmrk--12"><div class="lt-block-wrapper"><div class="container"><div class="row"><div class="modal-block-content block-box col-md-12 text-left"><div class="builder  animated-block" data-animation-order="in-turn" data-path="items" id="bkmrk--13"><div class="builder-item part-image " data-animation-mode="no" data-item-name="field40749" data-param="items/parts/field40749" data-setting-editable="true" data-title="Элемент" id="bkmrk--14"></div></div></div></div></div></div></div></div>

# Модуль корректировки опечаток в почтовых адресах

[![77.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/scaled-1680-/77.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/77.png)

Автор: [Evgeniy GCboost.ru](https://t.me/zykymeka)

*Большое количество пользователей вводит свои почтовые адреса с опечатками в домене почтового сервиса и соответственно не получают письма из рассылки. При этом находятся в базе getcourse и за них нужно ежемесячно платить.*  
  
*По моему опыту это 15-20% пользователей известных почтовых сервисов. Или ~10% от всей базы. При базе в 100000 это уже потенциально 10000 тех кого мы привлекли, но они не получают письма и мы за них платим ~20000 рублей в месяц.*

*В неё входит сам код и информация по установке.*

*При необходимости, возможна услуга установки скрипта нашим специалистом (оплачивается отдельно).*

#### **Метод установки:**

1\. Загрузите файл в файловое хранилище getcourse.  
2\. Скопируйте путь к файлу  
3\. Перейдите в настройки аккаунта getcourse  
4\. Откройте вкладку «Настройки»  
5\. В текстовое поле «Счетчики и прочие скрипты для BODY» в самый конец добавьте скрипт и замените путь к файлу

[![332.jpg](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/scaled-1680-/332.jpg)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/332.jpg)

**Скрипт - сохранить в формате ".js"**

```javascript
/**
 * Plugin Name: ZygcFixEmailTypos
 * Plugin URI: https://gcboost.ru/shop/zygcfixemailtypos
 * Description: Исправление опечаток в почтовых адресах подписчиков в getcourse
 * Version: 1.1
 * Author: Evgeniy Nayden
 * Author URI: https://gcboost.ru/
 */
;(function(a,i){var l={},o="zy-gc-fix-email-typos",n={init:function(i){let o={debug:!1,access:"admin"};if(l=a.extend(!0,o,i),n.debug("options",i),n.debug("settings",l),!n.checkAccess())return!1;a("head").append(n.getStyles()),n.menuActionInject(),n.modalInject()},debug:function(a="key",i={}){l.debug&&console.log(a,i)},checkAccess:function(){n.debug("checkAccess",window.userInfo);let a=!1;return window.userInfo&&("user"===l.access&&window.userInfo.isInAccount&&(a=!0),"manager"===l.access&&window.userInfo.isManager&&(a=!0),"admin"===l.access&&window.userInfo.isAdmin&&(a=!0)),window.location.pathname.indexOf("pl/user/user")>=0&&a},menuActionInject:function(){n.debug("menuInject",l.menu),window.userInfo&&window.userInfo.isAdmin&&(a(".segment-construct-widget .dropdown-menu.segment-actions-menu").append('\n <li>\n <a href="javascript:void(0)" class="fix-email-typos">Исправить опечатки в адресах</a>\n </li>\n '),a(".dropdown-menu.segment-actions-menu .fix-email-typos").on("click",n.checkEmails))},newEmailInject:function(i,l){i.addClass(`${o}__change`).find("a").addClass(`${o}__notcorrect-email`),"levenshtein"===l.methods?i.append(`\n <div class="${o}__correct-email">\n Возможно: ${l.email}\n </div>\n <button class="btn btn-primary ${o}__complete-change" data-new-email="${l.email}">Заменить</button>\n `):i.append(`\n <div class="${o}__correct-email">\n${l.email}\n </div>\n <button class="btn btn-primary ${o}__complete-change" data-new-email="${l.email}">Заменить</button>\n `),a(`.${o}__change .${o}__complete-change`).on("click",n.modalFixEmailShow)},checkEmails:function(){const i=a('[data-sort="email"]').closest("th").data("col-seq");a(`table tr.gc-user-link[data-user-id] td[data-col-seq="${i}"]`).each(function(){const i=a(this).text().trim(),l=i.slice(i.indexOf("@")+1),o=n.listTypos();let m={};a:for(const a in o)for(const n in o[a])if(o[a][n]===l){m={findtypos:!0,methods:"manual",email:i.slice(0,i.indexOf("@")+1)+a};break a}0==Object.keys(m).length&&(m=n.checkByLevenshtein(i,l)),m.findtypos&&n.newEmailInject(a(this),m)})},checkByLevenshtein:function(a,i){const l=["mail.ru","yandex.ru","gmail.com","rambler.ru","list.ru","bk.ru","inbox.ru","yahoo.com","hotmail.com","inbox.lv","icloud.com","outlook.com","tut.by","ya.ru"];let o,m=-1;for(vd in l){let a=n.levenshteinDistance(i,l[vd]);if(0==a){o=l[vd],m=0;break}(a<=m||m<0)&&(o=l[vd],m=a)}return m>0&&m<4?{findtypos:!0,methods:"levenshtein",email:a.slice(0,a.indexOf("@")+1)+o}:{findtypos:!1,email:a}},levenshteinDistance:function(a,i){if(!a.length)return i.length;if(!i.length)return a.length;const l=[];for(let o=0;o<=i.length;o++){l[o]=[o];for(let n=1;n<=a.length;n++)l[o][n]=0===o?n:Math.min(l[o-1][n]+1,l[o][n-1]+1,l[o-1][n-1]+(a[n-1]===i[o-1]?0:1))}return l[i.length][a.length]},modalInject:function(){let i=`\n <div class="modal zy-gc-modal" id="${o}__modal">\n <div class="modal-dialog" style="width: 50%;">\n <div class="modal-content">\n  <div class="modal-body">\n <div class="gc-modal-content" id="gc-modal-content-1">\n  <div>\n  <input type="text" value="" data-user-id="" class="email-val">\n  <div class="confirmation"></div>\n  </div>\n  <br>\n  <div>\n  <button class="btn btn-primary save-new-email" onclick="return false;">Сохранить</button> \n  или <a href="javascript:void(0);" class="cancel">отменить редактирование</a>\n  </div>\n </div>\n  </div>\n  <div class="close-btn">\n <i class="fa fa-times"></i>\n  </div>\n </div>\n </div>\n </div>\n`;a("body").append(i),a(`#${o}__modal`).find(".save-new-email").on("click",function(){n.fixEmail()}),a(`#${o}__modal`).find(".cancel").on("click",function(){a(`#${o}__modal`).hide()}),a(`#${o}__modal`).find(".close-btn").on("click",function(){a(`#${o}__modal`).hide()})},modalFixEmailShow:function(i){i.preventDefault(),i.stopPropagation();const l=a(i.target).closest("tr.gc-user-link").data("user-id"),n=a(i.target).data("new-email"),m=a(`#${o}__modal`);m.find("input.email-val").val(n).data("user-id",l),m.show()},modalFixEmailHide:function(i){const l=a(`#${o}__modal`);l.hide(),l.find(".confirmation").empty(),l.find(".email-val").val("").data("user-id","")},fixEmail:function(){const i=a(`#${o}__modal`),l=a(`#${o}__modal`).find(".email-val").data("user-id"),m=a(`#${o}__modal`).find(".email-val").val(),e=i.find(".confirmation");ajaxCall("/pl/user/user/set-email",{email:m,user_id:l},{btn:i.find(".save-new-email")},function(i){if(i.data.user_exists){var r=i.data.user;e.html(['Пользователь с таким email уже существует (<a href="'+r.card_link+'" target="_blank">'+r.name+"</a>), он будет удален, продолжить?",'<br /><button class="btn btn-danger save" onclick="return false;">Да</button> <a href="javascript:void(0);" class="fix-email-cancel">Нет</a>'].join(" ")),e.find("button").click(function(){ajaxCall("/pl/user/user/set-email",{email:m,user_id:l,override:1},{btn:e.find("button")},function(i){i.data.finished&&(a.toast("email успешно изменен",{type:"success"}),n.modalFixEmailHide(l),a(`table tr.gc-user-link[data-user-id="${l}"] .${o}__complete-change`).remove())})}),e.find("a").click(function(){n.modalFixEmailHide(l)})}else i.data.finished?(a.toast("email успешно изменен",{type:"success"}),n.modalFixEmailHide(l),a(`table tr.gc-user-link[data-user-id="${l}"] .${o}__complete-change`).remove()):n.modalFixEmailHide(l)})},getStyles:function(){return`\n <style>\n form .form-content {\n position: relative;\n }\n .${o}__change {\n background-color: #f3ec8f;\n }\n .${o}__correct-email {\n color: #0e990e;\n }\n .${o}__notcorrect-email {\n color: #d62c2c;\n }\n .${o}__complete-change {\n margin-top: 5px;\n }\n #${o}__modal {\n background-color: rgba(0,0,0,.6);\n }\n #${o}__modal .modal-dialog {\n height: 100vh;\n display: flex;\n align-items: center;\n }\n #${o}__modal .modal-content {\n width: 100%;\n padding: 10px;\n }\n #${o}__modal .email-val {\n padding: 10px 15px;\n width: 100%;\n }\n #${o}__modal .close-btn {\n position: absolute;\n top: -12px;\n right: -12px;\n font-size: 21px;\n background-color: #ccc;\n width: 30px;\n height: 30px;\n display: flex;\n justify-content: center;\n border-radius: 50%;\n align-items: center;\n cursor: pointer;\n }\n </style>\n`},listTypos:function(){return{"yahoo.com":["ahoo.com","yahoo.com.au","yahoo.come","yaoo.com","yhoo.com","yahoo.ru","hahoo.com","yhaoo.com","yachoo.com","uahoo.com","yahoo.clm","yahoo.mail","yagoo.com","yooho.com","yahoo.con","yahooo.com","yahho.com","yahoo.no","yahoo.ca","yahooc.com","yahnoo.com","yaho.com","yahoo.es","yahoi.com"],"yandex.ru":["ayndex.ru","yabdex.ru","yadex.ru","yandes.ru","yandex.com","yandex.ri","yandex.run","yandex.ruru","yandex.ruu","yandex.ry","yandex.u","yandx.ru","yanex.ru","yndex.com","jandex.ru","yndex.ry","yaandex.ru","yandex.comru","yandex.be","yandex.con","yander.ru","yanfex.ru","ayndex.ua","yandex.yru","yanbex.ru","yandexn.ru","yzndex.ru","yandex.bu","yngex.ru","yandeyx.ru","jandex.ua","yanderx.ru","yndexc.ru","yanlex.ru","yaqndex.ru","yandex.ru.ru","yandez.ru","yandex.rru","yxandex.ru","yand.ru","yandexter.ru","yanked.ru","yunxex.ru","yandex.eu","yardex.ry","yandex.ti","yandexd.ru","yandex.ruas","uandex.ru","yande.ru","yundex.ru","ysndex.ru","yandekx.ru","zandex.ru"],"bk.ru":["bk.com","dk.ru","bk.r","bk.ry","br.ru","bk.u","bk.ruu","bk.tu","bl.ru","bk.ri","bc.ru"],"icloud.com":["incloud.com","icloud.con","cloud.com","icloud.ru","iclod.com","icloud.c","icould.com","icloug.com","84icloud.com","iklood.com"],"gmail.com":["g.mail.com","gail.com","gamil.com","gimail.com","gma.com","gmaik.com","gmail.cim","gmail.cjm","gmail.co.il","gmail.com.il","gmail.comcom","gmail.come","gmail.coming","gmail.con","gmail.coom","gmail.cpm","gmail.kom","gmail.om","gmail.vom","gmail.xom","gmaill.com","gmal.com","gmale.com","gmali.com","gmall.com","gmeil.ru","gnail.com","gnail.con","qmail.com","qmail.ru","ymail.com","google.com","googlemail.ru","gmail.ru","amail.com","qmail.c","gmail.comj","gmail.ckm","inbox.rum","gmall.co","com.gmail","gmail.colm","gmail.hu","gmiail.com","gmail.tu","gmail.ua","gmail.comv","qmail.kom","gmail.cyom","gmail.cvom","gmail.ri","gmail.cov","gmail.col","gnail.cjm","com.gmall","gmajl.com","gjmeil.com","cmail.cjm","g-mail.com","gmi.com","imail.com","gmqil.om","quail.com","email.com","gmail.c","gmail.no","gmil.clm","gmail.ch","gmlil.com","ngmail.com","gmai.cot","gvfil.com","atgmail.com","gmail.rum","gimail.kom","gmail.com.b","emeil.com","gmail.gom","gmail.comm","gmail.c.com","gmail.comnk","gmail.net","gmail.lv","gmali.vom","gmail.gr","g.mail","gmail.it","gmail.com.ru","gmail.co.com","gmail.lt","maul.com","mail.gom","googlmail.com","gmail.comr"],"hotmail.com":["hmail.com","hotmail.be","hotmail.co","hotmal.com","hotmail.ru","hotmail.cim","hotmail.kom","hotmail.ry","hotmail.cov","hotmail.con","htmailm.com","hotmai.com","hotmail.it","hotmail.de"],"inbox.ru":["imbox.ru","inbix.ru","indox.ru","inox.ru","inbox.com","inbox.by","lnbox.ru","inbiox.ru","onbox.lv","inboh.ru","inbux.ru","ibox.pu","inboux.r","inbox.r","inboz.lt","inbvox.lv","inbox.lc","ibbox.lv","in.box.ru","inbx.ru","insbox.ru","unbox.ru","inbo.ru","inbox.ri"],"inbox.lv":["inbo.lv","nbox.lv","indox.lv","inbox.kv","inboc.lv","inbokx.lv","invox.lv","inbox.iv","inboks.lv","inbox.lt","ibox.v"],"list.ru":["ist.ru","lis.ru","list.r","list.ry","list.tu","list.u","lust.ru","lisr.ru","list.rum","iist.ru","llist.ru","listt.ru","liast.ru","list.am"],"mail.ru":["mael.ru","mai.lru","mai.ru","maii.ru","maij.ru","mail.bk","mail.pu","mail.r","mail.rb","mail.ri","mail.rj","mail.rui","mail.ry","mail.rz","mail.th","mail.tu","mail.u","mail.ur","maill.ru","mailr.ru","mal.ru","mall.ru","maul.ru","maul.ry","meil.ru","mil.ru","vail.ru","nail.ru","mail.rup","mailrr.ru","mair.ru","mail.run","mzil.ru","mail.rue","mail.uu","mail.rou","mail.ruf","mail.fu","mapl.ru","mail.rul","mail.rus","maeil.ru","muil.ru","mal.rui","maji.ru","email.ru","maisd.ru","meyl.ru","mail.rua","mail.bg","mail.eru","mailb.ru","maol.ru","mial.ru","mail.fr","maqil.ru","mail.ro","mail.ruy","mqail.ru","maqi.ru","mail.cru","e-mail.ru","mail.rh","mail.ca","mal.ry","lmail.ru","mail.rn","maail.ru","ail.ru","mail.comru","mqil.ru","mfil.ru"],"rambler.ru":["rambler.com","rambler.ry","rambler.u","ramblet.ru","ramdler.ru","ramler.ru","rmbler.ru","rambles.ru","rambler.ri","lrambler.ru","qrambler.ru","rfmbler.ru","ramblerl.ru","rambler.tu","rambjer.ru","rambker.ru","rambler.ruk","raqmbler.ru","rambler.r","ramblr.ru"],"ya.ru":["ya.ry","ya.u","ay.ru","ya.by"],"tut.by":["tut.b","tu.by","tyt.by","tut.bu","tu.by","tut.dy","tut.bv","tut.byby","tuit.by","tut.bt"],"outlook.com":["outlook.ru","outlook.by"]}}};a.zygcfixemailtypos=function(i){return n[i]?n[i].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof i&&i?void a.error("Метод с именем "+i+" не существует для jQuery.zygcfixemailtypos"):n.init.apply(this,arguments)}})(jQuery);
```

**Мини инструкция**

```javascript
1. Загрузите файл zy-gc-fix-email-typos.mi.js к себе на хостинг или в файловое хранилище getcourse.
2. Скопируйте путь к файлу
3. Перейдите в настройки аккаунта getcourse
4. Откройте вкладку "Настройки"
5. В текстовое поле "Счетчики и прочие скрипты для BODY" в самый конец добавьте:
<!-- Модуль помощи в исправлении опечаток -->
<script src="путь/к/файлу/zy-gc-fix-email-typos.js"></script>
<script>$.zygcfixemailtypos();</script>
<!-- / Модуль помощи в исправлении опечаток -->
```

### Проблема

Большое количество пользователей вводит свои почтовые адреса с опечатками в домене почтового сервиса и соответственно не получают письма из рассылки. При этом находятся в базе getcourse и за них нужно ежемесячно платить.

По моему опыту это 15-20% пользователей известных почтовых сервисов. Или ~10% от всей базы. При базе в 100000 это уже потенциально 10000 тех кого мы привлекли, но они не получают письма и мы за них платим ~20000 рублей в месяц.

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/scaled-1680-/wlcimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2025-07/wlcimage.png)

Варианты?

Их в целом 2:

1. Делать валидацию формы регистрации
2. Ручное исправление уже существующих пользователей

В данном модуле реализуется второй вариант. Первый вариант реализован в другом модуле.

### Решение

Поиск пользователей с опечатками в доменах известных почтовых сервисов и их исправление.

Для больших школ это нужно делать ежедневно, для маленьких 1-2 раза в неделю.

Примерная схема работы для технического специалиста такая:

<div class="builder-item part-text" id="bkmrk-%D0%92%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%82%D0%B5%D1%85-%D0%BA%D1%82%D0%BE-%D0%B7%D0%B0%D1%80%D0%B5"><div class="text-normal f-text">1. Выбрать тех кто зарегистрировался вчера и не получил письмо
2. Пройтись взглядом по все адресам
3. Если увидели опечатку в домене: 
    1. открыть профиль пользователя
    2. провести замену почты

</div></div>### Проблемы

Сразу образуется 3 проблемы:

<div class="builder-item part-text" id="bkmrk-%D0%97%D0%B0%D1%82%D1%80%D0%B0%D1%82%D1%8B-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8-%D1%82%D0%B5%D1%85%D0%BD"><div class="text-normal f-text">1. Затраты времени технического специалиста
2. Пропускаются взглядом некоторые пользователи с опечатками
3. Технический специалист может не знать большого количества популярных почтовых сервисов

</div></div>Так же необходимо учитывать, что реализовать полностью автоматическую проверку и корректировку очень сложно, так как существуют варианты при которых пользователя с опечаткой менять не стоит и решать это должен человек.

### Реализация

Для того, чтобы сократить временные затраты технического специалиста и помочь ему не пропустить опечатку — был реализован модуль для getcourse.

Схема работы после подключения такая:

<div class="builder-item part-text" id="bkmrk-%D0%94%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D1%83-%28%D0%BB%D1%8E%D0%B1%D1%83"><div class="text-normal f-text">- Делаем выборку (любую)
- В меню действий добавляется пункт «Исправить опечатки в адресах»
- Скрипт проходится по каждому пользователю и выделяет тех у кого опечатка
- Предлагает вариант для замены и кнопку замены
- При клике по кнопке замены выходит модальное окно с подставленным вариантом, который можно скорректировать вручную
- После подтверждения почта пользователя заменяется на указанную в модальном окне
- Если пользователь с такой почтой уже есть то предлагается его удалить или оставить все без изменений

</div></div><div class="builder-item part-image" id="bkmrk--3"><div class="image-box" id="bkmrk--4">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/5ef27287ce9e3371094ffb74eb47c1fe.png/s/s1200x/a/11874/sc/261)<div class="lt-image-caption">  
</div></div></div><div class="builder-item part-text" id="bkmrk-%D0%92%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D1%8F-%D0%92%D1%8B"><div class="text-normal f-text">1. Выбираем действия
2. Выбираем пункт «Исправить опечатки в адресах»
3. Видим опечатку
4. Вариант для замены
5. Кнопка замены с выводом модального окна
6. Еще пользователь с опечаткой
7. Указан вариант возможной замены. Он работает по формуле расчета расстояния Левенштейна и указывает на возможные опечатки до 3 символов. Например: вместо [gmail.com](http://gmail.com/) → gnaill.con

</div></div>Модальное окно:

<div class="builder-item part-image" id="bkmrk--5"><div class="image-box" id="bkmrk--6">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/e52eba8f354f64a29217f2eae7a6ffd3.png/s/s1200x/a/11874/sc/344)<div class="lt-image-caption">  
</div></div></div>Подставляется почта с предложенным вариантом, который можно тут же вручную отредактировать под другой и вариант сохранения или отмены.

Если пользователь с указанной почтой уже существует то модуль укажет на это и предложит либо удалить пользователя либо отменить замену:

<div class="builder-item part-image" id="bkmrk--7"><div class="image-box" id="bkmrk--8">![](https://fs-thb03.getcourse.ru/fileservice/file/thumbnail/h/f262b07348babefd6358f09c47e37005.png/s/s1200x/a/11874/sc/147)<div class="lt-image-caption">  
</div></div></div>## Backlog

<div class="builder-item part-text" id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5-%D0%B2%D0%B0%D1%80%D0%B8"><div class="text-normal f-text">- Добавить больше вариантов явных опечаток.
- Добавить больше вариантов почтовых сервисов.
- Реализовать подсвечивание адресов со временными (однодневными) почтовыми адресами.
- Реализовать схему проверки опечаток в почтовых адресах с собственными доменами через пинг по mx зоне.

</div></div>

# Как скрыть отображение тренинга через код

Можете сделать это с помощью дополнительного кода [https://dpaste.com/HY5DKJ7RN](https://dpaste.com/HY5DKJ7RN)

```javascript
.stream-table tr[data-training-id="id-тренинга"] {
display: none;
}
```

Вместо значения "id-тренинга" необходимо поставить актуальное. ID тренинга вы можете скопировать из адресной строки [https://skrinshoter.ru/sY82ngfNgWG](https://skrinshoter.ru/sY82ngfNgWG) перейдя в сам тренинг.

Внести код необходимо, согласно скринкасту [https://skrinshoter.ru/vY80cQBbtnC](https://skrinshoter.ru/vY80cQBbtnC)

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-10/scaled-1680-/image.png)](https://skrinshoter.ru/vY80cQBbtnC)

# Скрипты в настройках

#### Дополнительные теги для HEAD (применяются в течение 10 минут )

```html
<!-- START Оформление Remake -->    
<!-- подключение уведомления об изменениях в оформлении для учеников -->
<style>@import url('https://fonts.googleapis.com/css2?family=Golos+Text:wght@400;500;600;700;800;900&display=swap');.message-wrapper{width:100%;position:fixed;left:50%;bottom:50px;background:#333;border-radius:50px;display:flex;flex-direction:row;align-items:center;padding:20px 40px;z-index:10000;max-width:1000px;animation:fadeIn .3s linear 1 forwards 5s;transform:translate(-50%,10px);opacity:0}.message-wrapper.fadeOut{animation:fadeOut .3s linear 1 forwards}.message-text,.message-btn{font-family:'Golos','Manrope',Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;font-size:16px;line-height:140%;color:#fff}.message-text{padding-right:20px}.message-btn{border:none;cursor:pointer;background:#fff;border-radius:30px;padding:20px 89px;transition:.3s all;color:#333}.message-btn:hover{opacity: 0.8;}.message-text a{border-bottom:1px solid #fff;text-decoration:none;color:#fff!important}@media (max-width:991px){.message-wrapper{flex-direction:column;justify-content:center;align-items:center;padding:20px;border-radius:20px}.message-text{margin-bottom:30px;margin-right:0;padding-right:0}}@keyframes fadeIn{0%{transform:translate(-50%,10px);opacity:0}100%{transform:translate(-50%,0);opacity:1}}@keyframes fadeOut{0%{transform:translate(-50%,0);opacity:1}100%{transform:translate(-50%,10px);opacity:0}}</style>




<script>
/* Параметры прелоадера */
const PRELOADER_REMAKE_READY_TIMEOUT = 1500; // таймаут для remake-ready в мс
const PRELOADER_FALLBACK_TIMEOUT = 7000; // таймаут для принудительного скрытия прелоадера в мс
const PRELOADER_COLOR = '#333';

const removePreloader=()=>{$('body').css('opacity','1');$('html').addClass('loaded page-ready')};$(document).on('remake-ready',()=>{setTimeout(()=>{removePreloader()},PRELOADER_REMAKE_READY_TIMEOUT)});setTimeout(()=>{removePreloader()},PRELOADER_FALLBACK_TIMEOUT);</script>

<!-- Подключение Remake -->
<script type="text/javascript" src="/pl/cms/layout/js?hash&bundle=0&id=52740"></script>
<!-- END Оформление Remake -->

<style>
    body {
        opacity: 0;
        transition: opacity 1ms linear;
    }
    #gcAccountUserMenu {
        opacity: 0;
    }
</style>
<script>
    $(() => {
        setTimeout(() => {
            console.log("body loaded");
            $("body").css("opacity", "1");
            $("#gcAccountUserMenu").css("opacity", "1");
        }, 500);
    });
</script>

<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-PF7BJR6');</script>
<!-- End Google Tag Manager -->


<!--<script src="https://getfusion.ru/fusion/plugin.js?hash=97259168913" crossorigin="use-credentials"></script> -->
```

#### Счетчики и прочие скрипты для BODY (применяются в течение 10 минут )

```html
<!--<style>
.vpn-alert {display: none}
</style>-->

<!--<!-- Прямой переход ученика к открытому потоку (подтренингу) -->
<script>
$(document).ready(function () {
  if (window.location.href.indexOf('/teach/control/stream/view') > -1) {
    if (!$('.gc-main-content').hasClass('gc-user-user')) return;

    const $streamTable = $('.stream-table');
    if (!$streamTable.length) return;

    const $subTrainingRows = $streamTable.find('tbody tr');


    const $lessonsList = $('.lesson-list');
    const $lessons = $lessonsList.find('li');

    if ($subTrainingRows.length === 1 && $lessons.length < 1) {
      const link = $subTrainingRows.find('a').attr('href');
      if (link) window.location.href = link;
    }
  }
});
</script>-->


<!-- New design Start -->
<!-- Служебные скрипты -->
<!-- <link rel="stylesheet" href="https://fitnessmama.school/pl/cms/layout/css?id=29679&hash=760805fe8b3b3849412df8b01bdb52f1&bundle=1" />-->
<!-- <script src="https://fitnessmama.school/pl/cms/layout/js?id=29679&hash=760805fe8b3b3849412df8b01bdb52f1&bundle=1"></script>-->



<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PF7BJR6"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

<script>
$(function(){
  $('a[href*="'+window.location.pathname+'"][href$="/editMode/1"]').each((i,el)=>{
    $(el).attr('href', $(el).attr('href').replace('/editMode/1','?editMode=1'));
  });
});
</script>

<!-- IШрифты -->
<style>
@import url('https://fonts.googleapis.com/css2?family=Urbanist:wght@100;200;300;400;500;600;700;800;900&display=swap');
</style>
<!-- New design End -->


<!-- Yandex.Metrika counter -->
<script async type="text/javascript" >
   (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
   m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
   (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

   ym(70381675, "init", {
        clickmap:true,
        trackLinks:true,
        accurateTrackBounce:true,
        webvisor:true
   });
</script>

<noscript><div><img src="https://mc.yandex.ru/watch/70381675" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->

<!-- Модуль проверки ошибок при рассылках -->
<script src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/378/h/efdbab0338b54a8791c0bffc7423ec2e.js"></script>
<script>
$.zygcmailerrors({
  'groups': {
    'default': {
      id: 3355832, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - ошибка в доменной зоне почты'  // название группы в ГК
    },
    'domain': {
      id: 3355831, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - любые ошибки' // название группы в ГК
    },
    'spam': {
      id: 3355834, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - ip в спаме, в сером или черном списке' // название группы в ГК
    },
    'overquota': {
      id: 3355835, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - переполнение почтового ящика пользователя' // название группы в ГК
    },
    'user': {
      id: 3355840, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - почтовый адрес пользователя указан неверно или удален' // название группы в ГК
    },
    'dns': {
      id:3355841, // id группы в ГК
      name: 'GetHelpers. Ошибки рассылки - проблемы с spf, dkim, mx, dmarc' // название группы в ГК
    }
  }
});
</script>
<!-- / Модуль проверки ошибок при рассылках -->

<!-- (GC) Скрыть нулевые заказы на странице Мои покупки -->
<script>
$(document).ready(function () {
  if (window.location.href.indexOf('/sales/control/userProduct/my') > 0 && $('.gc-main-content').hasClass('gc-user-user')) {
    
    $('.table tr').each(function(){
      if ($(this).find('td:last-child').text().trim() === '0€') {
        $(this).hide();
      }
    });
  }
});
</script>


<script>
if (window.userInfo.isAdmin || window.userInfo.isManager || window.userInfo.isTeacher) {

function FindDublicateAccount() {
    // Проверяем наличие блока, в котором записан телефон, в правой панели. Проверка на случай работы у пользователя специального виджета IP телефонии
    if ($('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"] span span').length>0) {
        // записываем телефон в переменную tel, для дальнейшего использования
        var tel = $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"] span span').html();
    } else {
       // записываем телефон в переменную tel, для дальнейшего использования 
       var tel = $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"]').html();
    }
    // Проверяем переменную с телефоном, на предмет наличия в нем значения
    if (!(tel == "null")&&!(typeof tel == 'undefined')&&(tel != '')) {
        // Запрашиваем страницу поиска пользователей по номеру телефона, на всякий случай чистим телефон от любых не цифр!
        $.get('/pl/user/user/search?uc%5Bphone%5D='+tel.replace(/\D/g,'')+'&search=1',function(data) {
            // считаем в полученной странице кол-во строк с пользователями имеющими одинаковый номер телефона
            count = $(data).find('.standard-page-content > table tbody tr').length;
            // удаляем со страницы предыдущий блок с информацией о дублях. Это нужно делать, чтобы избежать дубликатов информационного блока 
            $('span.DublicateAccount').remove();
            // Проверяем кол-во пользователей с таким номером телефона, если пользователь один, тогда выводим после телефона блок с изображением человечка зеленого цвета
            if (count == 1) $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"]').after('<span class="DublicateAccount" style="color:green;"><i class="fa fa-user"  aria-hidden="true"></i><sup><small>'+count+'</small></sup></span>');
            
            // Проверяем кол-во пользователей с таким номером телефона, если пользователей больше чем один, тогда выводим после телефона блок со ссылкой на страницу поиска и красным изображением группы человечков, а в правом верхнем углу выводим кол-во пользователей с таким телефоном (в формате степени числа)
            if (count > 1) $('.user-phone span[data-reactid=".0.1.1.0.0.2.5.2"]').after('<span class="DublicateAccount"><a href="/pl/user/user/search?uc%5Bphone%5D='+tel.replace(/\D/g,'')+'&search=1"  style="color:red;"><i class="fa fa-users" aria-hidden="true"></i><sup><small>'+count+'</small></sup></a></span>');
            
        })
    };
    // Отдельно ищем дубликаты по имени в почте пользователя
    var email = $('.user-email[data-reactid=".0.1.1.0.0.2.3"]').text();
    if (!(email == "null")&&!(typeof email == 'undefined')&&(email != '')) {
	var name_email   = email.match(/^.+(?=@)/)[0]+'@';
        // Ищем дубликаты по имени в почте
        $.get('/pl/user/user/search?search=1&uc%5Bemail%5D='+name_email,function(data) {
            // считаем в полученной странице кол-во строк с пользователями имеющими похожую почту
            count = $(data).find('.standard-page-content > table tbody tr').length;
            // удаляем со страницы предыдущий блок с информацией о дублях. Это нужно делать, чтобы избежать дубликатов информационного блока 
            $('span.DublicateAccountEmail').remove();
            // Проверяем кол-во пользователей с похожей почтой, если пользователь один, тогда выводим после почты блок с изображением человечка зеленого цвета
            if (count == 1) $('.user-email[data-reactid=".0.1.1.0.0.2.3"]').append('<span class="DublicateAccountEmail" style="color:green;"><i class="fa fa-user"  aria-hidden="true"></i><sup><small>'+count+'</small></sup></span>');
            
            // Проверяем кол-во пользователей с таким номером телефона, если пользователей больше чем один, тогда выводим после телефона блок со ссылкой на страницу поиска и красным изображением группы человечков, а в правом верхнем углу выводим кол-во пользователей с таким телефоном (в формате степени числа)
            if (count > 1) $('.user-email[data-reactid=".0.1.1.0.0.2.3"]').append('<span class="DublicateAccountEmail"><a href="/pl/user/user/search?search=1&uc%5Bemail%5D='+name_email+'"  style="color:red;"><i class="fa fa-users" aria-hidden="true"></i><sup><small>'+count+'</small></sup></a></span>');
            
        })
    }
}

// Начинаем отслеживать событие ajaxSuccess во всем документе
$(document).ajaxSuccess(function(event, xhr, settings) {
    
        // Запускаем функцию поиска дубликатов через 1 секунду
        setTimeout(function (){
            // Проверяем, нет ли уже блока с информацией о дубликате.
            if ($('span.DublicateAccount').length==0) FindDublicateAccount()
        },1000);
})

// Запускаем функцию поиска дубликатов после загрузки страницы с задержкой запуска в одну секунду
$(function(){setTimeout(function (){FindDublicateAccount();},1000)});

}
</script>


<!-- Оформление Remake для чатиума -->
<script type="text/javascript" src="/pl/layout/52740/0/chatium-connect.js"></script>
<!-- Оформление Remake для чатиума -->

<!-- START | Меняем цвет фона для администраторов на вебинарной странице -->
<!-- <script>
(function() {
  // Проверка: страница вебинара и пользователь — админ
  if (document.body.classList.contains('isWebinarPage') &&
    window.userInfo.isAdmin === true) {
    // Установка инлайн-стиля
    document.body.style.backgroundColor = '#222 !important';
   console.log(15);
  }
})();
</script> -->




<!-- END | Меняем цвет фона для администраторов на вебинарной странице -->


<!-- Модуль помощи в исправлении опечаток -->
<script src="https://fs.gcfiles.net/fileservice/file/download/a/87136/sc/209/h/05f2811a4524ba191f05cb2af0e51dac.js"></script>
<script>$.zygcfixemailtypos();</script>
<!-- / Модуль помощи в исправлении опечаток -->
```

# Оформление виджета

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2025-12/scaled-1680-/image.png)](https://fitnessmama.school/pl/lite/widget/editor?id=1525558)

#### Оформление виджета

```css
/* === СТИЛИ ДЛЯ ОФФЕРОВ ВО ВСЕХ ФОРМАХ GC === */

.lt-form .form-position {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;

  padding: 14px 16px;
  margin-bottom: 12px;

  background: #f9fafb;
  border: 1px solid #e5e7eb;
  border-radius: 12px;

  cursor: pointer;

  transition: 0.18s ease border-color,
              0.18s ease background-color,
              0.15s ease box-shadow;
}

/* hover */
.lt-form .form-position:hover {
  background: #ffffff;
  border-color: #cbd5e1;
  box-shadow: 0 4px 12px rgba(0,0,0,0.06);
}

/* выбранный оффер (.selected GetCourse добавляет сам) */
.lt-form .form-position.selected {
  background: #eef6ff;
  border-color: #3b82f6;
  box-shadow: 0 6px 16px rgba(59,130,246,0.15);
}

/* Радиокнопка слева */
.lt-form .form-position-checker {
  flex-shrink: 0;
}

.lt-form .form-position-checker input[type="radio"] {
  width: 18px;
  height: 18px;
  accent-color: #3b82f6;
  cursor: pointer;
}

/* Заголовок оффера по центру */
.lt-form .form-position-title {
  flex-grow: 1;
}

.lt-form .form-position-title .offer-title {
  font-size: 14px;
  font-weight: 500;
  color: #111827;
  line-height: 1.3;
}

/* Блок цены справа */
.lt-form .form-position-price {
  flex-shrink: 0;
  text-align: right;
  min-width: 70px;
}

.lt-form .form-position-price__discount {
  font-size: 12px;
  color: #9ca3af;
  text-decoration: line-through;
  display: block;
  line-height: 1.2;
}

.lt-form .final-price {
  font-weight: 700;
  color: #111827;
  font-size: 14px;
}


/* === ПОЛЯ ВВОДА ВО ВСЕХ ФОРМАХ GC === */

.lt-form .f-input,
.lt-form input[type="text"],
.lt-form input[type="email"],
.lt-form input[type="tel"] {
  width: 100%;
  box-sizing: border-box;
  padding: 12px 14px;

  background: #f9fafb;
  border: 1px solid #d1d5db;
  border-radius: 10px;

  font-size: 15px;
  color: #111827;

  transition: 0.18s border-color,
              0.18s box-shadow,
              0.18s background-color;
}

/* отступы между полями (если используется builder) */
.lt-form .builder-item.part-userField {
  margin-bottom: 14px;
}

.lt-form .f-input::placeholder,
.lt-form input::placeholder {
  color: #9ca3af;
}

/* фокус */
.lt-form .f-input:focus,
.lt-form input[type="text"]:focus,
.lt-form input[type="email"]:focus,
.lt-form input[type="tel"]:focus {
  background: #ffffff;
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59,130,246,0.25);
  outline: none;
}

/* ошибка */
.lt-form .f-input.error,
.lt-form .has-error .f-input {
  border-color: #ef4444 !important;
  box-shadow: 0 0 0 3px rgba(239,68,68,0.25);
}


```

##### Скрипт перехода к кастомной ссылке при выборе определенного оффера

```javascript
$(function() {

    $('.btn.f-btn.button-md.btn-success').on('click', function() {

        var freeOfferSelected = $('.form-position-input[data-price-value="0"]').is(':checked');

        if (freeOfferSelected) {
            // ЗАДЕРЖКА перед редиректом
            setTimeout(function() {
               window.top.location.href = "https://buy.stripe.com/4gMdR9d8N2OpdJ10lt3AY0B";

            }, 50);
        }
        
    });

});
```

# Настройка виджетов офферов с редиректом и кастомной ценой

### Что нужно

- `offer_id` нужных офферов (из GC или из HTML: `data-offer-id="..."`)
- ссылка для редиректа (для каждого оффера)
- (опционально) текст “цены”, который показываем вместо реальной

---

## 1) JS: редирект по выбранному offer\_id

Вставь JS и заполни словарь `REDIRECTS`:

```js
<script>
$(function () {

  var REDIRECTS = {
    "7528221": "https://buy.stripe.com/9B6dR98Sx88JcEXfgn3AY0i",
    "7528798": "https://buy.stripe.com/8x25kD7Ot74F5cv6JR3AY0l",
    "7528815": "https://buy.stripe.com/14A9AT0m1dt3dJ19W33AY0k"
  };

  var pendingRedirect = null; // Хранит URL для редиректа после успешной отправки

  // Перед отправкой формы — запоминаем оффер
  $(document).on('click', '.lt-form .btn.f-btn.button-md.btn-success', function (e) {
    var $form = $(this).closest('.lt-form');
    var $selected = $form.find('.form-position-input:checked').closest('.form-position');
    var offerId = ($selected.attr('data-offer-id') || "").toString();

    if (offerId && REDIRECTS[offerId]) {
      // Запоминаем URL для редиректа, НО НЕ блокируем отправку
      pendingRedirect = REDIRECTS[offerId];
    } else {
      pendingRedirect = null;
    }
    // Форма отправляется стандартно через liteForm()
  });

  // После успешной AJAX-отправки — редирект
  $(document).ajaxComplete(function(event, xhr, settings) {
    if (pendingRedirect && xhr.status === 200) {
      try {
        var response = JSON.parse(xhr.responseText);
        // GetCourse возвращает success: true при успешном создании заказа
        if (response.success) {
          window.top.location.href = pendingRedirect;
        }
      } catch (e) {
        // Если не JSON или ошибка парсинга — игнорируем
      }
    }
  });

});
</script>
```

Как добавить новый оффер:  
`"НОВЫЙ_ID": "https://ссылка"`

---

## 2) CSS: порядок офферов + подмена цены

### База (один раз)

```css
.part-manyPositions { display: flex; flex-direction: column; }

.form-position .form-position-price.pull-right { position: relative; }
.form-position .form-position-price.pull-right::before{
  font-size:14px;font-weight:700;color:#111;line-height:1.2;font-family:inherit;visibility:visible;
}

```

### Для каждого оффера (копируй блок и меняй значения)

```css
/* ОФФЕР 7820040 */
.form-position[data-offer-id="7820040"] { order: 1; }
.form-position[data-offer-id="7820040"] .form-position-price.pull-right { visibility:hidden; font-size:0; }
.form-position[data-offer-id="7820040"] .form-position-price.pull-right::before { content:"2 × 110€"; }

/* ОФФЕР 1234567 */
.form-position[data-offer-id="1234567"] { order: 2; }
.form-position[data-offer-id="1234567"] .form-position-price.pull-right { visibility:hidden; font-size:0; }
.form-position[data-offer-id="1234567"] .form-position-price.pull-right::before { content:"199€ (o singura plata)"; }

```

---

## Проверка

- Порядок офферов меняется (через `order`)
- Цена визуально подменена (`content`)
- Редирект срабатывает только для офферов из `REDIRECTS`

# GetCourse: сбор статистики в Google Таблице

Скрипт для Google Sheets, который собирает статистику рассылок, количество пользователей в сегментах и статистику заказов из GetCourse.

## Возможности

- **Письма** — выгрузка статистики рассылок (всего, доставлено, просмотры, клики, отписки, ошибки, запрещено)
- **Сегменты пользователей** — подсчёт пользователей в сегменте по ссылке
- **Сегменты заказов** — статистика заказов: общее количество, платных, сумма платных, оплаченных, сумма оплаченных
- **Мульти-аккаунт** — поддержка нескольких аккаунтов GetCourse

## Требования

- Язык интерфейса пользователя GetCourse должен быть **русским**
- У пользователя должен быть доступ ко всем разделам, из которых собираются данные (рассылки, пользователи, заказы)

## Установка

1. Открыть Google Таблицу
2. **Расширения** → **Apps Script**
3. Удалить содержимое файла `Code.gs`
4. Вставить код из раздела [Код скрипта](#%D0%BA%D0%BE%D0%B4-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0)
5. Сохранить (Ctrl+S)
6. Вернуться в таблицу, обновить страницу
7. В меню появится вкладка **GetCourse**

## Первый запуск

1. **GetCourse → Управление аккаунтами** → добавить аккаунт (имя, email, пароль, домен вида `https://your-school.getcourse.ru`)
2. **GetCourse → Проверить подключение** — убедиться, что авторизация работает
3. При первом запуске Google попросит разрешения — нажать "Разрешить"

## Использование

### Статистика рассылок

1. В ячейки вписать ID рассылок (число) или ссылки на рассылки
2. Выделить эти ячейки
3. **GetCourse → Письма: обновить выбранные**
4. В ячейках справа от ID появятся данные (название, всего, доставлено и т.д.), каждая ячейка с примечанием

### Количество пользователей в сегменте

1. В ячейку вставить ссылку на сегмент (или гиперссылку)
2. Выделить ячейку
3. **GetCourse → Пользователи: кол-во в сегментах**
4. В ячейке справа — количество, через одну — дата обновления

### Статистика заказов в сегменте

1. В ячейку вставить ссылку на сегмент заказов (URL, гиперссылка или формула HYPERLINK с динамическими параметрами)
2. Выделить ячейку
3. **GetCourse → Заказы: статистика сегментов**
4. В ячейках справа появятся: кол-во заказов, платных, сумма платных, оплаченных, сумма оплаченных, дата обновления

Поддерживаются ссылки с `segment_id` (сохранённые сегменты) и с `rule_string` (произвольные выборки).

## Код скрипта

<details id="bkmrk-%2F%2A%2A-%2A-gc%3A-email-stat"><summary></summary>

```javascript
/**
 * GC: Email Stats
 *
 * Сбор статистики рассылок GetCourse прямо в Google Таблице.
 *
 * Установка:
 * 1. Расширения → Apps Script → вставить этот код
 * 2. Вписать ID или ссылки рассылок в ячейки
 * 3. Выделить ячейки → меню GC: Email Stats → Обновить выбранные
 */

// ============================================================
// Меню
// ============================================================

function onOpen() {
  var menuName = 'GetCourse';
  var accounts = getAccounts();
  if (accounts.length > 0) {
    var idx = getActiveAccountIndex();
    var acc = accounts[idx];
    menuName = 'GetCourse [' + (acc.name || acc.email) + ']';
  }

  SpreadsheetApp.getUi()
    .createMenu(menuName)
    .addItem('Письма: обновить выбранные', 'updateSelectedRows')
    .addItem('Пользователи: кол-во в сегментах', 'updateSegmentCounts')
    .addItem('Заказы: статистика сегментов', 'updateDealSegmentStats')
    .addSeparator()
    .addItem('Управление аккаунтами', 'showAccountManager')
    .addItem('Проверить подключение', 'testConnection')
    .addToUi();
}

// ============================================================
// Управление аккаунтами
// ============================================================

function getAccounts() {
  var props = PropertiesService.getScriptProperties();
  var json = props.getProperty('gc_accounts');
  if (!json) return [];
  try { return JSON.parse(json); } catch (e) { return []; }
}

function getActiveAccountIndex() {
  var props = PropertiesService.getScriptProperties();
  var idx = parseInt(props.getProperty('gc_active_account') || '0', 10);
  var accounts = getAccounts();
  if (idx >= accounts.length) idx = 0;
  return idx;
}

function saveAccount(accountData) {
  var accounts = getAccounts();
  var props = PropertiesService.getScriptProperties();

  if (accountData.index !== undefined && accountData.index !== null && accountData.index >= 0 && accountData.index < accounts.length) {
    accounts[accountData.index] = {
      name: accountData.name,
      email: accountData.email,
      password: accountData.password,
      domain: accountData.domain
    };
  } else {
    accounts.push({
      name: accountData.name,
      email: accountData.email,
      password: accountData.password,
      domain: accountData.domain
    });
  }

  props.setProperty('gc_accounts', JSON.stringify(accounts));

  if (accounts.length === 1) {
    props.setProperty('gc_active_account', '0');
  }

  return accounts.length - 1;
}

function deleteAccount(index) {
  var accounts = getAccounts();
  var props = PropertiesService.getScriptProperties();

  if (index < 0 || index >= accounts.length) return;
  accounts.splice(index, 1);
  props.setProperty('gc_accounts', JSON.stringify(accounts));

  var activeIdx = getActiveAccountIndex();
  if (index === activeIdx) {
    props.setProperty('gc_active_account', '0');
    CacheService.getScriptCache().remove('gc_session');
  } else if (index < activeIdx) {
    props.setProperty('gc_active_account', String(activeIdx - 1));
  }
}

function setActiveAccount(index) {
  var accounts = getAccounts();
  if (index < 0 || index >= accounts.length) return;
  PropertiesService.getScriptProperties().setProperty('gc_active_account', String(index));
  CacheService.getScriptCache().remove('gc_session');
}

function getAccountsForDialog() {
  var accounts = getAccounts();
  var activeIdx = getActiveAccountIndex();
  return { accounts: accounts, activeIndex: activeIdx };
}

function getConfig() {
  var accounts = getAccounts();
  if (accounts.length === 0) {
    throw new Error('NO_ACCOUNTS: Нет сохранённых аккаунтов. Добавьте аккаунт через меню GetCourse → Управление аккаунтами.');
  }
  var idx = getActiveAccountIndex();
  var acc = accounts[idx];
  return {
    email: acc.email,
    password: acc.password,
    domain: acc.domain
  };
}

// ============================================================
// Диалог управления аккаунтами
// ============================================================

function showAccountManager() {
  var html = HtmlService.createHtmlOutput(getAccountManagerHtml_())
    .setWidth(520)
    .setHeight(480)
    .setTitle('Управление аккаунтами');
  SpreadsheetApp.getUi().showModalDialog(html, 'Управление аккаунтами GetCourse');
}

function getAccountManagerHtml_() {
  return '\
\
<html>\
<head>\
<style>\
  * { box-sizing: border-box; font-family: "Google Sans", Roboto, Arial, sans-serif; }\
  body { margin: 0; padding: 16px; font-size: 14px; color: #202124; }\
  h3 { margin: 0 0 12px; font-size: 16px; }\
  .account-list { margin-bottom: 16px; }\
  .account-item {\
    display: flex; align-items: center; padding: 10px 12px;\
    border: 1px solid #dadce0; border-radius: 8px; margin-bottom: 8px;\
    cursor: pointer; transition: background 0.15s;\
  }\
  .account-item:hover { background: #f1f3f4; }\
  .account-item.active { border-color: #1a73e8; background: #e8f0fe; }\
  .account-item .info { flex: 1; margin-left: 10px; }\
  .account-item .name { font-weight: 500; }\
  .account-item .email { font-size: 12px; color: #5f6368; }\
  .account-item .domain { font-size: 11px; color: #80868b; }\
  .account-item .actions { display: flex; gap: 4px; }\
  .btn { padding: 6px 16px; border-radius: 4px; border: 1px solid #dadce0;\
    background: #fff; cursor: pointer; font-size: 13px; }\
  .btn:hover { background: #f1f3f4; }\
  .btn-primary { background: #1a73e8; color: #fff; border: none; }\
  .btn-primary:hover { background: #1557b0; }\
  .btn-danger { color: #d93025; border-color: #d93025; }\
  .btn-danger:hover { background: #fce8e6; }\
  .btn-sm { padding: 4px 10px; font-size: 12px; }\
  .form-group { margin-bottom: 12px; }\
  .form-group label { display: block; margin-bottom: 4px; font-size: 12px; color: #5f6368; }\
  .form-group input { width: 100%; padding: 8px 10px; border: 1px solid #dadce0;\
    border-radius: 4px; font-size: 14px; }\
  .form-group input:focus { outline: none; border-color: #1a73e8; }\
  .form-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; }\
  .radio { width: 16px; height: 16px; accent-color: #1a73e8; cursor: pointer; }\
  .empty { text-align: center; padding: 24px; color: #80868b; }\
  #form-section { display: none; }\
</style>\
</head>\
<body>\
\
<div id="list-section">\
  <h3>Аккаунты</h3>\
  <div id="account-list" class="account-list"><div class="empty">Загрузка...</div></div>\
  <button class="btn btn-primary" onclick="showForm(-1)">+ Добавить аккаунт</button>\
</div>\
\
<div id="form-section">\
  <h3 id="form-title">Добавить аккаунт</h3>\
  <input type="hidden" id="edit-index" value="-1">\
  <div class="form-group">\
    <label>Название (для удобства)</label>\
    <input type="text" id="f-name" placeholder="Например: Фитнес Мама">\
  </div>\
  <div class="form-group">\
    <label>Email</label>\
    <input type="email" id="f-email" placeholder="user@example.com">\
  </div>\
  <div class="form-group">\
    <label>Пароль</label>\
    <input type="password" id="f-password" placeholder="Пароль от GetCourse">\
  </div>\
  <div class="form-group">\
    <label>Домен школы</label>\
    <input type="url" id="f-domain" placeholder="https://myschool.getcourse.ru">\
  </div>\
  <div class="form-actions">\
    <button class="btn" onclick="showList()">Отмена</button>\
    <button class="btn btn-primary" onclick="saveForm()">Сохранить</button>\
  </div>\
</div>\
\
<script>\
var currentData = { accounts: [], activeIndex: 0 };\
\
function load() {\
  google.script.run.withSuccessHandler(function(data) {\
    currentData = data;\
    render();\
  }).getAccountsForDialog();\
}\
\
function render() {\
  var list = document.getElementById("account-list");\
  if (currentData.accounts.length === 0) {\
    list.innerHTML = "<div class=\\"empty\\">Нет аккаунтов. Добавьте первый аккаунт.</div>";\
    return;\
  }\
  var html = "";\
  for (var i = 0; i < currentData.accounts.length; i++) {\
    var a = currentData.accounts[i];\
    var isActive = (i === currentData.activeIndex);\
    html += "<div class=\\"account-item" + (isActive ? " active" : "") + "\\">";\
    html += "<input type=\\"radio\\" class=\\"radio\\" name=\\"active\\" " + (isActive ? "checked" : "") + " onclick=\\"activate(" + i + ")\\">";\
    html += "<div class=\\"info\\">";\
    html += "<div class=\\"name\\">" + esc(a.name || "Без названия") + (isActive ? " ✓" : "") + "</div>";\
    html += "<div class=\\"email\\">" + esc(a.email) + "</div>";\
    html += "<div class=\\"domain\\">" + esc(a.domain) + "</div>";\
    html += "</div>";\
    html += "<div class=\\"actions\\">";\
    html += "<button class=\\"btn btn-sm\\" onclick=\\"event.stopPropagation();showForm(" + i + ")\\">Изм.</button>";\
    html += "<button class=\\"btn btn-sm btn-danger\\" onclick=\\"event.stopPropagation();del(" + i + ")\\">✕</button>";\
    html += "</div></div>";\
  }\
  list.innerHTML = html;\
}\
\
function esc(s) { var d = document.createElement("div"); d.textContent = s; return d.innerHTML; }\
\
function activate(idx) {\
  google.script.run.withSuccessHandler(function() {\
    currentData.activeIndex = idx;\
    render();\
  }).setActiveAccount(idx);\
}\
\
function del(idx) {\
  if (!confirm("Удалить аккаунт \\"" + (currentData.accounts[idx].name || currentData.accounts[idx].email) + "\\"?")) return;\
  google.script.run.withSuccessHandler(function() { load(); }).deleteAccount(idx);\
}\
\
function showForm(idx) {\
  document.getElementById("list-section").style.display = "none";\
  document.getElementById("form-section").style.display = "block";\
  document.getElementById("edit-index").value = idx;\
  if (idx >= 0 && idx < currentData.accounts.length) {\
    var a = currentData.accounts[idx];\
    document.getElementById("form-title").textContent = "Редактировать аккаунт";\
    document.getElementById("f-name").value = a.name || "";\
    document.getElementById("f-email").value = a.email || "";\
    document.getElementById("f-password").value = a.password || "";\
    document.getElementById("f-domain").value = a.domain || "";\
  } else {\
    document.getElementById("form-title").textContent = "Добавить аккаунт";\
    document.getElementById("f-name").value = "";\
    document.getElementById("f-email").value = "";\
    document.getElementById("f-password").value = "";\
    document.getElementById("f-domain").value = "";\
  }\
}\
\
function showList() {\
  document.getElementById("form-section").style.display = "none";\
  document.getElementById("list-section").style.display = "block";\
}\
\
function saveForm() {\
  var idx = parseInt(document.getElementById("edit-index").value, 10);\
  var data = {\
    index: idx >= 0 ? idx : null,\
    name: document.getElementById("f-name").value.trim(),\
    email: document.getElementById("f-email").value.trim(),\
    password: document.getElementById("f-password").value,\
    domain: document.getElementById("f-domain").value.trim().replace(/\\/+$/, "")\
  };\
  if (!data.email || !data.password || !data.domain) {\
    alert("Заполните Email, Пароль и Домен.");\
    return;\
  }\
  google.script.run.withSuccessHandler(function() {\
    showList();\
    load();\
  }).saveAccount(data);\
}\
\
load();\
</script>\
</body>\
</html>';
}

// ============================================================
// Авторизация
// ============================================================

/**
 * Логин в GetCourse по email/паролю через AJAX API.
 * GetCourse использует React-форму и эндпоинт /user/public/user/json
 * Возвращает строку cookies для авторизованной сессии.
 */
function login() {
  var config = getConfig();
  var ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';

  // Шаг 1: GET любой страницы для получения начального cookie сессии
  var getResp = UrlFetchApp.fetch(config.domain + '/cms/system/login', {
    method: 'get',
    headers: { 'User-Agent': ua },
    muteHttpExceptions: true,
    followRedirects: true
  });
  var initialCookies = extractAllCookies_(getResp);

  // Шаг 2: AJAX-логин через /user/public/user/json
  var ajaxUrl = config.domain + '/user/public/user/json';
  var postResp = UrlFetchApp.fetch(ajaxUrl, {
    method: 'post',
    headers: {
      'User-Agent': ua,
      'Content-Type': 'application/x-www-form-urlencoded',
      'X-Requested-With': 'XMLHttpRequest',
      'Referer': config.domain + '/cms/system/login',
      'Cookie': initialCookies
    },
    payload: 'action=login&email=' + encodeURIComponent(config.email) +
             '&password=' + encodeURIComponent(config.password),
    muteHttpExceptions: true,
    followRedirects: false
  });

  var postCode = postResp.getResponseCode();
  var postBody = postResp.getContentText();
  var postCookies = extractAllCookies_(postResp);
  var finalCookies = mergeCookies_(initialCookies, postCookies);

  // Парсим JSON-ответ
  var json;
  try {
    json = JSON.parse(postBody);
  } catch (e) {
    throw new Error('LOGIN_FAILED: Неожиданный ответ сервера (HTTP ' + postCode + '): ' + postBody.substring(0, 200));
  }

  // Проверяем результат
  if (json.error) {
    throw new Error('LOGIN_FAILED: ' + (json.error.message || json.error.text || JSON.stringify(json.error)));
  }

  // Шаг 3: Если в ответе есть redirectUrl — переходим по нему (устанавливает финальные cookies)
  if (json.data && json.data.redirectUrl) {
    var redirectUrl = json.data.redirectUrl;
    if (redirectUrl.indexOf('http') !== 0) {
      redirectUrl = config.domain + redirectUrl;
    }
    var redirResp = UrlFetchApp.fetch(redirectUrl, {
      method: 'get',
      headers: { 'User-Agent': ua, 'Cookie': finalCookies },
      muteHttpExceptions: true,
      followRedirects: true
    });
    var redirCookies = extractAllCookies_(redirResp);
    finalCookies = mergeCookies_(finalCookies, redirCookies);
  }

  // Шаг 4: Проверяем что авторизация работает
  var testResp = UrlFetchApp.fetch(config.domain + '/notifications/control/mailings/active', {
    method: 'get',
    headers: { 'User-Agent': ua, 'Cookie': finalCookies },
    muteHttpExceptions: true,
    followRedirects: true
  });
  var testCookies = extractAllCookies_(testResp);
  finalCookies = mergeCookies_(finalCookies, testCookies);

  if (isLoginPage_(testResp.getContentText())) {
    throw new Error('LOGIN_FAILED: Логин прошёл, но сессия не активна. Ответ JSON: ' + postBody.substring(0, 300));
  }

  // Сохраняем cookies в кеш на 2 часа
  CacheService.getScriptCache().put('gc_session', finalCookies, 7200);
  return finalCookies;
}

/**
 * Извлекает ВСЕ cookies из заголовков Set-Cookie ответа.
 * Возвращает строку "name1=val1; name2=val2"
 */
function extractAllCookies_(response) {
  var allHeaders = response.getAllHeaders();
  var setCookieHeaders = allHeaders['Set-Cookie'];
  if (!setCookieHeaders) return '';

  if (typeof setCookieHeaders === 'string') {
    setCookieHeaders = [setCookieHeaders];
  }

  var cookies = {};
  for (var i = 0; i < setCookieHeaders.length; i++) {
    var pair = setCookieHeaders[i].split(';')[0]; // берём только name=value
    var eqIdx = pair.indexOf('=');
    if (eqIdx > 0) {
      var name = pair.substring(0, eqIdx).trim();
      var value = pair.substring(eqIdx + 1).trim();
      cookies[name] = value;
    }
  }

  var parts = [];
  for (var key in cookies) {
    parts.push(key + '=' + cookies[key]);
  }
  return parts.join('; ');
}

/**
 * Объединяет две строки cookies. Новые перезаписывают старые.
 */
function mergeCookies_(existing, fresh) {
  if (!fresh) return existing;
  if (!existing) return fresh;

  var cookies = {};

  // Парсим существующие
  var parts = existing.split(';');
  for (var i = 0; i < parts.length; i++) {
    var eqIdx = parts[i].indexOf('=');
    if (eqIdx > 0) {
      cookies[parts[i].substring(0, eqIdx).trim()] = parts[i].substring(eqIdx + 1).trim();
    }
  }

  // Перезаписываем новыми
  parts = fresh.split(';');
  for (var j = 0; j < parts.length; j++) {
    var eqIdx2 = parts[j].indexOf('=');
    if (eqIdx2 > 0) {
      cookies[parts[j].substring(0, eqIdx2).trim()] = parts[j].substring(eqIdx2 + 1).trim();
    }
  }

  var result = [];
  for (var key in cookies) {
    result.push(key + '=' + cookies[key]);
  }
  return result.join('; ');
}

/**
 * Возвращает актуальный cookie сессии.
 * Сначала проверяет кеш, если нет — логинится заново.
 */
function getSessionCookie() {
  var cached = CacheService.getScriptCache().get('gc_session');
  if (cached) return cached;
  return login();
}

// ============================================================
// HTTP-запрос к GetCourse
// ============================================================

function fetchMailingPage(mailingId) {
  var config = getConfig();
  var url = config.domain + '/notifications/control/mailings/update/id/' + mailingId + '/part/main';
  var sessionCookie = getSessionCookie();

  var html = fetchWithSession_(url, sessionCookie);

  // Проверяем, не попали ли на страницу логина
  if (isLoginPage_(html)) {
    // Сессия истекла — перелогиниваемся
    CacheService.getScriptCache().remove('gc_session');
    sessionCookie = login();
    html = fetchWithSession_(url, sessionCookie);

    if (isLoginPage_(html)) {
      throw new Error('LOGIN_FAILED: Не удалось авторизоваться');
    }
  }

  return html;
}

function fetchWithSession_(url, sessionCookie) {
  var response = UrlFetchApp.fetch(url, {
    method: 'get',
    headers: {
      'Cookie': sessionCookie,
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
      'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
    },
    muteHttpExceptions: true,
    followRedirects: true
  });

  var code = response.getResponseCode();
  if (code !== 200) {
    throw new Error('HTTP_ERROR_' + code);
  }

  return response.getContentText();
}

function isLoginPage_(html) {
  return html.indexOf('action="/cms/system/login"') !== -1 ||
         html.indexOf('id="loginForm"') !== -1 ||
         html.indexOf('LoginForm[email]') !== -1 ||
         html.indexOf('LoginForm%5Bemail%5D') !== -1 ||
         html.indexOf('Pagina de logare') !== -1 ||
         html.indexOf('page-cms_system-login') !== -1 ||
         (html.indexOf('login') !== -1 && html.indexOf('Статистика рассылки') === -1 && html.indexOf('gc-user-logined') === -1);
}

// ============================================================
// Парсинг HTML
// ============================================================

function parseMailingStats(html) {
  var stats = {
    title: '',
    total: 0,
    delivered: 0,
    views: 0,
    clicks: 0,
    unsubscribes: 0,
    errors: 0,
    restricted: 0
  };

  // Название рассылки из <title>
  var titleMatch = html.match(/<title>([^<]+)<\/title>/);
  if (titleMatch) {
    stats.title = titleMatch[1].trim();
  }

  // --- Панель 1: "Статистика рассылки" (values-table) ---

  // Всего сообщений
  var totalMatch = html.match(/Всего сообщений<\/td>\s*<td[^>]*>\s*<a[^>]*>\s*([\d\s]+)\s*<\/a>/);
  if (totalMatch) {
    stats.total = parseInt(totalMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // доставлено
  var deliveredMatch = html.match(/<td class="subkey">\s*доставлено\s*<\/td>\s*<td[^>]*>\s*<a[^>]*>\s*([\d\s]+)\s*<\/a>/);
  if (deliveredMatch) {
    stats.delivered = parseInt(deliveredMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // ошибка
  var errorsMatch = html.match(/<td class="subkey">\s*ошибка\s*<\/td>\s*<td[^>]*>\s*<a[^>]*>\s*([\d\s]+)\s*<\/a>/);
  if (errorsMatch) {
    stats.errors = parseInt(errorsMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // запрещено
  var restrictedMatch = html.match(/<td class="subkey">\s*запрещено\s*<\/td>\s*<td[^>]*>\s*<a[^>]*>\s*([\d\s]+)\s*<\/a>/);
  if (restrictedMatch) {
    stats.restricted = parseInt(restrictedMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // --- Панель 2: "Статистика пользователей" ---

  // просмотров (открытия)
  var viewsMatch = html.match(/([\d\s]+)\s*просмотр[а-я]*\s*\(/);
  if (viewsMatch) {
    stats.views = parseInt(viewsMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // кликов
  var clicksMatch = html.match(/([\d\s]+)\s*клик[а-я]*\s*\(/);
  if (clicksMatch) {
    stats.clicks = parseInt(clicksMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  // отписки
  var unsubMatch = html.match(/([\d\s]+)\s*отписк[а-яё]*\s*\(/);
  if (unsubMatch) {
    stats.unsubscribes = parseInt(unsubMatch[1].replace(/\s/g, ''), 10) || 0;
  }

  return stats;
}

// ============================================================
// Извлечение ID из ячейки
// ============================================================

function extractMailingId_(cellValue) {
  if (!cellValue) return null;

  var str = String(cellValue).split(/\s*\|\s*/)[0].trim();

  // Если чистое число
  if (/^\d+$/.test(str)) return str;

  // URL с /id/ЧИСЛО
  var urlMatch = str.match(/\/id\/(\d+)/);
  if (urlMatch) return urlMatch[1];

  // Первое число в строке
  var numMatch = str.match(/(\d{5,})/);
  if (numMatch) return numMatch[1];

  return null;
}

// ============================================================
// Обновление статистики
// ============================================================

function updateSelectedRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var selection = sheet.getActiveRange();

  if (!selection) {
    SpreadsheetApp.getUi().alert('Выделите ячейки с ID рассылок.');
    return;
  }

  var updated = 0;
  var numRows = selection.getNumRows();
  var numCols = selection.getNumColumns();
  var startRow = selection.getRow();
  var startCol = selection.getColumn();

  for (var r = 0; r < numRows; r++) {
    for (var c = 0; c < numCols; c++) {
      var cell = sheet.getRange(startRow + r, startCol + c);
      var cellValue = cell.getValue();
      if (!cellValue) continue;

      var mailingId = extractMailingId_(cellValue);
      if (!mailingId) continue;

      ss.toast('Обработка ID ' + mailingId + '...', 'GetCourse', 3);

      var row = startRow + r;
      var col = startCol + c;

      try {
        var html = fetchMailingPage(mailingId);
        var stats = parseMailingStats(html);
        var now = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd.MM.yyyy HH:mm');

        var fields = [
          [stats.title, 'Название'],
          [stats.total, 'Всего'],
          [stats.delivered, 'Доставлено'],
          [stats.views, 'Просмотры'],
          [stats.clicks, 'Клики'],
          [stats.unsubscribes, 'Отписки'],
          [stats.errors, 'Ошибки'],
          [stats.restricted, 'Запрещено'],
          [now, 'Обновлено']
        ];

        for (var i = 0; i < fields.length; i++) {
          sheet.getRange(row, col + 1 + i).setValue(fields[i][0]).setNote(fields[i][1]);
        }
        SpreadsheetApp.flush();
        updated++;
      } catch (e) {
        if (e.message.indexOf('LOGIN_FAILED') !== -1) {
          SpreadsheetApp.getUi().alert('Ошибка авторизации: ' + e.message);
          return;
        }
        sheet.getRange(row, col + 1).setValue('Ошибка: ' + e.message).setNote('Ошибка');
        SpreadsheetApp.flush();
      }

      Utilities.sleep(500);
    }
  }

  ss.toast('Обновлено: ' + updated, 'GC: Email Stats', 5);
}

// ============================================================
// Сегменты: количество пользователей
// ============================================================

function extractSegmentUrl_(cell) {
  // 1. Rich-text ссылка — работает для HYPERLINK формул (включая с &/TEXT),
  //    и для ссылок вставленных через Ctrl+K
  var richText = cell.getRichTextValue();
  if (richText) {
    var url = richText.getLinkUrl();
    if (url) return url;

    var runs = richText.getRuns();
    for (var i = 0; i < runs.length; i++) {
      var runUrl = runs[i].getLinkUrl();
      if (runUrl) return runUrl;
    }
  }

  // 2. HYPERLINK-формула с простой строкой: =HYPERLINK("url"; "text")
  var formula = cell.getFormula();
  if (formula) {
    var m = formula.match(/HYPERLINK\s*\(\s*"([^"]+)"/i);
    if (m) return m[1];
  }

  // 3. Обычный текст URL
  var val = String(cell.getValue()).trim();
  if (val.match(/^https?:\/\//)) return val;

  return null;
}

function fetchSegmentPage(url) {
  var sessionCookie = getSessionCookie();
  var html = fetchWithSession_(url, sessionCookie);

  if (isLoginPage_(html)) {
    CacheService.getScriptCache().remove('gc_session');
    sessionCookie = login();
    html = fetchWithSession_(url, sessionCookie);

    if (isLoginPage_(html)) {
      throw new Error('LOGIN_FAILED: Не удалось авторизоваться');
    }
  }

  return html;
}

function parseSegmentCount(html) {
  // <div class="summary">Показаны <b>1-30</b> из <b>1 941</b> записи.</div>
  var m = html.match(/<div class="summary">Показаны\s*<b>[^<]+<\/b>\s*из\s*<b>([\d\s]+)<\/b>/);
  if (m) return parseInt(m[1].replace(/\s/g, ''), 10);
  return null;
}

function updateSegmentCounts() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var selection = sheet.getActiveRange();

  if (!selection) {
    SpreadsheetApp.getUi().alert('Выделите ячейки со ссылками на сегменты.');
    return;
  }

  var updated = 0;
  var numRows = selection.getNumRows();
  var numCols = selection.getNumColumns();
  var startRow = selection.getRow();
  var startCol = selection.getColumn();

  for (var r = 0; r < numRows; r++) {
    for (var c = 0; c < numCols; c++) {
      var cell = sheet.getRange(startRow + r, startCol + c);
      if (!cell.getValue()) continue;

      var url = extractSegmentUrl_(cell);
      if (!url) continue;

      ss.toast('Обработка сегмента...', 'GC: Сегменты', 3);

      try {
        var html = fetchSegmentPage(url);
        var count = parseSegmentCount(html);

        if (count === null) {
          ss.toast('Не удалось найти количество пользователей', 'GC: Сегменты', 3);
          continue;
        }

        var now = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd.MM.yyyy HH:mm');
        var col = startCol + c;

        sheet.getRange(startRow + r, col + 1).setValue(count);
        sheet.getRange(startRow + r, col + 2).setValue(now);
        SpreadsheetApp.flush();
        updated++;
      } catch (e) {
        if (e.message.indexOf('LOGIN_FAILED') !== -1) {
          SpreadsheetApp.getUi().alert('Ошибка авторизации: ' + e.message);
          return;
        }
        sheet.getRange(startRow + r, startCol + c + 1).setValue('Ошибка: ' + e.message);
        SpreadsheetApp.flush();
      }

      Utilities.sleep(500);
    }
  }

  ss.toast('Обновлено: ' + updated, 'GC: Сегменты', 5);
}

// ============================================================
// Сегменты заказов (deals): статистика
// ============================================================

/**
 * Извлекает rule_string из URL сегмента заказов.
 * Поддерживает форматы: DealContext[rule_string]=... и DealContext%5Brule_string%5D=...
 */
function extractDealRule_(url) {
  var decoded = decodeURIComponent(url);
  var m = decoded.match(/DealContext\[rule_string\]=([^&]*)/);
  if (m && m[1]) {
    return decodeURIComponent(m[1]);
  }
  return null;
}

/**
 * Извлекает JSON-объект из строки начиная с позиции открывающей скобки {.
 * Считает вложенные {} для нахождения правильной закрывающей скобки.
 */
function extractJsonObject_(str, startPos) {
  if (str.charAt(startPos) !== '{') return null;
  var depth = 0;
  var inString = false;
  var escape = false;
  for (var i = startPos; i < str.length; i++) {
    var ch = str.charAt(i);
    if (escape) { escape = false; continue; }
    if (ch === '\\') { escape = true; continue; }
    if (ch === '"') { inString = !inString; continue; }
    if (inString) continue;
    if (ch === '{') depth++;
    if (ch === '}') { depth--; if (depth === 0) return str.substring(startPos, i + 1); }
  }
  return null;
}

/**
 * Для сохранённых сегментов (segment_id без rule_string):
 * загружает страницу и извлекает правило из инициализации rulePlugin({"rule": {...}}).
 */
function fetchRuleFromPage_(url, sessionCookie) {
  var html = fetchWithSession_(url, sessionCookie);

  if (isLoginPage_(html)) {
    CacheService.getScriptCache().remove('gc_session');
    sessionCookie = login();
    html = fetchWithSession_(url, sessionCookie);
    if (isLoginPage_(html)) {
      throw new Error('LOGIN_FAILED: Не удалось авторизоваться');
    }
  }

  // Ищем rulePlugin({ в HTML и извлекаем полный JSON-аргумент
  var marker = 'rulePlugin(';
  var idx = html.indexOf(marker + '{');
  if (idx === -1) return null;

  var jsonStart = idx + marker.length;
  var jsonStr = extractJsonObject_(html, jsonStart);
  if (!jsonStr) return null;

  try {
    var config = JSON.parse(jsonStr);
    if (config.rule) {
      return JSON.stringify(config.rule);
    }
  } catch (e) {}

  return null;
}

/**
 * Извлекает домен из URL сегмента (https://domain.com).
 */
function extractDomain_(url) {
  var m = url.match(/^(https?:\/\/[^\/]+)/);
  return m ? m[1] : null;
}

/**
 * Сериализует JS-объект в формат jQuery $.param() (nested keys).
 * {rule: {type: "x", params: {mode: "and"}}} →
 * "rule[type]=x&rule[params][mode]=and"
 */
function jqueryParam_(obj, prefix) {
  var parts = [];
  for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;
    var fullKey = prefix ? prefix + '[' + key + ']' : key;
    var val = obj[key];
    if (val !== null && typeof val === 'object') {
      parts.push(jqueryParam_(val, fullKey));
    } else {
      parts.push(encodeURIComponent(fullKey) + '=' + encodeURIComponent(val === null ? '' : val));
    }
  }
  return parts.filter(function(s) { return s; }).join('&');
}

/**
 * Загружает статистику заказов через AJAX-эндпоинт /pl/sales/stat/short-chart-data.
 * Отправляет rule как nested form params (формат jQuery $.param).
 * Возвращает HTML-фрагмент со статистикой.
 */
function fetchDealStatsAjax_(domain, rule, sessionCookie) {
  var statUrl = domain + '/pl/sales/stat/short-chart-data';

  var ruleObj = null;
  if (rule) {
    try { ruleObj = JSON.parse(rule); } catch (e) { ruleObj = null; }
  }

  var payload = jqueryParam_({ rule: ruleObj });

  var response = UrlFetchApp.fetch(statUrl, {
    method: 'post',
    headers: {
      'Cookie': sessionCookie,
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
      'Content-Type': 'application/x-www-form-urlencoded',
      'X-Requested-With': 'XMLHttpRequest',
      'Referer': domain + '/pl/sales/deal/index'
    },
    payload: payload,
    muteHttpExceptions: true,
    followRedirects: true
  });

  var code = response.getResponseCode();
  if (code !== 200) {
    throw new Error('STAT_HTTP_ERROR_' + code);
  }

  var body = response.getContentText();
  var json;
  try {
    json = JSON.parse(body);
  } catch (e) {
    throw new Error('STAT_PARSE_ERROR: ' + body.substring(0, 200));
  }

  if (!json.success || !json.data || !json.data.html) {
    throw new Error('STAT_ERROR: ' + body.substring(0, 200));
  }

  return json.data.html;
}

/**
 * Парсит общее кол-во заказов со страницы.
 * Источники: summary div или rule-test-block (data-count).
 */
function parseDealPageTotal_(html) {
  // 1. rule-test-block: data-count="487"
  var dataCount = html.match(/data-count="(\d+)"/);
  if (dataCount) {
    return parseInt(dataCount[1], 10);
  }

  // 2. summary: из <b>89301</b> запись
  var summary = html.match(/<div class="summary">Показаны\s*<b>[^<]+<\/b>\s*из\s*<b>([\d\s]+)<\/b>/);
  if (summary) {
    return parseInt(summary[1].replace(/\s/g, ''), 10);
  }

  return null;
}

/**
 * Парсит HTML-фрагмент статистики заказов из stat-table (AJAX).
 * Структура:
 *   <b>476</b> заявок
 *   <b>11</b> платных заказов <i>55€</i>
 *   <b>3</b> оплачено 27.27% <b>14€</b>
 */
function parseStatHtml_(statHtml) {
  var stats = {
    paidCount: null,
    paidSum: null,
    completedCount: null,
    completedSum: null
  };

  var paidRow = statHtml.match(/data-is-priceless="0"[\s\S]*?<b>([\d\s]+)<\/b>[\s\S]*?платных заказов[\s\S]*?<i>([\d\s.,]+)/);
  if (paidRow) {
    stats.paidCount = parseInt(paidRow[1].replace(/\s/g, ''), 10);
    stats.paidSum = parseFloat(paidRow[2].replace(/[\s,]/g, ''));
  }

  var completedRow = statHtml.match(/data-status="payed"[\s\S]*?<b>([\d\s]+)<\/b>[\s\S]*?оплачено[\s\S]*?<b>([\d\s.,]+)/);
  if (completedRow) {
    stats.completedCount = parseInt(completedRow[1].replace(/\s/g, ''), 10);
    stats.completedSum = parseFloat(completedRow[2].replace(/[\s,]/g, ''));
  }

  return stats;
}

function updateDealSegmentStats() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var selection = sheet.getActiveRange();

  if (!selection) {
    SpreadsheetApp.getUi().alert('Выделите ячейки со ссылками на сегменты заказов.');
    return;
  }

  var updated = 0;
  var numRows = selection.getNumRows();
  var numCols = selection.getNumColumns();
  var startRow = selection.getRow();
  var startCol = selection.getColumn();

  for (var r = 0; r < numRows; r++) {
    for (var c = 0; c < numCols; c++) {
      var cell = sheet.getRange(startRow + r, startCol + c);
      if (!cell.getValue()) continue;

      var url = extractSegmentUrl_(cell);
      if (!url) continue;

      var domain = extractDomain_(url);
      if (!domain) {
        domain = getConfig().domain.replace(/\/+$/, '');
      }

      var row = startRow + r;
      var col = startCol + c;

      try {
        ss.toast('Загрузка страницы сегмента...', 'GC: Заказы', 60);
        var sessionCookie = getSessionCookie();

        // Шаг 1: загружаем страницу — берём общее кол-во и правило
        var pageHtml = fetchWithSession_(url, sessionCookie);
        if (isLoginPage_(pageHtml)) {
          CacheService.getScriptCache().remove('gc_session');
          sessionCookie = login();
          pageHtml = fetchWithSession_(url, sessionCookie);
          if (isLoginPage_(pageHtml)) {
            throw new Error('LOGIN_FAILED: Не удалось авторизоваться');
          }
        }

        var totalOrders = parseDealPageTotal_(pageHtml);
        if (totalOrders === null) {
          sheet.getRange(row, col + 1).setValue('Н/Д — нет данных на странице').setNote('Ошибка');
          SpreadsheetApp.flush();
          continue;
        }

        // Шаг 2: получаем правило и вызываем stat endpoint для разбивки
        var rule = extractDealRule_(url);
        if (!rule) {
          // Для сохранённых сегментов — извлекаем правило из rulePlugin на странице
          var marker = 'rulePlugin(';
          var ruleIdx = pageHtml.indexOf(marker + '{');
          if (ruleIdx !== -1) {
            var jsonStr = extractJsonObject_(pageHtml, ruleIdx + marker.length);
            if (jsonStr) {
              try {
                var config = JSON.parse(jsonStr);
                if (config.rule) rule = JSON.stringify(config.rule);
              } catch (e) {}
            }
          }
        }

        var stats = { paidCount: null, paidSum: null, completedCount: null, completedSum: null };
        if (rule) {
          ss.toast('Загрузка статистики...', 'GC: Заказы', 60);
          try {
            var statHtml = fetchDealStatsAjax_(domain, rule, sessionCookie);
            stats = parseStatHtml_(statHtml);
          } catch (e) {
            // Если stat endpoint не сработал — оставляем null
          }
        }

        var now = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd.MM.yyyy HH:mm');

        var fields = [
          [totalOrders,          'Кол-во заказов'],
          [stats.paidCount,      'Платных заказов'],
          [stats.paidSum,        'Сумма платных'],
          [stats.completedCount, 'Оплаченных заказов'],
          [stats.completedSum,   'Сумма оплаченных'],
          [now,                  'Обновлено']
        ];

        for (var i = 0; i < fields.length; i++) {
          var val = fields[i][0];
          sheet.getRange(row, col + 1 + i).setValue(val !== null ? val : 'Н/Д').setNote(fields[i][1]);
        }
        SpreadsheetApp.flush();
        updated++;
      } catch (e) {
        if (e.message.indexOf('LOGIN_FAILED') !== -1) {
          SpreadsheetApp.getUi().alert('Ошибка авторизации: ' + e.message);
          return;
        }
        sheet.getRange(row, col + 1).setValue('Ошибка: ' + e.message).setNote('Ошибка');
        SpreadsheetApp.flush();
      }

      Utilities.sleep(500);
    }
  }

  ss.toast('Обновлено: ' + updated, 'GC: Заказы', 5);
}

function debugDealSegment() {
  // Тест с сохранённым сегментом (89301 заказов)
  var testUrl = 'https://fitnessmama.school/pl/sales/deal/index?DealContext%5Bsegment_id%5D=3010534&DealContext%5Brule_string%5D=&formParams%5Bclarity_uid%5D=fHNB_TNrF_imWfnGQA0YK225r030UbZK';

  Logger.log('=== DEBUG: page total + stat breakdown ===');

  try {
    var domain = extractDomain_(testUrl);
    var sessionCookie = getSessionCookie();

    // Шаг 1: загружаем страницу
    var pageHtml = fetchWithSession_(testUrl, sessionCookie);
    var totalOrders = parseDealPageTotal_(pageHtml);
    Logger.log('Общее кол-во (со страницы): ' + totalOrders);

    // Шаг 2: извлекаем правило и вызываем stat
    var rule = extractDealRule_(testUrl);
    if (!rule) {
      var marker = 'rulePlugin(';
      var ruleIdx = pageHtml.indexOf(marker + '{');
      if (ruleIdx !== -1) {
        var jsonStr = extractJsonObject_(pageHtml, ruleIdx + marker.length);
        if (jsonStr) {
          var config = JSON.parse(jsonStr);
          if (config.rule) rule = JSON.stringify(config.rule);
        }
      }
    }
    Logger.log('Rule: ' + (rule ? rule.substring(0, 100) + '...' : 'нет'));

    if (rule) {
      var statHtml = fetchDealStatsAjax_(domain, rule, sessionCookie);
      var stats = parseStatHtml_(statHtml);
      Logger.log('Платных: ' + stats.paidCount + ', сумма: ' + stats.paidSum);
      Logger.log('Оплаченных: ' + stats.completedCount + ', сумма: ' + stats.completedSum);
    }
  } catch (e) {
    Logger.log('ERROR: ' + e.message);
  }
}

// ============================================================
// Тест подключения
// ============================================================

function testConnection() {
  var ui = SpreadsheetApp.getUi();
  var config = getConfig();

  try {
    CacheService.getScriptCache().remove('gc_session');
    var sessionCookie = login();
    ui.alert('Подключение успешно!',
      'Email: ' + config.email + '\n' +
      'Домен: ' + config.domain + '\n' +
      'Cookie: ' + sessionCookie.substring(0, 40) + '...\n\n' +
      'Авторизация работает. Можно обновлять статистику.',
      ui.ButtonSet.OK);
  } catch (e) {
    ui.alert('Ошибка подключения', e.message, ui.ButtonSet.OK);
  }
}

/**
 * Отладка сегмента: показывает что возвращает сервер для URL сегмента.
 * Замените testUrl на нужную ссылку, запустите из Apps Script.
 */
function debugSegment() {
  var testUrl = 'https://fitnessmama.school/pl/user/user/index?uc%5Bsegment_id%5D=0&uc%5Brule_string%5D=%7B%22type%22%3A%22user_createdat%22%2C%22inverted%22%3A0%2C%22params%22%3A%7B%22value%22%3A%7B%22from%22%3Anull%2C%22to%22%3Anull%2C%22toNDays%22%3A%2230%22%2C%22fromNDays%22%3Anull%2C%22dateType%22%3A%22last_n_days%22%2C%22withTime%22%3Afalse%7D%2C%22valueMode%22%3Anull%7D%2C%22maxSize%22%3A%22%22%7D&formParams%5Bclarity_uid%5D=JoSTNr9IVThIbcbL_OLoVFNrnDiOXnbX';

  try {
    var html = fetchSegmentPage(testUrl);
    var title = html.match(/<title>([^<]+)<\/title>/);
    var isLogin = isLoginPage_(html);
    var hasFilterCount = html.indexOf('filter-count') !== -1;
    var hasDataCount = html.indexOf('data-count') !== -1;
    var count = parseSegmentCount(html);

    Logger.log('=== DEBUG segment ===');
    Logger.log('URL: ' + testUrl.substring(0, 80) + '...');
    Logger.log('Title: ' + (title ? title[1] : 'не найден'));
    Logger.log('isLoginPage: ' + isLogin);
    Logger.log('hasFilterCount: ' + hasFilterCount);
    Logger.log('hasDataCount: ' + hasDataCount);
    Logger.log('parsedCount: ' + count);
    Logger.log('HTML length: ' + html.length);
    Logger.log('First 2000 chars: ' + html.substring(0, 2000));
  } catch (e) {
    Logger.log('ERROR: ' + e.message);
  }
}

/**
 * Отладка: показывает что возвращает сервер для конкретного mailing ID.
 * Запустите вручную из Apps Script, изменив ID ниже.
 */
function debugMailing() {
  var testId = 4508232; // Замените на нужный ID
  CacheService.getScriptCache().remove('gc_session');

  try {
    var html = fetchMailingPage(testId);
    var title = html.match(/<title>([^<]+)<\/title>/);
    var hasStats = html.indexOf('Статистика рассылки') !== -1;
    var hasUserStats = html.indexOf('просмотр') !== -1;
    var isLogin = isLoginPage_(html);
    var bodyClass = html.match(/class="([^"]*page-[^"]*)"/) || ['', 'не найден'];

    Logger.log('=== DEBUG mailing ID: ' + testId + ' ===');
    Logger.log('Title: ' + (title ? title[1] : 'не найден'));
    Logger.log('Body class: ' + bodyClass[1]);
    Logger.log('isLoginPage: ' + isLogin);
    Logger.log('hasStats: ' + hasStats);
    Logger.log('hasUserStats: ' + hasUserStats);
    Logger.log('HTML length: ' + html.length);
    Logger.log('First 1000 chars: ' + html.substring(0, 1000));
  } catch (e) {
    Logger.log('ERROR: ' + e.message);
  }
}

```

</details></body></html>

# CSS оформление для страниц с анкетами

[![image.png](https://wiki.kishlaru.ru/uploads/images/gallery/2026-04/scaled-1680-/qqZimage.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2026-04/qqZimage.png)

```css
/* ============================================
   Fitness Mama — Chestionar Postură & Sănătatea Spatelui
   CSS for GetCourse Singly (sequential) Survey
   Quiz-style — UNIVERSAL version (no hardcoded IDs)
   ============================================ */

/* --- 1. @import Inter --- */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');

/* --- 2. CSS Custom Properties --- */
:root {
  --accent: #ff257c;
  --accent-light: #fff0f5;
  --accent-gradient: linear-gradient(135deg, #ff257c, #ff6b9d);
  --bg: #fff9fb;
  --bg-card: #ffffff;
  --text: #2d2d2d;
  --text-muted: #666;
  --shadow-card: 0 4px 20px rgba(255, 37, 124, 0.08);
  --border-card: 1px solid rgba(255, 37, 124, 0.1);
  --radius-card: 20px;
  --radius-field: 14px;
  --transition: 0.3s ease;
}

/* --- 3. Base styles --- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
  background: var(--bg) !important;
  color: var(--text);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* --- 4. Hide GC service elements --- */
.add-redesign-subblock,
.common-setting-link,
.showAllCustomFields,
.survey .text-right {
  display: none !important;
  width: 0 !important;
  height: 0 !important;
  overflow: hidden !important;
  position: absolute !important;
  pointer-events: none !important;
}

.custom-form.without-help-elems {
  padding: 0;
}

.builder-item .hidden {
  display: none !important;
}

/* --- 5. Generic content/text blocks above the form --- */
/* Targets any lt-block that contains a header + text (intro block) */
.survey-page .lt-block-wrapper,
[class*="ltBlock"] .lt-block-wrapper {
  font-family: 'Inter', sans-serif;
}

/* Card-style wrapper for any modal-block-content */
.modal-block-content {
  background: var(--bg-card);
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-card);
  border: var(--border-card);
  padding: 28px 20px !important;
}

/* Headers inside content blocks */
.modal-block-content .f-header-36,
.modal-block-content .f-header {
  font-family: 'Inter', sans-serif !important;
  font-size: 22px !important;
  font-weight: 800 !important;
  color: var(--accent) !important;
  line-height: 1.3 !important;
  margin-bottom: 16px;
  text-align: center;
}

.modal-block-content .f-header-36 p,
.modal-block-content .f-header p {
  margin: 0;
}

/* Body text inside content blocks */
.modal-block-content .f-text,
.modal-block-content .text-normal,
.modal-block-content .text-large {
  font-family: 'Inter', sans-serif !important;
  font-size: 15px;
  line-height: 1.7;
  color: var(--text-muted);
}

.modal-block-content .f-text p {
  margin-bottom: 0.6em;
}

/* --- 6. Form container block --- */
.lt-form .lt-block-wrapper {
  padding-top: 10px !important;
  padding-bottom: 40px !important;
}

/* --- 7. Progress bar --- */
.progress-bar-wrapper {
  height: 8px;
  background: #f0e6ea;
  border-radius: 4px;
  overflow: hidden;
  margin-bottom: 24px;
}

.progress-bar-wrapper .progress-bar {
  height: 100% !important;
  background: var(--accent-gradient) !important;
  border-radius: 4px;
  transition: width 0.4s ease;
  float: none !important;
  box-shadow: none !important;
  font-size: 0 !important;
  line-height: 0 !important;
  padding: 0 !important;
}

/* --- 8. Section headers (empty field-input-block) --- */
.field-wrapper:has(.type-select .field-input-block:empty) {
  margin-top: 8px;
  margin-bottom: 8px;
  border-bottom: none;
  padding-bottom: 0;
}

.field-wrapper:has(.type-select .field-input-block:empty) .field-label {
  display: block;
  font-family: 'Inter', sans-serif !important;
  font-size: 11px !important;
  font-weight: 700 !important;
  color: var(--accent) !important;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  margin-bottom: 6px;
  background: transparent !important;
  padding: 0 !important;
  border-radius: 0 !important;
}

.field-wrapper:has(.type-select .field-input-block:empty) .field-label .label-value {
  color: var(--accent) !important;
}

.field-wrapper:has(.type-select .field-input-block:empty) .field-label .required-sign {
  display: none;
}

/* --- 9. Field labels (questions) --- */
.fields .field-label {
  font-family: 'Inter', sans-serif !important;
  font-weight: 700 !important;
  font-size: 20px !important;
  color: var(--text) !important;
  margin-bottom: 22px;
  display: block;
  line-height: 1.4;
}

.fields .field-label .required-sign {
  color: var(--accent);
  margin-left: 3px;
  font-weight: 400;
}

/* --- 10. Radio buttons — card style --- */

/* Hide native radio inputs */
.type-select .field-input-block label input[type="radio"] {
  position: absolute !important;
  opacity: 0 !important;
  width: 1px !important;
  height: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
  pointer-events: none;
}

/* Card style for radio labels */
.type-select .field-input-block label {
  display: block !important;
  position: relative !important;
  background: var(--accent-light) !important;
  border: 2px solid transparent !important;
  border-radius: var(--radius-field) !important;
  padding: 16px 24px 16px 62px !important;
  margin-bottom: 10px !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  cursor: pointer;
  font-family: 'Inter', sans-serif !important;
  font-size: 15px !important;
  font-weight: 500 !important;
  color: var(--text) !important;
  line-height: 1.5 !important;
  transition: all var(--transition);
  min-height: 0 !important;
}

.type-select .field-input-block label:last-child {
  margin-bottom: 0 !important;
}

/* Radio outer ring (::before) */
.type-select .field-input-block label::before {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: 18px;
  top: 50%;
  transform: translateY(-50%);
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 2.5px solid rgba(255, 37, 124, 0.25);
  background: #fff;
  transition: all var(--transition);
  box-shadow: 0 1px 4px rgba(255, 37, 124, 0.08);
}

/* Radio inner dot (::after) */
.type-select .field-input-block label::after {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: 25px;
  top: 50%;
  transform: translateY(-50%) scale(0);
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: var(--accent);
  transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Hover */
.type-select .field-input-block label:hover {
  border-color: var(--accent) !important;
  transform: translateX(4px);
}

.type-select .field-input-block label:hover::before {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(255, 37, 124, 0.1);
}

/* Checked state */
.type-select .field-input-block label:has(input[type="radio"]:checked) {
  background: var(--accent) !important;
  color: #fff !important;
  border-color: var(--accent) !important;
  box-shadow: 0 4px 14px rgba(255, 37, 124, 0.25);
}

.type-select .field-input-block label:has(input[type="radio"]:checked)::before {
  border-color: rgba(255, 255, 255, 0.6);
  background: rgba(255, 255, 255, 0.15);
  box-shadow: none;
}

.type-select .field-input-block label:has(input[type="radio"]:checked)::after {
  transform: translateY(-50%) scale(1);
  background: #fff;
}

/* --- 11. Checkboxes — card style --- */

/* Hide native checkbox inputs */
.type-multi_select .field-input-block label input[type="checkbox"] {
  position: absolute !important;
  opacity: 0 !important;
  width: 1px !important;
  height: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
  pointer-events: none;
}

/* Card style for checkbox labels */
.type-multi_select .field-input-block label {
  display: block !important;
  position: relative !important;
  background: var(--accent-light) !important;
  border: 2px solid transparent !important;
  border-radius: var(--radius-field) !important;
  padding: 16px 24px 16px 62px !important;
  margin-bottom: 10px !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  cursor: pointer;
  font-family: 'Inter', sans-serif !important;
  font-size: 15px !important;
  font-weight: 500 !important;
  color: var(--text) !important;
  line-height: 1.5 !important;
  transition: all var(--transition);
  min-height: 0 !important;
}

.type-multi_select .field-input-block label:last-child {
  margin-bottom: 0 !important;
}

/* Checkbox outer square (::before) */
.type-multi_select .field-input-block label::before {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: 18px;
  top: 50%;
  transform: translateY(-50%);
  width: 26px;
  height: 26px;
  border-radius: 8px;
  border: 2.5px solid rgba(255, 37, 124, 0.25);
  background: #fff;
  transition: all var(--transition);
  box-shadow: 0 1px 4px rgba(255, 37, 124, 0.08);
}

/* Checkbox checkmark (::after) */
.type-multi_select .field-input-block label::after {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: 24px;
  top: 50%;
  width: 14px;
  height: 14px;
  transform: translateY(-50%) scale(0);
  transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
  background-size: contain;
  background-repeat: no-repeat;
}

/* Hover */
.type-multi_select .field-input-block label:hover {
  border-color: var(--accent) !important;
  transform: translateX(4px);
}

.type-multi_select .field-input-block label:hover::before {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(255, 37, 124, 0.1);
}

/* Checked state */
.type-multi_select .field-input-block label:has(input[type="checkbox"]:checked) {
  background: var(--accent) !important;
  color: #fff !important;
  border-color: var(--accent) !important;
  box-shadow: 0 4px 14px rgba(255, 37, 124, 0.25);
}

.type-multi_select .field-input-block label:has(input[type="checkbox"]:checked)::before {
  background: rgba(255, 255, 255, 0.15);
  border-color: rgba(255, 255, 255, 0.6);
  box-shadow: none;
}

.type-multi_select .field-input-block label:has(input[type="checkbox"]:checked)::after {
  transform: translateY(-50%) scale(1);
}

/* --- 12. Textarea & text input --- */
.custom-form textarea.form-control,
.custom-form input[type="text"].form-control,
.custom-form input[type="number"].form-control,
.builder-item input.f-input {
  font-family: 'Inter', sans-serif !important;
  font-size: 15px !important;
  color: var(--text) !important;
  background: #fff !important;
  border: 2px solid #f0e6ea !important;
  border-radius: var(--radius-field) !important;
  padding: 16px 18px !important;
  width: 100%;
  transition: all var(--transition);
  resize: vertical;
  line-height: 1.55;
}

.custom-form textarea.form-control:focus,
.custom-form input[type="text"].form-control:focus,
.custom-form input[type="number"].form-control:focus,
.builder-item input.f-input:focus {
  outline: none !important;
  border-color: var(--accent) !important;
  box-shadow: 0 0 0 3px rgba(255, 37, 124, 0.15) !important;
  background: #fff !important;
}

.custom-form textarea.form-control::placeholder,
.custom-form input[type="text"].form-control::placeholder {
  color: #aaa;
}

/* Numeric field */
.type-numeric .field-input-block {
  max-width: 100%;
}

.type-numeric .field-input-block .units {
  display: none;
}

/* --- 13. Field descriptions --- */
.field-description-block {
  font-family: 'Inter', sans-serif !important;
  font-size: 14px !important;
  font-style: italic;
  color: var(--text-muted) !important;
  margin-top: 10px;
  line-height: 1.55;
  padding-left: 2px;
}

/* --- 14. Singly navigation buttons --- */
.btn-singly-controls {
  display: flex;
  gap: 12px;
  justify-content: space-between;
  align-items: center;
  margin-top: 24px;
  padding-top: 8px;
}

/* "Далее" / Next button */
.btn-singly-controls .btn-next {
  flex: 1;
  background: var(--accent-gradient) !important;
  color: #fff !important;
  border: none !important;
  border-radius: var(--radius-field) !important;
  padding: 16px !important;
  font-family: 'Inter', sans-serif !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  cursor: pointer;
  transition: transform 0.2s, box-shadow 0.2s;
  text-transform: none !important;
  letter-spacing: 0 !important;
}

.btn-singly-controls .btn-next:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 25px rgba(255, 37, 124, 0.35);
}

.btn-singly-controls .btn-next:active {
  transform: translateY(0);
}

/* "Назад" / Prev button — outline style */
.btn-singly-controls .btn-prev {
  background: transparent !important;
  color: var(--accent) !important;
  border: 2px solid var(--accent) !important;
  border-radius: var(--radius-field) !important;
  padding: 14px 24px !important;
  font-family: 'Inter', sans-serif !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  cursor: pointer;
  transition: all 0.2s ease;
  text-transform: none !important;
  letter-spacing: 0 !important;
}

.btn-singly-controls .btn-prev:hover {
  background: var(--accent-light) !important;
  transform: translateY(-2px);
}

.btn-singly-controls .btn-prev:active {
  transform: translateY(0);
}

/* --- 15. Submit button — universal (any .btn-success inside a GC form) --- */
.lt-form .btn.f-btn.btn-success,
.custom-form .btn.f-btn.btn-success,
button.btn.f-btn.btn-success {
  font-family: 'Inter', sans-serif !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  color: #fff !important;
  background: var(--accent-gradient) !important;
  background-color: transparent !important;
  border: none !important;
  border-radius: var(--radius-field) !important;
  padding: 16px 36px !important;
  width: 100%;
  cursor: pointer;
  transition: transform 0.2s, box-shadow 0.2s;
  text-transform: none !important;
  letter-spacing: 0 !important;
  box-shadow: 0 4px 16px rgba(255, 37, 124, 0.3);
  background-image: none !important;
}

.lt-form .btn.f-btn.btn-success:hover,
.custom-form .btn.f-btn.btn-success:hover,
button.btn.f-btn.btn-success:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 25px rgba(255, 37, 124, 0.35);
}

.lt-form .btn.f-btn.btn-success:active,
.custom-form .btn.f-btn.btn-success:active,
button.btn.f-btn.btn-success:active {
  transform: translateY(0);
  box-shadow: 0 4px 16px rgba(255, 37, 124, 0.3);
}

/* --- 16. Thank-you / result block — universal --- */
.form-result-block {
  font-family: 'Inter', sans-serif;
  border-radius: var(--radius-field);
  margin-bottom: 16px;
}

/* --- 17. CTA buttons inside any content block (universal) --- */
.modal-block-content .btn.f-btn,
.modal-block-content a.btn {
  font-family: 'Inter', sans-serif !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  color: #fff !important;
  background: var(--accent-gradient) !important;
  background-color: transparent !important;
  border: none !important;
  border-radius: var(--radius-field) !important;
  padding: 16px 36px !important;
  cursor: pointer;
  transition: transform 0.2s, box-shadow 0.2s;
  box-shadow: 0 4px 16px rgba(255, 37, 124, 0.3);
  text-transform: none !important;
  text-decoration: none !important;
  display: inline-block;
}

.modal-block-content .btn.f-btn:hover,
.modal-block-content a.btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 25px rgba(255, 37, 124, 0.35);
}

/* --- 18. Field wrapper spacing --- */
.field-wrapper {
  margin-bottom: 24px;
  padding-bottom: 0;
  border-bottom: none;
  animation: fadeIn 0.4s ease;
}

/* --- 19. Animation fadeIn --- */
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* --- 20. prefers-reduced-motion --- */
@media (prefers-reduced-motion: reduce) {
  .field-wrapper,
  .type-select .field-input-block label,
  .type-multi_select .field-input-block label,
  .progress-bar-wrapper .progress-bar {
    animation: none !important;
    transition: none !important;
  }

  .btn-singly-controls .btn-next,
  .btn-singly-controls .btn-prev,
  .lt-form .btn.f-btn.btn-success,
  .custom-form .btn.f-btn.btn-success,
  button.btn.f-btn.btn-success,
  .modal-block-content .btn.f-btn,
  .modal-block-content a.btn {
    transition: none !important;
  }
}

/* --- 21. Bootstrap / GetCourse overrides --- */
.custom-form .form-control {
  box-shadow: none !important;
  height: auto !important;
}

.custom-form .form-control:focus {
  box-shadow: 0 0 0 3px rgba(255, 37, 124, 0.15) !important;
}

.lt-form .form-content {
  font-family: 'Inter', sans-serif;
}

.btn-success {
  background-image: none !important;
}

.btn-default {
  background-image: none !important;
}

/* --- 22. GC system overrides (universal) --- */

/* Generic lt-block-wrapper padding reset — let content breathe */
.lt-block-wrapper {
  font-family: 'Inter', sans-serif;
}

/* GC form container */
.lt-form {
  font-family: 'Inter', sans-serif;
}

/* Builder-item inline style overrides */
.builder-item[style*="margin-bottom"] {
  margin-bottom: 0 !important;
}

/* Any GC button with inline background-color — force gradient */
button.btn.f-btn.btn-success[style],
.modal-block-content .btn.f-btn[style] {
  background-color: transparent !important;
  background: var(--accent-gradient) !important;
  color: #fff !important;
}

/* Form hidden fields — preserve them */
.builder-item.part-userField[style*="display: none"] {
  display: none !important;
}

/* --- 23. Responsive — Desktop (min-width: 769px) --- */
@media (min-width: 769px) {
  .modal-block-content {
    padding: 40px 44px !important;
  }

  .modal-block-content .f-header-36,
  .modal-block-content .f-header {
    font-size: 26px !important;
  }

  .modal-block-content .f-text,
  .modal-block-content .text-normal,
  .modal-block-content .text-large {
    font-size: 16px;
  }

  .fields .field-label {
    font-size: 20px !important;
  }

  .type-select .field-input-block label,
  .type-multi_select .field-input-block label {
    font-size: 16px !important;
    padding: 18px 28px 18px 66px !important;
  }

  .custom-form textarea.form-control,
  .custom-form input[type="text"].form-control,
  .custom-form input[type="number"].form-control,
  .builder-item input.f-input {
    font-size: 16px !important;
  }

  .field-description-block {
    font-size: 14px !important;
  }

  .lt-form .btn.f-btn.btn-success,
  .custom-form .btn.f-btn.btn-success,
  button.btn.f-btn.btn-success {
    width: auto;
    padding: 18px 48px !important;
    font-size: 17px !important;
  }

  .type-numeric .field-input-block {
    max-width: 200px;
  }
}
```

# GetCourse — кнопка копирования абсолютной ссылки (userscript)

## Что делает

Добавляет в админке GetCourse рядом со ссылками в таблицах маленькую иконку «копировать». Клик по ней копирует **абсолютный URL** страницы (с доменом) в буфер обмена. После копирования иконка на ~1 секунду превращается в зелёную галочку.

[![Снимок экрана 2026-04-29 005851.png](https://wiki.kishlaru.ru/uploads/images/gallery/2026-04/scaled-1680-/snimok-ekrana-2026-04-29-005851.png)](https://wiki.kishlaru.ru/uploads/images/gallery/2026-04/snimok-ekrana-2026-04-29-005851.png)

## Код

```javascript
// ==UserScript==
// @name         GetCourse — копировать абсолютную ссылку
// @namespace    fitnessmama.school
// @version      1.3
// @description  Кнопка копирования абсолютного URL рядом со ссылками в админке GetCourse
// @match        https://fitnessmama.school/pl/*
// @match        https://*.getcourse.ru/pl/*
// @run-at       document-idle
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const BTN_CLASS = 'gc-copy-abs-link-btn';
    const PROCESSED_ATTR = 'data-gc-copy-added';

    const style = document.createElement('style');
    style.textContent = `
        td.w5 > a.not-pjax-link[${PROCESSED_ATTR}] {
            margin-right: 2px;
        }
        .${BTN_CLASS} {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 18px;
            height: 18px;
            padding: 0;
            margin: 0 0 0 2px;
            border: none;
            border-radius: 4px;
            background: transparent;
            color: #8a96a8;
            cursor: pointer;
            vertical-align: -4px;
            opacity: 0.7;
            transition: background .15s ease, color .15s ease;
        }
        .${BTN_CLASS}:hover { opacity: 1; background: #e8f0fe; color: #1a73e8; }
        .${BTN_CLASS}:active { background: #d2e3fc; }
        .${BTN_CLASS}.copied { opacity: 1; background: #e6f4ea; color: #188038; }
        .${BTN_CLASS} svg { width: 13px; height: 13px; display: block; }
    `;
    document.head.appendChild(style);

    const SVG_NS = 'http://www.w3.org/2000/svg';

    function svg(paths) {
        const s = document.createElementNS(SVG_NS, 'svg');
        s.setAttribute('viewBox', '0 0 24 24');
        s.setAttribute('fill', 'none');
        s.setAttribute('stroke', 'currentColor');
        s.setAttribute('stroke-width', '2');
        s.setAttribute('stroke-linecap', 'round');
        s.setAttribute('stroke-linejoin', 'round');
        paths.forEach(([tag, attrs]) => {
            const el = document.createElementNS(SVG_NS, tag);
            for (const k in attrs) el.setAttribute(k, attrs[k]);
            s.appendChild(el);
        });
        return s;
    }

    const iconCopy = () => svg([
        ['rect', { x: 9, y: 9, width: 13, height: 13, rx: 2 }],
        ['path', { d: 'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1' }],
    ]);

    const iconOk = () => {
        const s = svg([['polyline', { points: '20 6 9 17 4 12' }]]);
        s.setAttribute('stroke-width', '3');
        return s;
    };

    function makeButton(absUrl) {
        const btn = document.createElement('button');
        btn.type = 'button';
        btn.className = BTN_CLASS;
        btn.title = 'Скопировать ссылку';
        btn.setAttribute('aria-label', 'Скопировать ' + absUrl);
        btn.appendChild(iconCopy());
        btn.addEventListener('click', async (e) => {
            e.preventDefault();
            e.stopPropagation();
            try {
                await navigator.clipboard.writeText(absUrl);
            } catch {
                const ta = document.createElement('textarea');
                ta.value = absUrl;
                ta.style.position = 'fixed';
                ta.style.opacity = '0';
                document.body.appendChild(ta);
                ta.select();
                document.execCommand('copy');
                ta.remove();
            }
            btn.classList.add('copied');
            btn.replaceChildren(iconOk());
            setTimeout(() => {
                btn.classList.remove('copied');
                btn.replaceChildren(iconCopy());
            }, 1100);
        });
        return btn;
    }

    function process(root) {
        if (!root || root.nodeType !== 1) root = document.body;
        const links = root.querySelectorAll('td.w5 > a.not-pjax-link[href]');
        links.forEach((a) => {
            if (a.hasAttribute(PROCESSED_ATTR)) return;
            const href = a.getAttribute('href');
            if (!href || href.startsWith('javascript:') || href.startsWith('#')) return;
            let absUrl;
            try { absUrl = new URL(href, location.origin).href; } catch { return; }
            a.setAttribute(PROCESSED_ATTR, '1');
            const btn = makeButton(absUrl);
            if (a.nextSibling) a.parentNode.insertBefore(btn, a.nextSibling);
            else a.parentNode.appendChild(btn);
        });
    }

    function cleanupOld() {
        document.querySelectorAll('td.w5 > a.not-pjax-link').forEach((a) => {
            let n = a.nextSibling;
            while (n) {
                const next = n.nextSibling;
                if (n.nodeType === 3 && /^\s*&#128203;\s*$/.test(n.textContent)) {
                    n.remove();
                } else if (n.nodeType === 1 && n.tagName === 'BUTTON' && (n.textContent.includes('📋') || n.textContent.includes('&#128203;'))) {
                    n.remove();
                }
                n = next;
            }
        });
    }

    cleanupOld();
    process(document.body);

    const observer = new MutationObserver((mutations) => {
        for (const m of mutations) {
            m.addedNodes.forEach((node) => {
                if (node.nodeType === 1) process(node);
            });
        }
    });
    observer.observe(document.body, { childList: true, subtree: true });
})();
```

# GetCourse — кнопка редактирования рассылки (userscript)

## Что делает

В редакторе CMS-страниц GetCourse рядом со ссылками на рассылки (`/notifications/control/mailings/update/id/<id>`) добавляет маленькую оранжевую иконку карандаша. Клик по иконке открывает в новой вкладке **новый** редактор той же рассылки по адресу `/pl/notifications/control/mailings/editor?id=<id>` — без необходимости копировать ID и переходить вручную.

![Кнопка редактирования рассылки в редакторе CMS](https://wiki.kishlaru.ru/uploads/images/gallery/2026-04/scaled-1680-/screenshot-edit-mailing.png)

## Код

```javascript
// ==UserScript==
// @name         GetCourse — кнопка редактирования рассылки
// @namespace    fitnessmama.school
// @version      1.0
// @description  Добавляет кнопку "редактировать" рядом со ссылками на рассылки в редакторе CMS GetCourse
// @match        https://fitnessmama.school/pl/*
// @match        https://*.getcourse.ru/pl/*
// @run-at       document-idle
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const BTN_CLASS = 'gc-edit-mailing-btn';
    const PROCESSED_ATTR = 'data-gc-edit-added';
    const HREF_PATTERN = /\/notifications\/control\/mailings\/update\/id\/(\d+)/;

    const style = document.createElement('style');
    style.textContent = `
        .${BTN_CLASS} {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 18px;
            height: 18px;
            padding: 0;
            margin: 0 0 0 4px;
            border: none;
            border-radius: 4px;
            background: transparent;
            color: #8a96a8;
            cursor: pointer;
            vertical-align: -4px;
            opacity: 0.7;
            transition: background .15s ease, color .15s ease, opacity .15s ease;
            text-decoration: none;
        }
        .${BTN_CLASS}:hover {
            opacity: 1;
            background: #fff4e5;
            color: #e8730c;
            text-decoration: none;
        }
        .${BTN_CLASS}:active { background: #ffe0b2; }
        .${BTN_CLASS} svg { width: 13px; height: 13px; display: block; }
    `;
    document.head.appendChild(style);

    const SVG_NS = 'http://www.w3.org/2000/svg';

    function buildPencil() {
        const s = document.createElementNS(SVG_NS, 'svg');
        s.setAttribute('viewBox', '0 0 24 24');
        s.setAttribute('fill', 'none');
        s.setAttribute('stroke', 'currentColor');
        s.setAttribute('stroke-width', '2');
        s.setAttribute('stroke-linecap', 'round');
        s.setAttribute('stroke-linejoin', 'round');
        const p1 = document.createElementNS(SVG_NS, 'path');
        p1.setAttribute('d', 'M12 20h9');
        const p2 = document.createElementNS(SVG_NS, 'path');
        p2.setAttribute('d', 'M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z');
        s.appendChild(p1);
        s.appendChild(p2);
        return s;
    }

    function makeButton(editUrl) {
        const a = document.createElement('a');
        a.className = BTN_CLASS;
        a.href = editUrl;
        a.target = '_blank';
        a.rel = 'noopener';
        a.title = 'Редактировать рассылку';
        a.setAttribute('aria-label', 'Редактировать рассылку: ' + editUrl);
        a.appendChild(buildPencil());
        return a;
    }

    function process(root) {
        if (!root || root.nodeType !== 1) root = document.body;
        const links = root.querySelectorAll('a[href*="/notifications/control/mailings/update/id/"]');
        links.forEach((a) => {
            if (a.hasAttribute(PROCESSED_ATTR)) return;
            const href = a.getAttribute('href') || '';
            const m = HREF_PATTERN.exec(href);
            if (!m) return;
            const id = m[1];
            const editUrl = '/pl/notifications/control/mailings/editor?id=' + id;
            a.setAttribute(PROCESSED_ATTR, '1');
            const btn = makeButton(editUrl);
            if (a.nextSibling) a.parentNode.insertBefore(btn, a.nextSibling);
            else a.parentNode.appendChild(btn);
        });
    }

    process(document.body);

    const observer = new MutationObserver((mutations) => {
        for (const m of mutations) {
            m.addedNodes.forEach((node) => {
                if (node.nodeType === 1) process(node);
            });
        }
    });
    observer.observe(document.body, { childList: true, subtree: true });
})();
```