From 83e7d90131a60206a219edf4a2ba9e570c689268 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Fri, 13 Oct 2023 18:02:18 +0900 Subject: Replace QObject, QWidget, QImage, QPair, QRgb, QColor, QChar, QString, QIODevice with TQ* version Signed-off-by: Michele Calgaro (cherry picked from commit 241e0082f7b9ccadaeed0ef43a1c9ebb9b4fe840) --- .../docs/tdevelop/kde_app_devel/index.docbook | 42 ++++++++++----------- tde-i18n-ru/docs/tdevelop/kdearch/index.docbook | 44 +++++++++++----------- 2 files changed, 43 insertions(+), 43 deletions(-) (limited to 'tde-i18n-ru/docs/tdevelop') diff --git a/tde-i18n-ru/docs/tdevelop/kde_app_devel/index.docbook b/tde-i18n-ru/docs/tdevelop/kde_app_devel/index.docbook index 29987b7b73c..9a4f4528483 100644 --- a/tde-i18n-ru/docs/tdevelop/kde_app_devel/index.docbook +++ b/tde-i18n-ru/docs/tdevelop/kde_app_devel/index.docbook @@ -160,15 +160,15 @@ return a.exec(); Второй объект нашей программы - кнопка, экземпляр класса QPushButton. Из двух доступных конструкторов экземпляров этого класса мы воспользовались вторым: он принимает в виде аргумента строку текста, которая будет показана на кнопке. Затем методом resize() мы изменяем размер кнопки, чтобы вся строка была видна на кнопке. -Далее идёт метод show(). Но его нет в описании класса QPushButton. Этот класс наследует методы класса QButton, а тот, в свою очередь, наследует методы QWidget. Этот класс содержит огромное количество методов, в том числе show(). Итак, что же делалось с кнопкой: +Далее идёт метод show(). Но его нет в описании класса QPushButton. Этот класс наследует методы класса QButton, а тот, в свою очередь, наследует методы TQWidget. Этот класс содержит огромное количество методов, в том числе show(). Итак, что же делалось с кнопкой: Создаём экземпляр класса QPushButton, используя второй конструктор для указания надписи на кнопке Изменяем размер кнопки Делаем основным элементом управления для переменной а, экземпляра класса QApplication -Вызываем метод show(), который приводит к отображению элемента управления. Он наследуется от класса QWidget +Вызываем метод show(), который приводит к отображению элемента управления. Он наследуется от класса TQWidget После вызова метода exec(), приложение становится видимым пользователю. Окно приложения содержит кнопку "Hello world!". Примечание: GUI-программы ведут себя несколько отлично от процедурных. Главное отличие состоит в том, что приложение входит в т.н. "главный цикл событий" ("main event loop"). Это означает, что программа ожидает действий со стороны пользователя, и выдаёт на них определённую реакцию. Следующий раздел разъясняет, что это означает для программиста, и как эти события обрабатываются в Qt. -Для опытных: кнопка не имеет родителя, это значит, что это элемент управления верхнего уровня (top-level) и выполняется в локальном цикле событий, которому не нужно ждать главного цикла событий. Подробно это объяснено в документации класса QWidget и The KDE Library Reference Guide +Для опытных: кнопка не имеет родителя, это значит, что это элемент управления верхнего уровня (top-level) и выполняется в локальном цикле событий, которому не нужно ждать главного цикла событий. Подробно это объяснено в документации класса TQWidget и The KDE Library Reference Guide @@ -183,7 +183,7 @@ return a.exec(); Теперь оживим нашу программу добавлением обработчика событий. В общем, есть два способа взаимодействия пользователя с программой - клавиатурой и мышью. В обоих случаях графический интерфейс предоставляет механизмы регистрации новых событий от этих устройств и методы их обработки. -Оконная система посылает все события соответствующему приложению. QApplication пересылает их активному окну в виде QEvent и элементы управления затем решают, что при этом делать. Соответствующий элемент управления принимает событие и обрабатывает QWidget::event (QEvent*), в котором определяется тип события и выдаётся соответствующая реакция; event() - главный обработчик событий. Он передаёт событие т.н. фильтрам событий, которые определяют, что произошло и что делать с этим событием. Если фильтра для данного типа события нет, вызываются специальные обработчики событий. Они вызывают соответствующие предопределённые методы: +Оконная система посылает все события соответствующему приложению. QApplication пересылает их активному окну в виде QEvent и элементы управления затем решают, что при этом делать. Соответствующий элемент управления принимает событие и обрабатывает TQWidget::event (QEvent*), в котором определяется тип события и выдаётся соответствующая реакция; event() - главный обработчик событий. Он передаёт событие т.н. фильтрам событий, которые определяют, что произошло и что делать с этим событием. Если фильтра для данного типа события нет, вызываются специальные обработчики событий. Они вызывают соответствующие предопределённые методы: События с клавиатуры - нажатие клавиш TAB и Shift-TAB: virtual void focusInEvent(QFocusEvent *) @@ -224,12 +224,12 @@ return a.exec(); -Помните, что все функции событий являются виртуальными и защищёнными. Вы можете переназначить события, нужные вам, и определить свою реакцию. QWidget также содержит некоторые виртуальные методы, которые могут пригодиться в ваших программах. В любом случае, класс QWidget нужно узнать получше. +Помните, что все функции событий являются виртуальными и защищёнными. Вы можете переназначить события, нужные вам, и определить свою реакцию. TQWidget также содержит некоторые виртуальные методы, которые могут пригодиться в ваших программах. В любом случае, класс TQWidget нужно узнать получше. Взаимодействие объектов через сигналы и слоты Теперь переходим к основному отличию Qt: механизму сигнал/слот. Это быстрое и удобное решение реализации взаимодействия объектов, которое обычно решается посредством callback-функций в библиотеках, работающих с X-Window. Так как такое взаимодействие требует аккуратного программирования и иногда делает создание пользовательского интерфейса очень сложным (что описано в документации по Qt и объяснено в книге К.Дальхеймера [K.Dalheimer] 'Programming with Qt'), Troll Tech придумала новую систему, где объекты могут посылать сигналы, которые можно связывать с методами, объявленными как слоты. Программисту на C++ нужно знать только некоторые вещи о механизме: -объявление класса, использующего сигналы/слот должно содержать макрос TQ_OBJECT в начале (без точки с запятой); и должно быть унаследовано от класса QObject +объявление класса, использующего сигналы/слот должно содержать макрос TQ_OBJECT в начале (без точки с запятой); и должно быть унаследовано от класса TQObject сигнал может быть послан ключевым словом emit (например, emit signal (параметры...)) из любого метода класса, поддерживающего сигналы/слоты все сигналы, использующиеся не наследуемыми классами, должны быть добавлены в объявление класса в разделе signals @@ -237,9 +237,9 @@ return a.exec(); компилятор метаобъектов (moc, meta-object compiler) обрабатывает заголовочные файлы, заменяя макросы на действительный код (это не обязательно знать). Вывод moc передаётся компилятору C++. -Другой способ использования сигналов без наследования от класса QObject - использовать класс QSignal: дополнительные сведения и примеры использования вы можете найти в документации. Далее подразумевается, что вы используете наследование от класса QObject. +Другой способ использования сигналов без наследования от класса TQObject - использовать класс QSignal: дополнительные сведения и примеры использования вы можете найти в документации. Далее подразумевается, что вы используете наследование от класса TQObject. В этом случае ваш класс может посылать сигналы куда угодно и создавать слоты, к которым можно привязывать любые сигналы. Используя сигналы, вам не нужно заботиться о том, кто их получает - нужно просто послать сигнал, а потом подключить любой слот, который будет выполнен при возникновении сигнала. Слоты можно использовать также как обычные методы в реализации. -Теперь, чтобы соединить сигнал со слотом,воспользуйтесь методом connect() класса QObject или, если доступно, другими специальными методами объекта для создания привязки к соответствующему сигналу. +Теперь, чтобы соединить сигнал со слотом,воспользуйтесь методом connect() класса TQObject или, если доступно, другими специальными методами объекта для создания привязки к соответствующему сигналу. Примерное использование @@ -255,16 +255,16 @@ hello.resize( 100, 30 ); a.setMainWidget( &hello ); -QObject::connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )); +TQObject::connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )); hello.show(); return a.exec(); } -Как видите, мы лишь расширили возможности кнопки с использованием метода connect(): connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )) — всё, что мы добавили. Что же это означает? Объявление метода connect() в классе QObject: -bool connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) -Это значит, что указатель на экземпляр QObject является инициатором сигнала, указанного во втором аргументе. Оставшиеся два аргумента есть объект-приёмник, который имеет слот, а затем и имя функции-слота, которая будет выполнена при получении сигнала. +Как видите, мы лишь расширили возможности кнопки с использованием метода connect(): connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )) — всё, что мы добавили. Что же это означает? Объявление метода connect() в классе TQObject: +bool connect ( const TQObject * sender, const char * signal, const TQObject * receiver, const char * member ) +Это значит, что указатель на экземпляр TQObject является инициатором сигнала, указанного во втором аргументе. Оставшиеся два аргумента есть объект-приёмник, который имеет слот, а затем и имя функции-слота, которая будет выполнена при получении сигнала. С помощью сигналов и слотов, объекты ваших программ могут взаимодействовать друг с другом без явной зависимости от типа объекта-приёмника. Далее в этом руководстве приводится более подробное описание работы механзима сигналов/слотов. Коме этого, о нём можно почитать в The KDE Library Reference Guide и Qt online reference. @@ -304,7 +304,7 @@ hello.resize( 100, 30 ); a.setTopWidget( &hello ); -QObject::connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )); +TQObject::connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() )); hello.show(); return a.exec(); @@ -313,7 +313,7 @@ return a.exec(); Вы видите, что мы поменяли класс QApplication на TDEApplication. Затем мы использовали метод setTopWidget вместо setMainWidget() для указания главного элемента управления для TDEApplication. Всё! Ваше первое приложение KDE готово - осталось только указать путь к заголовочным файлам KDE и скомпоновать библиотеку tdecore ключом компоновщика -ltdecore. Если вы не собираетесь создавать такие простые программы, вам понадобится более удобная среда написания ПО. В следующей главе речь пойдёт о &tdevelop;. -Итак, к этому времени, вы уже прошлись по страницам справочной документации Qt, в т.ч. по классам QApplication, QWidget и QObject, а также по документации библиотеки tdecore, классу TDEApplication. KDE Library Reference handbook содержит полное описание использования конструкторов QApplication и TDEApplication, включая также обработку ключей командной строки. +Итак, к этому времени, вы уже прошлись по страницам справочной документации Qt, в т.ч. по классам QApplication, TQWidget и TQObject, а также по документации библиотеки tdecore, классу TDEApplication. KDE Library Reference handbook содержит полное описание использования конструкторов QApplication и TDEApplication, включая также обработку ключей командной строки. @@ -549,10 +549,10 @@ return a.exec(); 16 statusBar()->show(); 17 18 // allow the view to change the statusbar and caption -19 connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)), -20 this, SLOT(changeStatusbar(const QString&))); -21 connect(m_view, SIGNAL(signalChangeCaption(const QString&)), -22 this, SLOT(changeCaption(const QString&))); +19 connect(m_view, SIGNAL(signalChangeStatusbar(const TQString&)), +20 this, SLOT(changeStatusbar(const TQString&))); +21 connect(m_view, SIGNAL(signalChangeCaption(const TQString&)), +22 this, SLOT(changeCaption(const TQString&))); 23 24 } @@ -584,7 +584,7 @@ return a.exec(); Излишним будет говорить, что стабильность - самая главная цель. Никто не может 100% избежать ошибок ("bugs"), но разумное проектирование позволяет значительно уменьшить количество возможных недоработок. Программирование на C++, если вы знаете как использовать его лучшие стороны - наследовательность, скрытие информации (модульность) и повторное использование одного кода, безусловно принесёт вам успех. -При создании проекта KDE или Qt, его представление (view) всегда наследует QWidget, либо напрямую, либо через другие элементы управления библиотек. Мастер приложений также создёт код, содержащий класс yourappView, наследователь QWidget. +При создании проекта KDE или Qt, его представление (view) всегда наследует TQWidget, либо напрямую, либо через другие элементы управления библиотек. Мастер приложений также создёт код, содержащий класс yourappView, наследователь TQWidget. В этой главе мы опишем как использовать элементы управления библиотек для создания новыхпредставлений, потом будет обзор готовых представлений, которые они уже содержат. @@ -601,7 +601,7 @@ return a.exec(); На первой странице документации Qt вы можете найти ссылку на "Widget Screenshots", чтобы выбрать нужный. Они уже готовы к использованию, и их можно совмещать. Далее, мы обсудим некоторые из них, но помните, что библиотеки KDE могут содержать свои (доработанные) элементы управления, предназначенные для тех же задач. Вот несколько компонентов Qt и их назначения: Если в области вашего представления не хватает свободного места, пользователь должен перемещаться по документу с помощью полос прокрутки. Для этого, в Qt есть класс QScrollView. Вы можете сделать свой элемент управления наследником QScrollView или использовать его экземпляр для управления представлением. -Для создания ScrollView, унаследуйте виджет-представление от QWidget и и добавьте вертикальные и горизонтальные полосы прокрутки QScrollBars (так делается в TDEHTMLView). +Для создания ScrollView, унаследуйте виджет-представление от TQWidget и и добавьте вертикальные и горизонтальные полосы прокрутки QScrollBars (так делается в TDEHTMLView). Для обработки текста, пвоспользуйтесь QTextEdit. Этот класс предоставляет законченный виджет текстового редактора, который уже поддерживает операции с буфером обмена, а также управляется полосами прокрутки scrollview. Воспользуйтесь QTable для отображения данных, организованных в таблицу. QTable также управляется полосами прокрутки. Для отображения двух различных виджетов или двух экземпляров одного виджета одновременно, воспользуйтесь QSplitter . Он позволяет разделить представления горизонтально или вертикально. Его использует KMail и KBabel. @@ -696,7 +696,7 @@ return a.exec(); Кнопка <guibutton>Что это?</guibutton> Подсказка Что это? должна содержать кратку справку (абзац-два) по выбраному элементу. Сама кнопка Что это? обычно располагается либо в меню, либо на панели инструментов, либо в загаловке окна. После нажатия на ней, пользователь должен нажать на нужной объекте. -Для добавления такой справки, воспользуйтесь статическим методом QWhatsThis::add(QWidget *widget, const QString &text) +Для добавления такой справки, воспользуйтесь статическим методом QWhatsThis::add(TQWidget *widget, const TQString &text) diff --git a/tde-i18n-ru/docs/tdevelop/kdearch/index.docbook b/tde-i18n-ru/docs/tdevelop/kdearch/index.docbook index 36397c33db3..5ff95b63e29 100644 --- a/tde-i18n-ru/docs/tdevelop/kdearch/index.docbook +++ b/tde-i18n-ru/docs/tdevelop/kdearch/index.docbook @@ -238,7 +238,7 @@ <ulink url="kdeapi:tdeui/KPixmapIO">KPixmapIO</ulink> -Быстрое преобразование QImage в QPixmap. +Быстрое преобразование TQImage в QPixmap. @@ -473,7 +473,7 @@ url="kdeapi:tdeui/KAnimWidget">KAnimWidget Низкоуровневая графическая модель Qt основывается на возможностях, предоставляемых X11 или другими графическими моделями, в которые портирована Qt. Но в ней также есть расширенные функции, такие как произвольные преобразования для текста и растра. -Центральный графический класс для двухмерного рисования с Qt называется QPainter. Он может рисовать на QPaintDevice. Реализовано 3 устройства для рисования: QWidget, представляющий элемент управления на экране, QPrinter, представляющий виджет в виде вывода Postscript, и QPicture, позволяющий записывать и воспроизводить команды рисования (с диска) в формате SVG. +Центральный графический класс для двухмерного рисования с Qt называется QPainter. Он может рисовать на QPaintDevice. Реализовано 3 устройства для рисования: TQWidget, представляющий элемент управления на экране, QPrinter, представляющий виджет в виде вывода Postscript, и QPicture, позволяющий записывать и воспроизводить команды рисования (с диска) в формате SVG. Такое рисование используется преимущественно в методе paintEvent() класса элемента управления. @@ -664,10 +664,10 @@ url="kdeapi:tdeui/KAnimWidget">KAnimWidget QBrush::QBrush(BrushStyle) - чёрная кисть. -QBrush::QBrush(const QColor &, BrushStyle) - Цветная кисть. +QBrush::QBrush(const TQColor &, BrushStyle) - Цветная кисть. -QBrush::QBrush(const QColor &, const QPixmap) - Цветная кисть с заданным узором. +QBrush::QBrush(const TQColor &, const QPixmap) - Цветная кисть с заданным узором. @@ -685,7 +685,7 @@ url="kdeapi:tdeui/KAnimWidget">KAnimWidget Цвет -В Qt цвета представлены классом QColor. Qt не поддерживает расширенную функциональность типа цветовых профилей ICC и сглаживание цветов. Цвета указываются по RGB. +В Qt цвета представлены классом TQColor. Qt не поддерживает расширенную функциональность типа цветовых профилей ICC и сглаживание цветов. Цвета указываются по RGB. Также возможно использовать оттенки, насыщенность и величина (HSV). Эти параметры напрямую используются в диалоге выбора цвета GIMP. Оттенок отвечает уголку на полосе цвета, насыщенность отвечает расстоянию до центра окружности. Величину можно выбрать отдельным ползунком. @@ -738,7 +738,7 @@ url="kdeapi:tdeui/KAnimWidget">KAnimWidget QPixmap отвечает растровым объектам X11. Растры - это объекты стороны сервера и могут - на новых графических картах - даже храниться в их памяти. Поэтому работа с ними происходит очень быстро. Растры также выступают эквивалентами элементов управления - класс QPixmap является подклассом QPaintDevice, так что вы можете рисовать на нём с QPainter. Элементарные операции рисования обычно оптимизируются современными графическими картами. Поэтому, можно использовать растры для двойной буферизации ("double buffering"). Это означает рисовать не прямо на элементе управления, а на временном растре, а потом вызывать функцию bitBlt чтобы передать его виджету. Для сложных перерисовок, это помогает предотвратить мигание. -Объекты QImage располагаются на стороне клиента. Основное ударение поставлено на прямой доступ к точкам изображения. Это упрощает операции манипуляции с изображениями, загрузку и сохранение на диск (метод QPixmapload() берёт QImage как промежуточный). С другой стороны, рисование на элементе управления - дорогая операция, т.к. включает в себя передачу X-серверу. В зависимости от глубины цвета, преобразование из QImage в QPixmap может требовать dithering. +Объекты TQImage располагаются на стороне клиента. Основное ударение поставлено на прямой доступ к точкам изображения. Это упрощает операции манипуляции с изображениями, загрузку и сохранение на диск (метод QPixmapload() берёт TQImage как промежуточный). С другой стороны, рисование на элементе управления - дорогая операция, т.к. включает в себя передачу X-серверу. В зависимости от глубины цвета, преобразование из TQImage в QPixmap может требовать dithering. @@ -1002,7 +1002,7 @@ rc_DATA = kviewui.rc void MainWindow::popupRequested() { - QWidget *w = factory()->container("context_popup", this); + TQWidget *w = factory()->container("context_popup", this); QPopupMenu *popup = static_cast<QPopupMenu *>(w); popup->exec(QCursor::pos()); } @@ -1138,13 +1138,13 @@ X-TDE-ServiceType=KDevelop/Part Name=KDevelop Part [PropertyDef::X-KDevelop-Scope] -Type=QString +Type=TQString [PropertyDef::X-KDevelop-ProgrammingLanguages] Type=QStringList [PropertyDef::X-KDevelop-Args] -Type=QString +Type=TQString Кроме обычных записей, здесь есть объявление наличия свойств. Каждое определение свойства отвечает группе [PropertyDef::name] в файле настроек. В этой группе, Type объявляет тип свойства. Возможные типы - всё, что может храниться в QVariant. @@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project Получив объект KService, остаётся загрузить библиотеку и получить указатель на объект factory: KService *service = ... -QString libName = QFile::encodeName(service->library()); +TQString libName = QFile::encodeName(service->library()); KLibFactory *factory = KLibLoader::self()->factory(libName); if (!factory) { - QString name = service->name(); - QString errorMessage = KLibLoader::self()->lastErrorMessage(); + TQString name = service->name(); + TQString errorMessage = KLibLoader::self()->lastErrorMessage(); KMessageBox::error(0, i18n("There was an error loading service %1.\n" "The diagnostics from libtool is:\n%2") .arg(name).arg(errorMessage); @@ -1211,7 +1211,7 @@ if (!factory) { if (factory->inherits("KParts::Factory")) { KParts::Factory *partFactory = static_cast<KParts::Factory*>(factory); - QObject *obj = partFactory->createPart(parentWidget, widgetName, + TQObject *obj = partFactory->createPart(parentWidget, widgetName, parent, name, "KParts::ReadOnlyPart"); ... } else { @@ -1256,7 +1256,7 @@ X-TDE-StartupNotify=false DCOPClient *client = kapp->dcopClient(); client->attach(); if (!client->isApplicationRegistered("tdeio_uiserver")) { - QString error; + TQString error; if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error)) cout << "Starting kioserver failed with message " << error << endl; } @@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)", В пиведенном примере, служба была запущена по имени ("by name"), т.е. первым аргументом TDEApplication::startServiceByName() является имя, указываемое в записи Name файла .desktop. Как альтернативу, можно использовать TDEApplication::startServiceByDesktopName(), которому передаётся имя файла .desktop, например "tdeio_uiserver.desktop". -Все эти вызовы берут список URL вторым аргументом. Третий аргумент - указатель на QString. Если произойдёт ошибка, в это строку будет занесено (локализованное) сообщение об ошибке. +Все эти вызовы берут список URL вторым аргументом. Третий аргумент - указатель на TQString. Если произойдёт ошибка, в это строку будет занесено (локализованное) сообщение об ошибке. @@ -1385,7 +1385,7 @@ else KMimeMagic поддерживает только локальные файлы. Для удалённых файлов: KURL url("http://developer.kde.org/favicon.ico"); -QString type = TDEIO::NetAccess::mimetype(url); +TQString type = TDEIO::NetAccess::mimetype(url); if (type == KMimeType::defaultMimeType()) cout << "Could not find out type" << endl; else @@ -1463,7 +1463,7 @@ KRun::run(offer.service(), urlList); Получить значок URL. KURL url("ftp://ftp.kde.org/pub/incoming/wibble.c"); -QString icon = KMimeType::iconForURL(url); +TQString icon = KMimeType::iconForURL(url); Выполненые URL. @@ -1542,7 +1542,7 @@ void FooClass::mkdirResult(TDEIO::Job *job) Переименовать файл. -TDEIO::symlink(const QString &target, const KURL &dest, bool overwrite, bool showProgressInfo) +TDEIO::symlink(const TQString &target, const KURL &dest, bool overwrite, bool showProgressInfo) Создать символическую ссылку. @@ -1662,7 +1662,7 @@ TDEIO::NetAccess::copy(source, target); KURL url; url = ...; -QString tempFile; +TQString tempFile; if (TDEIO::NetAccess::download(url, tempFile) { // load the file with the name tempFile // загрузить файл с именем tempFile @@ -1699,12 +1699,12 @@ if (TDEIO::NetAccess::download(url, tempFile) { void FooClass::transferResult(TDEIO::Job *job) { - QString mimetype; + TQString mimetype; if (job->error()) job->showErrorDialog(); else { TDEIO::TransferJob *transferJob = (TDEIO::TransferJob*) job; - QString modified = transferJob->queryMetaData("modified"); + TQString modified = transferJob->queryMetaData("modified"); cout << "Last modified: " << modified << endl; } @@ -1849,7 +1849,7 @@ int kdemain(int argc, char **argv) copy(const KURL &url, const KURL &dest, int permissions, bool overwrite) Создаёт символическую ссылку. -void symlink(const QString &target, const KURL &dest, bool overwrite) +void symlink(const TQString &target, const KURL &dest, bool overwrite) -- cgit v1.2.1