LINUX.ORG.RU

Открыть много окон SDL2/nuklear в параллельных потоках одного процесса

 , , , ,


0

2

Использую SDL2 и nuklear+ для графики. При попытке открыть два окна одновременно программа падает. Есть ли способы заставить много SDL-окон работать одновременно в разных потоках одного процесса?

Сначала открывается поток отрисовки виджета, выводящий "...". Через 5 секунд выскакивает второе графическое окошко с диалогом в главном потоке - и все, крышка:

./nuklear_cross/nuklear.h:18531: int nk_begin_titled(struct nk_context *, const char *, const char *, struct nk_rect, nk_flags): Assertion `ctx->style.font && ctx->style.font->width && "if this triggers you forgot to add a font"' failed.

Исходники в Метапрог онлайн: «разработка графического интерфейса на нуклеар+», версия 14, функция «2 параллельных окна».

Выглядит так (красным обведен блок, на котором все валится): https://i.postimg.cc/9fwcDqss/2.png

Сишная трансляция: https://pastebin.com/UybkZj8a



Последнее исправление: metaprog (всего исправлений: 2)

Ответ на: комментарий от anonymous

Ну да, на текущем метапроге напишется метапрог который будет транслирован в С а потом и скомпилирован, выйдет нативный метапрог с открытым исходным кодом без привязки к labview.

AdonisSexyBoy
()
Ответ на: комментарий от AdonisSexyBoy

Ну да, на текущем метапроге напишется метапрог который будет транслирован в С а потом и скомпилирован, выйдет нативный метапрог с открытым исходным кодом без привязки к labview.

Лучше бы конечно просто Метапрог разработать на C/C++.
Но если времени ДЕВАТЬ НЕКУДА, то лучше бы уж взяли какой-нибудь
скриптовый язык и на нем сгенерировали исходники Метапрог на Си.

Так исходники Метапрог, генерирующего Метапрог открыты?

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Так исходники Метапрог, генерирующего Метапрог открыты?

Эшо.
Понял так, что GUI начали разрабатывать?
Если «да», то - наконец то делом занялись.

Владимир

anonymous
()
Ответ на: комментарий от anonymous
Задание @metaprog и его приблеженным

И так, сегодня доказываем/опровергаем Великую теорему Ферма.

Суть алгоритма

Любые числа возведенные в N-ую степень /например третью/.

  1. Получаем набор возможных последних двух цифр чисел при возведению в третью степень.

  2. Проверяем на первом мульоне чисел для x^n + y^n = z^n есть ли среди них такие x и y, чтобы сумма последних двух цифр совпадала с последними двумя цифрами z^n

Просьба показать исходник с использованием диаграмм Метапрог

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Наверное лучше последние три цифры брать из результата возведения x^n, y^n и z^n …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

В чем фишка алгоритма?

В результате возведения числа с миллион цифрами, все равно будет последние три цифра результата будут от 1 до 999 …
Вот только каково это множество при возведении числа скажем в третью степень?

Шас на 1С сварганю /хороший скриптовый язык и объектов хороших много/.

Владимир

anonymous
()
Ответ на: комментарий от AdonisSexyBoy

Про хаки вторая часть предложения.

Пусть пишет в список рассылки. Впрочем мне кажется, с этим говном никто даже не откликнется.

a1batross ★★★★★
()
Ответ на: комментарий от anonymous
Он молчал невпопад и не в такт подпевал,
Он всегда говорил про другое,
Он всем спать не давал и с восхода флудил,
А ныне молчит как рыбешка.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

goto metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_3786217904497745921__switch_7874948738130192385_end; // Мама, я хочу вниз > metaprog_instance_0_3112900175383187457_6005561938704082945_4080618829275611137_3007269978343680001_1658655125656641537_3786217904497745921__switch_7874948738130192385_end:;

метапрог-goto «сам на себя» ?

anonymous
()

Assertion `ctx->style.font && ctx->style.font->width && «if this triggers you forgot to add a font»’ failed.

ну так добавь фонт

anonymous
()
Ответ на: комментарий от anonymous

в чём смысл подобной обфускации – вообще не понятно

anonymous
()
Ответ на: комментарий от Siborgium

или сопрограммы пилить, «сами на себе», с асинхронщиной… тогда этот лапшекод js-подобным станет

anonymous
()
Ответ на: комментарий от anonymous

просто уж очень хотелось придать хоть как-то этому позору метауникальность, поэтому каждая переменная в этом уродстве начинается с префикса metaprog_

дело дениски попова цветёт и пахнет.. это он там свои копирайты в каждую строчку вписывал (а вдруг, не догадаются чьё это творение)

anonymous
()
Ответ на: комментарий от anonymous

ну или хотя бы вот тот же Rambutan взять про жабу, и писать им не жабу, а сишечку. на входе – Literate Programming single source WEB исходник, на выходе – PDF с индексами и сорцы.

блин, из мануала уже всё понятно. но можно и в отдельную статью из Tex User group носом ткнуть: журнал номер сама статья с примером.

//ещё в том номере полезная статья TrueType fonts in PostScript и про JS-интерактивность в PDF: interactiveworkbook. в первой про Type45 Unicode PS шрифты как из TTF конвертировать, может быть полезно чтобы в какой-нибудь [Lout] (https://en.wikipedia.org/wiki/Lout_(software)) + Slit2 прикрутить русификацию/украинизацию/кириллизацию

вот, блин, минималистичный пример из мануала про грамотное (literate) литературное программирование:

13. This method makes a labelled TextField and attaches it to panel .
< Code for initializing 13 > ≡
TextField new tf (String str , int n)
{ Panel p ← new Panel (); TextField t ← new TextField (n);
p.add (new Label (str , Label .CENTER)); p.add (t); p.add (new Label (" ", Label .CENTER));
panel .add (p);
return t;
}

See also section 15.
This code is used in section 5.

то есть эти вот индексы для отладки: 13, section 15, section 5 – генерирует javaweave LitProg средство само

золотце наше всё> Каждое имя переменной указывает на конкретное место на схемах и подсхемах (подфункциях) где она объявлена. Очень помогает дебажить транслятор.

при Literate Programming сами сабой образуются.

Очень помогает дебажить транслятор.

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

и это всё при том, что технологии такие существуют, просты как палка.

но ужос-ужос, они ж текстовые!!! в лапшекодной разметке типа @<, @>= и т.п.

хотя там наглядно всё. и нечего особо добавить.

ну разве что следующее – что «картинки с проводочками» не обязательно рисовать руками. а тем же скриптом на чём-то вроде plot из troff, ну или Tikz/PSTricks из LaTeX.

при этом, о ужас, и Разрыв Шаблонов. И картиночки, И текст, и наглядно всё. и гипертекст с индексами по многотиповому, ога.

anonymous
()
Ответ на: комментарий от anonymous

interactiveworkbook

interactiveworkbook

вы таки будете смеяться, но судя по примерам вот отсюда

вполне может оказаться, что для хвалёной метапрожьей интерактивности вполне себе достаточно формата PDF с формами – и какой-то LaTeX-ной / литературно программной особой уличной техномагии:

  1. реализовать текстовый компилятор из DSL в целевое на PDF с формами через Rambutan/interactiveworkbook

  2. текстовый DSL расписать в примерах трансляции в PSTricks / Tikz кусков на LaTeX

  3. втыкать дополнительно не текстовый исходник на LaTeX, а ту картинку в которую он оттранслируется

хотя может быть достаточно того же Lout (если разобраться с embedded шрифтами кириллическими в PS -> PDF выходной). там в постскрипте куски вставлять можно.

и на них картиночки рисовать, на форте/постскрипте. ога.

anonymous
()
Ответ на: interactiveworkbook от anonymous

вот в примере ex_doc.pdf к lout-graph на Lout через @Graph графики рисуют.

почему графики рисовать текстом можно, а «квадратики с проводочками» нельзя ???

anonymous
()
Ответ на: комментарий от anonymous

True Type fonts in PostScript

  • Type45

Type42, очепятка.

вот, в рассылке lout приводится скрипт addfonts.sh который ttf из венды конвертирует, и правильно метрики фонтов в lout настраивает и в ghostscript конфиг сам прописывает (через ttf2pt1)

остаётся только embed шрифты встраивать, чтобы PDF итоговый из такого PS сконвертированный (через Slit2) везде читался

anonymous
()
Ответ на: комментарий от metaprog

нужно внутреннее представление и дерево разбора

О чем это ты?

об IR транслятора и AST компилятора/транспилятора, вестимо.

я не тот семён-анонимус, но тоже влезу.

вот у тебя есть конкретный синтаксис CST который транслируется в абстрактный AST который потом образует дерево, которое переводится в промежуточное представление IR, и как-то оптимизируется, а потом через pretty printing этого AST распечатывается в конкретный синтаксис CST сишечки.

так работает транспилятор. положим, есть некий условный DSL «текстовый метапрог». каким он CST должен быть, чтобы пример разобрался в общий AST, оптимизировался в IR и далее эти деревья назад pretty printer-ом в CST сишечки распечатались?

ты толком не поймёшь, пока такие пары примеров трансляций «текстовый метапрог» – «оттранслированная сишечка» не составишь.

ну ладно, не нравится тебе DSL#1 «текстовый метапрог». потому что текстовый. а нужен гипертекстовый. или графический, с гиперссылками.

ну так возьми себе придумай графический DSL#2 «графический метапрог». и для него нарисуй, тупо ручкой в блокнотике такие вот изоморфные соответствия «метапрог исходный сам на себе» <=> «сишечка православная оттранслированная».

опять же, сишечка довольно хрупкая, чтобы быстро прототипировать. другой язык возможно позволил бы гораздо быстрее раскрутиться и наглядно такие пары и соответствия заметить – хоть tcl/tk, хоть постскрипт, хоть ребол с редом, да даже питон с луа, прости господи.

ну это ладно, хочется тебе крутить две ручки сразу с низкоуровневой сишечкой и жонглировать тремя тарелками с SDL2/nukear imm mode (который в многопоточке немного другой) – дело твоё, наступай на грабли на здоровьечко.

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

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

anonymous
()
Ответ на: комментарий от metaprog

в LitProg средстве Rambutan в дистрибутиве Rambutan.zip лежит Primes.w и «запускалка» Primes.html который по сути грузит апплет Primes.class который ещё нужно скомпилировать из исходника Primes.java который будет сгенерирован через javatangle: javatangle Primes.w > Primes.java и отдокументирован через javaweave: javaweave Primes.w > Primes.tex && pdflatex Primes.tex > primes.pdf

то есть: генерирует из литературной грамотной разметки single source исходника Primes.w из куска вида

@(Primes.java@>=
  @<Imported packages@>
  public class Primes extends Applet
    implements ActionListener
    { @<Fields@>
      @<Code for initializing@>
      @<The event handler@>
    }
  • по javatangle: сам исходник апплета Primes.java; который потом собирается через java Primes.java > Primes.class и запускается «запускатором» Primes.html который и запускает апплет в браузере (ещё бы найти браузер где плагин явы эти рукосуйные хиспторы не выпили ещё, ога… HotJava что ли откопать)

  • по javaweave : из такого «текстового литературного метапрог» DSL#1 генерируется сначала Primes.tex из которого потом Primes.pdf который и показывает этот конкретный кусок вида «общий main апплета» в таком вот гипертекстовом виде, с See also/Also used in/Also uses section … , с индексами

все эти индексы генерируются автомаГически, LitProg средством.

далее, выберем в качестве примера другой пример, чё-нить интереснее. например,

@<Fields@>=
  int N1=0,N2=0; TextField N1_txt,N2_txt;
  Button run; Panel panel;  // for input 
  TextArea disp;            // for output

@ This method makes a labelled |TextField| and attaches it to
|panel|.
@<Code for initializing@>=
  TextField new_tf(String str, int n)
    { Panel p = new Panel();  TextField t = new TextField(n);  @/
      p.add(new Label(str,Label.CENTER));
      p.add(t);
      p.add(new Label(" ",Label.CENTER));  @/
      panel.add(p);  @/
      return t;
    }

вот этот кусок.

здесь GUI жабоапплета формируется программатически.

допустим, это вот твоя похожая пара :

«текстовый метапрог» => «сишечка православная».

чуешь синхроничность?

корреляция не означает каузацию, но здесь близко :

кусок «во что оттранслируется» (программа на жабо апплете, на SDL2 nuklear) <= «исходный текстовый метапрог» кусок на DSL#1

не чуешь текстово литературно? не бида.

нарисуй ручкой в блокнотике графический «графический метапрог» DSL#2 и пример на нём.

в Rambutan.zip показано, как GUI апплета можно формировать программатически из примеров, задавать такое вот соответствие тулзой, чтобы индексы сама везде правильно, литературно-грамотно проставляла.

«картиночка квадратиков, жгутиков и проводочков» =~ aka «графический метапрог» <=> «оттранслированный код на сишечке» как и должно быть в истинно православном «сам на себе» а не «Primes.w текстовый исходный» <=> жабоапплет Primes.java графический целевой

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

anonymous
()
Ответ на: комментарий от anonymous

А ныне молчит как рыбешка.

а молчит как rebforce на REBOL-е … //и баррэ таа-дамм!

anonymous
()
Ответ на: комментарий от anonymous

у пациента уже давно рамбутан случился от твоего напора без мыла, java тут только кофеечка сможет распарсить из дуэта, хотя ты можешь вступить назад в трио, а то ты и правда отошел от дел так сказать… liksys уже совсем там заскучал, а metaprog стал слишком серьезным, опыт то накапливается, осознание приходит мало-помалу.

anonymous
()
Ответ на: комментарий от anonymous

скриптовый язык и на нем сгенерировали исходники Метапрог на Си

Цель метапрог на метапроге, а не метапрог сгенерированный на С.

AdonisSexyBoy
()
Ответ на: комментарий от anonymous

Не. Но сделать читаемыми переменные, и добавить комментарий рядом о их местоположении можно, это будет попроще и поудобнее.

AdonisSexyBoy
()
Последнее исправление: AdonisSexyBoy (всего исправлений: 1)
Ответ на: комментарий от AdonisSexyBoy

тогда возьми метациклический интерпретатор чего-нибудь и пошагово добавляй туда DSL интерпретатора языка «текстовый метапрог», постепенно специализируя. как раз получится «сам на себе».

пойнт в том, что пока ты крутишь две ручки сразу – вы этот DSL исходный и примеры целевые, достаточно полезные чтобы самораскрутиться (bootstrap) не осилите никогда.

а пошагово вполне могли бы, если примеры сесть и расписать. но это ж писать надо. текстово, гипертекстово или текстово-графически DSL-порождающе.

скриптовый язык(1) и на нем сгенерировали исходники Метапрог на Си(2)

Цель метапрог на метапроге(4), а не метапрог сгенерированный на С(3)=(2).

(1) -> (2) = (3) -> (4) через зад

через перёд:

(0)+(0)’ -> (2) = (3) -> (4)

где (0) – метациклический интерпретатор обычного языка (лисп, пролог, форт, ребол, рефал), (0)’ – его специализация DSL#1 «текстовый метапрог» или DSL#2 «графический метапрог» или метаDSL#3 «текст на LaTeX/Lout/PS который описывает картинку, выглядящую как DSL#2» то есть, метаDSL#3 «полный текстовый физический метаметапрог» со специализацией LaTeX/Lout/PS/PDF/scibe Racket-лет/жабо applet/скрипто reblet/сишечко_nuklear_let –> (порождает) DSL#2 и выглядит условно абстрактно сокращённо как DSL#1 «сокращённый логический текстовый метапрог DSL»

это всё достаточно очевидно: на LitProg средстве, почти любом можно эту цепочку раскрутить, понятно как. хоть из метациклического интерпретатора «сам на себе», постепенно его специализируя. хоть наоборот, в другую сторону.

anonymous
()
Ответ на: комментарий от AdonisSexyBoy

Цель метапрог на метапроге, а не метапрог сгенерированный на С.

Ваше право конечно.
ИМХО ни какой генерации Метапрог на Си вовсе не нужно было делать.
Нужно было просто разработать Метапрог на C/C++.
Не исключаю, что можно было бы и скриптовый язык программирования использовать для прототипа.

А так все на фанатизм больше смахивает.

Владимир

anonymous
()
Ответ на: комментарий от AdonisSexyBoy

Не. Но сделать читаемыми переменные, и добавить комментарий рядом о их местоположении можно, это будет попроще и поудобнее.

Вы неверно употребляете грамматику русского языка. Начните с него, потом английский, потом Си. И после вам уже не захочется плотских отношений с метапрогом, ибо он очень глуп.

Владимир

anonymous
()

Насколько я знаю, SDL не особо предназначен для развесистого GUI. Так что если очень хочется, можно попробовать два варианта:

  1. Использовать подходящий инструмент - Qt, gtk
  2. Сделать одно полноэкранное окно, а подокна рисовать самостоятельно внутри. Примерно так, как сделано, например, в gimp
COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Насколько я знаю, SDL не особо предназначен для развесистого GUI

Лол, оно универсально, это просто ввод вывод. Ты LMMS запускал? Там сотни тысяч окон можно открыть на 65535 8k экранов при желании. Только железа такого не существует которое это проглотит.

anonymous
()
Ответ на: комментарий от AdonisSexyBoy

Он не чудит, чудят те кто thread unsafe функции в многопотоке дрыгает даже без банальных семафоров хотя бы. А ещё чудят когда 1 switch в середине разнывают на несколько тредов и удивляются чёйта всюо упало.

anonymous
()
Ответ на: комментарий от AdonisSexyBoy

Цель метапрог на метапроге, а не метапрог сгенерированный на С.

В чем функциональное отличие метапрог на метапроге, от метапрога написанного на С/C+.
При разработке на С/C+ у вас было бы API, а на Метапрог «витрины».

Владимир

anonymous
()
Ответ на: комментарий от COKPOWEHEU

SDL не особо предназначен для развесистого GUI.

SDL вообще не предназначен. Он просто рисовалка. а про GTK, так метанпрог его ниасилил. Ну и от потокопроблем его ни Qt, ни GTK не спасет, если беды с башкой. он то думал, что сейчас опа и нарисует вс, а тут ему, оказывается, знать что-то надо. И с чего это так…

anonymous
()
Ответ на: комментарий от anonymous

Ты LMMS запускал?

Нет, но на Википедии пишут что оно на Qt. Хотя… посмотрел внимательнее, в SDL_PollEvent возвращается некий windowID. Надо будет посмотреть как им пользоваться.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Да, таким способом в одном потоке работать с несколькими окнами можно, хотя и гораздо сложнее, чем с одним. Ну а выносить каждое окно в отдельный поток смысла все равно нет, проще GUI оставить в одном потоке, а логику разбить на разные. Это уж точно лучше, чем как во времена Delphi писать основную логику приложения в обработчиках кнопок, таймере и других странных местах.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Это уж точно лучше, чем как во времена Delphi писать основную логику приложения в обработчиках кнопок, таймере и других странных местах.

Вообще-то, Delphi вполне себе позволяла выносить логику в отдельные классы. И кому надо было — выносили.

Просто армии говнокодеров никто не объяснил, что так лучше. :(((

hobbit ★★★★★
()
Ответ на: комментарий от anonymous
В темно-синем ЛОР, где трепещут форумчане
Где с дубовых-тредов опадает листва
На поляне траву Метапроги косили
И при этом напевали странные слова

А нам все равно, а нам все равно
Пусть боимся мы ЛОР и сову
Метапрог есть у нас - в самый жуткий час
Мы волшебную косим фулудню

Владимир

anonymous
()
Ответ на: комментарий от hobbit

Чтобы вынести логику в отдельный поток, там надо было сильно постараться. А без этого лучшим способом были события таймера либо OnIdle (это, кстати, и есть разумный подход). Но да, армия говнокодеров предпочитала писать в Button1_OnClick и плевать на тормоза GUI.

COKPOWEHEU
()

Так это. Ты ж стейт шаришь между потоками. Или лочь его или делай, чтоб все это в одном потоке было.

Хотя я думаю тебе уже написали это.

anonymous
()
Ответ на: комментарий от anonymous

Мета пурга

ТС не рассказывает о своих новациях подробно …
Сколько их там еще будет и что в результате получится … … …?

Пока Метапрог развивает функциональность диаграмм LabView, а что дам далее - хз …

Впрочем ТС проект приносит радость, а это уже хорошо.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

http://vist.gearhostpreview.com/metaprog/faq.html

Бинарные форматы - это быстро и просто.  
Будут стандартные функции сериализации-десериализации всех типов в бинарный формат.  
В Лабвью есть такой функционал и я его все время использую - если не менять тип, то все работает как часы.  

ИМХО сериализацию-десериализацию не использую.

Почему?

Потому как любой сложности объект сохраняется в бинарном формате /или xml/, с возможностью изменения значений переменных /и много более/ в бинарном формате.
Конечно возможна загрузка объекта в memory …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Пока Метапрог развивает функциональность диаграмм LabView,

  • генерация сишного кода на основе диаграмм.

Вообщем то интересно, увлекательно, сногшибательно, но - ЗАЧЕМ?
Пока не понятно что диаграммы упрощают.
Для 2 + 2 диаграмма не нужна …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

ТС не рассказывает о своих новациях подробно …

Наверное, потому что их нет. За джва года они «осилили» кривущий будильник, какую-то херню для отображения хтмлки и кучу непонятных рисунков. Еще все это валится, течет и непонятно какие еще сюрпризы. Непонятно, потому что весь этот метанпрог никому, кроме двух поехавших неупоёрся.

Эти «разработчики» даже строчку перевернуть неосилили.

anonymous
()
Ответ на: комментарий от anonymous

За джва года они «осилили» <…> и кучу непонятных рисунков

Куча непонятных рисунков это то с чего они начали. Так что в этом прогресса нет. Если не считать того, что рисунки стали еще непонятнее.

Непонятно, потому что весь этот метанпрог никому, кроме двух поехавших неупоёрся.

Ну как же! Эти темы вызывают живейший отклик. Так что метапрог нужен хотя бы для поднятия настроения.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Ну как же! Эти темы вызывают живейший отклик. Так что метапрог нужен хотя бы для поднятия настроения.

Все понимают, что rapid системы это хорошо.
В случае с Метапрог пока не понятен профит.

Даже если кто-то создаст хороший графический Си, то непонятно зачем?

Вот создание генератора, который бы много упрощал разработку кода было бы интересно /это так для трепа, на самом деле и это «не ахти»/.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Вот создание генератора, который бы много упрощал разработку кода было бы интересно /это так для трепа, на самом деле и это «не ахти»/.

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

Кстати многие скриптовые языки такую возможность /в какой-то мере/ имеют …

В 1С разработка обобщенных алгоритмов проста.

Скорее всего ни кто не сможет разработать «серебрянный компилятор».

Но это тема для отдельного треда/трепа …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Вот создание генератора, который бы много упрощал разработку кода было бы интересно

Видел я такие автоконфигураторы для микроконтроллеров вроде cvavr или STM Cube. Генерируют кучу нечитабельных букв (кодом это язык не поворачивается назвать), так еще и воспользоваться можно только один раз: после того, как вписал свой код, генерация затрет его. И это не говоря о том, что добавляет еще один слой магии поверх абстракций языка. В результате эффективно пользоваться этим могут только те, кто уже обладает немалым багажом знаний и способен предсказать какая периферия ему нужна, способен причесать генератную кучу и способен предсказать из-под какой коряги выскочат очередные грабли.

Так что переоценены они.

COKPOWEHEU
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.