mod: админка (03) ImageAdmin (03) fin (пропатчено, подключили стили)

This commit is contained in:
erjemin committed 2026-06-12 00:48:12 +03:00
1 parent c7049f7d8d
commit fed2a1c5a0
6 files changed
+196 -14

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "esbuild src/editor.js --bundle --format=esm --minify --outfile=${CM6_OUTPUT_DIR:-../public/static/codemirror}/editor.js" "build": "esbuild src/editor.js --bundle --format=iife --minify --outfile=${CM6_OUTPUT_DIR:-../public/static/codemirror}/editor.js"
}, },
"devDependencies": { "devDependencies": {
"@babel/runtime": "7.29.7", "@babel/runtime": "7.29.7",
+55 -9
View File
@@ -2,6 +2,8 @@
# Регистрируем модели с удобным интерфейсом. # Регистрируем модели с удобным интерфейсом.
from django import forms from django import forms
from django.db import models
from django.forms import TextInput, Textarea, URLField
from django.contrib import admin from django.contrib import admin
from django.utils.html import format_html, mark_safe from django.utils.html import format_html, mark_safe
from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.files import get_thumbnailer
@@ -25,8 +27,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False, required=False,
widget=forms.TextInput(attrs={ widget=forms.TextInput(attrs={
'placeholder': 'Введите alt-текст для картинки', 'placeholder': 'Введите alt-текст для картинки',
'class': 'vTextField',
'size': 200,
}), }),
label='ALT (новый)', label='ALT (новый)',
help_text='Текст для alt-атрибута картинки <tt>&lt;img alt="" .../&gt;</tt>.' help_text='Текст для alt-атрибута картинки <tt>&lt;img alt="" .../&gt;</tt>.'
@@ -37,8 +37,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False, required=False,
widget=forms.TextInput(attrs={ widget=forms.TextInput(attrs={
'placeholder': 'Введите title-описание картинки', 'placeholder': 'Введите title-описание картинки',
'class': 'vTextField',
'cols': 120,
}), }),
label='TITLE (новый)', label='TITLE (новый)',
help_text='Текст для title-атрибута картинки <tt>&lt;img title="" .../&gt;</tt>.' help_text='Текст для title-атрибута картинки <tt>&lt;img title="" .../&gt;</tt>.'
@@ -49,8 +47,6 @@ class TbImageAdminForm(forms.ModelForm):
required=False, required=False,
widget=forms.TextInput(attrs={ widget=forms.TextInput(attrs={
'placeholder': 'XXXX, Авторские права на изображение', 'placeholder': 'XXXX, Авторские права на изображение',
'class': 'vTextField',
'cols': 120,
}), }),
label='Copyright', label='Copyright',
help_text='Авторские права на изображение (например: <tt>2025, Sergei Erjemin</tt>. Будет сохранён в filer_image.author' help_text='Авторские права на изображение (например: <tt>2025, Sergei Erjemin</tt>. Будет сохранён в filer_image.author'
@@ -64,6 +60,13 @@ class TbImageAdminForm(forms.ModelForm):
""" """
При инициализации формы подгружаем текущие значения alt/caption из filer_image. При инициализации формы подгружаем текущие значения alt/caption из filer_image.
""" """
# Атрибуты для активации CodeMirror редактора
codemirror_attrs = {
'data-codemirror-editor': '1',
'data-language': 'text',
'data-width': '100%', # Ширина для патча (100% займет полную ширину)
}
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# Если редактируем существующую запись, получаем текущие значения из filer # Если редактируем существующую запись, получаем текущие значения из filer
@@ -71,27 +74,70 @@ class TbImageAdminForm(forms.ModelForm):
try: try:
filer_image = self.instance.image filer_image = self.instance.image
# Получаем текущие значения из filer и заполняем виртуальные поля # Получаем текущие значения из filer и заполняем виртуальные поля
# ALT-text
self.fields['filer_alt_text'].initial = filer_image.default_alt_text or '' self.fields['filer_alt_text'].initial = filer_image.default_alt_text or ''
self.fields['filer_alt_text'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
self.fields['filer_caption'].initial = filer_image.default_caption or '' self.fields['filer_caption'].initial = filer_image.default_caption or ''
self.fields['filer_caption'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
self.fields['filer_copyright'].initial = filer_image.author or '' self.fields['filer_copyright'].initial = filer_image.author or ''
self.fields['filer_copyright'].widget = Textarea(attrs={
'class': 'codemirror-width-m',
**codemirror_attrs,
})
except Exception: except Exception:
# Если ошибка при получении filer_image, просто оставляем пустые значения # Если ошибка при получении filer_image, просто оставляем пустые значения
pass pass
# s_img_src_url - поле URL источника (длинная строка)
self.fields['s_img_src_url'].widget = Textarea(attrs={
'class': 'codemirror-width-xl',
**codemirror_attrs,
})
# i_img_sort - поле сортировки (до четырех цифр)
self.fields['i_img_sort'].widget = Textarea(attrs={
'class': 'codemirror-width-s codemirror-no-lines',
**codemirror_attrs,
})
# f_img_confidence_score - поле confidence score (число с плавающей точкой)
self.fields['f_img_confidence_score'].widget = Textarea(attrs={
'class': 'codemirror-width-s codemirror-no-lines',
**codemirror_attrs,
})
class ImageAdmin(admin.ModelAdmin): class ImageAdmin(admin.ModelAdmin):
""" """
Админ для изображений TbImage с поддержкой редактирования метаданных filer_image. Админ для изображений TbImage с поддержкой редактирования метаданных filer_image.
Позволяет пользователю заполнить default_alt_text и default_caption для картинки в filer Позволяет пользователю заполнить default_alt_text и default_caption для картинки в filer
прямо в админке TbImage, без необходимости отдельного редактирования фiler. прямо в админке TbImage, без необходимости отдельного редактирования filer.
""" """
form = TbImageAdminForm # Используем кастомную форму с виртуальными полями form = TbImageAdminForm # Используем кастомную форму с виртуальными полями
# Подключаем JS через Media (правильный способ!)
class Media:
css = {
'all': ('codemirror/codemirror-styles.css',) # Стили для CodeMirror
}
js = (
'codemirror/editor.js', # Основной CodeMirror
'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
)
list_display = ('id', 'image_thumbnail', 'image', '_display_filer_alt_text', 'i_img_sort', 't_img_created') list_display = ('id', 'image_thumbnail', 'image', '_display_filer_alt_text', 'i_img_sort', 't_img_created')
list_display_links = ('id', 'image_thumbnail', 'image') list_display_links = ('id', 'image_thumbnail', 'image')
list_filter = ('l_img_source', 'l_img_reality', 't_img_created') list_filter = ('l_img_source', 'l_img_reality', 't_img_created')
ordering = ('image', 'i_img_sort') ordering = ('image', 'i_img_sort')
readonly_fields = ('t_img_created', 't_img_updated', '_display_filer_alt_text', '_display_filer_caption') readonly_fields = ('t_img_created', 't_img_updated', '_display_filer_alt_text', '_display_filer_caption')
fieldsets = ( fieldsets = (
('Изображение', { ('Изображение', {
'fields': ('image', 'l_img_source', 'l_img_reality', 's_img_src_url', 'i_img_sort', 'fields': ('image', 'l_img_source', 'l_img_reality', 's_img_src_url', 'i_img_sort',
@@ -101,8 +147,8 @@ class ImageAdmin(admin.ModelAdmin):
('Метаданные filer (SEO для картинок)', { ('Метаданные filer (SEO для картинок)', {
'fields': ('_display_filer_alt_text', '_display_filer_caption', 'filer_alt_text', 'filer_caption', 'fields': ('_display_filer_alt_text', '_display_filer_caption', 'filer_alt_text', 'filer_caption',
'filer_copyright'), 'filer_copyright'),
'description': 'Редактируемые поля для заполнения Alt текста и описания в filer. Если не заполнить,' 'description': 'Редактируемые поля для заполнения ALT-, TITLE- и ©-текста в filer. Если не заполнить,'
' текущие значения останутся без изменений (или не будут заполнены при создании).', ' текущие значения останутся без изменений (и не будут заполнены при создании).',
# 'classes': ('collapse',), # 'classes': ('collapse',),
}), }),
('Служебная информация', { ('Служебная информация', {
+2 -2
View File
@@ -314,9 +314,9 @@ class TbImage(models.Model):
# Доверие данным (для парсеров и API) # Доверие данным (для парсеров и API)
null=True, null=True,
blank=True, blank=True,
default=None, default=10.0,
verbose_name='Достоверность', verbose_name='Достоверность',
help_text='Уверенность (для автоматических данных) 0.0 - 1.0, насколько уверены, что это правильное изображение', help_text='Уверенность (для автоматических данных) 0.0 - 10.0, насколько уверены, что это правильное изображение',
) )
s_img_copyright = models.CharField( s_img_copyright = models.CharField(
# Авторские права и лицензия (по идее -- ненужное поле. Можно в filer использовать `obj.image.author`. # Авторские права и лицензия (по идее -- ненужное поле. Можно в filer использовать `obj.image.author`.
@@ -0,0 +1,78 @@
/**
* CodeMirror 6 - Height Control Patch
*
* Этот патч перехватывает создание CodeMirror редакторов и копирует
* атрибут data-height с textarea на создаваемый wrapper div.
*
* Использование в admin.py:
* textarea widget: attrs={'data-height': '50px', 'data-codemirror-editor': '1'}
*
* Загружается ПОСЛЕ editor.js через Media в Admin класс.
*/
(function () {
'use strict';
/**
* Применяем высоту к уже созданным wrapper'ам
* (CodeMirror уже загрузился и создал обёртки)
*/
function applyHeightsToExistingWrappers() {
// Находим все textarea'ы с data-codemirror-editor
document.querySelectorAll('textarea[data-codemirror-editor]').forEach((textarea) => {
// Соседний div (wrapper, созданный CodeMirror)
const wrapper = textarea.previousElementSibling;
// Проверяем что это действительно wrapper CodeMirror
if (wrapper && wrapper.classList && wrapper.classList.contains('cm6-editor-wrapper')) {
// Копируем data-height на style если указано
if (textarea.dataset.height) {
wrapper.style.height = textarea.dataset.height;
}
// Копируем data-width на style если указано (для ширины)
if (textarea.dataset.width) {
wrapper.style.width = textarea.dataset.width;
wrapper.style.minWidth = textarea.dataset.width;
// Также устанавливаем ширину на сам .cm-editor внутри wrapper
// Используем !important чтобы переопределить flex: 1 1 auto из CSS
const cmEditor = wrapper.querySelector('.cm-editor');
// if (cmEditor) {
// cmEditor.style.cssText = `width: ${textarea.dataset.width} !important; flex: 0 0 auto;`;
// }
}
// Копируем классы с textarea если они есть
// (например cm6-editor-wrapper-xs, cm6-editor-wrapper-sm и т.д.)
if (textarea.className) {
// Добавляем классы из textarea (сохраняя cm6-editor-wrapper)
textarea.className.split(' ').forEach((cls) => {
if (cls && cls !== 'cm6-editor-wrapper') {
wrapper.classList.add(cls);
}
});
}
}
});
}
// Применяем высоты когда DOM готов
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', applyHeightsToExistingWrappers);
} else {
// DOM уже загружен
applyHeightsToExistingWrappers();
}
// Также применяем для динамически добавленных элементов (если загружают CodeMirror после инициализации)
const observer = new MutationObserver(() => {
applyHeightsToExistingWrappers();
});
observer.observe(document, {
childList: true,
subtree: true,
});
})();
@@ -0,0 +1,58 @@
/* CodeMirror 6 - Стили для правильного отображения */
:root {
color-scheme: light dark;
--brdr: light-dark(#333, #ccc);
--accent-mode-color: light-dark(#222, #eee);
}
.cm6-editor-wrapper {
/* Основной wrapper, созданный CodeMirror */
flex-direction: column;
overflow: hidden;
}
.cm-editor {
/* Сам редактор внутри wrapper - растягиваем на всю доступную высоту */
flex: 1 1 auto;
font-family: monospace;
line-height: 1;
border: 1px solid var(--brdr);;
}
/*
Утилитарные классы для управления шириной.
Мы ищем редактор .cm-editor ВНУТРИ элемента с нашим классом.
*/
.codemirror-width-s > .cm-editor {
/* Маленький (для чисел, коротких ID) */
max-width: 8em !important;
}
.codemirror-width-m .cm-editor {
/* Средний (для URL, коротких строк) */
max-width: calc(50% - 13em) !important;
}
.codemirror-width-l > .cm-editor {
/* Большой (для текста, JSON, HTML) */
max-width: calc(75% - 13em) !important;
}
.codemirror-width-xl > .cm-editor {
/* Во всю ширину контейнера */
max-width: calc(100% - 13em) !important;
}
/* --- Новое правило для скрытия номеров строк --- */
/* Если у обертки есть наш класс, находим внутри панель с номерами и скрываем ее */
.codemirror-no-lines .cm-gutters {
display: none !important;
}
/* Скрыть оригинальный textarea */
textarea[data-codemirror-editor] {
display: none !important;
}
+2 -2
View File
@@ -1,4 +1,4 @@
var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e<r.length;e++)(e%2?Vo:Js).push(t=t+r[e])})();function gc(r){if(r<768)return!1;for(let e=0,t=Js.length;;){let i=e+t>>1;if(r<Js[i])t=i;else if(r>=Vo[i])e=i+1;else return!0;if(e==t)return!1}}function zo(r){return r>=127462&&r<=127487}var _o=8205;function Eo(r,e,t=!0,i=!0){return(t?Wo:mc)(r,e,i)}function Wo(r,e,t){if(e==r.length)return e;e&&qo(r.charCodeAt(e))&&Do(r.charCodeAt(e-1))&&e--;let i=Ks(r,e);for(e+=Yo(i);e<r.length;){let s=Ks(r,e);if(i==_o||s==_o||t&&gc(s))e+=Yo(s),i=s;else if(zo(s)){let n=0,o=e-2;for(;o>=0&&zo(Ks(r,o));)n++,o-=2;if(n%2==0)break;e+=2}else break}return e}function mc(r,e,t){for(;e>0;){let i=Wo(r,e-2,t);if(i<e)return i;e--}return 0}function Ks(r,e){let t=r.charCodeAt(e);if(!Do(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return qo(i)?(t-55296<<10)+(i-56320)+65536:t}function qo(r){return r>=56320&&r<57344}function Do(r){return r>=55296&&r<56320}function Yo(r){return r<65536?1:2}var M=class r{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=zt(this,e,t);let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),At.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=zt(this,e,t);let i=[];return this.decompose(e,t,i,0),At.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new St(this),n=new St(e);for(let o=t,l=t;;){if(s.next(o),n.next(o),o=0,s.lineBreak!=n.lineBreak||s.done!=n.done||s.value!=n.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new St(this,e)}iterRange(e,t=this.length){return new Hi(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ki(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?r.empty:e.length<=32?new Oe(e):At.from(Oe.split(e,[]))}},Oe=class r extends M{constructor(e,t=Sc(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.text[n],l=s+o.length;if((t?i:l)>=e)return new tr(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let n=e<=0&&t>=this.length?this:new r(Lo(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=Fi(n.text,o.text.slice(),0,n.length);if(l.length<=32)i.push(new r(l,o.length+n.length));else{let a=l.length>>1;i.push(new r(l.slice(0,a)),new r(l.slice(a)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof r))return super.replace(e,t,i);[e,t]=zt(this,e,t);let s=Fi(this.text,Fi(i.text,Lo(this.text,0,e)),t),n=this.length+i.length-(t-e);return s.length<=32?new r(s,n):At.from(r.split(s,[]),n)}sliceString(e,t=this.length,i=` (()=>{var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e<r.length;e++)(e%2?Vo:Js).push(t=t+r[e])})();function gc(r){if(r<768)return!1;for(let e=0,t=Js.length;;){let i=e+t>>1;if(r<Js[i])t=i;else if(r>=Vo[i])e=i+1;else return!0;if(e==t)return!1}}function zo(r){return r>=127462&&r<=127487}var _o=8205;function Eo(r,e,t=!0,i=!0){return(t?Wo:mc)(r,e,i)}function Wo(r,e,t){if(e==r.length)return e;e&&qo(r.charCodeAt(e))&&Do(r.charCodeAt(e-1))&&e--;let i=Ks(r,e);for(e+=Yo(i);e<r.length;){let s=Ks(r,e);if(i==_o||s==_o||t&&gc(s))e+=Yo(s),i=s;else if(zo(s)){let n=0,o=e-2;for(;o>=0&&zo(Ks(r,o));)n++,o-=2;if(n%2==0)break;e+=2}else break}return e}function mc(r,e,t){for(;e>0;){let i=Wo(r,e-2,t);if(i<e)return i;e--}return 0}function Ks(r,e){let t=r.charCodeAt(e);if(!Do(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return qo(i)?(t-55296<<10)+(i-56320)+65536:t}function qo(r){return r>=56320&&r<57344}function Do(r){return r>=55296&&r<56320}function Yo(r){return r<65536?1:2}var M=class r{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,i){[e,t]=zt(this,e,t);let s=[];return this.decompose(0,e,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(t,this.length,s,1),At.from(s,this.length-(t-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=zt(this,e,t);let i=[];return this.decompose(e,t,i,0),At.from(i,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),s=new St(this),n=new St(e);for(let o=t,l=t;;){if(s.next(o),n.next(o),o=0,s.lineBreak!=n.lineBreak||s.done!=n.done||s.value!=n.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(e=1){return new St(this,e)}iterRange(e,t=this.length){return new Hi(this,e,t)}iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.lines+1);let s=this.line(e).from;i=this.iterRange(s,Math.max(s,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Ki(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?r.empty:e.length<=32?new Oe(e):At.from(Oe.split(e,[]))}},Oe=class r extends M{constructor(e,t=Sc(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.text[n],l=s+o.length;if((t?i:l)>=e)return new tr(s,l,i,o);s=l+1,i++}}decompose(e,t,i,s){let n=e<=0&&t>=this.length?this:new r(Lo(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(s&1){let o=i.pop(),l=Fi(n.text,o.text.slice(),0,n.length);if(l.length<=32)i.push(new r(l,o.length+n.length));else{let a=l.length>>1;i.push(new r(l.slice(0,a)),new r(l.slice(a)))}}else i.push(n)}replace(e,t,i){if(!(i instanceof r))return super.replace(e,t,i);[e,t]=zt(this,e,t);let s=Fi(this.text,Fi(i.text,Lo(this.text,0,e)),t),n=this.length+i.length-(t-e);return s.length<=32?new r(s,n):At.from(r.split(s,[]),n)}sliceString(e,t=this.length,i=`
`){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<=t&&o<this.text.length;o++){let l=this.text[o],a=n+l.length;n>e&&o&&(s+=i),e<a&&t>n&&(s+=l.slice(Math.max(0,e-n),t-n)),n=a+1}return s}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],s=-1;for(let n of e)i.push(n),s+=n.length+1,i.length==32&&(t.push(new r(i,s)),i=[],s=-1);return s>-1&&t.push(new r(i,s)),t}},At=class r extends M{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.children[n],l=s+o.length,a=i+o.lines-1;if((t?a:l)>=e)return o.lineInner(e,t,i,s);s=l+1,i=a+1}}decompose(e,t,i,s){for(let n=0,o=0;o<=t&&n<this.children.length;n++){let l=this.children[n],a=o+l.length;if(e<=a&&t>=o){let h=s&((o<=e?1:0)|(a>=t?2:0));o>=e&&a<=t&&!h?i.push(l):l.decompose(e-o,t-o,i,h)}o=a+1}}replace(e,t,i){if([e,t]=zt(this,e,t),i.lines<this.lines)for(let s=0,n=0;s<this.children.length;s++){let o=this.children[s],l=n+o.length;if(e>=n&&t<=l){let a=o.replace(e-n,t-n,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>4&&a.lines>h>>6){let c=this.children.slice();return c[s]=a,new r(c,this.length-(t-e)+i.length)}return super.replace(n,l,a)}n=l+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=` `){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<=t&&o<this.text.length;o++){let l=this.text[o],a=n+l.length;n>e&&o&&(s+=i),e<a&&t>n&&(s+=l.slice(Math.max(0,e-n),t-n)),n=a+1}return s}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let i=[],s=-1;for(let n of e)i.push(n),s+=n.length+1,i.length==32&&(t.push(new r(i,s)),i=[],s=-1);return s>-1&&t.push(new r(i,s)),t}},At=class r extends M{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,t,i,s){for(let n=0;;n++){let o=this.children[n],l=s+o.length,a=i+o.lines-1;if((t?a:l)>=e)return o.lineInner(e,t,i,s);s=l+1,i=a+1}}decompose(e,t,i,s){for(let n=0,o=0;o<=t&&n<this.children.length;n++){let l=this.children[n],a=o+l.length;if(e<=a&&t>=o){let h=s&((o<=e?1:0)|(a>=t?2:0));o>=e&&a<=t&&!h?i.push(l):l.decompose(e-o,t-o,i,h)}o=a+1}}replace(e,t,i){if([e,t]=zt(this,e,t),i.lines<this.lines)for(let s=0,n=0;s<this.children.length;s++){let o=this.children[s],l=n+o.length;if(e>=n&&t<=l){let a=o.replace(e-n,t-n,i),h=this.lines-o.lines+a.lines;if(a.lines<h>>4&&a.lines>h>>6){let c=this.children.slice();return c[s]=a,new r(c,this.length-(t-e)+i.length)}return super.replace(n,l,a)}n=l+1}return super.replace(e,t,i)}sliceString(e,t=this.length,i=`
`){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<this.children.length&&o<=t;n++){let l=this.children[n],a=o+l.length;o>e&&n&&(s+=i),e<a&&t>o&&(s+=l.sliceString(e-o,t-o,i)),o=a+1}return s}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof r))return 0;let i=0,[s,n,o,l]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,n+=t){if(s==o||n==l)return i;let a=this.children[s],h=e.children[n];if(a!=h)return i+a.scanIdentical(h,t);i+=a.length+1}}static from(e,t=e.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let O of e)i+=O.lines;if(i<32){let O=[];for(let p of e)p.flatten(O);return new Oe(O,t)}let s=Math.max(32,i>>5),n=s<<1,o=s>>1,l=[],a=0,h=-1,c=[];function f(O){let p;if(O.lines>n&&O instanceof r)for(let g of O.children)f(g);else O.lines>o&&(a>o||!a)?(u(),l.push(O)):O instanceof Oe&&a&&(p=c[c.length-1])instanceof Oe&&O.lines+p.lines<=32?(a+=O.lines,h+=O.length+1,c[c.length-1]=new Oe(p.text.concat(O.text),p.length+1+O.length)):(a+O.lines>s&&u(),a+=O.lines,h+=O.length+1,c.push(O))}function u(){a!=0&&(l.push(c.length==1?c[0]:r.from(c,h)),h=-1,a=c.length=0)}for(let O of e)f(O);return u(),l.length==1?l[0]:new r(l,t)}};M.empty=new Oe([""],0);function Sc(r){let e=-1;for(let t of r)e+=t.length+1;return e}function Fi(r,e,t=0,i=1e9){for(let s=0,n=0,o=!0;n<r.length&&s<=i;n++){let l=r[n],a=s+l.length;a>=t&&(a>i&&(l=l.slice(0,i-s)),s<t&&(l=l.slice(t-s)),o?(e[e.length-1]+=l,o=!1):e.push(l)),s=a+1}return e}function Lo(r,e,t){return Fi(r,[""],e,t)}var St=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[e],this.offsets=[t>0?1:(e instanceof Oe?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],n=this.offsets[i],o=n>>1,l=s instanceof Oe?s.text.length:s.children.length;if(o==(t>0?l:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((n&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=` `){[e,t]=zt(this,e,t);let s="";for(let n=0,o=0;n<this.children.length&&o<=t;n++){let l=this.children[n],a=o+l.length;o>e&&n&&(s+=i),e<a&&t>o&&(s+=l.sliceString(e-o,t-o,i)),o=a+1}return s}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof r))return 0;let i=0,[s,n,o,l]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,n+=t){if(s==o||n==l)return i;let a=this.children[s],h=e.children[n];if(a!=h)return i+a.scanIdentical(h,t);i+=a.length+1}}static from(e,t=e.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let O of e)i+=O.lines;if(i<32){let O=[];for(let p of e)p.flatten(O);return new Oe(O,t)}let s=Math.max(32,i>>5),n=s<<1,o=s>>1,l=[],a=0,h=-1,c=[];function f(O){let p;if(O.lines>n&&O instanceof r)for(let g of O.children)f(g);else O.lines>o&&(a>o||!a)?(u(),l.push(O)):O instanceof Oe&&a&&(p=c[c.length-1])instanceof Oe&&O.lines+p.lines<=32?(a+=O.lines,h+=O.length+1,c[c.length-1]=new Oe(p.text.concat(O.text),p.length+1+O.length)):(a+O.lines>s&&u(),a+=O.lines,h+=O.length+1,c.push(O))}function u(){a!=0&&(l.push(c.length==1?c[0]:r.from(c,h)),h=-1,a=c.length=0)}for(let O of e)f(O);return u(),l.length==1?l[0]:new r(l,t)}};M.empty=new Oe([""],0);function Sc(r){let e=-1;for(let t of r)e+=t.length+1;return e}function Fi(r,e,t=0,i=1e9){for(let s=0,n=0,o=!0;n<r.length&&s<=i;n++){let l=r[n],a=s+l.length;a>=t&&(a>i&&(l=l.slice(0,i-s)),s<t&&(l=l.slice(t-s)),o?(e[e.length-1]+=l,o=!1):e.push(l)),s=a+1}return e}function Lo(r,e,t){return Fi(r,[""],e,t)}var St=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[e],this.offsets=[t>0?1:(e instanceof Oe?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],n=this.offsets[i],o=n>>1,l=s instanceof Oe?s.text.length:s.children.length;if(o==(t>0?l:0)){if(i==0)return this.done=!0,this.value="",this;t>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((n&1)==(t>0?0:1)){if(this.offsets[i]+=t,e==0)return this.lineBreak=!0,this.value=`
`,this;e--}else if(s instanceof Oe){let a=s.text[o+(t<0?-1:0)];if(this.offsets[i]+=t,a.length>Math.max(0,e))return this.value=e==0?a:t>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=s.children[o+(t<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(t>0?1:(a instanceof Oe?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Hi=class{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new St(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:s}=this.cursor.next(e);return this.pos+=(s.length+e)*t,this.value=s.length<=i?s:t<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Ki=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:s}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(M.prototype[Symbol.iterator]=function(){return this.iter()},St.prototype[Symbol.iterator]=Hi.prototype[Symbol.iterator]=Ki.prototype[Symbol.iterator]=function(){return this});var tr=class{constructor(e,t,i,s){this.from=e,this.to=t,this.number=i,this.text=s}get length(){return this.to-this.from}};function zt(r,e,t){return e=Math.max(0,Math.min(r.length,e)),[e,Math.max(e,Math.min(r.length,t))]}function Pe(r,e,t=!0,i=!0){return Eo(r,e,t,i)}function bc(r){return r>=56320&&r<57344}function Qc(r){return r>=55296&&r<56320}function dr(r,e){let t=r.charCodeAt(e);if(!Qc(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return bc(i)?(t-55296<<10)+(i-56320)+65536:t}function pr(r){return r<65536?1:2}var ir=/\r\n?|\n/,te=(function(r){return r[r.Simple=0]="Simple",r[r.TrackDel=1]="TrackDel",r[r.TrackBefore=2]="TrackBefore",r[r.TrackAfter=3]="TrackAfter",r})(te||(te={})),bt=class r{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let i=this.sections[t+1];e+=i<0?this.sections[t]:i}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,i=0,s=0;t<this.sections.length;){let n=this.sections[t++],o=this.sections[t++];o<0?(e(i,s,n),s+=n):s+=o,i+=n}}iterChangedRanges(e,t=!1){sr(this,e,t)}get invertedDesc(){let e=[];for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];s<0?e.push(i,s):e.push(s,i)}return new r(e)}composeDesc(e){return this.empty?e:e.empty?this:Uo(this,e)}mapDesc(e,t=!1){return e.empty?this:rr(this,e,t)}mapPos(e,t=-1,i=te.Simple){let s=0,n=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>e)return n+(e-s);n+=l}else{if(i!=te.Simple&&h>=e&&(i==te.TrackDel&&s<e&&h>e||i==te.TrackBefore&&s<e||i==te.TrackAfter&&h>e))return null;if(h>e||h==e&&t<0&&!l)return e==s||t<0?n:n+a;n+=a}s=h}if(e>s)throw new RangeError(`Position ${e} is out of range for changeset of length ${s}`);return n}touchesRange(e,t=e){for(let i=0,s=0;i<this.sections.length&&s<=t;){let n=this.sections[i++],o=this.sections[i++],l=s+n;if(o>=0&&s<=t&&l>=e)return s<e&&l>t?"cover":!0;s=l}return!1}toString(){let e="";for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];e+=(e?" ":"")+i+(s>=0?":"+s:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new r(e)}static create(e){return new r(e)}},de=class r extends bt{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return sr(this,(t,i,s,n,o)=>e=e.replace(s,s+(i-t),o),!1),e}mapDesc(e,t=!1){return rr(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let s=0,n=0;s<t.length;s+=2){let o=t[s],l=t[s+1];if(l>=0){t[s]=l,t[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(M.empty);i.push(o?e.slice(n,n+o):M.empty)}n+=o}return new r(t,i)}compose(e){return this.empty?e:e.empty?this:Uo(this,e,!0)}map(e,t=!1){return e.empty?this:rr(this,e,t,!0)}iterChanges(e,t=!1){sr(this,e,t)}get desc(){return bt.create(this.sections)}filter(e){let t=[],i=[],s=[],n=new Qt(this);e:for(let o=0,l=0;;){let a=o==e.length?1e9:e[o++ Line truncated `,this;e--}else if(s instanceof Oe){let a=s.text[o+(t<0?-1:0)];if(this.offsets[i]+=t,a.length>Math.max(0,e))return this.value=e==0?a:t>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=s.children[o+(t<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=t):(t<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(t>0?1:(a instanceof Oe?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Hi=class{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new St(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:s}=this.cursor.next(e);return this.pos+=(s.length+e)*t,this.value=s.length<=i?s:t<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Ki=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:s}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(M.prototype[Symbol.iterator]=function(){return this.iter()},St.prototype[Symbol.iterator]=Hi.prototype[Symbol.iterator]=Ki.prototype[Symbol.iterator]=function(){return this});var tr=class{constructor(e,t,i,s){this.from=e,this.to=t,this.number=i,this.text=s}get length(){return this.to-this.from}};function zt(r,e,t){return e=Math.max(0,Math.min(r.length,e)),[e,Math.max(e,Math.min(r.length,t))]}function Pe(r,e,t=!0,i=!0){return Eo(r,e,t,i)}function bc(r){return r>=56320&&r<57344}function Qc(r){return r>=55296&&r<56320}function dr(r,e){let t=r.charCodeAt(e);if(!Qc(t)||e+1==r.length)return t;let i=r.charCodeAt(e+1);return bc(i)?(t-55296<<10)+(i-56320)+65536:t}function pr(r){return r<65536?1:2}var ir=/\r\n?|\n/,te=(function(r){return r[r.Simple=0]="Simple",r[r.TrackDel=1]="TrackDel",r[r.TrackBefore=2]="TrackBefore",r[r.TrackAfter=3]="TrackAfter",r})(te||(te={})),bt=class r{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let i=this.sections[t+1];e+=i<0?this.sections[t]:i}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,i=0,s=0;t<this.sections.length;){let n=this.sections[t++],o=this.sections[t++];o<0?(e(i,s,n),s+=n):s+=o,i+=n}}iterChangedRanges(e,t=!1){sr(this,e,t)}get invertedDesc(){let e=[];for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];s<0?e.push(i,s):e.push(s,i)}return new r(e)}composeDesc(e){return this.empty?e:e.empty?this:Uo(this,e)}mapDesc(e,t=!1){return e.empty?this:rr(this,e,t)}mapPos(e,t=-1,i=te.Simple){let s=0,n=0;for(let o=0;o<this.sections.length;){let l=this.sections[o++],a=this.sections[o++],h=s+l;if(a<0){if(h>e)return n+(e-s);n+=l}else{if(i!=te.Simple&&h>=e&&(i==te.TrackDel&&s<e&&h>e||i==te.TrackBefore&&s<e||i==te.TrackAfter&&h>e))return null;if(h>e||h==e&&t<0&&!l)return e==s||t<0?n:n+a;n+=a}s=h}if(e>s)throw new RangeError(`Position ${e} is out of range for changeset of length ${s}`);return n}touchesRange(e,t=e){for(let i=0,s=0;i<this.sections.length&&s<=t;){let n=this.sections[i++],o=this.sections[i++],l=s+n;if(o>=0&&s<=t&&l>=e)return s<e&&l>t?"cover":!0;s=l}return!1}toString(){let e="";for(let t=0;t<this.sections.length;){let i=this.sections[t++],s=this.sections[t++];e+=(e?" ":"")+i+(s>=0?":"+s:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new r(e)}static create(e){return new r(e)}},de=class r extends bt{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return sr(this,(t,i,s,n,o)=>e=e.replace(s,s+(i-t),o),!1),e}mapDesc(e,t=!1){return rr(this,e,t,!0)}invert(e){let t=this.sections.slice(),i=[];for(let s=0,n=0;s<t.length;s+=2){let o=t[s],l=t[s+1];if(l>=0){t[s]=l,t[s+1]=o;let a=s>>1;for(;i.length<a;)i.push(M.empty);i.push(o?e.slice(n,n+o):M.empty)}n+=o}return new r(t,i)}compose(e){return this.empty?e:e.empty?this:Uo(this,e,!0)}map(e,t=!1){return e.empty?this:rr(this,e,t,!0)}iterChanges(e,t=!1){sr(this,e,t)}get desc(){return bt.create(this.sections)}filter(e){let t=[],i=[],s=[],n=new Qt(this);e:for(let o=0,l=0;;){let a=o==e.length?1e9:e[o++ Line truncated
@@ -19,4 +19,4 @@ var Js=[],Vo=[];(()=>{let r="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,
constructor(\${params}) { constructor(\${params}) {
\${} \${}
} }
}`,{label:"class",detail:"definition",type:"keyword"}),le('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),le('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Vd=Uh.concat([le("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),le("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),le("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),Ih=new Ht,Fh=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function Di(r){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,r),!0}}var Ed=["FunctionDeclaration"],Wd={FunctionDeclaration:Di("function"),ClassDeclaration:Di("class"),ClassExpression:()=>!0,EnumDeclaration:Di("constant"),TypeAliasDeclaration:Di("type"),NamespaceDeclaration:Di("namespace"),VariableDefinition(r,e){r.matchContext(Ed)||e(r,"variable")},TypeDefinition(r,e){e(r,"type")},__proto__:null};function Hh(r,e){let t=Ih.get(e);if(t)return t;let i=[],s=!0;function n(o,l){let a=r.sliceString(o.from,o.to);i.push({label:a,type:l})}return e.cursor(j.IncludeAnonymous).iterate(o=>{if(s)s=!1;else if(o.name){let l=Wd[o.name];if(l&&l(o,n)||Fh.has(o.name))return!1}else if(o.to-o.from>8192){for(let l of Hh(r,o.node))i.push(l);return!1}}),Ih.set(e,i),i}var Nh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Kh=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function qd(r){let e=oe(r.state).resolveInner(r.pos,-1);if(Kh.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Nh.test(r.state.sliceDoc(e.from,e.to));if(!t&&!r.explicit)return null;let i=[];for(let s=e;s;s=s.parent)Fh.has(s.name)&&(i=i.concat(Hh(r.state.doc,s)));return{options:i,from:t?e.from:r.pos,validFor:Nh}}var Me=ht.define({name:"javascript",parser:Vh.configure({props:[ii.add({IfStatement:si({except:/^\s*({|else\b)/}),TryStatement:si({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Ka,SwitchBody:r=>{let e=r.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return r.baseIndent+(t?0:i?1:2)*r.unit},Block:Ha({closing:"}"}),ArrowFunction:r=>r.baseIndent+r.unit,"TemplateString BlockComment":()=>null,"Statement Property":si({except:/^\s*{/}),JSXElement(r){let e=/^\s*<\//.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},JSXEscape(r){let e=/\s*\}/.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},"JSXOpenTag JSXSelfClosingTag"(r){return r.column(r.node.from)+r.unit}}),ri.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Ds,BlockComment(r){return{from:r.from+2,to:r.to-2}},JSXElement(r){let e=r.firstChild;if(!e||e.name=="JSXSelfClosingTag")return null;let t=r.lastChild;return{from:e.to,to:t.type.isError?r.to:t.from}},"JSXSelfClosingTag JSXOpenTag"(r){var e;let t=(e=r.firstChild)===null||e===void 0?void 0:e.nextSibling,i=r.lastChild;return!t||t.type.isError?null:{from:t.to,to:i.type.isError?r.to:i.from}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),Jh={test:r=>/^JSX/.test(r.name),facet:Gn({commentTokens:{block:{open:"{/*",close:"*/}"}}})},$o=Me.configure({dialect:"ts"},"typescript"),ko=Me.configure({dialect:"jsx",props:[qs.add(r=>r.isTop?[Jh]:void 0)]}),vo=Me.configure({dialect:"jsx ts",props:[qs.add(r=>r.isTop?[Jh]:void 0)]},"typescript"),ec=r=>({label:r,type:"keyword"}),tc="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(ec),Dd=tc.concat(["declare","implements","private","protected","public"].map(ec));function Us(r={}){let e=r.jsx?r.typescript?vo:ko:r.typescript?$o:Me,t=r.typescript?Vd.concat(Dd):Uh.concat(tc);return new ct(e,[Me.data.of({autocomplete:Dh(Kh,qh(t))}),Me.data.of({autocomplete:qd}),r.jsx?Id:[]])}function Ld(r){for(;;){if(r.name=="JSXOpenTag"||r.name=="JSXSelfClosingTag"||r.name=="JSXFragmentTag")return r;if(r.name=="JSXEscape"||!r.parent)return null;r=r.parent}}function Gh(r,e,t=r.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return r.sliceString(i.from,Math.min(i.to,t));return""}var Bd=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),Id=T.inputHandler.of((r,e,t,i,s)=>{if((Bd?r.composing:r.compositionStarted)||r.state.readOnly||e!=t||i!=">"&&i!="/"||!Me.isActiveAt(r.state,e,-1))return!1;let n=s(),{state:o}=n,l=o.changeByRange(a=>{var h;let{head:c}=a,f=oe(o).resolveInner(c-1,-1) Line truncated }`,{label:"class",detail:"definition",type:"keyword"}),le('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),le('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],Vd=Uh.concat([le("interface ${name} {\n ${}\n}",{label:"interface",detail:"definition",type:"keyword"}),le("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),le("enum ${name} {\n ${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),Ih=new Ht,Fh=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function Di(r){return(e,t)=>{let i=e.node.getChild("VariableDefinition");return i&&t(i,r),!0}}var Ed=["FunctionDeclaration"],Wd={FunctionDeclaration:Di("function"),ClassDeclaration:Di("class"),ClassExpression:()=>!0,EnumDeclaration:Di("constant"),TypeAliasDeclaration:Di("type"),NamespaceDeclaration:Di("namespace"),VariableDefinition(r,e){r.matchContext(Ed)||e(r,"variable")},TypeDefinition(r,e){e(r,"type")},__proto__:null};function Hh(r,e){let t=Ih.get(e);if(t)return t;let i=[],s=!0;function n(o,l){let a=r.sliceString(o.from,o.to);i.push({label:a,type:l})}return e.cursor(j.IncludeAnonymous).iterate(o=>{if(s)s=!1;else if(o.name){let l=Wd[o.name];if(l&&l(o,n)||Fh.has(o.name))return!1}else if(o.to-o.from>8192){for(let l of Hh(r,o.node))i.push(l);return!1}}),Ih.set(e,i),i}var Nh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Kh=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName","JSXText","JSXAttributeValue","JSXOpenTag","JSXCloseTag","JSXSelfClosingTag",".","?."];function qd(r){let e=oe(r.state).resolveInner(r.pos,-1);if(Kh.indexOf(e.name)>-1)return null;let t=e.name=="VariableName"||e.to-e.from<20&&Nh.test(r.state.sliceDoc(e.from,e.to));if(!t&&!r.explicit)return null;let i=[];for(let s=e;s;s=s.parent)Fh.has(s.name)&&(i=i.concat(Hh(r.state.doc,s)));return{options:i,from:t?e.from:r.pos,validFor:Nh}}var Me=ht.define({name:"javascript",parser:Vh.configure({props:[ii.add({IfStatement:si({except:/^\s*({|else\b)/}),TryStatement:si({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Ka,SwitchBody:r=>{let e=r.textAfter,t=/^\s*\}/.test(e),i=/^\s*(case|default)\b/.test(e);return r.baseIndent+(t?0:i?1:2)*r.unit},Block:Ha({closing:"}"}),ArrowFunction:r=>r.baseIndent+r.unit,"TemplateString BlockComment":()=>null,"Statement Property":si({except:/^\s*{/}),JSXElement(r){let e=/^\s*<\//.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},JSXEscape(r){let e=/\s*\}/.test(r.textAfter);return r.lineIndent(r.node.from)+(e?0:r.unit)},"JSXOpenTag JSXSelfClosingTag"(r){return r.column(r.node.from)+r.unit}}),ri.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Ds,BlockComment(r){return{from:r.from+2,to:r.to-2}},JSXElement(r){let e=r.firstChild;if(!e||e.name=="JSXSelfClosingTag")return null;let t=r.lastChild;return{from:e.to,to:t.type.isError?r.to:t.from}},"JSXSelfClosingTag JSXOpenTag"(r){var e;let t=(e=r.firstChild)===null||e===void 0?void 0:e.nextSibling,i=r.lastChild;return!t||t.type.isError?null:{from:t.to,to:i.type.isError?r.to:i.from}}})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),Jh={test:r=>/^JSX/.test(r.name),facet:Gn({commentTokens:{block:{open:"{/*",close:"*/}"}}})},$o=Me.configure({dialect:"ts"},"typescript"),ko=Me.configure({dialect:"jsx",props:[qs.add(r=>r.isTop?[Jh]:void 0)]}),vo=Me.configure({dialect:"jsx ts",props:[qs.add(r=>r.isTop?[Jh]:void 0)]},"typescript"),ec=r=>({label:r,type:"keyword"}),tc="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(ec),Dd=tc.concat(["declare","implements","private","protected","public"].map(ec));function Us(r={}){let e=r.jsx?r.typescript?vo:ko:r.typescript?$o:Me,t=r.typescript?Vd.concat(Dd):Uh.concat(tc);return new ct(e,[Me.data.of({autocomplete:Dh(Kh,qh(t))}),Me.data.of({autocomplete:qd}),r.jsx?Id:[]])}function Ld(r){for(;;){if(r.name=="JSXOpenTag"||r.name=="JSXSelfClosingTag"||r.name=="JSXFragmentTag")return r;if(r.name=="JSXEscape"||!r.parent)return null;r=r.parent}}function Gh(r,e,t=r.length){for(let i=e?.firstChild;i;i=i.nextSibling)if(i.name=="JSXIdentifier"||i.name=="JSXBuiltin"||i.name=="JSXNamespacedName"||i.name=="JSXMemberExpression")return r.sliceString(i.from,Math.min(i.to,t));return""}var Bd=typeof navigator=="object"&&/Android\b/.test(navigator.userAgent),Id=T.inputHandler.of((r,e,t,i,s)=>{if((Bd?r.composing:r.compositionStarted)||r.state.readOnly||e!=t||i!=">"&&i!="/"||!Me.isActiveAt(r.state,e,-1))return!1;let n=s(),{state:o}=n,l=o.changeByRange(a=>{var h;let{head:c}=a,f=oe(o).resolveInner(c-1,-1) Line truncated