Commit 301e73a3 authored by Яков's avatar Яков
Browse files

Задание внутри урока: узел activityRef



Ссылка на существующее задание как блок документа. Узел хранит только
положение задания в уроке и то, как его показать: вопросы, ответы и правила
проверки остаются в конструкторе задания. Дублировать их в документ нельзя —
правка вопроса не доехала бы до урока, а попытки сотрудников ссылались бы
на две разные версии одного и того же.

Два поля под идентификатор (activityScope + activityId) — потому что у
упражнений в платформе два пространства идентификаторов: целое в библиотеке
и строка «e-<uuid>» в карте. Урок карты — клон библиотечного, при установке
упражнениям выдаются новые идентификаторы, и ссылка без указания пространства
после установки указала бы в никуда.

Тип задания хранится доменный (question, essay, videoTask), а не клиентский:
иначе сверять его с самой сущностью не с чем.

Пакет про маршруты и сущности платформы не знает: выбор задания и открытие
его конструктора приходят колбэками onPickActivity / onOpenActivity.
Co-Authored-By: default avatarClaude Opus 5 (1M context) <noreply@anthropic.com>
parent d13af7f4
......@@ -39,6 +39,7 @@ import ToggleBlock from './extensions/ToggleBlock'
import InteractiveImage from './extensions/InteractiveImage'
import FontSize from './extensions/FontSize'
import BlockId from './extensions/BlockId'
import ActivityRef from './extensions/ActivityRef'
import ButtonLinkExtension from './extensions/ButtonLink'
// import Image from '@tiptap/extension-image'
......@@ -193,6 +194,12 @@ const QEditor = ({
// Словарь подписей от хоста: { [ключ кнопки]: { title, hint } }.
// Нужен для перевода — своей локализации у пакета нет. Пусто — встроенные русские.
labels = {},
// Выбор задания для вставки в урок. Возвращает промис с атрибутами ссылки
// либо null, если автор передумал. Пакет не знает ни маршрутов платформы,
// ни её API — список заданий показывает хост.
onPickActivity = null,
// Открыть конструктор задания из карточки в редакторе
onOpenActivity = null,
// Документ tiptap наружу. Отдельным пропом, а НЕ вторым аргументом onChange:
// редактор используется в 21 месте, и все ждут строку с HTML.
// Не передали — ничего не меняется.
......@@ -517,6 +524,20 @@ const QEditor = ({
// pdfToText удалён: его onClick вызывал modalOpener('pdf', …) — тот же модал
// с тем же аргументом, что и кнопка pdf, то есть буквальный дубль.
// В пресетах он не значился, автору не показывался никогда.
activityRef: {
title: 'Задание в уроке',
onClick: async () => {
if (!onPickActivity) {
message.info('Выбор задания недоступен в этом окне редактора')
return
}
const picked = await onPickActivity()
if (!picked || !picked.activityId) {
return
}
editor.chain().focus().insertActivityRef(picked).run()
}
},
interactiveImage: {
title: 'Интерактивное изображение',
onClick: () => {
......@@ -828,6 +849,7 @@ const QEditor = ({
TextStyle,
FontSize,
BlockId,
ActivityRef.configure({ onOpenActivity }),
ButtonLinkExtension,
Color.configure({
types: ['textStyle']
......
......@@ -52,6 +52,7 @@ const LESSON = [
{ type: 'g', items: ['|'] },
{ type: 'g', items: ['activityRef'] },
{ type: 's', toggle: false, items: ['image', 'interactiveImage'] },
{ type: 's', toggle: false, items: ['video', 'iframe'] },
{ type: 'g', items: ['audio'] },
......@@ -204,6 +205,10 @@ const TOOL_INFO = {
hr: { title: 'Разделитель', hint: 'Горизонтальная линия между смысловыми частями' },
clearMarks: { title: 'Убрать оформление', hint: 'Снять с выделенного текста цвет, жирность и прочее' },
insertTable: { title: 'Таблица', hint: 'Вставить таблицу; строки и столбцы настраиваются после' },
activityRef: {
title: 'Задание в уроке',
hint: 'Поставить тест, эссе или видеоответ прямо в нужном месте урока, а не в конце',
},
undo: { title: 'Отменить' },
redo: { title: 'Вернуть' },
emoji: { title: 'Эмодзи', hint: 'Вставить символ из набора' },
......
import { Node, mergeAttributes } from '@tiptap/core'
import { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react'
import React from 'react'
/**
* Ссылка на существующее задание внутри урока.
*
* ── Что этот узел НЕ делает ──────────────────────────────────────────────────
*
* Он не хранит ни вопросов, ни правильных ответов, ни чек-листов, ни баллов.
* Источник правды по заданию — существующие сущности платформы (LibraryExercise,
* Exercise, попытки, результаты, проверка человеком). Узел хранит только
* ПОЛОЖЕНИЕ задания в уроке и то, как его показать.
*
* Дублировать содержимое задания в документ нельзя: тогда правка вопроса
* в конструкторе не доедет до урока, а попытки сотрудников будут ссылаться
* на две разные версии одного и того же.
*
* ── Почему два поля под идентификатор ────────────────────────────────────────
*
* У упражнений в платформе ДВА пространства идентификаторов:
* LibraryExercise.id — целое (autoincrement), упражнение в библиотеке;
* Exercise.id — строка «e-<uuid>», упражнение в конкретной карте.
*
* Урок карты — клон библиотечного: при установке упражнениям выдаются НОВЫЕ
* идентификаторы. Ссылка из документа библиотечного урока после установки
* в карту указала бы в никуда. Поэтому:
* activityScope — в каком пространстве смотреть (library | map);
* activityId — идентификатор в нём;
* activityOrigin — идентификатор исходного библиотечного упражнения,
* если элемент пришёл клонированием.
*
* ── Тип задания хранится ДОМЕННЫЙ ────────────────────────────────────────────
*
* question / questionPsychologic / essay / videoTask / dialog / meeting —
* то, что лежит в Exercise.type. Клиентские значения (test, psy-test, video)
* вычисляются существующей трансляцией при отдаче; в документ они не пишутся,
* иначе сверять тип с доменной сущностью будет не с чем.
*
* См. docs/Редактор уроков — этап 2, JSON-документ — ТЗ.md, §8.
*/
/** Доменные типы. Клиентские (test, psy-test, video) сюда НЕ попадают */
const TYPE_LABELS = {
question: 'Тест',
questionPsychologic: 'Психологический тест',
essay: 'Эссе',
videoTask: 'Видеоответ',
dialog: 'Диалог',
meeting: 'Встреча',
}
const ActivityCard = ({ node, deleteNode, extension }) => {
const a = node.attrs
const label = TYPE_LABELS[a.activityType] || a.activityType || 'Задание'
const onOpen = extension.options.onOpenActivity
return (
<NodeViewWrapper as="div" className="atma-activity-ref" contentEditable={false}>
<div className="atma-activity-ref__head">
<span className="atma-activity-ref__type">{label}</span>
{a.required && <span className="atma-activity-ref__required">обязательное</span>}
</div>
<div className="atma-activity-ref__title">
{a.titleOverride || a.activityTitle || 'Задание без названия'}
</div>
<div className="atma-activity-ref__actions">
{onOpen && (
<button type="button" onClick={() => onOpen(a)}>Открыть настройку</button>
)}
<button type="button" onClick={() => deleteNode()}>Убрать из урока</button>
</div>
<div className="atma-activity-ref__hint">
Вопросы и настройки задания живут в его конструкторе. Здесь только место в уроке.
</div>
</NodeViewWrapper>
)
}
const ActivityRef = Node.create({
name: 'activityRef',
group: 'block',
atom: true, // неделимый: внутрь курсор не ставится
draggable: true,
selectable: true,
addOptions() {
return {
/** Хост открывает конструктор задания: пакет про маршруты платформы не знает */
onOpenActivity: null,
}
},
addAttributes() {
return {
activityId: { default: null },
activityScope: { default: 'library' }, // library | map
activityOrigin: { default: null }, // целое или null, НЕ строка
activityType: { default: null }, // доменное значение
activityTitle: { default: null }, // подпись для карточки автора
titleOverride: { default: null }, // своя подпись для учащегося
display: { default: 'inline' }, // inline | card
required: { default: false },
blockId: { default: null },
}
},
parseHTML() {
return [{ tag: 'div[data-activity-ref]' }]
},
renderHTML({ HTMLAttributes, node }) {
const a = node.attrs
// В HTML уезжает только ссылка и то, что нужно для карточки-заглушки.
// Содержимое задания сюда не попадает — его подставляет отрисовка,
// читая существующие сущности.
return [
'div',
mergeAttributes(
{
'data-activity-ref': 'true',
'data-activity-id': a.activityId,
'data-activity-scope': a.activityScope,
'data-activity-type': a.activityType,
class: 'atma-activity-ref',
},
a.activityOrigin != null ? { 'data-activity-origin': String(a.activityOrigin) } : {},
a.required ? { 'data-required': 'true' } : {},
a.titleOverride ? { 'data-title': a.titleOverride } : {},
a.blockId ? { 'data-block-id': a.blockId } : {}
),
TYPE_LABELS[a.activityType] || 'Задание',
]
},
addNodeView() {
return ReactNodeViewRenderer(ActivityCard)
},
addCommands() {
return {
insertActivityRef:
(attrs) =>
({ commands }) =>
commands.insertContent({ type: this.name, attrs }),
}
},
})
export default ActivityRef
export { TYPE_LABELS }
......@@ -1435,6 +1435,11 @@ body{
&.qinsertToggleBlock {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgPHJlY3QgeD0iMyIgeT0iNCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjMiIHJ4PSIxIiAvPgogIDxyZWN0IHg9IjMiIHk9IjEwIiB3aWR0aD0iMTgiIGhlaWdodD0iMyIgcng9IjEiIC8+CiAgPHJlY3QgeD0iMyIgeT0iMTYiIHdpZHRoPSIxMiIgaGVpZ2h0PSIzIiByeD0iMSIgLz4KICA8cG9seWxpbmUgcG9pbnRzPSIxOCwxNiAyMSwxOC41IDE4LDIxIiAvPgo8L3N2Zz4K");
}
// Задание в уроке: рамка со «птичкой» — то же, чем платформа обозначает
// выполненный шаг, поэтому кнопка читается без подписи.
&.qactivityRef {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23000000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2' /%3E%3Cpath d='m8 12 2.5 2.5L16 9' /%3E%3C/svg%3E");
}
&.qinteractiveImage {
background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmlld0JveD0iMCAwIDEzMy40NDA3NyAyMDAiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUwIDUwIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iSW50ZXJhY3RpdmVfaWNvbiAodHdvIGNpcmNsZSkuc3ZnIgogICB3aWR0aD0iMTMzLjQ0MDc3IgogICBoZWlnaHQ9IjIwMCI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTAiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTg1OCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU3IgogICAgIGlkPSJuYW1lZHZpZXc2IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxLjY2ODc3MiIKICAgICBpbmtzY2FwZTpjeD0iMzc0Ljc1NTAyIgogICAgIGlua3NjYXBlOmN5PSItNjEuODc5MTQ0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI1NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyIgogICAgIGZpdC1tYXJnaW4tdG9wPSI1IgogICAgIGZpdC1tYXJnaW4tbGVmdD0iNSIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSI1IgogICAgIGZpdC1tYXJnaW4tYm90dG9tPSI1IiAvPgogIDxwYXRoCiAgICAgaWQ9ImNpcmNsZTQxNDkiCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMzZjNmN2I7c3Ryb2tlLXdpZHRoOjUuNTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxIgogICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICBzb2RpcG9kaTpjeD0iNTEuMDIzMjM1IgogICAgIHNvZGlwb2RpOmN5PSI1MC4yMTAwNTIiCiAgICAgc29kaXBvZGk6cng9IjQwLjk0NDIwNiIKICAgICBzb2RpcG9kaTpyeT0iNDEuMzU1MTU2IgogICAgIHNvZGlwb2RpOnN0YXJ0PSIyLjA5NzE3OTIiCiAgICAgc29kaXBvZGk6ZW5kPSIwLjU2MzE5MTk1IgogICAgIGQ9Ik0gMzAuNDUyNDkxLDg1Ljk2Njk2MSBBIDQwLjk0NDIwNiw0MS4zNTUxNTYgMCAwIDEgMTAuNDk2Mjg2LDQ0LjMyMTA2NCA0MC45NDQyMDYsNDEuMzU1MTU2IDAgMCAxIDQxLjI2NjQwMiwxMC4wNDYyMyA0MC45NDQyMDYsNDEuMzU1MTU2IDAgMCAxIDg0LjI0ODg0MywyNi4wNDMyMDMgNDAuOTQ0MjA2LDQxLjM1NTE1NiAwIDAgMSA4NS42NDM4MjUsNzIuMjg5MDY5IgogICAgIHNvZGlwb2RpOm9wZW49InRydWUiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICA8cGF0aAogICAgIGlkPSJjaXJjbGU0MTUzIgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojM2YzZjdiO3N0cm9rZS13aWR0aDo1LjU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgc29kaXBvZGk6Y3g9IjUxLjAyMzE1NSIKICAgICBzb2RpcG9kaTpjeT0iNTIuMTgyNTk4IgogICAgIHNvZGlwb2RpOnJ4PSIyNi4xNDc2MzYiCiAgICAgc29kaXBvZGk6cnk9IjI2LjcxOTk3NiIKICAgICBzb2RpcG9kaTpzdGFydD0iMi41ODU3NDk5IgogICAgIHNvZGlwb2RpOmVuZD0iMC40NTM4NDY4NSIKICAgICBkPSJtIDI4LjgxMTg4Nyw2Ni4yODE2NDQgYSAyNi4xNDc2MzYsMjYuNzE5OTc2IDAgMCAxIDQuNTI0NzI4LC0zMy43Nzg5NjggMjYuMTQ3NjM2LDI2LjcxOTk3NiAwIDAgMSAzMy4zMjAyOSwtMS43Mzc5NjggMjYuMTQ3NjM2LDI2LjcxOTk3NiAwIDAgMSA3Ljg2Njg4OCwzMy4xMzI2MjgiCiAgICAgc29kaXBvZGk6b3Blbj0idHJ1ZSIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogIDxnCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNS4zMjczMDUsMCwwLDUuMzI3MzA1LC02MS41ODU2NiwtNC40Njk3MzA1KSIKICAgICBpZD0iZzQxODEiCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MSI+CiAgICA8cGF0aAogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4xMDU5MzIyLDApIgogICAgICAgZD0ibSAyMS4wOTk2MDksOS4xMzg2NzE5IGMgLTEuMTMzODQzLDAgLTEuODYxMzI4LDAuNzI3NDg0MiAtMS44NjEzMjgsMS44NjEzMjgxIGwgMCwxMC4zMDA3ODEgYSAwLjY4NjcxOTI0LDAuNjg2NzE5MjQgMCAwIDEgMCwwLjAwMzkgYyAtMC4wMDIxLDAuNDkzOTIgLTAuMzQyNzQ4LDAuOTE0MTI1IC0wLjc0ODA0NywxLjA2MjUgLTAuNDA1Mjk4LDAuMTQ4Mzc0IC0wLjkzNTMxOCwwLjA0NTY5IC0xLjI1NTg1OSwtMC4zMzAwNzkgYSAwLjY4NjcxOTI0LDAuNjg2NzE5MjQgMCAwIDEgLTAuMDAyLC0wLjAwMiBjIC0xLjAxNTIzMSwtMS4xOTk4MTkgLTIuMTA2ODE5LC0xLjg5NjQ4NCAtMi42MzI4MTMsLTEuODk2NDg0IC0wLjY0MzYwOCwwIC0xLjA1Njc4OSwwLjI0OTI0NiAtMS4xNTIzNDMsMC4zOTI1NzggYSAwLjY4NjcxOTI0LDAuNjg2NzE5MjQgMCAwIDEgLTAuMDA1OSwwLjAwNzggYyAtMC4wMTU3NiwwLjAyMjg5IC0wLjAzMzI2LDAuMDQ4MTUgLTAuMDUyNzMsMC4wNzIyNyAtMC4xNjc4OTYsMC4yMDk4NyAtMC40MTMzODcsMC42NDA4NjggLTAuMTAxNTYzLDEuNjU0Mjk3IDAuMTUxMDMyLDAuNDkwODUzIDAuNjY3MDU2LDEuNzExNjU1IDEuMzY1MjM1LDMuMTIzMDQ3IDAuNjk4MTc4LDEuNDExMzkyIDEuNTg2NjM2LDMuMDQ3NDY1IDIuNTA3ODEyLDQuNTAxOTUzIDAuNjYyNDc1LDEuMDQwODQ3IDEuMzIyMjA4LDEuODkwNjM2IDEuODkwNjI1LDIuNTU0Njg3IGwgMC4wMDk4LDAuMDExNzIgYyA0Ljg4ZS00LDUuNjllLTQgMC4wMDE1LDAuMDAxNCAwLjAwMiwwLjAwMiBhIDAuNjg2NzE5MjQsMC42ODY3MTkyNCAwIDAgMSAwLjAzMTI1LDAuMDM3MTEgYyAxLjA3MTUyOCwxLjM2Mzc2NSAxLjk1ODExMiwyLjU4OTk5IDIuMDA5NzY2LDQuMzY1MjM0IGwgMTEuNzcxNDg0LDAgYyAwLjAyMDYxLC0yLjQ4NzIzOSAwLjUzMzU5OCwtNC40ODU5NTQgMS4wMjE0ODQsLTYuNDM3NSBDIDM0LjM5NDI5NiwyOC40MzI2IDM0Ljg2MTMyOCwyNi40NTQ0IDM0Ljg2MTMyOCwyNCBsIDAsLTMgYyAwLC0xLjEzMzg0NSAtMC43Mjc0ODMsLTEuODYxMzI4IC0xLjg2MTMyOCwtMS44NjEzMjggLTAuMjA1MDgyLDAgLTAuNTE5NTMxLDAuMDY3MDUgLTAuNzQwMjM0LDAuMTQwNjI1IGwgMCwtMC4wMDIgYyAtMC41OTc0LDAuMTk5MzUxIC0xLjI2MTI4NCwtMC4xNDA1MSAtMS40NDcyNjYsLTAuNzQyMTg4IGEgMC42ODY3MTkyNCwwLjY4NjcxOTI0IDAgMCAxIDAsLTAuMDAyIEMgMzAuNTM3ODYzLDE3LjY0MDYzNSAyOS45MjMxOTgsMTcuMTM4NjcyIDI5LDE3LjEzODY3MiBjIC0wLjM0NTg4MywwIC0wLjU4NzIxMSwwLjA3NDY5IC0wLjcxNjc5NywwLjE3MTg3NSAtMC41MjUwOCwwLjM5MzYwOSAtMS4zMDA5NDUsMC4yNDc2NSAtMS42NDg0MzcsLTAuMzA4NTk0IEwgMjYuNjMyODEyLDE3IGMgLTAuMzEyMjE1LC0wLjQ5ODAwNyAtMC44NDY5ODgsLTAuODYxMzI4IC0xLjUzMzIwMywtMC44NjEzMjggLTAuMjE4NDIsMCAtMC4zNDMzNjIsMC4wNDE1MyAtMC42NDA2MjUsMC4xNDA2MjUgLTAuNzE2OTYyLDAuMjM4MTA1IC0xLjQ5Njg1OCwtMC4zMjI2NDkgLTEuNDk4MDQ2LC0xLjA3ODEyNSBhIDAuNjg2NzE5MjQsMC42ODY3MTkyNCAwIDAgMSAwLC0wLjAwMiBsIDAsLTQuMTk5MjE5IGMgMCwtMS4xMzM4NDM5IC0wLjcyNzQ4NCwtMS44NjEzMjgxIC0xLjg2MTMyOSwtMS44NjEzMjgxIHoiCiAgICAgICBpZD0icGF0aDQxODMiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gMjEuMDk5NjA5IDguNDUxMTcxOSBDIDE5LjYyOTc0MSA4LjQ1MTE3MTkgMTguNTUwNzgxIDkuNTMwMTMxMyAxOC41NTA3ODEgMTEgTCAxOC41NTA3ODEgMjEuMzAwNzgxIEMgMTguNTQ4OTgxIDIxLjcxOTQ2OCAxOC4wMjc1ODIgMjEuOTEwMzM5IDE3Ljc1NTg1OSAyMS41OTE3OTcgQyAxNi42ODY2MzYgMjAuMzI4MTY5IDE1LjU0ODYyOSAxOS40NTExNzIgMTQuNTk5NjA5IDE5LjQ1MTE3MiBDIDEzLjgwMDA1NCAxOS40NTExNzIgMTMuMTU5NTU3IDE5LjcyMzU1NSAxMi44NzUgMjAuMTUwMzkxIEMgMTIuODY3NiAyMC4xNjExNDEgMTIuODU5ODIyIDIwLjE3MTU3MSAxMi44NTE1NjIgMjAuMTgxNjQxIEMgMTIuNTQ3NTMxIDIwLjU2MTY4IDEyLjI2Njc3MiAyMS4yODM1MTQgMTIuNjMwODU5IDIyLjQ2Njc5NyBDIDEyLjk5NDAzMSAyMy42NDcxMDQgMTQuNzAyMzA2IDI3LjI5MjkxIDE2LjU4MDA3OCAzMC4yNTc4MTIgQyAxNy4yNjY3MjEgMzEuMzM2ODIzIDE3Ljk1MjQyOCAzMi4yMTk1NjUgMTguNTQxMDE2IDMyLjkwNjI1IEMgMTguNTQ1NzE2IDMyLjkxMDc1IDE4LjU1MDIxOCAzMi45MTUyNTIgMTguNTU0Njg4IDMyLjkxOTkyMiBDIDE5LjY1NTI1OSAzNC4zMjA2NTEgMjAuNDUxMTcyIDM1LjM1OTQwNCAyMC40NTExNzIgMzcgQyAyMC40NTExNzIgMzcuMTk5Njg2IDIwLjUwOTk1MiAzNy4zMjI0NDkgMjAuNTkzNzUgMzcuNDA2MjUgQyAyMC42Nzc1NSAzNy40OTAwNSAyMC44MDAzMTQgMzcuNTQ4ODI4IDIxIDM3LjU0ODgyOCBMIDMzIDM3LjU0ODgyOCBDIDMzLjE5OTY4NiAzNy41NDg4MjggMzMuMzIyNDQ5IDM3LjQ5MDA0OCAzMy40MDYyNSAzNy40MDYyNSBDIDMzLjQ5MDA1IDM3LjMyMjQ1IDMzLjU0ODgyOCAzNy4xOTk2ODYgMzMuNTQ4ODI4IDM3IEMgMzMuNTQ4ODI4IDM0LjUzNzMwNCAzNC4wNjMzNTIgMzIuNTg2NDM2IDM0LjU2MjUgMzAuNTg5ODQ0IEMgMzUuMDYxNjUyIDI4LjU5MzI1NCAzNS41NDg4MjggMjYuNTQyMTI3IDM1LjU0ODgyOCAyNCBMIDM1LjU0ODgyOCAyMSBDIDM1LjU0ODgyOCAxOS41MzAxMzEgMzQuNDY5ODY5IDE4LjQ1MTE3MiAzMyAxOC40NTExNzIgQyAzMi42NzQ2NDggMTguNDUxMTcyIDMyLjMxMzg2MiAxOC41MzY2NTIgMzIuMDQyOTY5IDE4LjYyNjk1MyBDIDMxLjgwMjcyMiAxOC43MDcxMjMgMzEuNTQzNTQ1IDE4LjU3NDAwMyAzMS40Njg3NSAxOC4zMzIwMzEgQyAzMS4xMTk5NzcgMTcuMTk4NTIgMzAuMjA2NzA2IDE2LjQ1MTE3MiAyOSAxNi40NTExNzIgQyAyOC41NjA0MjQgMTYuNDUxMTcyIDI4LjE2NTIgMTYuNTQxMTQyIDI3Ljg3MTA5NCAxNi43NjE3MTkgQyAyNy42NTkxMzQgMTYuOTIwNjA4IDI3LjM1NjU1NyAxNi44NjM3MDUgMjcuMjE2Nzk3IDE2LjYzODY3MiBDIDI2Ljc5MjAzMSAxNS45NTkwNDYgMjYuMDM1MzUzIDE1LjQ1MTE3MiAyNS4wOTk2MDkgMTUuNDUxMTcyIEMgMjQuNzc0MjU3IDE1LjQ1MTE3MiAyNC41NDE1MTggMTUuNTI3MTcyIDI0LjI0MjE4OCAxNS42MjY5NTMgQyAyMy45NTAyMyAxNS43MjM5MTMgMjMuNjQ4OTIyIDE1LjUwNjg1NyAyMy42NDg0MzggMTUuMTk5MjE5IEwgMjMuNjQ4NDM4IDExIEMgMjMuNjQ4NDM4IDkuNTMwMTMxMyAyMi41Njk0NzggOC40NTExNzE5IDIxLjA5OTYwOSA4LjQ1MTE3MTkgeiAiCiAgICAgICBpbmtzY2FwZTpyYWRpdXM9Ii0wLjY4NjY1MDU3IgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6b2Zmc2V0IiAvPgogIDwvZz4KICA8ZwogICAgIGlkPSJnNDEzOCIKICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDUuMzI3MzA1LDAsMCw1LjMyNzMwNSwtNjAuOTM4NjgyLC01LjAzNDA2MDUpIj4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpvZmZzZXQiCiAgICAgICBpbmtzY2FwZTpyYWRpdXM9Ii0wLjQ1MTQxMTQ5IgogICAgICAgaW5rc2NhcGU6b3JpZ2luYWw9Ik0gMjEuMDk5NjA5IDggQyAxOS4zOTk2MDkgOCAxOC4wOTk2MDkgOS4zIDE4LjA5OTYwOSAxMSBMIDE4LjA5OTYwOSAyMS4zMDA3ODEgQyAxNi45OTk2MDkgMjAuMDAwNzgxIDE1Ljc5OTYwOSAxOSAxNC41OTk2MDkgMTkgQyAxMy42OTk2MDkgMTkgMTIuOSAxOS4zMDAzOTEgMTIuNSAxOS45MDAzOTEgQyAxMi4xIDIwLjQwMDM5MSAxMS43OTkyMTkgMjEuMjk5NjA5IDEyLjE5OTIxOSAyMi41OTk2MDkgQyAxMi41OTkyMTkgMjMuODk5NjA5IDE0LjI5OTIxOSAyNy41IDE2LjE5OTIxOSAzMC41IEMgMTYuODk5MjE5IDMxLjYgMTcuNTk5MjE5IDMyLjQ5OTIxOSAxOC4xOTkyMTkgMzMuMTk5MjE5IEMgMTkuMjk5MjE5IDM0LjU5OTIxOSAyMCAzNS41IDIwIDM3IEMgMjAgMzcuNiAyMC40IDM4IDIxIDM4IEwgMzMgMzggQyAzMy42IDM4IDM0IDM3LjYgMzQgMzcgQyAzNCAzNC42IDM0LjUgMzIuNjk5MjE5IDM1IDMwLjY5OTIxOSBDIDM1LjUgMjguNjk5MjE5IDM2IDI2LjYgMzYgMjQgTCAzNiAyMSBDIDM2IDE5LjMgMzQuNyAxOCAzMyAxOCBDIDMyLjYgMTggMzIuMjAwMzkxIDE4LjA5OTIxOSAzMS45MDAzOTEgMTguMTk5MjE5IEMgMzEuNTAwMzkxIDE2Ljg5OTIxOSAzMC40IDE2IDI5IDE2IEMgMjguNSAxNiAyNy45OTk2MDkgMTYuMTAwMzkxIDI3LjU5OTYwOSAxNi40MDAzOTEgQyAyNy4wOTk2MDkgMTUuNjAwMzkxIDI2LjE5OTYwOSAxNSAyNS4wOTk2MDkgMTUgQyAyNC42OTk2MDkgMTUgMjQuMzk5NjA5IDE1LjA5OTIxOSAyNC4wOTk2MDkgMTUuMTk5MjE5IEwgMjQuMDk5NjA5IDExIEMgMjQuMDk5NjA5IDkuMyAyMi43OTk2MDkgOCAyMS4wOTk2MDkgOCB6IE0gMjEgMTAgQyAyMS42IDEwIDIyIDEwLjQgMjIgMTEgTCAyMiAyMCBDIDIyIDIwLjYgMjIuNCAyMSAyMyAyMSBDIDIzLjYgMjEgMjQgMjAuNiAyNCAyMCBMIDI0IDE4IEMgMjQgMTcuNCAyNC40IDE3IDI1IDE3IEMgMjUuNiAxNyAyNiAxNy40IDI2IDE4IEwgMjYgMjEgQyAyNiAyMS42IDI2LjQgMjIgMjcgMjIgQyAyNy42IDIyIDI4IDIxLjYgMjggMjEgTCAyOCAxOSBDIDI4IDE4LjQgMjguNCAxOCAyOSAxOCBDIDI5LjYgMTggMzAgMTguNCAzMCAxOSBMIDMwIDIyIEMgMzAgMjIuNiAzMC40IDIzIDMxIDIzIEMgMzEuNiAyMyAzMiAyMi42IDMyIDIyIEwgMzIgMjEgQyAzMiAyMC40IDMyLjQgMjAgMzMgMjAgQyAzMy42IDIwIDM0IDIwLjQgMzQgMjEgTCAzNCAyNCBDIDM0IDI2LjMgMzMuNSAyOC4xOTkyMTkgMzMgMzAuMTk5MjE5IEMgMzIuNiAzMS45OTkyMTkgMzIuMSAzMy44IDMyIDM2IEwgMjEuOTAwMzkxIDM2IEMgMjEuNzAwMzkxIDM0LjMgMjAuNjk5NjA5IDMzLjIgMTkuNTk5NjA5IDMyIEMgMTguOTk5NjA5IDMxLjIgMTguNDAwNzgxIDMwLjUgMTcuODAwNzgxIDI5LjUgQyAxNS44MDA3ODEgMjYuMyAxNC4zIDIzLjEgMTQgMjIgQyAxMy45IDIxLjUgMTMuOSAyMS4xOTk2MDkgMTQgMjEuMDk5NjA5IEMgMTQuMSAyMC45OTk2MDkgMTQuMyAyMSAxNC41IDIxIEMgMTUuMiAyMSAxNy4xIDIyLjg5OTIxOSAxOCAyNS4xOTkyMTkgTCAxOCAyNiBDIDE4IDI2LjYgMTguNCAyNyAxOSAyNyBDIDE5LjYgMjcgMjAgMjYuNiAyMCAyNiBMIDIwIDExIEMgMjAgMTAuNCAyMC40IDEwIDIxIDEwIHogIgogICAgICAgaWQ9InBhdGg0MTQzIgogICAgICAgZD0ibSAyMS4wOTk2MDksOC40NTExNzE5IGMgLTEuNDY5ODY4LDAgLTIuNTQ4ODI4LDEuMDc4OTU5NCAtMi41NDg4MjgsMi41NDg4MjgxIGwgMCwxMC4zMDA3ODEgYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgLTAuNzk0OTIyLDAuMjkxMDE2IGMgLTEuMDY5MjIzLC0xLjI2MzYyOCAtMi4yMDcyMywtMi4xNDA2MjUgLTMuMTU2MjUsLTIuMTQwNjI1IC0wLjc5OTU1NSwwIC0xLjQ0MDA1MiwwLjI3MjM4MyAtMS43MjQ2MDksMC42OTkyMTkgYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgLTAuMDIzNDQsMC4wMzEyNSBjIC0wLjMwNDAzMSwwLjM4MDAzOSAtMC41ODQ3OSwxLjEwMTg3MyAtMC4yMjA3MDMsMi4yODUxNTYgMC4zNjMxNzIsMS4xODAzMDcgMi4wNzE0NDcsNC44MjYxMTIgMy45NDkyMTksNy43OTEwMTUgMC42ODY2NDMsMS4wNzkwMSAxLjM3MjM1LDEuOTYxNzUzIDEuOTYwOTM4LDIuNjQ4NDM4IGEgMC40NTE0NTY2MywwLjQ1MTQ1NjYzIDAgMCAxIDAuMDEzNjcsMC4wMTM2NyBjIDEuMTAwNTcyLDEuNDAwNzI5IDEuODk2NDg0LDIuNDM5NDgyIDEuODk2NDg0LDQuMDgwMDc4IDAsMC4xOTk2ODYgMC4wNTg3OCwwLjMyMjQ0OSAwLjE0MjU3OCwwLjQwNjI1IDAuMDgzOCwwLjA4MzggMC4yMDY1NjQsMC4xNDI1NzggMC40MDYyNSwwLjE0MjU3OCBsIDEyLDAgYyAwLjE5OTY4NiwwIDAuMzIyNDQ5LC0wLjA1ODc4IDAuNDA2MjUsLTAuMTQyNTc4IDAuMDgzOCwtMC4wODM4IDAuMTQyNTc4LC0wLjIwNjU2NCAwLjE0MjU3OCwtMC40MDYyNSAwLC0yLjQ2MjY5NiAwLjUxNDUyNCwtNC40MTM1NjQgMS4wMTM2NzIsLTYuNDEwMTU2IEMgMzUuMDYxNjQ4LDI4LjU5MzI1MiAzNS41NDg4MjgsMjYuNTQyMTI3IDM1LjU0ODgyOCwyNCBsIDAsLTMgYyAwLC0xLjQ2OTg2OSAtMS4wNzg5NTksLTIuNTQ4ODI4IC0yLjU0ODgyOCwtMi41NDg4MjggLTAuMzI1MzUyLDAgLTAuNjg2MTM4LDAuMDg1NDggLTAuOTU3MDMxLDAuMTc1NzgxIEEgMC40NTE0NTY2MywwLjQ1MTQ1NjYzIDAgMCAxIDMxLjQ2ODc1LDE4LjMzMjAzMSBDIDMxLjExOTk3NywxNy4xOTg1MiAzMC4yMDY3MDYsMTYuNDUxMTcyIDI5LDE2LjQ1MTE3MiBjIC0wLjQzOTU3NiwwIC0wLjgzNDgsMC4wODk5NyAtMS4xMjg5MDYsMC4zMTA1NDcgYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgLTAuNjU0Mjk3LC0wLjEyMzA0NyBjIC0wLjQyNDc2NiwtMC42Nzk2MjYgLTEuMTgxNDQ0LC0xLjE4NzUgLTIuMTE3MTg4LC0xLjE4NzUgLTAuMzI1MzUyLDAgLTAuNTU4MDksMC4wNzYgLTAuODU3NDIxLDAuMTc1NzgxIGEgMC40NTE0NTY2MywwLjQ1MTQ1NjYzIDAgMCAxIC0wLjU5Mzc1LC0wLjQyNzczNCBsIDAsLTQuMTk5MjE5IGMgMCwtMS40Njk4Njg3IC0xLjA3ODk2LC0yLjU0ODgyODEgLTIuNTQ4ODI5LC0yLjU0ODgyODEgeiBNIDIxLDkuNTQ4ODI4MSBjIDAuNDAwMzE0LDAgMC43Nzg3MjMsMC4xNDAwNTExIDEuMDQ0OTIyLDAuNDA2MjUgMC4yNjYxOTksMC4yNjYxOTg5IDAuNDA2MjUsMC42NDQ2MDc5IDAuNDA2MjUsMS4wNDQ5MjE5IGwgMCw5IGMgMCwwLjE5OTY4NiAwLjA1ODc4LDAuMzIyNDQ5IDAuMTQyNTc4LDAuNDA2MjUgMC4wODM4LDAuMDgzOCAwLjIwNjU2NCwwLjE0MjU3OCAwLjQwNjI1LDAuMTQyNTc4IDAuMTk5Njg2LDAgMC4zMjI0NDksLTAuMDU4NzggMC40MDYyNSwtMC4xNDI1NzggMC4wODM4LC0wLjA4MzggMC4xNDI1NzgsLTAuMjA2NTY0IDAuMTQyNTc4LC0wLjQwNjI1IGwgMCwtMiBjIDAsLTAuNDAwMzE0IDAuMTQwMDUxLC0wLjc3ODcyMyAwLjQwNjI1LC0xLjA0NDkyMiAwLjI2NjE5OSwtMC4yNjYxOTkgMC42NDQ2MDgsLTAuNDA2MjUgMS4wNDQ5MjIsLTAuNDA2MjUgMC40MDAzMTQsMCAwLjc3ODcyMywwLjE0MDA1MSAxLjA0NDkyMiwwLjQwNjI1IDAuMjY2MTk5LDAuMjY2MTk5IDAuNDA2MjUsMC42NDQ2MDggMC40MDYyNSwxLjA0NDkyMiBsIDAsMyBjIDAsMC4xOTk2ODYgMC4wNTg3OCwwLjMyMjQ0OSAwLjE0MjU3OCwwLjQwNjI1IDAuMDgzOCwwLjA4MzggMC4yMDY1NjQsMC4xNDI1NzggMC40MDYyNSwwLjE0MjU3OCAwLjE5OTY4NiwwIDAuMzIyNDQ5LC0wLjA1ODc4IDAuNDA2MjUsLTAuMTQyNTc4IDAuMDgzOCwtMC4wODM4IDAuMTQyNTc4LC0wLjIwNjU2NCAwLjE0MjU3OCwtMC40MDYyNSBsIDAsLTIgYyAwLC0wLjQwMDMxNCAwLjE0MDA1MSwtMC43Nzg3MjMgMC40MDYyNSwtMS4wNDQ5MjIgMC4yNjYxOTksLTAuMjY2MTk5IDAuNjQ0NjA4LC0wLjQwNjI1IDEuMDQ0OTIyLC0wLjQwNjI1IDAuNDAwMzE0LDAgMC43Nzg3MjMsMC4xNDAwNTEgMS4wNDQ5MjIsMC40MDYyNSAwLjI2NjE5OSwwLjI2NjE5OSAwLjQwNjI1LDAuNjQ0NjA4IDAuNDA2MjUsMS4wNDQ5MjIgbCAwLDMgYyAwLDAuMTk5Njg2IDAuMDU4NzgsMC4zMjI0NDkgMC4xNDI1NzgsMC40MDYyNSAwLjA4MzgsMC4wODM4IDAuMjA2NTY0LDAuMTQyNTc4IDAuNDA2MjUsMC4xNDI1NzggMC4xOTk2ODYsMCAwLjMyMjQ0OSwtMC4wNTg3OCAwLjQwNjI1LC0wLjE0MjU3OCAwLjA4MzgsLTAuMDgzOCAwLjE0MjU3OCwtMC4yMDY1NjQgMC4xNDI1NzgsLTAuNDA2MjUgbCAwLC0xIGMgMCwtMC40MDAzMTQgMC4xNDAwNTEsLTAuNzc4NzIzIDAuNDA2MjUsLTEuMDQ0OTIyIDAuMjY2MTk5LC0wLjI2NjE5OSAwLjY0NDYwOCwtMC40MDYyNSAxLjA0NDkyMiwtMC40MDYyNSAwLjQwMDMxNCwwIDAuNzc4NzIzLDAuMTQwMDUxIDEuMDQ0OTIyLDAuNDA2MjUgMC4yNjYxOTksMC4yNjYxOTkgMC40MDYyNSwwLjY0NDYwOCAwLjQwNjI1LDEuMDQ0OTIyIGwgMCwzIGMgMCwyLjM2NTQyMiAtMC41MTQ1MzcsNC4zMTIwNTUgLTEuMDEzNjcyLDYuMzA4NTk0IGwgMC4wMDM5LC0wLjAxMTcyIGMgLTAuNDAzNDUsMS44MTU1MjYgLTAuODkyODI2LDMuNTc5Njc4IC0wLjk5MDIzNCw1LjcyMjY1NiBBIDAuNDUxNDU2NjMsMC40NTE0NTY2MyAwIDAgMSAzMiwzNi40NTExNzIgbCAtMTAuMDk5NjA5LDAgQSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgMjEuNDUxMTcyLDM2LjA1MjczNCBDIDIxLjI2ODk0OSwzNC41MDM4NCAyMC4zNjY4ODMsMzMuNTAzOTI5IDE5LjI2NzU3OCwzMi4zMDQ2ODggYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgLTAuMDI5MywtMC4wMzMyIGMgLTAuNTg4MDA5LC0wLjc4NDAxMSAtMS4yMDEzNzMsLTEuNTAzMDEyIC0xLjgyMDMxMiwtMi41MzMyMDMgbCAtMC4wMDIsLTAuMDAyIGMgLTguNTZlLTQsLTAuMDAxNCAtMC4wMDExLC0wLjAwMjUgLTAuMDAyLC0wLjAwMzkgLTEuMDA3MjU0LC0xLjYxMjE0NCAtMS44ODYyNzYsLTMuMjIxMjc3IC0yLjU1NDY4NywtNC41NzAzMTMgLTAuNjY5MzA3LC0xLjM1MDg0NCAtMS4xMjM4ODIsLTIuNDE1ODIxIC0xLjI5NDkyMiwtMy4wNDI5NjggYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgLTAuMDA3OCwtMC4wMzEyNSBjIC0wLjA1MzQxLC0wLjI2NzA0NyAtMC4wODM5OSwtMC40ODcyNzggLTAuMDgzOTksLTAuNjg3NSAwLC0wLjIwMDIyMiAtOC4yMWUtNCwtMC40MDkzMzUgMC4yMDg5ODUsLTAuNjE5MTQxIDAuMTU2NjA2LC0wLjE1NjYwNyAwLjMzMTY1NCwtMC4xOTc2NDIgMC40NjY3OTcsLTAuMjE2Nzk3IDAuMTM1MTQyLC0wLjAxOTE2IDAuMjUxODU2LC0wLjAxNTYzIDAuMzUxNTYyLC0wLjAxNTYzIDAuMzc5MTI2LDAgMC42NTY0NDgsMC4xNzk5MDUgMC45ODI0MjIsMC40MTk5MjIgMC4zMjU5NzQsMC4yNDAwMTcgMC42NzY5MTEsMC41Njg1ODEgMS4wMzEyNSwwLjk2ODc1IDAuNzA4Njc3LDAuODAwMzM4IDEuNDMyMzMzLDEuODg2NTM3IDEuOTA2MjUsMy4wOTc2NTYgYSAwLjQ1MTQ1NjYzLDAuNDUxNDU2NjMgMCAwIDEgMC4wMzEyNSwwLjE2NDA2MyBsIDAsMC44MDA3ODEgYyAwLDAuMTk5Njg2IDAuMDU4NzgsMC4zMjI0NDkgMC4xNDI1NzgsMC40MDYyNSAwLjA4MzgsMC4wODM4IDAuMjA2NTY0LDAuMTQyNTc4IDAuNDA2MjUsMC4xNDI1NzggMC4xOTk2ODYsMCAwLjMyMjQ0OSwtMC4wNTg3OCAwLjQwNjI1LC0wLjE0MjU3OCAwLjA4MzgsLTAuMDgzOCAwLjE0MjU3OCwtMC4yMDY1NjQgMC4xNDI1NzgsLTAuNDA2MjUgbCAwLC0xNSBjIDAsLTAuNDAwMzE0IDAuMTQwMDUxLC0wLjc3ODcyMyAwLjQwNjI1LC0xLjA0NDkyMTkgQyAyMC4yMjEyNzcsOS42ODg4NzkyIDIwLjU5OTY4Niw5LjU0ODgyODEgMjEsOS41NDg4MjgxIFoiCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxIiAvPgogIDwvZz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiMwMGZmZmY7ZmlsbC1vcGFjaXR5OjEiCiAgICAgaWQ9Imc0MTYxLTgiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoNS4zMjczMDUsMCwwLDUuMzI3MzA1LDIxNy4zNTE3MiwtNzguOTU4MzgpIiAvPgo8L3N2Zz4K");
background-size: 16px;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment